| import pymake.data, pymake.functions, pymake.util |
| import unittest |
| import re |
| from cStringIO import StringIO |
| |
| def multitest(cls): |
| for name in cls.testdata.iterkeys(): |
| def m(self, name=name): |
| return self.runSingle(*self.testdata[name]) |
| |
| setattr(cls, 'test_%s' % name, m) |
| return cls |
| |
| class SplitWordsTest(unittest.TestCase): |
| testdata = ( |
| (' test test.c test.o ', ['test', 'test.c', 'test.o']), |
| ('\ttest\t test.c \ntest.o', ['test', 'test.c', 'test.o']), |
| ) |
| |
| def runTest(self): |
| for s, e in self.testdata: |
| w = s.split() |
| self.assertEqual(w, e, 'splitwords(%r)' % (s,)) |
| |
| class GetPatSubstTest(unittest.TestCase): |
| testdata = ( |
| ('%.c', '%.o', ' test test.c test.o ', 'test test.o test.o'), |
| ('%', '%.o', ' test.c test.o ', 'test.c.o test.o.o'), |
| ('foo', 'bar', 'test foo bar', 'test bar bar'), |
| ('foo', '%bar', 'test foo bar', 'test %bar bar'), |
| ('%', 'perc_%', 'path', 'perc_path'), |
| ('\\%', 'sub%', 'p %', 'p sub%'), |
| ('%.c', '\\%%.o', 'foo.c bar.o baz.cpp', '%foo.o bar.o baz.cpp'), |
| ) |
| |
| def runTest(self): |
| for s, r, d, e in self.testdata: |
| words = d.split() |
| p = pymake.data.Pattern(s) |
| a = ' '.join((p.subst(r, word, False) |
| for word in words)) |
| self.assertEqual(a, e, 'Pattern(%r).subst(%r, %r)' % (s, r, d)) |
| |
| class LRUTest(unittest.TestCase): |
| # getkey, expected, funccount, debugitems |
| expected = ( |
| (0, '', 1, (0,)), |
| (0, '', 2, (0,)), |
| (1, ' ', 3, (1, 0)), |
| (1, ' ', 3, (1, 0)), |
| (0, '', 4, (0, 1)), |
| (2, ' ', 5, (2, 0, 1)), |
| (1, ' ', 5, (1, 2, 0)), |
| (3, ' ', 6, (3, 1, 2)), |
| ) |
| |
| def spaceFunc(self, l): |
| self.funccount += 1 |
| return ''.ljust(l) |
| |
| def runTest(self): |
| self.funccount = 0 |
| c = pymake.util.LRUCache(3, self.spaceFunc, lambda k, v: k % 2) |
| self.assertEqual(tuple(c.debugitems()), ()) |
| |
| for i in xrange(0, len(self.expected)): |
| k, e, fc, di = self.expected[i] |
| |
| v = c.get(k) |
| self.assertEqual(v, e) |
| self.assertEqual(self.funccount, fc, |
| "funccount, iteration %i, got %i expected %i" % (i, self.funccount, fc)) |
| goti = tuple(c.debugitems()) |
| self.assertEqual(goti, di, |
| "debugitems, iteration %i, got %r expected %r" % (i, goti, di)) |
| |
| class EqualityTest(unittest.TestCase): |
| def test_string_expansion(self): |
| s1 = pymake.data.StringExpansion('foo bar', None) |
| s2 = pymake.data.StringExpansion('foo bar', None) |
| |
| self.assertEqual(s1, s2) |
| |
| def test_expansion_simple(self): |
| s1 = pymake.data.Expansion(None) |
| s2 = pymake.data.Expansion(None) |
| |
| self.assertEqual(s1, s2) |
| |
| s1.appendstr('foo') |
| s2.appendstr('foo') |
| self.assertEqual(s1, s2) |
| |
| def test_expansion_string_finish(self): |
| """Adjacent strings should normalize to same value.""" |
| s1 = pymake.data.Expansion(None) |
| s2 = pymake.data.Expansion(None) |
| |
| s1.appendstr('foo') |
| s2.appendstr('foo') |
| |
| s1.appendstr(' bar') |
| s1.appendstr(' baz') |
| s2.appendstr(' bar baz') |
| |
| self.assertEqual(s1, s2) |
| |
| def test_function(self): |
| s1 = pymake.data.Expansion(None) |
| s2 = pymake.data.Expansion(None) |
| |
| n1 = pymake.data.StringExpansion('FOO', None) |
| n2 = pymake.data.StringExpansion('FOO', None) |
| |
| v1 = pymake.functions.VariableRef(None, n1) |
| v2 = pymake.functions.VariableRef(None, n2) |
| |
| s1.appendfunc(v1) |
| s2.appendfunc(v2) |
| |
| self.assertEqual(s1, s2) |
| |
| |
| class StringExpansionTest(unittest.TestCase): |
| def test_base_expansion_interface(self): |
| s1 = pymake.data.StringExpansion('FOO', None) |
| |
| self.assertTrue(s1.is_static_string) |
| |
| funcs = list(s1.functions()) |
| self.assertEqual(len(funcs), 0) |
| |
| funcs = list(s1.functions(True)) |
| self.assertEqual(len(funcs), 0) |
| |
| refs = list(s1.variable_references()) |
| self.assertEqual(len(refs), 0) |
| |
| |
| class ExpansionTest(unittest.TestCase): |
| def test_is_static_string(self): |
| e1 = pymake.data.Expansion() |
| e1.appendstr('foo') |
| |
| self.assertTrue(e1.is_static_string) |
| |
| e1.appendstr('bar') |
| self.assertTrue(e1.is_static_string) |
| |
| vname = pymake.data.StringExpansion('FOO', None) |
| func = pymake.functions.VariableRef(None, vname) |
| |
| e1.appendfunc(func) |
| |
| self.assertFalse(e1.is_static_string) |
| |
| def test_get_functions(self): |
| e1 = pymake.data.Expansion() |
| e1.appendstr('foo') |
| |
| vname1 = pymake.data.StringExpansion('FOO', None) |
| vname2 = pymake.data.StringExpansion('BAR', None) |
| |
| func1 = pymake.functions.VariableRef(None, vname1) |
| func2 = pymake.functions.VariableRef(None, vname2) |
| |
| e1.appendfunc(func1) |
| e1.appendfunc(func2) |
| |
| funcs = list(e1.functions()) |
| self.assertEqual(len(funcs), 2) |
| |
| func3 = pymake.functions.SortFunction(None) |
| func3.append(vname1) |
| |
| e1.appendfunc(func3) |
| |
| funcs = list(e1.functions()) |
| self.assertEqual(len(funcs), 3) |
| |
| refs = list(e1.variable_references()) |
| self.assertEqual(len(refs), 2) |
| |
| def test_get_functions_descend(self): |
| e1 = pymake.data.Expansion() |
| vname1 = pymake.data.StringExpansion('FOO', None) |
| func1 = pymake.functions.VariableRef(None, vname1) |
| e2 = pymake.data.Expansion() |
| e2.appendfunc(func1) |
| |
| func2 = pymake.functions.SortFunction(None) |
| func2.append(e2) |
| |
| e1.appendfunc(func2) |
| |
| funcs = list(e1.functions()) |
| self.assertEqual(len(funcs), 1) |
| |
| funcs = list(e1.functions(True)) |
| self.assertEqual(len(funcs), 2) |
| |
| self.assertTrue(isinstance(funcs[0], pymake.functions.SortFunction)) |
| |
| def test_is_filesystem_dependent(self): |
| e = pymake.data.Expansion() |
| vname1 = pymake.data.StringExpansion('FOO', None) |
| func1 = pymake.functions.VariableRef(None, vname1) |
| e.appendfunc(func1) |
| |
| self.assertFalse(e.is_filesystem_dependent) |
| |
| func2 = pymake.functions.WildcardFunction(None) |
| func2.append(vname1) |
| e.appendfunc(func2) |
| |
| self.assertTrue(e.is_filesystem_dependent) |
| |
| def test_is_filesystem_dependent_descend(self): |
| sort = pymake.functions.SortFunction(None) |
| wildcard = pymake.functions.WildcardFunction(None) |
| |
| e = pymake.data.StringExpansion('foo/*', None) |
| wildcard.append(e) |
| |
| e = pymake.data.Expansion(None) |
| e.appendfunc(wildcard) |
| |
| sort.append(e) |
| |
| e = pymake.data.Expansion(None) |
| e.appendfunc(sort) |
| |
| self.assertTrue(e.is_filesystem_dependent) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |