소스 검색

test: failure test and success test for extensions

Sam Jaffe 3 달 전
부모
커밋
8db5617e20
1개의 변경된 파일52개의 추가작업 그리고 9개의 파일을 삭제
  1. 52 9
      tests/extension_test.cxx

+ 52 - 9
tests/extension_test.cxx

@@ -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) {