From 012b106a3a870e2f5be58e289abd52e108d24265 Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Thu, 17 Oct 2024 16:05:07 -0400 Subject: [PATCH] Report `ControlMark` during evaluation (#21) Signed-off-by: Juan Cruz Viotti --- src/compiler/compile_describe.cc | 2 +- src/evaluator/evaluator.cc | 28 +- test/evaluator/evaluator_2019_09_test.cc | 315 ++++++++++++++--------- test/evaluator/evaluator_2020_12_test.cc | 17 +- 4 files changed, 225 insertions(+), 137 deletions(-) diff --git a/src/compiler/compile_describe.cc b/src/compiler/compile_describe.cc index 1faf6b4..4f94eca 100644 --- a/src/compiler/compile_describe.cc +++ b/src/compiler/compile_describe.cc @@ -251,7 +251,7 @@ struct DescribeVisitor { } auto operator()(const ControlMark &) const -> std::string { - return describe_reference(this->target); + return "The schema location was marked for future use"; } auto operator()(const ControlEvaluate &) const -> std::string { diff --git a/src/evaluator/evaluator.cc b/src/evaluator/evaluator.cc index 8a49f5a..76113cd 100644 --- a/src/evaluator/evaluator.cc +++ b/src/evaluator/evaluator.cc @@ -120,6 +120,16 @@ auto evaluate_step(const sourcemeta::blaze::Template::value_type &step, } \ bool result{false}; +#define EVALUATE_BEGIN_NO_PRECONDITION_AND_NO_PUSH(step_category, step_type) \ + SOURCEMETA_TRACE_END(trace_dispatch_id, "Dispatch"); \ + SOURCEMETA_TRACE_START(trace_id, STRINGIFY(step_type)); \ + const auto &step_category{std::get(step)}; \ + if (step_category.report && callback.has_value()) { \ + callback.value()(EvaluationType::Pre, true, step, context.evaluate_path(), \ + context.instance_location(), context.null); \ + } \ + bool result{true}; + #define EVALUATE_END(step_category, step_type) \ if (step_category.report && callback.has_value()) { \ callback.value()(EvaluationType::Post, result, step, \ @@ -130,6 +140,15 @@ auto evaluate_step(const sourcemeta::blaze::Template::value_type &step, SOURCEMETA_TRACE_END(trace_id, STRINGIFY(step_type)); \ return result; +#define EVALUATE_END_NO_POP(step_category, step_type) \ + if (step_category.report && callback.has_value()) { \ + callback.value()(EvaluationType::Post, result, step, \ + context.evaluate_path(), context.instance_location(), \ + context.null); \ + } \ + SOURCEMETA_TRACE_END(trace_id, STRINGIFY(step_type)); \ + return result; + // As a safety guard, only emit the annotation if it didn't exist already. // Otherwise we risk confusing consumers @@ -621,14 +640,13 @@ auto evaluate_step(const sourcemeta::blaze::Template::value_type &step, } case IS_STEP(ControlMark): { - SOURCEMETA_TRACE_START(trace_id, "ControlMark"); - const auto &control{std::get(step)}; + EVALUATE_BEGIN_NO_PRECONDITION_AND_NO_PUSH(control, ControlMark); context.mark(control.value, control.children); - SOURCEMETA_TRACE_END(trace_id, "ControlMark"); - return true; + EVALUATE_END_NO_POP(control, ControlMark); } case IS_STEP(ControlEvaluate): { + SOURCEMETA_TRACE_END(trace_dispatch_id, "Dispatch"); SOURCEMETA_TRACE_START(trace_id, "ControlEvaluate"); const auto &control{std::get(step)}; context.evaluate(control.value); @@ -1026,7 +1044,9 @@ auto evaluate_step(const sourcemeta::blaze::Template::value_type &step, #undef EVALUATE_BEGIN_NO_TARGET #undef EVALUATE_BEGIN_TRY_TARGET #undef EVALUATE_BEGIN_NO_PRECONDITION +#undef EVALUATE_BEGIN_NO_PRECONDITION_AND_NO_PUSH #undef EVALUATE_END +#undef EVALUATE_END_NO_POP #undef EVALUATE_ANNOTATION #undef EVALUATE_ANNOTATION_NO_PRECONDITION diff --git a/test/evaluator/evaluator_2019_09_test.cc b/test/evaluator/evaluator_2019_09_test.cc index 2d7f47b..fea5362 100644 --- a/test/evaluator/evaluator_2019_09_test.cc +++ b/test/evaluator/evaluator_2019_09_test.cc @@ -4432,26 +4432,31 @@ TEST(Evaluator_2019_09, recursiveRef_1) { const sourcemeta::jsontoolkit::JSON instance{ sourcemeta::jsontoolkit::parse("{ \"foo\": 1 }")}; - EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 2); + EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 3); - EVALUATE_TRACE_PRE(0, LoopProperties, "/additionalProperties", + EVALUATE_TRACE_PRE(0, ControlMark, "", "https://example.com/schema", ""); + EVALUATE_TRACE_PRE(1, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); EVALUATE_TRACE_PRE( - 1, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", + 2, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", "https://example.com/schema#/additionalProperties/$recursiveRef", "/foo"); + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "https://example.com/schema", + ""); EVALUATE_TRACE_POST_SUCCESS( - 0, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", + 1, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", "https://example.com/schema#/additionalProperties/$recursiveRef", "/foo"); EVALUATE_TRACE_POST_SUCCESS( - 1, LoopProperties, "/additionalProperties", + 2, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); + EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for future use"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 0, + instance, 1, "The integer value was expected to validate against the first subschema " "in scope that declared a recursive anchor"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 1, + EVALUATE_TRACE_POST_DESCRIBE(instance, 2, "The object properties not covered by other " "adjacent object keywords were " "expected to validate against this subschema"); @@ -4471,36 +4476,41 @@ TEST(Evaluator_2019_09, recursiveRef_1_exhaustive) { const sourcemeta::jsontoolkit::JSON instance{ sourcemeta::jsontoolkit::parse("{ \"foo\": 1 }")}; - EVALUATE_WITH_TRACE_EXHAUSTIVE_SUCCESS(schema, instance, 3); + EVALUATE_WITH_TRACE_EXHAUSTIVE_SUCCESS(schema, instance, 4); - EVALUATE_TRACE_PRE(0, LoopProperties, "/additionalProperties", + EVALUATE_TRACE_PRE(0, ControlMark, "", "https://example.com/schema", ""); + EVALUATE_TRACE_PRE(1, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); EVALUATE_TRACE_PRE( - 1, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", + 2, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", "https://example.com/schema#/additionalProperties/$recursiveRef", "/foo"); EVALUATE_TRACE_PRE_ANNOTATION( - 2, "/additionalProperties", + 3, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "https://example.com/schema", + ""); EVALUATE_TRACE_POST_SUCCESS( - 0, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", + 1, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", "https://example.com/schema#/additionalProperties/$recursiveRef", "/foo"); EVALUATE_TRACE_POST_ANNOTATION( - 1, "/additionalProperties", + 2, "/additionalProperties", "https://example.com/schema#/additionalProperties", "", "foo"); EVALUATE_TRACE_POST_SUCCESS( - 2, LoopProperties, "/additionalProperties", + 3, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); + EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for future use"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 0, + instance, 1, "The integer value was expected to validate against the first subschema " "in scope that declared a recursive anchor"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 1, + instance, 2, "The object property \"foo\" successfully validated against the " "additional properties subschema"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 2, + EVALUATE_TRACE_POST_DESCRIBE(instance, 3, "The object properties not covered by other " "adjacent object keywords were " "expected to validate against this subschema"); @@ -4521,35 +4531,40 @@ TEST(Evaluator_2019_09, recursiveRef_2) { const sourcemeta::jsontoolkit::JSON instance{ sourcemeta::jsontoolkit::parse("{ \"foo\": 1 }")}; - EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 3); + EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 4); - EVALUATE_TRACE_PRE(0, LoopProperties, "/additionalProperties", + EVALUATE_TRACE_PRE(0, ControlMark, "", "https://example.com/schema", ""); + EVALUATE_TRACE_PRE(1, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); EVALUATE_TRACE_PRE( - 1, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", + 2, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", "https://example.com/schema#/additionalProperties/$recursiveRef", "/foo"); - EVALUATE_TRACE_PRE(2, AssertionGreaterEqual, + EVALUATE_TRACE_PRE(3, AssertionGreaterEqual, "/additionalProperties/$recursiveRef/minimum", "https://example.com/schema#/minimum", "/foo"); - EVALUATE_TRACE_POST_SUCCESS(0, AssertionGreaterEqual, + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "https://example.com/schema", + ""); + EVALUATE_TRACE_POST_SUCCESS(1, AssertionGreaterEqual, "/additionalProperties/$recursiveRef/minimum", "https://example.com/schema#/minimum", "/foo"); EVALUATE_TRACE_POST_SUCCESS( - 1, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", + 2, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", "https://example.com/schema#/additionalProperties/$recursiveRef", "/foo"); EVALUATE_TRACE_POST_SUCCESS( - 2, LoopProperties, "/additionalProperties", + 3, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for future use"); + EVALUATE_TRACE_POST_DESCRIBE(instance, 1, "The integer value 1 was expected to be greater " "than or equal to the integer 1"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 1, + instance, 2, "The integer value was expected to validate against the first subschema " "in scope that declared a recursive anchor"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 2, + EVALUATE_TRACE_POST_DESCRIBE(instance, 3, "The object properties not covered by other " "adjacent object keywords were " "expected to validate against this subschema"); @@ -4570,45 +4585,50 @@ TEST(Evaluator_2019_09, recursiveRef_2_exhaustive) { const sourcemeta::jsontoolkit::JSON instance{ sourcemeta::jsontoolkit::parse("{ \"foo\": 1 }")}; - EVALUATE_WITH_TRACE_EXHAUSTIVE_SUCCESS(schema, instance, 4); + EVALUATE_WITH_TRACE_EXHAUSTIVE_SUCCESS(schema, instance, 5); - EVALUATE_TRACE_PRE(0, LoopProperties, "/additionalProperties", + EVALUATE_TRACE_PRE(0, ControlMark, "", "https://example.com/schema", ""); + EVALUATE_TRACE_PRE(1, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); EVALUATE_TRACE_PRE( - 1, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", + 2, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", "https://example.com/schema#/additionalProperties/$recursiveRef", "/foo"); - EVALUATE_TRACE_PRE(2, AssertionGreaterEqual, + EVALUATE_TRACE_PRE(3, AssertionGreaterEqual, "/additionalProperties/$recursiveRef/minimum", "https://example.com/schema#/minimum", "/foo"); EVALUATE_TRACE_PRE_ANNOTATION( - 3, "/additionalProperties", + 4, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); - EVALUATE_TRACE_POST_SUCCESS(0, AssertionGreaterEqual, + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "https://example.com/schema", + ""); + EVALUATE_TRACE_POST_SUCCESS(1, AssertionGreaterEqual, "/additionalProperties/$recursiveRef/minimum", "https://example.com/schema#/minimum", "/foo"); EVALUATE_TRACE_POST_SUCCESS( - 1, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", + 2, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", "https://example.com/schema#/additionalProperties/$recursiveRef", "/foo"); EVALUATE_TRACE_POST_ANNOTATION( - 2, "/additionalProperties", + 3, "/additionalProperties", "https://example.com/schema#/additionalProperties", "", "foo"); EVALUATE_TRACE_POST_SUCCESS( - 3, LoopProperties, "/additionalProperties", + 4, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for future use"); + EVALUATE_TRACE_POST_DESCRIBE(instance, 1, "The integer value 1 was expected to be greater " "than or equal to the integer 1"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 1, + instance, 2, "The integer value was expected to validate against the first subschema " "in scope that declared a recursive anchor"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 2, + instance, 3, "The object property \"foo\" successfully validated against the " "additional properties subschema"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 3, + EVALUATE_TRACE_POST_DESCRIBE(instance, 4, "The object properties not covered by other " "adjacent object keywords were " "expected to validate against this subschema"); @@ -4632,24 +4652,29 @@ TEST(Evaluator_2019_09, recursiveRef_3) { const sourcemeta::jsontoolkit::JSON instance{ sourcemeta::jsontoolkit::parse("{ \"foo\": 1 }")}; - EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 2); + EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 3); - EVALUATE_TRACE_PRE(0, LoopProperties, "/additionalProperties", + EVALUATE_TRACE_PRE(0, ControlMark, "", "https://example.com/nested", ""); + EVALUATE_TRACE_PRE(1, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); - EVALUATE_TRACE_PRE(1, AssertionGreaterEqual, "/additionalProperties/minimum", + EVALUATE_TRACE_PRE(2, AssertionGreaterEqual, "/additionalProperties/minimum", "https://example.com/nested#/minimum", "/foo"); - EVALUATE_TRACE_POST_SUCCESS(0, AssertionGreaterEqual, + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "https://example.com/nested", + ""); + EVALUATE_TRACE_POST_SUCCESS(1, AssertionGreaterEqual, "/additionalProperties/minimum", "https://example.com/nested#/minimum", "/foo"); EVALUATE_TRACE_POST_SUCCESS( - 1, LoopProperties, "/additionalProperties", + 2, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for future use"); + EVALUATE_TRACE_POST_DESCRIBE(instance, 1, "The integer value 1 was expected to be greater " "than or equal to the integer 1"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 1, + EVALUATE_TRACE_POST_DESCRIBE(instance, 2, "The object properties not covered by other " "adjacent object keywords were " "expected to validate against this subschema"); @@ -4673,34 +4698,40 @@ TEST(Evaluator_2019_09, recursiveRef_3_exhaustive) { const sourcemeta::jsontoolkit::JSON instance{ sourcemeta::jsontoolkit::parse("{ \"foo\": 1 }")}; - EVALUATE_WITH_TRACE_EXHAUSTIVE_SUCCESS(schema, instance, 3); + EVALUATE_WITH_TRACE_EXHAUSTIVE_SUCCESS(schema, instance, 4); - EVALUATE_TRACE_PRE(0, LoopProperties, "/additionalProperties", + EVALUATE_TRACE_PRE(0, ControlMark, "", "https://example.com/nested", ""); + EVALUATE_TRACE_PRE(1, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); - EVALUATE_TRACE_PRE(1, AssertionGreaterEqual, "/additionalProperties/minimum", + EVALUATE_TRACE_PRE(2, AssertionGreaterEqual, "/additionalProperties/minimum", "https://example.com/nested#/minimum", "/foo"); EVALUATE_TRACE_PRE_ANNOTATION( - 2, "/additionalProperties", + 3, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); - EVALUATE_TRACE_POST_SUCCESS(0, AssertionGreaterEqual, + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "https://example.com/nested", + ""); + EVALUATE_TRACE_POST_SUCCESS(1, AssertionGreaterEqual, "/additionalProperties/minimum", "https://example.com/nested#/minimum", "/foo"); EVALUATE_TRACE_POST_ANNOTATION( - 1, "/additionalProperties", + 2, "/additionalProperties", "https://example.com/schema#/additionalProperties", "", "foo"); EVALUATE_TRACE_POST_SUCCESS( - 2, LoopProperties, "/additionalProperties", + 3, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for " + "future use"); + EVALUATE_TRACE_POST_DESCRIBE(instance, 1, "The integer value 1 was expected to be greater " "than or equal to the integer 1"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 1, + instance, 2, "The object property \"foo\" successfully validated against the " "additional properties subschema"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 2, + EVALUATE_TRACE_POST_DESCRIBE(instance, 3, "The object properties not covered by other " "adjacent object keywords were " "expected to validate against this subschema"); @@ -4724,51 +4755,57 @@ TEST(Evaluator_2019_09, recursiveRef_4) { const sourcemeta::jsontoolkit::JSON instance{ sourcemeta::jsontoolkit::parse("{ \"foo\": { \"bar\": 1 } }")}; - EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 4); + EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 5); - EVALUATE_TRACE_PRE(0, LoopProperties, "/additionalProperties", + EVALUATE_TRACE_PRE(0, ControlMark, "", "https://example.com/nested", ""); + EVALUATE_TRACE_PRE(1, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); EVALUATE_TRACE_PRE( - 1, LoopProperties, "/additionalProperties/additionalProperties", + 2, LoopProperties, "/additionalProperties/additionalProperties", "https://example.com/nested#/additionalProperties", "/foo"); EVALUATE_TRACE_PRE( - 2, ControlDynamicAnchorJump, + 3, ControlDynamicAnchorJump, "/additionalProperties/additionalProperties/$recursiveRef", "https://example.com/nested#/additionalProperties/$recursiveRef", "/foo/bar"); EVALUATE_TRACE_PRE( - 3, AssertionGreaterEqual, + 4, AssertionGreaterEqual, "/additionalProperties/additionalProperties/$recursiveRef/minimum", "https://example.com/nested#/minimum", "/foo/bar"); + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "https://example.com/nested", + ""); EVALUATE_TRACE_POST_SUCCESS( - 0, AssertionGreaterEqual, + 1, AssertionGreaterEqual, "/additionalProperties/additionalProperties/$recursiveRef/minimum", "https://example.com/nested#/minimum", "/foo/bar"); EVALUATE_TRACE_POST_SUCCESS( - 1, ControlDynamicAnchorJump, + 2, ControlDynamicAnchorJump, "/additionalProperties/additionalProperties/$recursiveRef", "https://example.com/nested#/additionalProperties/$recursiveRef", "/foo/bar"); EVALUATE_TRACE_POST_SUCCESS( - 2, LoopProperties, "/additionalProperties/additionalProperties", + 3, LoopProperties, "/additionalProperties/additionalProperties", "https://example.com/nested#/additionalProperties", "/foo"); EVALUATE_TRACE_POST_SUCCESS( - 3, LoopProperties, "/additionalProperties", + 4, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for " + "future use"); + EVALUATE_TRACE_POST_DESCRIBE(instance, 1, "The integer value 1 was expected to be greater " "than or equal to the integer 1"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 1, + instance, 2, "The integer value was expected to validate against the first subschema " "in scope that declared a recursive anchor"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 2, + EVALUATE_TRACE_POST_DESCRIBE(instance, 3, "The object properties not covered by other " "adjacent object keywords were " "expected to validate against this subschema"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 3, + EVALUATE_TRACE_POST_DESCRIBE(instance, 4, "The object properties not covered by other " "adjacent object keywords were " "expected to validate against this subschema"); @@ -4792,71 +4829,77 @@ TEST(Evaluator_2019_09, recursiveRef_4_exhaustive) { const sourcemeta::jsontoolkit::JSON instance{ sourcemeta::jsontoolkit::parse("{ \"foo\": { \"bar\": 1 } }")}; - EVALUATE_WITH_TRACE_EXHAUSTIVE_SUCCESS(schema, instance, 6); + EVALUATE_WITH_TRACE_EXHAUSTIVE_SUCCESS(schema, instance, 7); - EVALUATE_TRACE_PRE(0, LoopProperties, "/additionalProperties", + EVALUATE_TRACE_PRE(0, ControlMark, "", "https://example.com/nested", ""); + EVALUATE_TRACE_PRE(1, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); EVALUATE_TRACE_PRE( - 1, LoopProperties, "/additionalProperties/additionalProperties", + 2, LoopProperties, "/additionalProperties/additionalProperties", "https://example.com/nested#/additionalProperties", "/foo"); EVALUATE_TRACE_PRE( - 2, ControlDynamicAnchorJump, + 3, ControlDynamicAnchorJump, "/additionalProperties/additionalProperties/$recursiveRef", "https://example.com/nested#/additionalProperties/$recursiveRef", "/foo/bar"); EVALUATE_TRACE_PRE( - 3, AssertionGreaterEqual, + 4, AssertionGreaterEqual, "/additionalProperties/additionalProperties/$recursiveRef/minimum", "https://example.com/nested#/minimum", "/foo/bar"); EVALUATE_TRACE_PRE_ANNOTATION( - 4, "/additionalProperties/additionalProperties", + 5, "/additionalProperties/additionalProperties", "https://example.com/nested#/additionalProperties", "/foo"); EVALUATE_TRACE_PRE_ANNOTATION( - 5, "/additionalProperties", + 6, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "https://example.com/nested", + ""); EVALUATE_TRACE_POST_SUCCESS( - 0, AssertionGreaterEqual, + 1, AssertionGreaterEqual, "/additionalProperties/additionalProperties/$recursiveRef/minimum", "https://example.com/nested#/minimum", "/foo/bar"); EVALUATE_TRACE_POST_SUCCESS( - 1, ControlDynamicAnchorJump, + 2, ControlDynamicAnchorJump, "/additionalProperties/additionalProperties/$recursiveRef", "https://example.com/nested#/additionalProperties/$recursiveRef", "/foo/bar"); EVALUATE_TRACE_POST_ANNOTATION( - 2, "/additionalProperties/additionalProperties", + 3, "/additionalProperties/additionalProperties", "https://example.com/nested#/additionalProperties", "/foo", "bar"); EVALUATE_TRACE_POST_SUCCESS( - 3, LoopProperties, "/additionalProperties/additionalProperties", + 4, LoopProperties, "/additionalProperties/additionalProperties", "https://example.com/nested#/additionalProperties", "/foo"); EVALUATE_TRACE_POST_ANNOTATION( - 4, "/additionalProperties", + 5, "/additionalProperties", "https://example.com/schema#/additionalProperties", "", "foo"); EVALUATE_TRACE_POST_SUCCESS( - 5, LoopProperties, "/additionalProperties", + 6, LoopProperties, "/additionalProperties", "https://example.com/schema#/additionalProperties", ""); EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for " + "future use"); + EVALUATE_TRACE_POST_DESCRIBE(instance, 1, "The integer value 1 was expected to be greater " "than or equal to the integer 1"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 1, + instance, 2, "The integer value was expected to validate against the first subschema " "in scope that declared a recursive anchor"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 2, + instance, 3, "The object property \"bar\" successfully validated against the " "additional properties subschema"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 3, + EVALUATE_TRACE_POST_DESCRIBE(instance, 4, "The object properties not covered by other " "adjacent object keywords were " "expected to validate against this subschema"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 4, + instance, 5, "The object property \"foo\" successfully validated against the " "additional properties subschema"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 5, + EVALUATE_TRACE_POST_DESCRIBE(instance, 6, "The object properties not covered by other " "adjacent object keywords were " "expected to validate against this subschema"); @@ -4879,33 +4922,39 @@ TEST(Evaluator_2019_09, recursiveRef_5) { const sourcemeta::jsontoolkit::JSON instance{ sourcemeta::jsontoolkit::parse("[ [ 1 ] ]")}; - EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 3); + EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 4); - EVALUATE_TRACE_PRE(0, LoopItems, "/items", + EVALUATE_TRACE_PRE(0, ControlMark, "", "https://example.com/nested", ""); + EVALUATE_TRACE_PRE(1, LoopItems, "/items", "https://example.com/schema#/items", ""); - EVALUATE_TRACE_PRE(1, LogicalWhenType, "/items/items", + EVALUATE_TRACE_PRE(2, LogicalWhenType, "/items/items", "https://example.com/nested#/items", "/0"); EVALUATE_TRACE_PRE( - 2, ControlDynamicAnchorJump, "/items/items/0/$recursiveRef", + 3, ControlDynamicAnchorJump, "/items/items/0/$recursiveRef", "https://example.com/nested#/items/0/$recursiveRef", "/0/0"); + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "https://example.com/nested", + ""); EVALUATE_TRACE_POST_SUCCESS( - 0, ControlDynamicAnchorJump, "/items/items/0/$recursiveRef", + 1, ControlDynamicAnchorJump, "/items/items/0/$recursiveRef", "https://example.com/nested#/items/0/$recursiveRef", "/0/0"); - EVALUATE_TRACE_POST_SUCCESS(1, LogicalWhenType, "/items/items", + EVALUATE_TRACE_POST_SUCCESS(2, LogicalWhenType, "/items/items", "https://example.com/nested#/items", "/0"); - EVALUATE_TRACE_POST_SUCCESS(2, LoopItems, "/items", + EVALUATE_TRACE_POST_SUCCESS(3, LoopItems, "/items", "https://example.com/schema#/items", ""); + EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for " + "future use"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 0, + instance, 1, "The integer value was expected to validate against the first subschema " "in scope that declared a recursive anchor"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 1, + instance, 2, "The first item of the array value was expected to validate against the " "corresponding subschemas"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 2, + EVALUATE_TRACE_POST_DESCRIBE(instance, 3, "Every item in the array value was expected to " "validate against the given subschema"); } @@ -4927,49 +4976,55 @@ TEST(Evaluator_2019_09, recursiveRef_5_exhaustive) { const sourcemeta::jsontoolkit::JSON instance{ sourcemeta::jsontoolkit::parse("[ [ 1 ] ]")}; - EVALUATE_WITH_TRACE_EXHAUSTIVE_SUCCESS(schema, instance, 5); + EVALUATE_WITH_TRACE_EXHAUSTIVE_SUCCESS(schema, instance, 6); - EVALUATE_TRACE_PRE(0, LoopItems, "/items", + EVALUATE_TRACE_PRE(0, ControlMark, "", "https://example.com/nested", ""); + EVALUATE_TRACE_PRE(1, LoopItems, "/items", "https://example.com/schema#/items", ""); - EVALUATE_TRACE_PRE(1, LogicalWhenType, "/items/items", + EVALUATE_TRACE_PRE(2, LogicalWhenType, "/items/items", "https://example.com/nested#/items", "/0"); EVALUATE_TRACE_PRE( - 2, ControlDynamicAnchorJump, "/items/items/0/$recursiveRef", + 3, ControlDynamicAnchorJump, "/items/items/0/$recursiveRef", "https://example.com/nested#/items/0/$recursiveRef", "/0/0"); - EVALUATE_TRACE_PRE_ANNOTATION(3, "/items/items", + EVALUATE_TRACE_PRE_ANNOTATION(4, "/items/items", "https://example.com/nested#/items", "/0"); - EVALUATE_TRACE_PRE_ANNOTATION(4, "/items", + EVALUATE_TRACE_PRE_ANNOTATION(5, "/items", "https://example.com/schema#/items", ""); + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "https://example.com/nested", + ""); EVALUATE_TRACE_POST_SUCCESS( - 0, ControlDynamicAnchorJump, "/items/items/0/$recursiveRef", + 1, ControlDynamicAnchorJump, "/items/items/0/$recursiveRef", "https://example.com/nested#/items/0/$recursiveRef", "/0/0"); EVALUATE_TRACE_POST_ANNOTATION( - 1, "/items/items", "https://example.com/nested#/items", "/0", true); - EVALUATE_TRACE_POST_SUCCESS(2, LogicalWhenType, "/items/items", + 2, "/items/items", "https://example.com/nested#/items", "/0", true); + EVALUATE_TRACE_POST_SUCCESS(3, LogicalWhenType, "/items/items", "https://example.com/nested#/items", "/0"); - EVALUATE_TRACE_POST_SUCCESS(3, LoopItems, "/items", + EVALUATE_TRACE_POST_SUCCESS(4, LoopItems, "/items", "https://example.com/schema#/items", ""); - EVALUATE_TRACE_POST_ANNOTATION(4, "/items", + EVALUATE_TRACE_POST_ANNOTATION(5, "/items", "https://example.com/schema#/items", "", true); + EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for " + "future use"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 0, + instance, 1, "The integer value was expected to validate against the first subschema " "in scope that declared a recursive anchor"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 1, + instance, 2, "At least one item of the array value successfully validated against the " "given subschema"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 2, + instance, 3, "The first item of the array value was expected to validate against the " "corresponding subschemas"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 3, + EVALUATE_TRACE_POST_DESCRIBE(instance, 4, "Every item in the array value was expected to " "validate against the given subschema"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 4, + instance, 5, "At least one item of the array value successfully validated against the " "given subschema"); } @@ -4987,25 +5042,29 @@ TEST(Evaluator_2019_09, recursiveRef_6) { const sourcemeta::jsontoolkit::JSON instance{ sourcemeta::jsontoolkit::parse("{ \"foo\": 1 }")}; - EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 2); + EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 3); - EVALUATE_TRACE_PRE(0, LoopProperties, "/additionalProperties", + EVALUATE_TRACE_PRE(0, ControlMark, "", "", ""); + EVALUATE_TRACE_PRE(1, LoopProperties, "/additionalProperties", "#/additionalProperties", ""); - EVALUATE_TRACE_PRE(1, ControlDynamicAnchorJump, + EVALUATE_TRACE_PRE(2, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", "#/additionalProperties/$recursiveRef", "/foo"); - EVALUATE_TRACE_POST_SUCCESS(0, ControlDynamicAnchorJump, + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "", ""); + EVALUATE_TRACE_POST_SUCCESS(1, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", "#/additionalProperties/$recursiveRef", "/foo"); - EVALUATE_TRACE_POST_SUCCESS(1, LoopProperties, "/additionalProperties", + EVALUATE_TRACE_POST_SUCCESS(2, LoopProperties, "/additionalProperties", "#/additionalProperties", ""); + EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for future use"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 0, + instance, 1, "The integer value was expected to validate against the first subschema " "in scope that declared a recursive anchor"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 1, + EVALUATE_TRACE_POST_DESCRIBE(instance, 2, "The object properties not covered by other " "adjacent object keywords were " "expected to validate against this subschema"); @@ -5024,33 +5083,37 @@ TEST(Evaluator_2019_09, recursiveRef_6_exhaustive) { const sourcemeta::jsontoolkit::JSON instance{ sourcemeta::jsontoolkit::parse("{ \"foo\": 1 }")}; - EVALUATE_WITH_TRACE_EXHAUSTIVE_SUCCESS(schema, instance, 3); + EVALUATE_WITH_TRACE_EXHAUSTIVE_SUCCESS(schema, instance, 4); - EVALUATE_TRACE_PRE(0, LoopProperties, "/additionalProperties", + EVALUATE_TRACE_PRE(0, ControlMark, "", "", ""); + EVALUATE_TRACE_PRE(1, LoopProperties, "/additionalProperties", "#/additionalProperties", ""); - EVALUATE_TRACE_PRE(1, ControlDynamicAnchorJump, + EVALUATE_TRACE_PRE(2, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", "#/additionalProperties/$recursiveRef", "/foo"); - EVALUATE_TRACE_PRE_ANNOTATION(2, "/additionalProperties", + EVALUATE_TRACE_PRE_ANNOTATION(3, "/additionalProperties", "#/additionalProperties", ""); - EVALUATE_TRACE_POST_SUCCESS(0, ControlDynamicAnchorJump, + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "", ""); + EVALUATE_TRACE_POST_SUCCESS(1, ControlDynamicAnchorJump, "/additionalProperties/$recursiveRef", "#/additionalProperties/$recursiveRef", "/foo"); - EVALUATE_TRACE_POST_ANNOTATION(1, "/additionalProperties", + EVALUATE_TRACE_POST_ANNOTATION(2, "/additionalProperties", "#/additionalProperties", "", "foo"); - EVALUATE_TRACE_POST_SUCCESS(2, LoopProperties, "/additionalProperties", + EVALUATE_TRACE_POST_SUCCESS(3, LoopProperties, "/additionalProperties", "#/additionalProperties", ""); + EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for future use"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 0, + instance, 1, "The integer value was expected to validate against the first subschema " "in scope that declared a recursive anchor"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 1, + instance, 2, "The object property \"foo\" successfully validated against the " "additional properties subschema"); - EVALUATE_TRACE_POST_DESCRIBE(instance, 2, + EVALUATE_TRACE_POST_DESCRIBE(instance, 3, "The object properties not covered by other " "adjacent object keywords were " "expected to validate against this subschema"); diff --git a/test/evaluator/evaluator_2020_12_test.cc b/test/evaluator/evaluator_2020_12_test.cc index 4410104..52aa37a 100644 --- a/test/evaluator/evaluator_2020_12_test.cc +++ b/test/evaluator/evaluator_2020_12_test.cc @@ -1209,22 +1209,27 @@ TEST(Evaluator_2020_12, dynamicRef_1) { })JSON")}; const sourcemeta::jsontoolkit::JSON instance{"foo"}; - EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 2); + EVALUATE_WITH_TRACE_FAST_SUCCESS(schema, instance, 3); - EVALUATE_TRACE_PRE(0, ControlDynamicAnchorJump, "/$dynamicRef", + EVALUATE_TRACE_PRE(0, ControlMark, "", "#/$defs/string", ""); + EVALUATE_TRACE_PRE(1, ControlDynamicAnchorJump, "/$dynamicRef", "#/$dynamicRef", ""); - EVALUATE_TRACE_PRE(1, AssertionTypeStrict, "/$dynamicRef/type", + EVALUATE_TRACE_PRE(2, AssertionTypeStrict, "/$dynamicRef/type", "#/$defs/string/type", ""); - EVALUATE_TRACE_POST_SUCCESS(0, AssertionTypeStrict, "/$dynamicRef/type", + EVALUATE_TRACE_POST_SUCCESS(0, ControlMark, "", "#/$defs/string", ""); + EVALUATE_TRACE_POST_SUCCESS(1, AssertionTypeStrict, "/$dynamicRef/type", "#/$defs/string/type", ""); - EVALUATE_TRACE_POST_SUCCESS(1, ControlDynamicAnchorJump, "/$dynamicRef", + EVALUATE_TRACE_POST_SUCCESS(2, ControlDynamicAnchorJump, "/$dynamicRef", "#/$dynamicRef", ""); EVALUATE_TRACE_POST_DESCRIBE(instance, 0, + "The schema location was marked for " + "future use"); + EVALUATE_TRACE_POST_DESCRIBE(instance, 1, "The value was expected to be of type string"); EVALUATE_TRACE_POST_DESCRIBE( - instance, 1, + instance, 2, "The string value was expected to validate against the first subschema " "in scope that declared the dynamic anchor \"foo\""); }