diff --git a/src/json-validator.cpp b/src/json-validator.cpp index 7f34553..0da71e7 100644 --- a/src/json-validator.cpp +++ b/src/json-validator.cpp @@ -436,9 +436,12 @@ class logical_combination : public schema for (auto &s : subschemata_) { first_error_handler esub; + json_patch old_patch(patch); s->validate(ptr, instance, patch, esub); if (!esub) count++; + else + patch = old_patch; if (is_validate_complete(instance, ptr, e, esub, count)) return; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index fd1c309..e0dd01f 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -73,3 +73,7 @@ add_test(NAME issue-149-entry-selection COMMAND issue-149-entry-selection) add_executable(issue-189-default-values issue-189-default-values.cpp) target_link_libraries(issue-189-default-values nlohmann_json_schema_validator) add_test(NAME issue-189-default-values COMMAND issue-189-default-values) + +add_executable(issue-229-oneof-default-values issue-229-oneof-default-values.cpp) +target_link_libraries(issue-229-oneof-default-values nlohmann_json_schema_validator) +add_test(NAME issue-229-if-default-values COMMAND issue-229-if-default-values) \ No newline at end of file diff --git a/test/issue-229-oneof-default-values.cpp b/test/issue-229-oneof-default-values.cpp new file mode 100644 index 0000000..6bd6e8e --- /dev/null +++ b/test/issue-229-oneof-default-values.cpp @@ -0,0 +1,69 @@ +#include +#include + +using nlohmann::json; +using nlohmann::json_uri; +using nlohmann::json_schema::json_validator; + +static const json default_schema = R"( +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "oneOf": [ + { + "type": "object", + "properties": { + "name": { + "enum": "foo" + }, + "code": { + "const": 1, + "default": 1 + } + } + }, + { + "type": "object", + "properties": { + "name": { + "enum": "bar" + }, + "code": { + "const": 2, + "default": 2 + } + } + } + ] +})"_json; + +static void loader(const json_uri &uri, json &schema) +{ + schema = default_schema; +} + +int main(void) +{ + json_validator validator(loader); + + validator.set_root_schema(default_schema); + + json data = R"({"name": "bar"})"_json; + json expected = R"( + [ + { + "op": "add", + "path": "/code", + "value": 2 + } + ] + )"_json; + + json patch = validator.validate(data); + if (patch != expected) { + std::cerr << "Patch contains wrong operation: '" << patch.dump() << "' instead of expected '" << expected.dump() << "'" << std::endl; + return 1; + } + + return 0; +}