summaryrefslogtreecommitdiff
path: root/json/tests/draft-next/unevaluatedProperties.json
diff options
context:
space:
mode:
Diffstat (limited to 'json/tests/draft-next/unevaluatedProperties.json')
-rw-r--r--json/tests/draft-next/unevaluatedProperties.json1572
1 files changed, 1572 insertions, 0 deletions
diff --git a/json/tests/draft-next/unevaluatedProperties.json b/json/tests/draft-next/unevaluatedProperties.json
new file mode 100644
index 0000000..69fe8a0
--- /dev/null
+++ b/json/tests/draft-next/unevaluatedProperties.json
@@ -0,0 +1,1572 @@
+[
+ {
+ "description": "unevaluatedProperties true",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "unevaluatedProperties": true
+ },
+ "tests": [
+ {
+ "description": "with no unevaluated properties",
+ "data": {},
+ "valid": true
+ },
+ {
+ "description": "with unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": true
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties schema",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "unevaluatedProperties": {
+ "type": "string",
+ "minLength": 3
+ }
+ },
+ "tests": [
+ {
+ "description": "with no unevaluated properties",
+ "data": {},
+ "valid": true
+ },
+ {
+ "description": "with valid unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": true
+ },
+ {
+ "description": "with invalid unevaluated properties",
+ "data": {
+ "foo": "fo"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties false",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with no unevaluated properties",
+ "data": {},
+ "valid": true
+ },
+ {
+ "description": "with unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with adjacent properties",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with no unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": true
+ },
+ {
+ "description": "with unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with adjacent patternProperties",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "patternProperties": {
+ "^foo": { "type": "string" }
+ },
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with no unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": true
+ },
+ {
+ "description": "with unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with adjacent additionalProperties",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "additionalProperties": true,
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with no additional properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": true
+ },
+ {
+ "description": "with additional properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": true
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with nested properties",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "allOf": [
+ {
+ "properties": {
+ "bar": { "type": "string" }
+ }
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with no additional properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": true
+ },
+ {
+ "description": "with additional properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar",
+ "baz": "baz"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with nested patternProperties",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "allOf": [
+ {
+ "patternProperties": {
+ "^bar": { "type": "string" }
+ }
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with no additional properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": true
+ },
+ {
+ "description": "with additional properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar",
+ "baz": "baz"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with nested additionalProperties",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "allOf": [
+ {
+ "additionalProperties": true
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with no additional properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": true
+ },
+ {
+ "description": "with additional properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": true
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with nested unevaluatedProperties",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "allOf": [
+ {
+ "unevaluatedProperties": true
+ }
+ ],
+ "unevaluatedProperties": {
+ "type": "string",
+ "maxLength": 2
+ }
+ },
+ "tests": [
+ {
+ "description": "with no nested unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": true
+ },
+ {
+ "description": "with nested unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": true
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with anyOf",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "anyOf": [
+ {
+ "properties": {
+ "bar": { "const": "bar" }
+ },
+ "required": ["bar"]
+ },
+ {
+ "properties": {
+ "baz": { "const": "baz" }
+ },
+ "required": ["baz"]
+ },
+ {
+ "properties": {
+ "quux": { "const": "quux" }
+ },
+ "required": ["quux"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "when one matches and has no unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": true
+ },
+ {
+ "description": "when one matches and has unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar",
+ "baz": "not-baz"
+ },
+ "valid": false
+ },
+ {
+ "description": "when two match and has no unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar",
+ "baz": "baz"
+ },
+ "valid": true
+ },
+ {
+ "description": "when two match and has unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar",
+ "baz": "baz",
+ "quux": "not-quux"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with oneOf",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "oneOf": [
+ {
+ "properties": {
+ "bar": { "const": "bar" }
+ },
+ "required": ["bar"]
+ },
+ {
+ "properties": {
+ "baz": { "const": "baz" }
+ },
+ "required": ["baz"]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with no unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": true
+ },
+ {
+ "description": "with unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar",
+ "quux": "quux"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with not",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "not": {
+ "not": {
+ "properties": {
+ "bar": { "const": "bar" }
+ },
+ "required": ["bar"]
+ }
+ },
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with if/then/else",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "if": {
+ "properties": {
+ "foo": { "const": "then" }
+ },
+ "required": ["foo"]
+ },
+ "then": {
+ "properties": {
+ "bar": { "type": "string" }
+ },
+ "required": ["bar"]
+ },
+ "else": {
+ "properties": {
+ "baz": { "type": "string" }
+ },
+ "required": ["baz"]
+ },
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "when if is true and has no unevaluated properties",
+ "data": {
+ "foo": "then",
+ "bar": "bar"
+ },
+ "valid": true
+ },
+ {
+ "description": "when if is true and has unevaluated properties",
+ "data": {
+ "foo": "then",
+ "bar": "bar",
+ "baz": "baz"
+ },
+ "valid": false
+ },
+ {
+ "description": "when if is false and has no unevaluated properties",
+ "data": {
+ "baz": "baz"
+ },
+ "valid": true
+ },
+ {
+ "description": "when if is false and has unevaluated properties",
+ "data": {
+ "foo": "else",
+ "baz": "baz"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with if/then/else, then not defined",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "if": {
+ "properties": {
+ "foo": { "const": "then" }
+ },
+ "required": ["foo"]
+ },
+ "else": {
+ "properties": {
+ "baz": { "type": "string" }
+ },
+ "required": ["baz"]
+ },
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "when if is true and has no unevaluated properties",
+ "data": {
+ "foo": "then",
+ "bar": "bar"
+ },
+ "valid": false
+ },
+ {
+ "description": "when if is true and has unevaluated properties",
+ "data": {
+ "foo": "then",
+ "bar": "bar",
+ "baz": "baz"
+ },
+ "valid": false
+ },
+ {
+ "description": "when if is false and has no unevaluated properties",
+ "data": {
+ "baz": "baz"
+ },
+ "valid": true
+ },
+ {
+ "description": "when if is false and has unevaluated properties",
+ "data": {
+ "foo": "else",
+ "baz": "baz"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with if/then/else, else not defined",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "if": {
+ "properties": {
+ "foo": { "const": "then" }
+ },
+ "required": ["foo"]
+ },
+ "then": {
+ "properties": {
+ "bar": { "type": "string" }
+ },
+ "required": ["bar"]
+ },
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "when if is true and has no unevaluated properties",
+ "data": {
+ "foo": "then",
+ "bar": "bar"
+ },
+ "valid": true
+ },
+ {
+ "description": "when if is true and has unevaluated properties",
+ "data": {
+ "foo": "then",
+ "bar": "bar",
+ "baz": "baz"
+ },
+ "valid": false
+ },
+ {
+ "description": "when if is false and has no unevaluated properties",
+ "data": {
+ "baz": "baz"
+ },
+ "valid": false
+ },
+ {
+ "description": "when if is false and has unevaluated properties",
+ "data": {
+ "foo": "else",
+ "baz": "baz"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with dependentSchemas",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "dependentSchemas": {
+ "foo": {
+ "properties": {
+ "bar": { "const": "bar" }
+ },
+ "required": ["bar"]
+ }
+ },
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with no unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": true
+ },
+ {
+ "description": "with unevaluated properties",
+ "data": {
+ "bar": "bar"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with boolean schemas",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "allOf": [true],
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with no unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": true
+ },
+ {
+ "description": "with unevaluated properties",
+ "data": {
+ "bar": "bar"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with $ref",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "$ref": "#/$defs/bar",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "unevaluatedProperties": false,
+ "$defs": {
+ "bar": {
+ "properties": {
+ "bar": { "type": "string" }
+ }
+ }
+ }
+ },
+ "tests": [
+ {
+ "description": "with no unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": true
+ },
+ {
+ "description": "with unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar",
+ "baz": "baz"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties can't see inside cousins",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "allOf": [
+ {
+ "properties": {
+ "foo": true
+ }
+ },
+ {
+ "unevaluatedProperties": false
+ }
+ ]
+ },
+ "tests": [
+ {
+ "description": "always fails",
+ "data": {
+ "foo": 1
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties can't see inside cousins (reverse order)",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "allOf": [
+ {
+ "unevaluatedProperties": false
+ },
+ {
+ "properties": {
+ "foo": true
+ }
+ }
+ ]
+ },
+ "tests": [
+ {
+ "description": "always fails",
+ "data": {
+ "foo": 1
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "nested unevaluatedProperties, outer false, inner true, properties outside",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "allOf": [
+ {
+ "unevaluatedProperties": true
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with no nested unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": true
+ },
+ {
+ "description": "with nested unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": true
+ }
+ ]
+ },
+ {
+ "description": "nested unevaluatedProperties, outer false, inner true, properties inside",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "allOf": [
+ {
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "unevaluatedProperties": true
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "with no nested unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": true
+ },
+ {
+ "description": "with nested unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": true
+ }
+ ]
+ },
+ {
+ "description": "nested unevaluatedProperties, outer true, inner false, properties outside",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "allOf": [
+ {
+ "unevaluatedProperties": false
+ }
+ ],
+ "unevaluatedProperties": true
+ },
+ "tests": [
+ {
+ "description": "with no nested unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": false
+ },
+ {
+ "description": "with nested unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "nested unevaluatedProperties, outer true, inner false, properties inside",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "allOf": [
+ {
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "unevaluatedProperties": false
+ }
+ ],
+ "unevaluatedProperties": true
+ },
+ "tests": [
+ {
+ "description": "with no nested unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": true
+ },
+ {
+ "description": "with nested unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "cousin unevaluatedProperties, true and false, true with properties",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "allOf": [
+ {
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "unevaluatedProperties": true
+ },
+ {
+ "unevaluatedProperties": false
+ }
+ ]
+ },
+ "tests": [
+ {
+ "description": "with no nested unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": false
+ },
+ {
+ "description": "with nested unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "cousin unevaluatedProperties, true and false, false with properties",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "allOf": [
+ {
+ "unevaluatedProperties": true
+ },
+ {
+ "properties": {
+ "foo": { "type": "string" }
+ },
+ "unevaluatedProperties": false
+ }
+ ]
+ },
+ "tests": [
+ {
+ "description": "with no nested unevaluated properties",
+ "data": {
+ "foo": "foo"
+ },
+ "valid": true
+ },
+ {
+ "description": "with nested unevaluated properties",
+ "data": {
+ "foo": "foo",
+ "bar": "bar"
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "property is evaluated in an uncle schema to unevaluatedProperties",
+ "comment": "see https://stackoverflow.com/questions/66936884/deeply-nested-unevaluatedproperties-and-their-expectations",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "foo": {
+ "type": "object",
+ "properties": {
+ "bar": {
+ "type": "string"
+ }
+ },
+ "unevaluatedProperties": false
+ }
+ },
+ "anyOf": [
+ {
+ "properties": {
+ "foo": {
+ "properties": {
+ "faz": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ "tests": [
+ {
+ "description": "no extra properties",
+ "data": {
+ "foo": {
+ "bar": "test"
+ }
+ },
+ "valid": true
+ },
+ {
+ "description": "uncle keyword evaluation is not significant",
+ "data": {
+ "foo": {
+ "bar": "test",
+ "faz": "test"
+ }
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "in-place applicator siblings, allOf has unevaluated",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "allOf": [
+ {
+ "properties": {
+ "foo": true
+ },
+ "unevaluatedProperties": false
+ }
+ ],
+ "anyOf": [
+ {
+ "properties": {
+ "bar": true
+ }
+ }
+ ]
+ },
+ "tests": [
+ {
+ "description": "base case: both properties present",
+ "data": {
+ "foo": 1,
+ "bar": 1
+ },
+ "valid": false
+ },
+ {
+ "description": "in place applicator siblings, bar is missing",
+ "data": {
+ "foo": 1
+ },
+ "valid": true
+ },
+ {
+ "description": "in place applicator siblings, foo is missing",
+ "data": {
+ "bar": 1
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "in-place applicator siblings, anyOf has unevaluated",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "allOf": [
+ {
+ "properties": {
+ "foo": true
+ }
+ }
+ ],
+ "anyOf": [
+ {
+ "properties": {
+ "bar": true
+ },
+ "unevaluatedProperties": false
+ }
+ ]
+ },
+ "tests": [
+ {
+ "description": "base case: both properties present",
+ "data": {
+ "foo": 1,
+ "bar": 1
+ },
+ "valid": false
+ },
+ {
+ "description": "in place applicator siblings, bar is missing",
+ "data": {
+ "foo": 1
+ },
+ "valid": false
+ },
+ {
+ "description": "in place applicator siblings, foo is missing",
+ "data": {
+ "bar": 1
+ },
+ "valid": true
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties + single cyclic ref",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "type": "object",
+ "properties": {
+ "x": { "$ref": "#" }
+ },
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "Empty is valid",
+ "data": {},
+ "valid": true
+ },
+ {
+ "description": "Single is valid",
+ "data": { "x": {} },
+ "valid": true
+ },
+ {
+ "description": "Unevaluated on 1st level is invalid",
+ "data": { "x": {}, "y": {} },
+ "valid": false
+ },
+ {
+ "description": "Nested is valid",
+ "data": { "x": { "x": {} } },
+ "valid": true
+ },
+ {
+ "description": "Unevaluated on 2nd level is invalid",
+ "data": { "x": { "x": {}, "y": {} } },
+ "valid": false
+ },
+ {
+ "description": "Deep nested is valid",
+ "data": { "x": { "x": { "x": {} } } },
+ "valid": true
+ },
+ {
+ "description": "Unevaluated on 3rd level is invalid",
+ "data": { "x": { "x": { "x": {}, "y": {} } } },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties + ref inside allOf / oneOf",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "$defs": {
+ "one": {
+ "properties": { "a": true }
+ },
+ "two": {
+ "required": ["x"],
+ "properties": { "x": true }
+ }
+ },
+ "allOf": [
+ { "$ref": "#/$defs/one" },
+ { "properties": { "b": true } },
+ {
+ "oneOf": [
+ { "$ref": "#/$defs/two" },
+ {
+ "required": ["y"],
+ "properties": { "y": true }
+ }
+ ]
+ }
+ ],
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "Empty is invalid (no x or y)",
+ "data": {},
+ "valid": false
+ },
+ {
+ "description": "a and b are invalid (no x or y)",
+ "data": { "a": 1, "b": 1 },
+ "valid": false
+ },
+ {
+ "description": "x and y are invalid",
+ "data": { "x": 1, "y": 1 },
+ "valid": false
+ },
+ {
+ "description": "a and x are valid",
+ "data": { "a": 1, "x": 1 },
+ "valid": true
+ },
+ {
+ "description": "a and y are valid",
+ "data": { "a": 1, "y": 1 },
+ "valid": true
+ },
+ {
+ "description": "a and b and x are valid",
+ "data": { "a": 1, "b": 1, "x": 1 },
+ "valid": true
+ },
+ {
+ "description": "a and b and y are valid",
+ "data": { "a": 1, "b": 1, "y": 1 },
+ "valid": true
+ },
+ {
+ "description": "a and b and x and y are invalid",
+ "data": { "a": 1, "b": 1, "x": 1, "y": 1 },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "dynamic evaluation inside nested refs",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "$defs": {
+ "one": {
+ "oneOf": [
+ { "$ref": "#/$defs/two" },
+ { "required": ["b"], "properties": { "b": true } },
+ { "required": ["xx"], "patternProperties": { "x": true } },
+ { "required": ["all"], "unevaluatedProperties": true }
+ ]
+ },
+ "two": {
+ "oneOf": [
+ { "required": ["c"], "properties": { "c": true } },
+ { "required": ["d"], "properties": { "d": true } }
+ ]
+ }
+ },
+ "oneOf": [
+ { "$ref": "#/$defs/one" },
+ { "required": ["a"], "properties": { "a": true } }
+ ],
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "Empty is invalid",
+ "data": {},
+ "valid": false
+ },
+ {
+ "description": "a is valid",
+ "data": { "a": 1 },
+ "valid": true
+ },
+ {
+ "description": "b is valid",
+ "data": { "b": 1 },
+ "valid": true
+ },
+ {
+ "description": "c is valid",
+ "data": { "c": 1 },
+ "valid": true
+ },
+ {
+ "description": "d is valid",
+ "data": { "d": 1 },
+ "valid": true
+ },
+ {
+ "description": "a + b is invalid",
+ "data": { "a": 1, "b": 1 },
+ "valid": false
+ },
+ {
+ "description": "a + c is invalid",
+ "data": { "a": 1, "c": 1 },
+ "valid": false
+ },
+ {
+ "description": "a + d is invalid",
+ "data": { "a": 1, "d": 1 },
+ "valid": false
+ },
+ {
+ "description": "b + c is invalid",
+ "data": { "b": 1, "c": 1 },
+ "valid": false
+ },
+ {
+ "description": "b + d is invalid",
+ "data": { "b": 1, "d": 1 },
+ "valid": false
+ },
+ {
+ "description": "c + d is invalid",
+ "data": { "c": 1, "d": 1 },
+ "valid": false
+ },
+ {
+ "description": "xx is valid",
+ "data": { "xx": 1 },
+ "valid": true
+ },
+ {
+ "description": "xx + foox is valid",
+ "data": { "xx": 1, "foox": 1 },
+ "valid": true
+ },
+ {
+ "description": "xx + foo is invalid",
+ "data": { "xx": 1, "foo": 1 },
+ "valid": false
+ },
+ {
+ "description": "xx + a is invalid",
+ "data": { "xx": 1, "a": 1 },
+ "valid": false
+ },
+ {
+ "description": "xx + b is invalid",
+ "data": { "xx": 1, "b": 1 },
+ "valid": false
+ },
+ {
+ "description": "xx + c is invalid",
+ "data": { "xx": 1, "c": 1 },
+ "valid": false
+ },
+ {
+ "description": "xx + d is invalid",
+ "data": { "xx": 1, "d": 1 },
+ "valid": false
+ },
+ {
+ "description": "all is valid",
+ "data": { "all": 1 },
+ "valid": true
+ },
+ {
+ "description": "all + foo is valid",
+ "data": { "all": 1, "foo": 1 },
+ "valid": true
+ },
+ {
+ "description": "all + a is invalid",
+ "data": { "all": 1, "a": 1 },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties depends on adjacent contains",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "properties": {
+ "foo": { "type": "number" }
+ },
+ "contains": { "type": "string" },
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "bar is evaluated by contains",
+ "data": { "foo": 1, "bar": "foo" },
+ "valid": true
+ },
+ {
+ "description": "contains fails, bar is not evaluated",
+ "data": { "foo": 1, "bar": 2 },
+ "valid": false
+ },
+ {
+ "description": "contains passes, bar is not evaluated",
+ "data": { "foo": 1, "bar": 2, "baz": "foo" },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties depends on multiple nested contains",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "allOf": [
+ { "contains": { "multipleOf": 2 } },
+ { "contains": { "multipleOf": 3 } }
+ ],
+ "unevaluatedProperties": { "multipleOf": 5 }
+ },
+ "tests": [
+ {
+ "description": "5 not evaluated, passes unevaluatedItems",
+ "data": { "a": 2, "b": 3, "c": 4, "d": 5, "e": 6 },
+ "valid": true
+ },
+ {
+ "description": "7 not evaluated, fails unevaluatedItems",
+ "data": { "a": 2, "b": 3, "c": 4, "d": 7, "e": 8 },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "non-object instances are valid",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "ignores booleans",
+ "data": true,
+ "valid": true
+ },
+ {
+ "description": "ignores integers",
+ "data": 123,
+ "valid": true
+ },
+ {
+ "description": "ignores floats",
+ "data": 1.0,
+ "valid": true
+ },
+ {
+ "description": "ignores arrays",
+ "data": [],
+ "valid": true
+ },
+ {
+ "description": "ignores strings",
+ "data": "foo",
+ "valid": true
+ },
+ {
+ "description": "ignores null",
+ "data": null,
+ "valid": true
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties with null valued instance properties",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "unevaluatedProperties": {
+ "type": "null"
+ }
+ },
+ "tests": [
+ {
+ "description": "allows null valued properties",
+ "data": {"foo": null},
+ "valid": true
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties can see inside propertyDependencies",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "properties": {
+ "foo": {
+ "type": "string"
+ }
+ },
+ "propertyDependencies": {
+ "foo": {
+ "foo1": {
+ "properties": {
+ "bar": true
+ }
+ }
+ }
+ },
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "allows bar if foo = foo1",
+ "data": {
+ "foo": "foo1",
+ "bar": 42
+ },
+ "valid": true
+ },
+ {
+ "description": "disallows bar if foo != foo1",
+ "data": {
+ "foo": "foo2",
+ "bar": 42
+ },
+ "valid": false
+ },
+ {
+ "description": "disallows bar if foo is absent",
+ "data": {
+ "bar": 42
+ },
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties not affected by propertyNames",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "propertyNames": {"maxLength": 1},
+ "unevaluatedProperties": {
+ "type": "number"
+ }
+ },
+ "tests": [
+ {
+ "description": "allows only number properties",
+ "data": {"a": 1},
+ "valid": true
+ },
+ {
+ "description": "string property is invalid",
+ "data": {"a": "b"},
+ "valid": false
+ }
+ ]
+ },
+ {
+ "description": "unevaluatedProperties can see annotations from if without then and else",
+ "schema": {
+ "$schema": "https://json-schema.org/draft/next/schema",
+ "if": {
+ "patternProperties": {
+ "foo": {
+ "type": "string"
+ }
+ }
+ },
+ "unevaluatedProperties": false
+ },
+ "tests": [
+ {
+ "description": "valid in case if is evaluated",
+ "data": {
+ "foo": "a"
+ },
+ "valid": true
+ },
+ {
+ "description": "invalid in case if is evaluated",
+ "data": {
+ "bar": "a"
+ },
+ "valid": false
+ }
+ ]
+ }
+]