{
  "tests": [
    {
      "name": "slice selector",
      "selector": "$[1:3]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        1,
        2
      ],
      "result_paths": [
        "$[1]",
        "$[2]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "slice selector with step",
      "selector": "$[1:6:2]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        1,
        3,
        5
      ],
      "result_paths": [
        "$[1]",
        "$[3]",
        "$[5]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "slice selector with everything omitted, short form",
      "selector": "$[:]",
      "document": [
        0,
        1,
        2,
        3
      ],
      "result": [
        0,
        1,
        2,
        3
      ],
      "result_paths": [
        "$[0]",
        "$[1]",
        "$[2]",
        "$[3]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "slice selector with everything omitted, long form",
      "selector": "$[::]",
      "document": [
        0,
        1,
        2,
        3
      ],
      "result": [
        0,
        1,
        2,
        3
      ],
      "result_paths": [
        "$[0]",
        "$[1]",
        "$[2]",
        "$[3]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "slice selector with start omitted",
      "selector": "$[:2]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        0,
        1
      ],
      "result_paths": [
        "$[0]",
        "$[1]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "slice selector with start and end omitted",
      "selector": "$[::2]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        0,
        2,
        4,
        6,
        8
      ],
      "result_paths": [
        "$[0]",
        "$[2]",
        "$[4]",
        "$[6]",
        "$[8]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "negative step with default start and end",
      "selector": "$[::-1]",
      "document": [
        0,
        1,
        2,
        3
      ],
      "result": [
        3,
        2,
        1,
        0
      ],
      "result_paths": [
        "$[3]",
        "$[2]",
        "$[1]",
        "$[0]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "negative step with default start",
      "selector": "$[:0:-1]",
      "document": [
        0,
        1,
        2,
        3
      ],
      "result": [
        3,
        2,
        1
      ],
      "result_paths": [
        "$[3]",
        "$[2]",
        "$[1]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "negative step with default end",
      "selector": "$[2::-1]",
      "document": [
        0,
        1,
        2,
        3
      ],
      "result": [
        2,
        1,
        0
      ],
      "result_paths": [
        "$[2]",
        "$[1]",
        "$[0]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "larger negative step",
      "selector": "$[::-2]",
      "document": [
        0,
        1,
        2,
        3
      ],
      "result": [
        3,
        1
      ],
      "result_paths": [
        "$[3]",
        "$[1]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "negative range with default step",
      "selector": "$[-1:-3]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [],
      "result_paths": [],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "negative range with negative step",
      "selector": "$[-1:-3:-1]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        9,
        8
      ],
      "result_paths": [
        "$[9]",
        "$[8]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "negative range with larger negative step",
      "selector": "$[-1:-6:-2]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        9,
        7,
        5
      ],
      "result_paths": [
        "$[9]",
        "$[7]",
        "$[5]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "larger negative range with larger negative step",
      "selector": "$[-1:-7:-2]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        9,
        7,
        5
      ],
      "result_paths": [
        "$[9]",
        "$[7]",
        "$[5]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "negative from, positive to",
      "selector": "$[-5:7]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        5,
        6
      ],
      "result_paths": [
        "$[5]",
        "$[6]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "negative from",
      "selector": "$[-2:]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        8,
        9
      ],
      "result_paths": [
        "$[8]",
        "$[9]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "positive from, negative to",
      "selector": "$[1:-1]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8
      ],
      "result_paths": [
        "$[1]",
        "$[2]",
        "$[3]",
        "$[4]",
        "$[5]",
        "$[6]",
        "$[7]",
        "$[8]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "negative from, positive to, negative step",
      "selector": "$[-1:1:-1]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        9,
        8,
        7,
        6,
        5,
        4,
        3,
        2
      ],
      "result_paths": [
        "$[9]",
        "$[8]",
        "$[7]",
        "$[6]",
        "$[5]",
        "$[4]",
        "$[3]",
        "$[2]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "positive from, negative to, negative step",
      "selector": "$[7:-5:-1]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        7,
        6
      ],
      "result_paths": [
        "$[7]",
        "$[6]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "in serial, on nested array",
      "selector": "$[1:3][1:2]",
      "document": [
        [
          "a",
          "b",
          "c"
        ],
        [
          "d",
          "e",
          "f"
        ],
        [
          "g",
          "h",
          "i"
        ]
      ],
      "result": [
        "e",
        "h"
      ],
      "result_paths": [
        "$[1][1]",
        "$[2][1]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "in serial, on flat array",
      "selector": "$[1:3][::]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5
      ],
      "result": [],
      "result_paths": [],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "negative from, negative to, positive step",
      "selector": "$[-5:-2]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        5,
        6,
        7
      ],
      "result_paths": [
        "$[5]",
        "$[6]",
        "$[7]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "too many colons",
      "selector": "$[1:2:3:4]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "non-integer array index",
      "selector": "$[1:2:a]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "zero step",
      "selector": "$[1:2:0]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [],
      "result_paths": [],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "empty range",
      "selector": "$[2:2]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [],
      "result_paths": [],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "slice selector with everything omitted with empty array",
      "selector": "$[:]",
      "document": [],
      "result": [],
      "result_paths": [],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "negative step with empty array",
      "selector": "$[::-1]",
      "document": [],
      "result": [],
      "result_paths": [],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "maximal range with positive step",
      "selector": "$[0:10]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result_paths": [
        "$[0]",
        "$[1]",
        "$[2]",
        "$[3]",
        "$[4]",
        "$[5]",
        "$[6]",
        "$[7]",
        "$[8]",
        "$[9]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "maximal range with negative step",
      "selector": "$[9:0:-1]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        9,
        8,
        7,
        6,
        5,
        4,
        3,
        2,
        1
      ],
      "result_paths": [
        "$[9]",
        "$[8]",
        "$[7]",
        "$[6]",
        "$[5]",
        "$[4]",
        "$[3]",
        "$[2]",
        "$[1]"
      ],
      "tags": [
        "slice"
      ]
    },
    {
      "name": "excessively large to value",
      "selector": "$[2:113667776004]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result_paths": [
        "$[2]",
        "$[3]",
        "$[4]",
        "$[5]",
        "$[6]",
        "$[7]",
        "$[8]",
        "$[9]"
      ],
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "excessively small from value",
      "selector": "$[-113667776004:1]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        0
      ],
      "result_paths": [
        "$[0]"
      ],
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "excessively large from value with negative step",
      "selector": "$[113667776004:0:-1]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        9,
        8,
        7,
        6,
        5,
        4,
        3,
        2,
        1
      ],
      "result_paths": [
        "$[9]",
        "$[8]",
        "$[7]",
        "$[6]",
        "$[5]",
        "$[4]",
        "$[3]",
        "$[2]",
        "$[1]"
      ],
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "excessively small to value with negative step",
      "selector": "$[3:-113667776004:-1]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        3,
        2,
        1,
        0
      ],
      "result_paths": [
        "$[3]",
        "$[2]",
        "$[1]",
        "$[0]"
      ],
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "excessively large step",
      "selector": "$[1:10:113667776004]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        1
      ],
      "result_paths": [
        "$[1]"
      ],
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "excessively small step",
      "selector": "$[-1:-10:-113667776004]",
      "document": [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9
      ],
      "result": [
        9
      ],
      "result_paths": [
        "$[9]"
      ],
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "start, min exact",
      "selector": "$[-9007199254740991::]",
      "document": [],
      "result": [],
      "result_paths": [],
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "start, max exact",
      "selector": "$[9007199254740991::]",
      "document": [],
      "result": [],
      "result_paths": [],
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "start, min exact - 1",
      "selector": "$[-9007199254740992::]",
      "invalid_selector": true,
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "start, max exact + 1",
      "selector": "$[9007199254740992::]",
      "invalid_selector": true,
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "end, min exact",
      "selector": "$[:-9007199254740991:]",
      "document": [],
      "result": [],
      "result_paths": [],
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "end, max exact",
      "selector": "$[:9007199254740991:]",
      "document": [],
      "result": [],
      "result_paths": [],
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "end, min exact - 1",
      "selector": "$[:-9007199254740992:]",
      "invalid_selector": true,
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "end, max exact + 1",
      "selector": "$[:9007199254740992:]",
      "invalid_selector": true,
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "step, min exact",
      "selector": "$[::-9007199254740991]",
      "document": [],
      "result": [],
      "result_paths": [],
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "step, max exact",
      "selector": "$[::9007199254740991]",
      "document": [],
      "result": [],
      "result_paths": [],
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "step, min exact - 1",
      "selector": "$[::-9007199254740992]",
      "invalid_selector": true,
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "step, max exact + 1",
      "selector": "$[::9007199254740992]",
      "invalid_selector": true,
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "overflowing to value",
      "selector": "$[2:231584178474632390847141970017375815706539969331281128078915168015826259279872]",
      "invalid_selector": true,
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "underflowing from value",
      "selector": "$[-231584178474632390847141970017375815706539969331281128078915168015826259279872:1]",
      "invalid_selector": true,
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "overflowing from value with negative step",
      "selector": "$[231584178474632390847141970017375815706539969331281128078915168015826259279872:0:-1]",
      "invalid_selector": true,
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "underflowing to value with negative step",
      "selector": "$[3:-231584178474632390847141970017375815706539969331281128078915168015826259279872:-1]",
      "invalid_selector": true,
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "overflowing step",
      "selector": "$[1:10:231584178474632390847141970017375815706539969331281128078915168015826259279872]",
      "invalid_selector": true,
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "underflowing step",
      "selector": "$[-1:-10:-231584178474632390847141970017375815706539969331281128078915168015826259279872]",
      "invalid_selector": true,
      "tags": [
        "slice",
        "boundary"
      ]
    },
    {
      "name": "start, leading 0",
      "selector": "$[01::]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "start, decimal",
      "selector": "$[1.0::]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "start, plus",
      "selector": "$[+1::]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "start, minus space",
      "selector": "$[- 1::]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "start, -0",
      "selector": "$[-0::]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "start, leading -0",
      "selector": "$[-01::]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "end, leading 0",
      "selector": "$[:01:]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "end, decimal",
      "selector": "$[:1.0:]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "end, plus",
      "selector": "$[:+1:]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "end, minus space",
      "selector": "$[:- 1:]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "end, -0",
      "selector": "$[:-0:]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "end, leading -0",
      "selector": "$[:-01:]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "step, leading 0",
      "selector": "$[::01]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "step, decimal",
      "selector": "$[::1.0]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "step, plus",
      "selector": "$[::+1]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "step, minus space",
      "selector": "$[::- 1]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "step, -0",
      "selector": "$[::-0]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    },
    {
      "name": "step, leading -0",
      "selector": "$[::-01]",
      "invalid_selector": true,
      "tags": [
        "slice"
      ]
    }
  ]
}
