From 6c344f9dcf152b9ae7aeae6cfed282be6977c789 Mon Sep 17 00:00:00 2001 From: Patrick Boettcher Date: Fri, 23 Dec 2016 16:29:33 +0100 Subject: [PATCH] validator: uniqueItems implemented for array --- README.md | 2 +- app/json-schema-test.cpp | 2 +- src/json-schema-validator.hpp | 21 ++++++++++++++++++--- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 1831d7b..89c12fb 100644 --- a/README.md +++ b/README.md @@ -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) diff --git a/app/json-schema-test.cpp b/app/json-schema-test.cpp index 4307c97..ac1daf4 100644 --- a/app/json-schema-test.cpp +++ b/app/json-schema-test.cpp @@ -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"; } diff --git a/src/json-schema-validator.hpp b/src/json-schema-validator.hpp index 044503b..a27ac4a 100644 --- a/src/json-schema-validator.hpp +++ b/src/json-schema-validator.hpp @@ -4,6 +4,7 @@ #include #include +#include // 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().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().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 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()); break;