def test_search_nested():
    path = (
        "moose",  # {}
        ijsongenerators.WILDCARD,  # []
        ijsongenerators.WILDCARD,  # {}
    )
    gen = ijsongenerators.search(
        io.BytesIO(b"""{"moose":[{"goose":[{"house":[{"truce":0}]}]}]}"""),
        *path)
    assert list(gen) == [(("moose", 0, "goose"), [{"house": [{"truce": 0}]}])]
def test_search_wildcard():
    gen = ijsongenerators.search(
        io.BytesIO(
            b'{"moose": {"a": [1, 2, 3], "b": {"nested": [1, 2, 3]}, "c": [4, 5, 6]}, "d": 1}'
        ),
        ijsongenerators.WILDCARD,  # match moose / b / c
        ijsongenerators.WILDCARD,  # match a / nested / array
    )
    assert next(gen) == (("moose", "a"), [1, 2, 3])
    assert next(gen) == (("moose", "b"), {"nested": [1, 2, 3]})
    assert next(gen) == (("moose", "c"), [4, 5, 6])
def test_search():
    for path, v in ijsongenerators.search(
            io.BytesIO(
                b'{"moose": {"a": [1, 2, 3], "b": {"nested": [1, 2, 3]}, "c": [1, 2, 3]}}'
            ),
            "moose",
            "a",
            2,
    ):
        assert v == 3

    for path, v in ijsongenerators.search(
            io.BytesIO(
                b'{"moose": {"a": [1, 2, 3], "b": {"nested": [1, 2, 3]}, "c": [1, 2, 3], "d": 1}}'
            ),
            "moose",
            "b",
            "nested",
            0,
    ):
        assert v == 1
def test_parse_path():
    path = ijsongenerators.parse_path("level-1.[0].*.[0].level-3a.*.b")
    assert path == ("level-1", 0, ijsongenerators.WILDCARD, 0, "level-3a",
                    ijsongenerators.WILDCARD, "b")

    jsonio = io.BytesIO(
        b'{"level-1":[{"level-2":[{"level-3a":[{"a":1,"b":"moose","c":"goose"},{"a":2,"b":"truce","c":"deduce"},{"a":3,"b":"house","c":"flute"}]},{"level-3b":[{"x":9,"b":"10"}]}]}]}'
    )

    assert list(ijsongenerators.search(jsonio, *path)) == [
        (("level-1", 0, "level-2", 0, "level-3a", 0, "b"), "moose"),
        (("level-1", 0, "level-2", 0, "level-3a", 1, "b"), "truce"),
        (("level-1", 0, "level-2", 0, "level-3a", 2, "b"), "house"),
    ]
def test_search_literal():
    assert list(ijsongenerators.search(io.BytesIO(b"1"), "*")) == []
def test_search_miss():
    for path, v in ijsongenerators.search(io.BytesIO(b'{"moose": 1}'), ):
        print(path)