fix #55: make additionalProperties-error-message clearer

Done this by using sub-error-handler of type first_error_handler
and constructing a message.
This commit is contained in:
Patrick Boettcher 2019-05-02 17:11:38 +02:00
parent 99e05c8335
commit c0d3a287d3
2 changed files with 24 additions and 6 deletions

View File

@ -791,9 +791,14 @@ class object : public schema
a_prop_or_pattern_matched = true;
schema_pp.second->validate(ptr / p.key(), p.value(), e);
}
// check additionalProperties as a last resort
if (!a_prop_or_pattern_matched && additionalProperties_)
additionalProperties_->validate(ptr / p.key(), p.value(), e);
if (!a_prop_or_pattern_matched && additionalProperties_) {
first_error_handler additional_prop_err;
additionalProperties_->validate(ptr / p.key(), p.value(), additional_prop_err);
if (additional_prop_err)
e.error(ptr, instance, "validation failed for additional property '" + p.key() + "': " + additional_prop_err.message_);
}
}
for (auto &dep : dependencies_) {

View File

@ -45,6 +45,7 @@ static json person_schema = R"(
"name",
"age"
],
"additionalProperties": false,
"type": "object"
})"_json;
@ -88,19 +89,20 @@ int main(void)
validator.validate({{"age", 42}}, err); // no name
EXPECT_EQ(err.failed_pointers[0].to_string(), "");
EXPECT_EQ(err.failed_pointers.size(), 1);
EXPECT_EQ(err.failed_pointers[0].to_string(), "");
err.reset();
validator.validate({{"street", "Boulevard"}}, err); // no name and no age
EXPECT_EQ(err.failed_pointers.size(), 3);
EXPECT_EQ(err.failed_pointers[0].to_string(), "");
EXPECT_EQ(err.failed_pointers[1].to_string(), "");
EXPECT_EQ(err.failed_pointers.size(), 2);
EXPECT_EQ(err.failed_pointers[2].to_string(), "");
err.reset();
validator.validate({{"age", 42}, {"name", 12}}, err); // name must be a string
EXPECT_EQ(err.failed_pointers[0].to_string(), "/name");
EXPECT_EQ(err.failed_pointers.size(), 1);
EXPECT_EQ(err.failed_pointers[0].to_string(), "/name");
err.reset();
validator.validate({
@ -109,8 +111,19 @@ int main(void)
{"phones", {1234, "223"}},
},
err); // name must be a string
EXPECT_EQ(err.failed_pointers[0].to_string(), "/phones/1");
EXPECT_EQ(err.failed_pointers.size(), 1);
EXPECT_EQ(err.failed_pointers[0].to_string(), "/phones/1");
err.reset();
validator.validate({
{"age", 42},
{"name", "John"},
{"phones", {0}},
{"post-code", 12345},
},
err); // name must be a string
EXPECT_EQ(err.failed_pointers.size(), 1);
EXPECT_EQ(err.failed_pointers[0].to_string(), "");
err.reset();
return error_count;