validator: uniqueItems implemented for array

This commit is contained in:
Patrick Boettcher 2016-12-23 16:29:33 +01:00
parent 615b4a1fef
commit 6c344f9dcf
3 changed files with 20 additions and 5 deletions

View File

@ -84,7 +84,7 @@ int main(void)
There is an application which can be used for testing the validator with the
[JSON-Schema-Test-Suite](https://github.com/json-schema-org/JSON-Schema-Test-Suite).
Currently **120** tests are still failing, because simply not all keywords and
Currently **107** of ~**308** tests are still failing, because simply not all keywords and
their functionalities have been implemented. Some of the missing feature will
require a rework. Some will only work with external libraries. (remote references)

View File

@ -58,7 +58,7 @@ int main(void)
total += group_total;
std::cout << "Group RESULT: " << test_group["description"] << " "
<< (group_total - group_failed) << " of " << group_total
<< " have succeeded - " << group_failed << " failed\n";
<< " have succeeded - " << group_failed << " failed\n";
std::cout << "-------------\n";
}

View File

@ -4,6 +4,7 @@
#include <json.hpp>
#include <regex>
#include <unordered_set>
// make yourself a home - welcome to nlohmann's namespace
namespace nlohmann
@ -87,6 +88,7 @@ class json_validator
validate_type(schema, "string", name);
// minLength
auto attr = schema.find("minLength");
if (attr != schema.end())
if (instance.get<std::string>().size() < attr.value()) {
@ -96,6 +98,7 @@ class json_validator
throw std::out_of_range(s.str());
}
// maxLength
attr = schema.find("maxLength");
if (attr != schema.end())
if (instance.get<std::string>().size() > attr.value()) {
@ -174,10 +177,11 @@ class json_validator
void validate_array(json &instance, const json &schema, const std::string &name)
{
not_yet_implemented(schema, "uniqueItems", "array");
not_yet_implemented(schema, "items", "array");
not_yet_implemented(schema, "additionalItems", "array");
validate_type(schema, "array", name);
// maxItems
const auto &maxItems = schema.find("maxItems");
if (maxItems != schema.end())
@ -190,7 +194,18 @@ class json_validator
if (instance.size() < minItems.value())
throw std::out_of_range(name + " has too many items.");
validate_type(schema, "array", name);
// uniqueItems
const auto &uniqueItems = schema.find("uniqueItems");
if (uniqueItems != schema.end())
if (uniqueItems.value() == true) {
std::unordered_set<json> array_to_set;
for (auto v : instance) {
array_to_set.insert(v);
}
if (instance.size() != array_to_set.size())
throw std::out_of_range(name + " should have only unique items.");
}
}
void validate_object(json &instance, const json &schema, const std::string &name)
@ -320,7 +335,7 @@ class json_validator
break;
case json::value_t::array:
for (const auto &prop: dep.value())
for (const auto &prop : dep.value())
if (instance.find(prop) == instance.end())
throw std::invalid_argument("failed dependency for " + sub_name + ". Need property " + prop.get<std::string>());
break;