blob: 8e2ee4b118b604f0f26c067db00a44157fd019d4 [file] [log] [blame] [edit]
[
{
"description": "unevaluatedItems true",
"schema": {
"$schema": "https://json-schema.org/draft/2019-09/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/2019-09/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/2019-09/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/2019-09/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/2019-09/schema",
"items": [
{ "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 additionalItems",
"schema": {
"$schema": "https://json-schema.org/draft/2019-09/schema",
"items": [
{ "type": "string" }
],
"additionalItems": true,
"unevaluatedItems": false
},
"tests": [
{
"description": "unevaluatedItems doesn't apply",
"data": ["foo", 42],
"valid": true
}
]
},
{
"description": "unevaluatedItems with ignored additionalItems",
"schema": {
"$schema": "https://json-schema.org/draft/2019-09/schema",
"additionalItems": {"type": "number"},
"unevaluatedItems": {"type": "string"}
},
"tests": [
{
"description": "invalid under unevaluatedItems",
"comment": "additionalItems is entirely ignored when items isn't present, so all elements need to be valid against the unevaluatedItems schema",
"data": ["foo", 1],
"valid": false
},
{
"description": "all valid under unevaluatedItems",
"data": ["foo", "bar", "baz"],
"valid": true
}
]
},
{
"description": "unevaluatedItems with ignored applicator additionalItems",
"schema": {
"$schema": "https://json-schema.org/draft/2019-09/schema",
"allOf": [ { "additionalItems": { "type": "number" } } ],
"unevaluatedItems": {"type": "string"}
},
"tests": [
{
"description": "invalid under unevaluatedItems",
"comment": "additionalItems is entirely ignored when items isn't present, so all elements need to be valid against the unevaluatedItems schema",
"data": ["foo", 1],
"valid": false
},
{
"description": "all valid under unevaluatedItems",
"data": ["foo", "bar", "baz"],
"valid": true
}
]
},
{
"description": "unevaluatedItems with nested tuple",
"schema": {
"$schema": "https://json-schema.org/draft/2019-09/schema",
"items": [
{ "type": "string" }
],
"allOf": [
{
"items": [
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/2019-09/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 items and additionalItems",
"schema": {
"$schema": "https://json-schema.org/draft/2019-09/schema",
"allOf": [
{
"items": [
{ "type": "string" }
],
"additionalItems": 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/2019-09/schema",
"allOf": [
{
"items": [
{ "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/2019-09/schema",
"items": [
{ "const": "foo" }
],
"anyOf": [
{
"items": [
true,
{ "const": "bar" }
]
},
{
"items": [
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/2019-09/schema",
"items": [
{ "const": "foo" }
],
"oneOf": [
{
"items": [
true,
{ "const": "bar" }
]
},
{
"items": [
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/2019-09/schema",
"items": [
{ "const": "foo" }
],
"not": {
"not": {
"items": [
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/2019-09/schema",
"items": [ { "const": "foo" } ],
"if": {
"items": [
true,
{ "const": "bar" }
]
},
"then": {
"items": [
true,
true,
{ "const": "then" }
]
},
"else": {
"items": [
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/2019-09/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/2019-09/schema",
"$ref": "#/$defs/bar",
"items": [
{ "type": "string" }
],
"unevaluatedItems": false,
"$defs": {
"bar": {
"items": [
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/2019-09/schema",
"unevaluatedItems": false,
"items": [
{ "type": "string" }
],
"$ref": "#/$defs/bar",
"$defs": {
"bar": {
"items": [
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 $recursiveRef",
"schema": {
"$schema": "https://json-schema.org/draft/2019-09/schema",
"$id": "https://example.com/unevaluated-items-with-recursive-ref/extended-tree",
"$recursiveAnchor": true,
"$ref": "./tree",
"items": [
true,
true,
{ "type": "string" }
],
"$defs": {
"tree": {
"$id": "./tree",
"$recursiveAnchor": true,
"type": "array",
"items": [
{ "type": "number" },
{
"$comment": "unevaluatedItems comes first so it's more likely to catch bugs with implementations that are sensitive to keyword ordering",
"unevaluatedItems": false,
"$recursiveRef": "#"
}
]
}
}
},
"tests": [
{
"description": "with no unevaluated items",
"data": [1, [2, [], "b"], "a"],
"valid": true
},
{
"description": "with unevaluated items",
"data": [1, [2, [], "b", "too many"], "a"],
"valid": false
}
]
},
{
"description": "unevaluatedItems can't see inside cousins",
"schema": {
"$schema": "https://json-schema.org/draft/2019-09/schema",
"allOf": [
{
"items": [ 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/2019-09/schema",
"properties": {
"foo": {
"items": [
{ "type": "string" }
],
"unevaluatedItems": false
}
},
"anyOf": [
{
"properties": {
"foo": {
"items": [
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": "non-array instances are valid",
"schema": {
"$schema": "https://json-schema.org/draft/2019-09/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/2019-09/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/2019-09/schema",
"if": {
"items": [{"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
}
]
}
]