From 4674c04cb80e0a50cde1b97464642e2778f9522f Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 24 Jul 2022 16:44:51 -0400 Subject: JSON schema: support multi-element array validation --- libtests/json.cc | 29 ++++++++++++++++++++++++----- libtests/libtests.testcov | 2 +- libtests/qtest/json/json.out | 11 ++++------- 3 files changed, 29 insertions(+), 13 deletions(-) (limited to 'libtests') diff --git a/libtests/json.cc b/libtests/json.cc index a509c2be..ef9188c5 100644 --- a/libtests/json.cc +++ b/libtests/json.cc @@ -179,7 +179,11 @@ test_schema() "z": "ebra", "o": "ptional" } - } + }, + "four": [ + { "first": "first element" }, + { "second": "second element" } + ] } )"); @@ -227,17 +231,28 @@ test_schema() "else": { "z": "okay" } - } + }, + "four": [ + {"first": "missing second"} + ] } )"); check_schema(b, schema, 0, false, "missing items"); - check_schema(a, a, 0, false, "top-level schema array error"); - check_schema(b, b, 0, false, "lower-level schema array error"); JSON bad_schema = JSON::parse(R"({"a": true, "b": "potato?"})"); check_schema(bad_schema, bad_schema, 0, false, "bad schema field type"); + JSON c = JSON::parse(R"( +{ + "four": [ + { "first": 1 }, + { "oops": [2] } + ] +} +)"); + check_schema(c, schema, JSON::f_optional, false, "array element mismatch"); + // "two" exercises the case of the JSON containing a single // element where the schema has an array. JSON good = JSON::parse(R"( @@ -262,7 +277,11 @@ test_schema() "": { "z": "ebra" } - } + }, + "four": [ + { "first": 1 }, + { "second": [2] } + ] } )"); check_schema(good, schema, 0, false, "not optional"); diff --git a/libtests/libtests.testcov b/libtests/libtests.testcov index 7f71d8e0..2ceef541 100644 --- a/libtests/libtests.testcov +++ b/libtests/libtests.testcov @@ -36,7 +36,6 @@ Pl_PNGFilter decodePaeth 0 Pl_TIFFPredictor processRow 1 JSON wanted dictionary 0 JSON key missing in object 0 -JSON schema array error 0 JSON key extra in object 0 QPDFArgParser read args from stdin 0 QPDFArgParser read args from file 0 @@ -93,3 +92,4 @@ JSON 16 low not after high 0 JSON 16 dangling high 0 JSON parse duplicate key 0 JSON schema array for single item 0 +JSON schema array length mismatch 0 diff --git a/libtests/qtest/json/json.out b/libtests/qtest/json/json.out index 811f8aed..f346daa6 100644 --- a/libtests/qtest/json/json.out +++ b/libtests/qtest/json/json.out @@ -2,6 +2,7 @@ top-level object is supposed to be a dictionary --- --- missing items +json key ".four" is supposed to be an array of length 2 json key ".one.a": key "q" is present in schema but missing in object json key ".one.a.r" is supposed to be a dictionary json key ".one.a.s": key "ss" is present in schema but missing in object @@ -15,16 +16,12 @@ json key ".two.1": key "flarp" is not present in schema but appears in object json key ".two.2" is supposed to be a dictionary json key ".two.3" is supposed to be a dictionary --- ---- top-level schema array error -top-level object schema array contains other than one item ---- ---- lower-level schema array error -json key ".one.a.r" schema array contains other than one item -json key ".two" schema array contains other than one item ---- --- bad schema field type json key ".a" schema value is not dictionary, array, or string --- +--- array element mismatch +json key ".four.1": key "oops" is not present in schema but appears in object +--- --- not optional json key ".three.": key "o" is present in schema but missing in object --- -- cgit v1.2.3-70-g09d2