hy/tests/macros/test_macro_processor.py

56 lines
1.6 KiB
Python
Raw Normal View History

2018-01-01 16:38:33 +01:00
# Copyright 2018 the authors.
# This file is part of Hy, which is free software licensed under the Expat
# license. See the LICENSE.
2013-03-08 04:52:47 +01:00
from hy.macros import macro, macroexpand
2013-03-09 00:46:51 +01:00
from hy.lex import tokenize
2013-03-08 04:52:47 +01:00
from hy.models import HyString, HyList, HySymbol, HyExpression
from hy.errors import HyMacroExpansionError
2013-03-08 04:52:47 +01:00
from hy.compiler import HyASTCompiler
import pytest
2013-03-08 04:52:47 +01:00
@macro("test")
def tmac(ETname, *tree):
2013-03-08 04:52:47 +01:00
""" Turn an expression into a list """
return HyList(tree)
2013-03-08 04:52:47 +01:00
def test_preprocessor_simple():
""" Test basic macro expansion """
obj = macroexpand(tokenize('(test "one" "two")')[0],
HyASTCompiler(__name__))
2013-03-08 04:52:47 +01:00
assert obj == HyList(["one", "two"])
assert type(obj) == HyList
def test_preprocessor_expression():
""" Test that macro expansion doesn't recurse"""
obj = macroexpand(tokenize('(test (test "one" "two"))')[0],
HyASTCompiler(__name__))
2013-03-08 04:52:47 +01:00
assert type(obj) == HyList
assert type(obj[0]) == HyExpression
2013-03-08 04:52:47 +01:00
assert obj[0] == HyExpression([HySymbol("test"),
HyString("one"),
HyString("two")])
2013-03-08 05:04:20 +01:00
obj = HyList([HyString("one"), HyString("two")])
2013-03-09 00:46:51 +01:00
obj = tokenize('(shill ["one" "two"])')[0][1]
assert obj == macroexpand(obj, HyASTCompiler(""))
@pytest.mark.xfail
def test_preprocessor_exceptions():
""" Test that macro expansion raises appropriate exceptions"""
try:
macroexpand(tokenize('(defn)')[0], HyASTCompiler(__name__))
assert False
except HyMacroExpansionError as e:
assert "_hy_anon_fn_" not in str(e)
assert "TypeError" not in str(e)