from hy.lex.tokenize import tokenize


def test_simple_tokenize():
    """Checking we can still handle something simple."""

    assert [["+", 1, 1]] == tokenize("(+ 1 1)")


def test_double_tokenize():
    """Checking if we can lex two things at once."""

    assert [
        ["+", 1, 2],
        ["-", 1, 1]
    ] == tokenize("(+ 1 2) (- 1 1)")


def test_simple_recurse():
    """ Test recursion """
    assert [
        ['fn',
            'one',
            ['fn', 'two'],
        ]
    ] == tokenize("(fn one (fn two))")


def test_mid_recurse():
    """ Test some crazy recursion """

    assert [
        ['fn',
            'one',
            ['fn', 'two'],
            ['fn', 'three'],
        ]
    ] == tokenize("(fn one (fn two)(fn three))")


def test_mid_recurse_comment():
    """ Test some crazy recursion with a comment """

    assert [
        ['fn',
            'one',
            ['fn', 'two'],
            ['fn', 'three'],
        ]
    ] == tokenize("""
(fn one ; this is a test
    (fn two)(fn three)) ; and so is this
""")


def test_full_recurse():
    """ Test something we could see for real """
    assert [
        ['fn',
            'el',
            ['+',
                1,
                2,
                ['==',
                    1,
                    20
                ],
                ['-',
                    1,
                    1
                ],
            ]
        ],
        ['fn1', 'foo', 'bar']
    ] == tokenize("(fn el (+ 1 2 (== 1 20) (- 1 1)))(fn1 foo bar)")