[
    {
        "description": "a schema given for items",
        "schema": {
            "items": {"type": "integer"}
        },
        "tests": [
            {
                "description": "valid items",
                "data": [ 1, 2, 3 ],
                "valid": true
            },
            {
                "description": "wrong type of items",
                "data": [1, "x"],
                "valid": false
            },
            {
                "description": "ignores non-arrays",
                "data": {"foo" : "bar"},
                "valid": true
            },
            {
                "description": "JavaScript pseudo-array is valid",
                "data": {
                    "0": "invalid",
                    "length": 1
                },
                "valid": true
            }
        ]
    },
    {
        "description": "an array of schemas for items",
        "schema": {
            "items": [
                {"type": "integer"},
                {"type": "string"}
            ]
        },
        "tests": [
            {
                "description": "correct types",
                "data": [ 1, "foo" ],
                "valid": true
            },
            {
                "description": "wrong types",
                "data": [ "foo", 1 ],
                "valid": false
            },
            {
                "description": "incomplete array of items",
                "data": [ 1 ],
                "valid": true
            },
            {
                "description": "array with additional items",
                "data": [ 1, "foo", true ],
                "valid": true
            },
            {
                "description": "empty array",
                "data": [ ],
                "valid": true
            },
            {
                "description": "JavaScript pseudo-array is valid",
                "data": {
                    "0": "invalid",
                    "1": "valid",
                    "length": 2
                },
                "valid": true
            }
        ]
    },
    {
        "description": "items with boolean schema (true)",
        "schema": {"items": true},
        "tests": [
            {
                "description": "any array is valid",
                "data": [ 1, "foo", true ],
                "valid": true
            },
            {
                "description": "empty array is valid",
                "data": [],
                "valid": true
            }
        ]
    },
    {
        "description": "items with boolean schema (false)",
        "schema": {"items": false},
        "tests": [
            {
                "description": "any non-empty array is invalid",
                "data": [ 1, "foo", true ],
                "valid": false
            },
            {
                "description": "empty array is valid",
                "data": [],
                "valid": true
            }
        ]
    },
    {
        "description": "items with boolean schemas",
        "schema": {
            "items": [true, false]
        },
        "tests": [
            {
                "description": "array with one item is valid",
                "data": [ 1 ],
                "valid": true
            },
            {
                "description": "array with two items is invalid",
                "data": [ 1, "foo" ],
                "valid": false
            },
            {
                "description": "empty array is valid",
                "data": [],
                "valid": true
            }
        ]
    },
    {
        "description": "items and subitems",
        "schema": {
            "definitions": {
                "item": {
                    "type": "array",
                    "additionalItems": false,
                    "items": [
                        { "$ref": "#/definitions/sub-item" },
                        { "$ref": "#/definitions/sub-item" }
                    ]
                },
                "sub-item": {
                    "type": "object",
                    "required": ["foo"]
                }
            },
            "type": "array",
            "additionalItems": false,
            "items": [
                { "$ref": "#/definitions/item" },
                { "$ref": "#/definitions/item" },
                { "$ref": "#/definitions/item" }
            ]
        },
        "tests": [
            {
                "description": "valid items",
                "data": [
                    [ {"foo": null}, {"foo": null} ],
                    [ {"foo": null}, {"foo": null} ],
                    [ {"foo": null}, {"foo": null} ]
                ],
                "valid": true
            },
            {
                "description": "too many items",
                "data": [
                    [ {"foo": null}, {"foo": null} ],
                    [ {"foo": null}, {"foo": null} ],
                    [ {"foo": null}, {"foo": null} ],
                    [ {"foo": null}, {"foo": null} ]
                ],
                "valid": false
            },
            {
                "description": "too many sub-items",
                "data": [
                    [ {"foo": null}, {"foo": null}, {"foo": null} ],
                    [ {"foo": null}, {"foo": null} ],
                    [ {"foo": null}, {"foo": null} ]
                ],
                "valid": false
            },
            {
                "description": "wrong item",
                "data": [
                    {"foo": null},
                    [ {"foo": null}, {"foo": null} ],
                    [ {"foo": null}, {"foo": null} ]
                ],
                "valid": false
            },
            {
                "description": "wrong sub-item",
                "data": [
                    [ {}, {"foo": null} ],
                    [ {"foo": null}, {"foo": null} ],
                    [ {"foo": null}, {"foo": null} ]
                ],
                "valid": false
            },
            {
                "description": "fewer items is valid",
                "data": [
                    [ {"foo": null} ],
                    [ {"foo": null} ]
                ],
                "valid": true
            }
        ]
    },
    {
        "description": "nested items",
        "schema": {
            "type": "array",
            "items": {
                "type": "array",
                "items": {
                    "type": "array",
                    "items": {
                        "type": "array",
                        "items": {
                            "type": "number"
                        }
                    }
                }
            }
        },
        "tests": [
            {
                "description": "valid nested array",
                "data": [[[[1]], [[2],[3]]], [[[4], [5], [6]]]],
                "valid": true
            },
            {
                "description": "nested array with invalid type",
                "data": [[[["1"]], [[2],[3]]], [[[4], [5], [6]]]],
                "valid": false
            },
            {
                "description": "not deep enough",
                "data": [[[1], [2],[3]], [[4], [5], [6]]],
                "valid": false
            }
        ]
    }
]
