macro_eval_test.py [plain text]
__author__ = "Nils Klarlund"
import os
import basics
import parse_file
import cache_basics
import macro_eval
import shutil
import tempfile
import unittest
NotCoveredError = basics.NotCoveredError
class MacroEvalTest(unittest.TestCase):
def setUp(self):
basics.opt_debug_pattern = 1
self.tmp = tempfile.mkdtemp()
caches = cache_basics.SetUpCaches(self.tmp)
self.includepath_map = caches.includepath_map
self.canonical_path = caches.canonical_path
self.directory_map = caches.directory_map
self.realpath_map = caches.realpath_map
def tearDown(self):
shutil.rmtree(self.tmp)
def test__SubstituteSymbolInString(self):
self.assertEqual(
macro_eval._SubstituteSymbolInString("X", "f(y)", "X+(X, X##Y)"),
"f(y)+(f(y), f(y)##Y)")
self.assertEqual(
macro_eval._SubstituteSymbolInString("a", "b", "c(a, aa)"),
"c(b, aa)")
def test_MassageAccordingToPoundSigns(self):
self.assertEqual(macro_eval._MassageAccordingToPoundSigns('#aa##bb'),
'"aabb"')
self.assertEqual(macro_eval._MassageAccordingToPoundSigns('# a(.)'),
'"a(.)"')
def test__ParseArgs(self):
self.assertEqual(macro_eval._ParseArgs("(a,m(c, n(d)), c)", 0),
(["a", "m(c, n(d))", " c"], 17))
self.assertEqual(macro_eval._ParseArgs("""(a","m(c, n(d)), c)""", 0),
(["""a","m(c, n(d))""", " c"], 19))
def test__PrependToSet(self):
self.assertEqual(
macro_eval._PrependToSet("x", set(["y", "z"])),
set(["xy", "xz"]))
def test__BigUnion(self):
self.assertEqual(macro_eval._BigUnion([set([]), set([1,2]), set([3])]),
set([1,2,3]))
def test_EvalExprDirs(self):
self.assertEqual(
macro_eval.EvalExpression("A", { 'A': ['b'] }),
set(['A', 'b']))
self.assertEqual(
macro_eval.EvalExpression("A", { 'A': ['B'], 'B': ['A'] }),
set(['A', 'B']))
self.assertEqual(
macro_eval.EvalExpression("A", { 'A': ['B'], 'B': ['c'] }),
set(['A', 'B', 'c']))
self.assertEqual(
macro_eval.EvalExpression("max(2, 4)",
{ 'max': [ ( ['x', 'y'], "x < y? y: x") ] }),
set(['max(2, 4)', '2 < 4? 4: 2']))
self.assertEqual(
macro_eval.EvalExpression("F(2, 4)",
{ 'F': ['max'],
'max': [ ( ['x', 'y'], "x < y? y: x") ] }),
set(['max(2, 4)', 'F(2, 4)', '2 < 4? 4: 2']))
self.assertEqual(
macro_eval.EvalExpression("max(max(1,2), 3)",
{ 'max': [ ( ['x', 'y'], "(x < y? y: x)") ] }),
set(['((1 < 2? 2: 1) < 3? 3: (1 < 2? 2: 1))',
'max(max(1,2), 3)',
'(max(1,2) < 3? 3: max(1,2))',
'max((1 < 2? 2: 1), 3)']))
self.assertEqual(
macro_eval.EvalExpression("A", { 'A': ['"a.c"'] }),
set(['A', '"a.c"']))
self.assertEqual(
macro_eval.EvalExpression("A##A", { 'A': ['a.c'] }),
set(['A##A', 'a.c##A', 'A##a.c', 'a.c##a.c']))
self.assertEqual(
macro_eval.EvalExpression("A(y)A(z)", { 'A': [(['x'], 'x##a.c')] }),
set(['A(y)A(z)', 'A(y)za.c', 'ya.cza.c', 'ya.cA(z)']))
self.assertEqual(
macro_eval.EvalExpression("m(abc)", { 'm': [( ['a'], "<a##_post.c>" )] }),
set(['m(abc)', '<abc_post.c>']))
self.assertEqual(
macro_eval.EvalExpression("myfile(hello)",
{ 'myfile': [(['x'], "myquote(myplace/x)")],
'myquote': [(['y'], """#y""")] }),
set(['myfile(hello)',
'"myplace/hello"',
'myquote(myplace/hello)']))
def test_FromCPPInternals(self):
self.assertEqual(
macro_eval.EvalExpression("foo(foo) (2)",
{'foo':[(['x'], "bar x")]}),
set(['bar foo (2)', 'foo(foo) (2)']))
self.assertEqual(
macro_eval.EvalExpression("+PLUS -EMPTY- PLUS+ f(=)",
{ 'PLUS':['+'],
'EMPTY':[""],
'f':[(['x'], '=x=')] }),
set(['++ -EMPTY- ++ ===',
'++ -EMPTY- PLUS+ ===',
'+PLUS -- ++ f(=)',
'+PLUS -EMPTY- ++ ===',
'++ -EMPTY- PLUS+ f(=)',
'+PLUS -EMPTY- PLUS+ f(=)',
'+PLUS -- ++ ===',
'++ -EMPTY- ++ f(=)',
'+PLUS -- PLUS+ ===',
'+PLUS -- PLUS+ f(=)',
'++ -- PLUS+ ===',
'++ -- ++ ===',
'+PLUS -EMPTY- PLUS+ ===',
'++ -- PLUS+ f(=)',
'+PLUS -EMPTY- ++ f(=)',
'++ -- ++ f(=)']))
def test_ResolveExpr(self):
caches = cache_basics.SetUpCaches(self.tmp)
parse_file_obj = parse_file.ParseFile(caches.includepath_map)
symbol_table = {}
self.assertEqual(parse_file_obj.Parse(
"test_data/more_macros.c", symbol_table),
([], [], ['TEMPLATE_VARNAME(foo)'], []))
self.assertEqual(
macro_eval.EvalExpression("TEMPLATE_VARNAME(foo)", symbol_table),
set(['TEMPLATE_VARNAME(foo)',
'"maps/foo.tpl.varnames.h"',
'AS_STRING(maps/foo.tpl.varnames.h)',
'AS_STRING_INTERNAL(maps/foo.tpl.varnames.h)']))
[((d, ip), rp)], symbols = macro_eval.ResolveExpr(
caches.includepath_map.Index,
caches.build_stat_cache.Resolve,
'TEMPLATE_VARNAME(foo)',
caches.directory_map.Index(os.getcwd()), caches.directory_map.Index(""), [caches.directory_map.Index("test_data")], [],
symbol_table)
self.assertEqual(caches.directory_map.string[d], "test_data/")
self.assertEqual(caches.includepath_map.string[ip],
"maps/foo.tpl.varnames.h")
self.assertEqual(symbols,
set(['TEMPLATE_VARNAME', 'maps',
'AS_STRING', 'AS_STRING_INTERNAL',
'tpl', 'varnames', 'h', 'foo']))
unittest.main()