from hy.macros import macro, process
from hy.lex import tokenize

from hy.models.expression import HyExpression
from hy.models.string import HyString
from hy.models.symbol import HySymbol
from hy.models.list import HyList


@macro("test")
def tmac(tree):
    """ Turn an expression into a list """
    return HyList(tree[1:])


def test_preprocessor_simple():
    """ Test basic macro expantion """
    obj = process(tokenize('(test "one" "two")')[0])
    assert obj == HyList(["one", "two"])
    assert type(obj) == HyList


def test_preprocessor_expression():
    """ Test inner macro expantion """
    obj = process(tokenize('(test (test "one" "two"))')[0])

    assert type(obj) == HyList
    assert type(obj[0]) == HyList

    assert obj[0] == HyList([HyString("one"), HyString("two")])

    obj = HyList([HyString("one"), HyString("two")])
    obj = tokenize('(shill ["one" "two"])')[0][1]
    assert obj == process(obj)