[
    {
        "description": "short-circuit with items",
        "schema": {
            "items": { "multipleOf": 2 }
        },
        "tests": [
            {
                "description": "single item is valid",
                "data": [ 2 ],
                "valid": true
            },
            {
                "description": "second item is invalid",
                "data": [ 2, 1 ],
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with prefixItems",
        "schema": {
            "prefixItems": [
                { "multipleOf": 2 },
                { "multipleOf": 2 }
            ]
        },
        "tests": [
            {
                "description": "single item is valid",
                "data": [ 2 ],
                "valid": true
            },
            {
                "description": "second item is invalid",
                "data": [ 2, 1 ],
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with items",
        "schema": {
            "prefixItems": [ true ],
            "items": { "multipleOf": 2 }
        },
        "tests": [
            {
                "description": "single additional item is valid",
                "data": [ 1, 2 ],
                "valid": true
            },
            {
                "description": "second additional item is invalid",
                "data": [ 1, 2, 1 ],
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with unevaluatedItems",
        "schema": {
            "unevaluatedItems": { "multipleOf": 2 }
        },
        "tests": [
            {
                "description": "single item is valid",
                "data": [ 2 ],
                "valid": true
            },
            {
                "description": "second item is invalid",
                "data": [ 2, 1 ],
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with properties",
        "schema": {
            "properties": {
                "alpha": { "multipleOf": 2 },
                "beta": { "multipleOf": 2 }
            }
        },
        "tests": [
            {
                "description": "single property is valid",
                "data": { "alpha": 2 },
                "valid": true
            },
            {
                "description": "second property is invalid",
                "data": { "alpha": 2, "beta": 1 },
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with properties and unevaluatedProperties",
        "schema": {
            "properties": {
                "alpha": true,
                "beta": false,
                "gamma": true
            },
            "unevaluatedProperties": false
        },
        "tests": [
            {
                "description": "single property is valid",
                "data": { "alpha": 1 },
                "valid": true
            },
            {
                "description": "second property is invalid",
                "data": { "alpha": 1, "beta": 2 },
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with patternProperties",
        "schema": {
            "patternProperties": {
                "^a": { "multipleOf": 2 },
                "^b": { "multipleOf": 2 }
            }
        },
        "tests": [
            {
                "description": "single property is valid",
                "data": { "alpha": 2 },
                "valid": true
            },
            {
                "description": "second property is invalid",
                "data": { "alpha": 2, "beta": 1 },
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with patternProperties and boolean schemas",
        "schema": {
            "patternProperties": {
                "^a": true,
                "^b": false
            }
        },
        "tests": [
            {
                "description": "single property is valid",
                "data": { "alpha": 2 },
                "valid": true
            },
            {
                "description": "second property is invalid",
                "data": { "alpha": 2, "beta": 1 },
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with additionalProperties",
        "schema": {
            "additionalProperties": { "multipleOf": 2 }
        },
        "tests": [
            {
                "description": "single property is valid",
                "data": { "alpha": 2 },
                "valid": true
            },
            {
                "description": "second property is invalid",
                "data": { "alpha": 2, "beta": 1 },
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with unevaluatedProperties",
        "schema": {
            "unevaluatedProperties": { "multipleOf": 2 }
        },
        "tests": [
            {
                "description": "single property is valid",
                "data": { "alpha": 2 },
                "valid": true
            },
            {
                "description": "second property is invalid",
                "data": { "alpha": 2, "beta": 1 },
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with allOf",
        "schema": {
            "allOf": [
                false,
                {
                    "properties": {
                        "alpha": {},
                        "beta": {}
                    }
                }
            ],
            "unevaluatedProperties": false
        },
        "tests": [
            {
                "description": "'unevaluated' errors are produced iff short_circuit is false",
                "data": { "alpha": 1, "gamma": 3 },
                "valid": false
            },
            {
                "description": "/allOf/0 guarantees a false result even when all branches are evaluated",
                "data": { "alpha": 1, "beta": 2 },
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with anyOf",
        "schema": {
            "anyOf": [
                true,
                {
                    "properties": {
                        "alpha": {},
                        "beta": {}
                    }
                }
            ],
            "unevaluatedProperties": false
        },
        "tests": [
            {
                "description": "some properties are unevaluated",
                "data": { "alpha": 1, "gamma": 1 },
                "valid": false
            },
            {
                "description": "all branches are still evaluated, even though we would have wanted to abort earlier",
                "data": { "alpha": 1, "beta": 2 },
                "valid": true
            }
        ]
    },
    {
        "description": "short-circuit with oneOf",
        "schema": {
            "oneOf": [
                {
                    "required": ["alpha"],
                    "properties": {
                        "alpha": { "const": 1 }
                    }
                },
                {
                    "required": ["beta"],
                    "properties": {
                        "beta": { "const": 2 }
                    }
                },
                {
                    "required": ["gamma"],
                    "properties": {
                        "gamma": { "const": 3 }
                    }
                }
            ],
            "unevaluatedProperties": false
        },
        "tests": [
            {
                "description": "we can safely short-circuit after two valid oneOfs; gamma never gets evaluated; incorrect unevaluated error is not produced",
                "data": { "alpha": 1, "beta": 2, "gamma": 3 },
                "valid": false
            },
            {
                "description": "all branches are still evaluated, even though we would have wanted to abort earlier",
                "data": { "alpha": 1, "delta": 4 },
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with contains and maxContains and unevaluatedItems",
        "schema": {
            "type": "array",
            "contains": { "const": 1 },
            "maxContains": 3,
            "unevaluatedItems": false
        },
        "tests": [
            {
                "description": "satisfying maxContains is always valid",
                "data": [ 1, 1, 1 ],
                "valid": true
            },
            {
                "description": "checking maxContains always requires evaluating every item, which also ensures that the unevaluated check is correct",
                "data": [ 1, 1, 8 ],
                "valid": false
            },
            {
                "description": "not satisfying maxContains is invalid overall, even when unevaluatedItems is valid",
                "data": [ 1, 1, 1, 1, 1 ],
                "valid": false
            },
            {
                "description": "not satisfying maxContains is invalid overall, so we can safely skip evaluating items as soon as we exceed the maximum quantity",
                "data": [ 1, 1, 1, 1, 8 ],
                "valid": false
            }
        ]
    },
    {
        "description": "short-circuit with contains and minContains and unevaluatedItems",
        "schema": {
            "type": "array",
            "contains": { "const": 1 },
            "minContains": 2,
            "unevaluatedItems": false
        },
        "tests": [
            {
                "description": "not satisfying minContains is always invalid overall, even when unevaluatedItems is valid",
                "data": [ 1 ],
                "valid": false
            },
            {
                "description": "not satisfying minContains is always invalid overall, so unevaluatedItems can be safely skipped",
                "data": [ 0 ],
                "valid": false
            },
            {
                "description": "all items must still be evaluated, even though we would have wanted to abort earlier due to satisfying minContains early, to allow unevaluatedItems to succeed",
                "data": [ 1, 1, 1, 1 ],
                "valid": true
            },
            {
                "description": "all items must still be evaluated, even though we would have wanted to abort earlier due to satisfying minContains early, to not unevaluatedItems give a false negative",
                "data": [ 1, 1, 3, 4 ],
                "valid": false
            }
        ]
    }
]