| [ |
| { |
| "description": "unevaluatedItems true", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "unevaluatedItems": true |
| }, |
| "tests": [ |
| { |
| "description": "with no unevaluated items", |
| "data": [], |
| "valid": true |
| }, |
| { |
| "description": "with unevaluated items", |
| "data": ["foo"], |
| "valid": true |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems false", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "with no unevaluated items", |
| "data": [], |
| "valid": true |
| }, |
| { |
| "description": "with unevaluated items", |
| "data": ["foo"], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems as schema", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "unevaluatedItems": { "type": "string" } |
| }, |
| "tests": [ |
| { |
| "description": "with no unevaluated items", |
| "data": [], |
| "valid": true |
| }, |
| { |
| "description": "with valid unevaluated items", |
| "data": ["foo"], |
| "valid": true |
| }, |
| { |
| "description": "with invalid unevaluated items", |
| "data": [42], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with uniform items", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "items": { "type": "string" }, |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "unevaluatedItems doesn't apply", |
| "data": ["foo", "bar"], |
| "valid": true |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with tuple", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "prefixItems": [ |
| { "type": "string" } |
| ], |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "with no unevaluated items", |
| "data": ["foo"], |
| "valid": true |
| }, |
| { |
| "description": "with unevaluated items", |
| "data": ["foo", "bar"], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with items and prefixItems", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "prefixItems": [ |
| { "type": "string" } |
| ], |
| "items": true, |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "unevaluatedItems doesn't apply", |
| "data": ["foo", 42], |
| "valid": true |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with items", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "items": {"type": "number"}, |
| "unevaluatedItems": {"type": "string"} |
| }, |
| "tests": [ |
| { |
| "description": "valid under items", |
| "comment": "no elements are considered by unevaluatedItems", |
| "data": [5, 6, 7, 8], |
| "valid": true |
| }, |
| { |
| "description": "invalid under items", |
| "data": ["foo", "bar", "baz"], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with nested tuple", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "prefixItems": [ |
| { "type": "string" } |
| ], |
| "allOf": [ |
| { |
| "prefixItems": [ |
| true, |
| { "type": "number" } |
| ] |
| } |
| ], |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "with no unevaluated items", |
| "data": ["foo", 42], |
| "valid": true |
| }, |
| { |
| "description": "with unevaluated items", |
| "data": ["foo", 42, true], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with nested items", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "unevaluatedItems": {"type": "boolean"}, |
| "anyOf": [ |
| { "items": {"type": "string"} }, |
| true |
| ] |
| }, |
| "tests": [ |
| { |
| "description": "with only (valid) additional items", |
| "data": [true, false], |
| "valid": true |
| }, |
| { |
| "description": "with no additional items", |
| "data": ["yes", "no"], |
| "valid": true |
| }, |
| { |
| "description": "with invalid additional item", |
| "data": ["yes", false], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with nested prefixItems and items", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "allOf": [ |
| { |
| "prefixItems": [ |
| { "type": "string" } |
| ], |
| "items": true |
| } |
| ], |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "with no additional items", |
| "data": ["foo"], |
| "valid": true |
| }, |
| { |
| "description": "with additional items", |
| "data": ["foo", 42, true], |
| "valid": true |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with nested unevaluatedItems", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "allOf": [ |
| { |
| "prefixItems": [ |
| { "type": "string" } |
| ] |
| }, |
| { "unevaluatedItems": true } |
| ], |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "with no additional items", |
| "data": ["foo"], |
| "valid": true |
| }, |
| { |
| "description": "with additional items", |
| "data": ["foo", 42, true], |
| "valid": true |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with anyOf", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "prefixItems": [ |
| { "const": "foo" } |
| ], |
| "anyOf": [ |
| { |
| "prefixItems": [ |
| true, |
| { "const": "bar" } |
| ] |
| }, |
| { |
| "prefixItems": [ |
| true, |
| true, |
| { "const": "baz" } |
| ] |
| } |
| ], |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "when one schema matches and has no unevaluated items", |
| "data": ["foo", "bar"], |
| "valid": true |
| }, |
| { |
| "description": "when one schema matches and has unevaluated items", |
| "data": ["foo", "bar", 42], |
| "valid": false |
| }, |
| { |
| "description": "when two schemas match and has no unevaluated items", |
| "data": ["foo", "bar", "baz"], |
| "valid": true |
| }, |
| { |
| "description": "when two schemas match and has unevaluated items", |
| "data": ["foo", "bar", "baz", 42], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with oneOf", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "prefixItems": [ |
| { "const": "foo" } |
| ], |
| "oneOf": [ |
| { |
| "prefixItems": [ |
| true, |
| { "const": "bar" } |
| ] |
| }, |
| { |
| "prefixItems": [ |
| true, |
| { "const": "baz" } |
| ] |
| } |
| ], |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "with no unevaluated items", |
| "data": ["foo", "bar"], |
| "valid": true |
| }, |
| { |
| "description": "with unevaluated items", |
| "data": ["foo", "bar", 42], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with not", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "prefixItems": [ |
| { "const": "foo" } |
| ], |
| "not": { |
| "not": { |
| "prefixItems": [ |
| true, |
| { "const": "bar" } |
| ] |
| } |
| }, |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "with unevaluated items", |
| "data": ["foo", "bar"], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with if/then/else", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "prefixItems": [ |
| { "const": "foo" } |
| ], |
| "if": { |
| "prefixItems": [ |
| true, |
| { "const": "bar" } |
| ] |
| }, |
| "then": { |
| "prefixItems": [ |
| true, |
| true, |
| { "const": "then" } |
| ] |
| }, |
| "else": { |
| "prefixItems": [ |
| true, |
| true, |
| true, |
| { "const": "else" } |
| ] |
| }, |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "when if matches and it has no unevaluated items", |
| "data": ["foo", "bar", "then"], |
| "valid": true |
| }, |
| { |
| "description": "when if matches and it has unevaluated items", |
| "data": ["foo", "bar", "then", "else"], |
| "valid": false |
| }, |
| { |
| "description": "when if doesn't match and it has no unevaluated items", |
| "data": ["foo", 42, 42, "else"], |
| "valid": true |
| }, |
| { |
| "description": "when if doesn't match and it has unevaluated items", |
| "data": ["foo", 42, 42, "else", 42], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with boolean schemas", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "allOf": [true], |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "with no unevaluated items", |
| "data": [], |
| "valid": true |
| }, |
| { |
| "description": "with unevaluated items", |
| "data": ["foo"], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with $ref", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "$ref": "#/$defs/bar", |
| "prefixItems": [ |
| { "type": "string" } |
| ], |
| "unevaluatedItems": false, |
| "$defs": { |
| "bar": { |
| "prefixItems": [ |
| true, |
| { "type": "string" } |
| ] |
| } |
| } |
| }, |
| "tests": [ |
| { |
| "description": "with no unevaluated items", |
| "data": ["foo", "bar"], |
| "valid": true |
| }, |
| { |
| "description": "with unevaluated items", |
| "data": ["foo", "bar", "baz"], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems before $ref", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "unevaluatedItems": false, |
| "prefixItems": [ |
| { "type": "string" } |
| ], |
| "$ref": "#/$defs/bar", |
| "$defs": { |
| "bar": { |
| "prefixItems": [ |
| true, |
| { "type": "string" } |
| ] |
| } |
| } |
| }, |
| "tests": [ |
| { |
| "description": "with no unevaluated items", |
| "data": ["foo", "bar"], |
| "valid": true |
| }, |
| { |
| "description": "with unevaluated items", |
| "data": ["foo", "bar", "baz"], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with $dynamicRef", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "$id": "https://example.com/unevaluated-items-with-dynamic-ref/derived", |
| |
| "$ref": "./baseSchema", |
| |
| "$defs": { |
| "derived": { |
| "$dynamicAnchor": "addons", |
| "prefixItems": [ |
| true, |
| { "type": "string" } |
| ] |
| }, |
| "baseSchema": { |
| "$id": "./baseSchema", |
| |
| "$comment": "unevaluatedItems comes first so it's more likely to catch bugs with implementations that are sensitive to keyword ordering", |
| "unevaluatedItems": false, |
| "type": "array", |
| "prefixItems": [ |
| { "type": "string" } |
| ], |
| "$dynamicRef": "#addons" |
| } |
| } |
| }, |
| "tests": [ |
| { |
| "description": "with no unevaluated items", |
| "data": ["foo", "bar"], |
| "valid": true |
| }, |
| { |
| "description": "with unevaluated items", |
| "data": ["foo", "bar", "baz"], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems can't see inside cousins", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "allOf": [ |
| { |
| "prefixItems": [ true ] |
| }, |
| { "unevaluatedItems": false } |
| ] |
| }, |
| "tests": [ |
| { |
| "description": "always fails", |
| "data": [ 1 ], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "item is evaluated in an uncle schema to unevaluatedItems", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "properties": { |
| "foo": { |
| "prefixItems": [ |
| { "type": "string" } |
| ], |
| "unevaluatedItems": false |
| } |
| }, |
| "anyOf": [ |
| { |
| "properties": { |
| "foo": { |
| "prefixItems": [ |
| true, |
| { "type": "string" } |
| ] |
| } |
| } |
| } |
| ] |
| }, |
| "tests": [ |
| { |
| "description": "no extra items", |
| "data": { |
| "foo": [ |
| "test" |
| ] |
| }, |
| "valid": true |
| }, |
| { |
| "description": "uncle keyword evaluation is not significant", |
| "data": { |
| "foo": [ |
| "test", |
| "test" |
| ] |
| }, |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems depends on adjacent contains", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "prefixItems": [true], |
| "contains": {"type": "string"}, |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "second item is evaluated by contains", |
| "data": [ 1, "foo" ], |
| "valid": true |
| }, |
| { |
| "description": "contains fails, second item is not evaluated", |
| "data": [ 1, 2 ], |
| "valid": false |
| }, |
| { |
| "description": "contains passes, second item is not evaluated", |
| "data": [ 1, 2, "foo" ], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems depends on multiple nested contains", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "allOf": [ |
| { "contains": { "multipleOf": 2 } }, |
| { "contains": { "multipleOf": 3 } } |
| ], |
| "unevaluatedItems": { "multipleOf": 5 } |
| }, |
| "tests": [ |
| { |
| "description": "5 not evaluated, passes unevaluatedItems", |
| "data": [ 2, 3, 4, 5, 6 ], |
| "valid": true |
| }, |
| { |
| "description": "7 not evaluated, fails unevaluatedItems", |
| "data": [ 2, 3, 4, 7, 8 ], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems and contains interact to control item dependency relationship", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "if": { |
| "contains": {"const": "a"} |
| }, |
| "then": { |
| "if": { |
| "contains": {"const": "b"} |
| }, |
| "then": { |
| "if": { |
| "contains": {"const": "c"} |
| } |
| } |
| }, |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "empty array is valid", |
| "data": [], |
| "valid": true |
| }, |
| { |
| "description": "only a's are valid", |
| "data": [ "a", "a" ], |
| "valid": true |
| }, |
| { |
| "description": "a's and b's are valid", |
| "data": [ "a", "b", "a", "b", "a" ], |
| "valid": true |
| }, |
| { |
| "description": "a's, b's and c's are valid", |
| "data": [ "c", "a", "c", "c", "b", "a" ], |
| "valid": true |
| }, |
| { |
| "description": "only b's are invalid", |
| "data": [ "b", "b" ], |
| "valid": false |
| }, |
| { |
| "description": "only c's are invalid", |
| "data": [ "c", "c" ], |
| "valid": false |
| }, |
| { |
| "description": "only b's and c's are invalid", |
| "data": [ "c", "b", "c", "b", "c" ], |
| "valid": false |
| }, |
| { |
| "description": "only a's and c's are invalid", |
| "data": [ "c", "a", "c", "a", "c" ], |
| "valid": false |
| } |
| ] |
| }, |
| { |
| "description": "non-array instances are valid", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "unevaluatedItems": 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 objects", |
| "data": {}, |
| "valid": true |
| }, |
| { |
| "description": "ignores strings", |
| "data": "foo", |
| "valid": true |
| }, |
| { |
| "description": "ignores null", |
| "data": null, |
| "valid": true |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems with null instance elements", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "unevaluatedItems": { |
| "type": "null" |
| } |
| }, |
| "tests": [ |
| { |
| "description": "allows null elements", |
| "data": [ null ], |
| "valid": true |
| } |
| ] |
| }, |
| { |
| "description": "unevaluatedItems can see annotations from if without then and else", |
| "schema": { |
| "$schema": "https://json-schema.org/draft/next/schema", |
| "if": { |
| "prefixItems": [{"const": "a"}] |
| }, |
| "unevaluatedItems": false |
| }, |
| "tests": [ |
| { |
| "description": "valid in case if is evaluated", |
| "data": [ "a" ], |
| "valid": true |
| }, |
| { |
| "description": "invalid in case if is evaluated", |
| "data": [ "b" ], |
| "valid": false |
| } |
| |
| ] |
| } |
| ] |