[
    {
        "description": "unevaluatedItems true",
        "schema": {
            "type": "array",
            "unevaluatedItems": true
        },
        "tests": [
            {
                "description": "with no unevaluated items",
                "data": [],
                "valid": true
            },
            {
                "description": "with unevaluated items",
                "data": ["foo"],
                "valid": true
            }
        ]
    },
    {
        "description": "unevaluatedItems false",
        "schema": {
            "type": "array",
            "unevaluatedItems": false
        },
        "tests": [
            {
                "description": "with no unevaluated items",
                "data": [],
                "valid": true
            },
            {
                "description": "with unevaluated items",
                "data": ["foo"],
                "valid": false
            }
        ]
    },
    {
        "description": "unevaluatedItems as schema",
        "schema": {
            "type": "array",
            "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": {
            "type": "array",
            "items": { "type": "string" },
            "unevaluatedItems": false
        },
        "tests": [
            {
                "description": "unevaluatedItems doesn't apply",
                "data": ["foo", "bar"],
                "valid": true
            }
        ]
    },
    {
        "description": "unevaluatedItems with tuple",
        "schema": {
            "type": "array",
            "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 additionalItems",
        "schema": {
            "type": "array",
            "items": [
                { "type": "string" }
            ],
            "additionalItems": true,
            "unevaluatedItems": false
        },
        "tests": [
            {
                "description": "unevaluatedItems doesn't apply",
                "data": ["foo", 42],
                "valid": true
            }
        ]
    },
    {
        "description": "unevaluatedItems with nested tuple",
        "schema": {
            "type": "array",
            "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 additionalItems",
        "schema": {
            "type": "array",
            "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": {
            "type": "array",
            "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": {
            "type": "array",
            "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": {
            "type": "array",
            "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": {
            "type": "array",
            "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": {
            "type": "array",
            "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": {
            "type": "array",
            "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": {
            "type": "array",
            "$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 can't see inside cousins",
        "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": {
            "type": "object",
            "properties": {
                "foo": {
                    "type": "array",
                    "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
            }
        ]
    }
]