|
|
@@ -17,6 +17,7 @@
|
|
|
using enum jvalidate::schema::Version;
|
|
|
using jvalidate::Status;
|
|
|
using jvalidate::constraint::ExtensionConstraint;
|
|
|
+using testing::Not;
|
|
|
|
|
|
struct IsKeyOfConstraint : jvalidate::extension::ConstraintBase<IsKeyOfConstraint> {
|
|
|
IsKeyOfConstraint(std::string_view ptr) : ptr(ptr) {
|
|
|
@@ -34,6 +35,7 @@ public:
|
|
|
|
|
|
template <jvalidate::Adapter A2>
|
|
|
Status visit(IsKeyOfConstraint const & cons, A2 const & document, auto const & validator) const {
|
|
|
+ validator.annotate(cons.ptr);
|
|
|
auto const & object =
|
|
|
std::get<1>(cons.ptr.inspect(validator.where_, root_document_)).as_object();
|
|
|
if (object.find(document.as_string()) != object.end()) {
|
|
|
@@ -43,24 +45,25 @@ public:
|
|
|
}
|
|
|
|
|
|
private:
|
|
|
- A const & root_document_;
|
|
|
+ A root_document_;
|
|
|
};
|
|
|
|
|
|
auto validate(Json::Value const & schema_doc, Json::Value const & instance_doc,
|
|
|
jvalidate::schema::Version version = Draft2020_12) {
|
|
|
- jvalidate::ConstraintFactory<jvalidate::adapter::AdapterFor<Json::Value>> factory{
|
|
|
- {"is_key_of", [](auto const & context) {
|
|
|
- return ExtensionConstraint::make<IsKeyOfConstraint>(context.schema.as_string());
|
|
|
- }}};
|
|
|
- jvalidate::Schema const schema(schema_doc, version);
|
|
|
+ using A = jvalidate::adapter::AdapterFor<Json::Value const>;
|
|
|
+ jvalidate::ConstraintFactory<A> factory{{"is_key_of", [](auto const & context) {
|
|
|
+ return ExtensionConstraint::make<IsKeyOfConstraint>(
|
|
|
+ context.schema.as_string());
|
|
|
+ }}};
|
|
|
+ jvalidate::Schema const schema(schema_doc, version, factory);
|
|
|
|
|
|
jvalidate::ValidationResult result;
|
|
|
- (void)jvalidate::Validator(schema).validate(instance_doc, &result);
|
|
|
+ (void)jvalidate::Validator(schema, Visitor(A(instance_doc))).validate(instance_doc, &result);
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
-TEST(ExtensionConstraint, CanExtend) {
|
|
|
+TEST(ExtensionConstraint, CanReportSuccess) {
|
|
|
auto schema = R"({
|
|
|
"properties": {
|
|
|
"nodes": {
|
|
|
@@ -97,7 +100,47 @@ TEST(ExtensionConstraint, CanExtend) {
|
|
|
})"_json;
|
|
|
|
|
|
jvalidate::ValidationResult result = validate(schema, instance);
|
|
|
- EXPECT_THAT(result, Valid()) << result;
|
|
|
+ EXPECT_THAT(result, Valid());
|
|
|
+}
|
|
|
+
|
|
|
+TEST(ExtensionConstraint, CanReportFailure) {
|
|
|
+ auto schema = R"({
|
|
|
+ "properties": {
|
|
|
+ "nodes": {
|
|
|
+ "type": "object"
|
|
|
+ },
|
|
|
+ "edges": {
|
|
|
+ "items": {
|
|
|
+ "properties": {
|
|
|
+ "destination": {
|
|
|
+ "is_key_of": "3/nodes",
|
|
|
+ "type": "string"
|
|
|
+ },
|
|
|
+ "source": {
|
|
|
+ "is_key_of": "3/nodes",
|
|
|
+ "type": "string"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "type": "object"
|
|
|
+ },
|
|
|
+ "type": "array"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "type": "object"
|
|
|
+ })"_json;
|
|
|
+
|
|
|
+ auto instance = R"({
|
|
|
+ "nodes": {
|
|
|
+ "A": {},
|
|
|
+ "B": {}
|
|
|
+ },
|
|
|
+ "edges": [
|
|
|
+ { "source": "A", "destination": "C" }
|
|
|
+ ]
|
|
|
+ })"_json;
|
|
|
+
|
|
|
+ jvalidate::ValidationResult result = validate(schema, instance);
|
|
|
+ EXPECT_THAT(result, Not(Valid()));
|
|
|
}
|
|
|
|
|
|
int main(int argc, char ** argv) {
|