1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/build/pymake/tests/datatests.py Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,237 @@ 1.4 +import pymake.data, pymake.functions, pymake.util 1.5 +import unittest 1.6 +import re 1.7 +from cStringIO import StringIO 1.8 + 1.9 +def multitest(cls): 1.10 + for name in cls.testdata.iterkeys(): 1.11 + def m(self, name=name): 1.12 + return self.runSingle(*self.testdata[name]) 1.13 + 1.14 + setattr(cls, 'test_%s' % name, m) 1.15 + return cls 1.16 + 1.17 +class SplitWordsTest(unittest.TestCase): 1.18 + testdata = ( 1.19 + (' test test.c test.o ', ['test', 'test.c', 'test.o']), 1.20 + ('\ttest\t test.c \ntest.o', ['test', 'test.c', 'test.o']), 1.21 + ) 1.22 + 1.23 + def runTest(self): 1.24 + for s, e in self.testdata: 1.25 + w = s.split() 1.26 + self.assertEqual(w, e, 'splitwords(%r)' % (s,)) 1.27 + 1.28 +class GetPatSubstTest(unittest.TestCase): 1.29 + testdata = ( 1.30 + ('%.c', '%.o', ' test test.c test.o ', 'test test.o test.o'), 1.31 + ('%', '%.o', ' test.c test.o ', 'test.c.o test.o.o'), 1.32 + ('foo', 'bar', 'test foo bar', 'test bar bar'), 1.33 + ('foo', '%bar', 'test foo bar', 'test %bar bar'), 1.34 + ('%', 'perc_%', 'path', 'perc_path'), 1.35 + ('\\%', 'sub%', 'p %', 'p sub%'), 1.36 + ('%.c', '\\%%.o', 'foo.c bar.o baz.cpp', '%foo.o bar.o baz.cpp'), 1.37 + ) 1.38 + 1.39 + def runTest(self): 1.40 + for s, r, d, e in self.testdata: 1.41 + words = d.split() 1.42 + p = pymake.data.Pattern(s) 1.43 + a = ' '.join((p.subst(r, word, False) 1.44 + for word in words)) 1.45 + self.assertEqual(a, e, 'Pattern(%r).subst(%r, %r)' % (s, r, d)) 1.46 + 1.47 +class LRUTest(unittest.TestCase): 1.48 + # getkey, expected, funccount, debugitems 1.49 + expected = ( 1.50 + (0, '', 1, (0,)), 1.51 + (0, '', 2, (0,)), 1.52 + (1, ' ', 3, (1, 0)), 1.53 + (1, ' ', 3, (1, 0)), 1.54 + (0, '', 4, (0, 1)), 1.55 + (2, ' ', 5, (2, 0, 1)), 1.56 + (1, ' ', 5, (1, 2, 0)), 1.57 + (3, ' ', 6, (3, 1, 2)), 1.58 + ) 1.59 + 1.60 + def spaceFunc(self, l): 1.61 + self.funccount += 1 1.62 + return ''.ljust(l) 1.63 + 1.64 + def runTest(self): 1.65 + self.funccount = 0 1.66 + c = pymake.util.LRUCache(3, self.spaceFunc, lambda k, v: k % 2) 1.67 + self.assertEqual(tuple(c.debugitems()), ()) 1.68 + 1.69 + for i in xrange(0, len(self.expected)): 1.70 + k, e, fc, di = self.expected[i] 1.71 + 1.72 + v = c.get(k) 1.73 + self.assertEqual(v, e) 1.74 + self.assertEqual(self.funccount, fc, 1.75 + "funccount, iteration %i, got %i expected %i" % (i, self.funccount, fc)) 1.76 + goti = tuple(c.debugitems()) 1.77 + self.assertEqual(goti, di, 1.78 + "debugitems, iteration %i, got %r expected %r" % (i, goti, di)) 1.79 + 1.80 +class EqualityTest(unittest.TestCase): 1.81 + def test_string_expansion(self): 1.82 + s1 = pymake.data.StringExpansion('foo bar', None) 1.83 + s2 = pymake.data.StringExpansion('foo bar', None) 1.84 + 1.85 + self.assertEqual(s1, s2) 1.86 + 1.87 + def test_expansion_simple(self): 1.88 + s1 = pymake.data.Expansion(None) 1.89 + s2 = pymake.data.Expansion(None) 1.90 + 1.91 + self.assertEqual(s1, s2) 1.92 + 1.93 + s1.appendstr('foo') 1.94 + s2.appendstr('foo') 1.95 + self.assertEqual(s1, s2) 1.96 + 1.97 + def test_expansion_string_finish(self): 1.98 + """Adjacent strings should normalize to same value.""" 1.99 + s1 = pymake.data.Expansion(None) 1.100 + s2 = pymake.data.Expansion(None) 1.101 + 1.102 + s1.appendstr('foo') 1.103 + s2.appendstr('foo') 1.104 + 1.105 + s1.appendstr(' bar') 1.106 + s1.appendstr(' baz') 1.107 + s2.appendstr(' bar baz') 1.108 + 1.109 + self.assertEqual(s1, s2) 1.110 + 1.111 + def test_function(self): 1.112 + s1 = pymake.data.Expansion(None) 1.113 + s2 = pymake.data.Expansion(None) 1.114 + 1.115 + n1 = pymake.data.StringExpansion('FOO', None) 1.116 + n2 = pymake.data.StringExpansion('FOO', None) 1.117 + 1.118 + v1 = pymake.functions.VariableRef(None, n1) 1.119 + v2 = pymake.functions.VariableRef(None, n2) 1.120 + 1.121 + s1.appendfunc(v1) 1.122 + s2.appendfunc(v2) 1.123 + 1.124 + self.assertEqual(s1, s2) 1.125 + 1.126 + 1.127 +class StringExpansionTest(unittest.TestCase): 1.128 + def test_base_expansion_interface(self): 1.129 + s1 = pymake.data.StringExpansion('FOO', None) 1.130 + 1.131 + self.assertTrue(s1.is_static_string) 1.132 + 1.133 + funcs = list(s1.functions()) 1.134 + self.assertEqual(len(funcs), 0) 1.135 + 1.136 + funcs = list(s1.functions(True)) 1.137 + self.assertEqual(len(funcs), 0) 1.138 + 1.139 + refs = list(s1.variable_references()) 1.140 + self.assertEqual(len(refs), 0) 1.141 + 1.142 + 1.143 +class ExpansionTest(unittest.TestCase): 1.144 + def test_is_static_string(self): 1.145 + e1 = pymake.data.Expansion() 1.146 + e1.appendstr('foo') 1.147 + 1.148 + self.assertTrue(e1.is_static_string) 1.149 + 1.150 + e1.appendstr('bar') 1.151 + self.assertTrue(e1.is_static_string) 1.152 + 1.153 + vname = pymake.data.StringExpansion('FOO', None) 1.154 + func = pymake.functions.VariableRef(None, vname) 1.155 + 1.156 + e1.appendfunc(func) 1.157 + 1.158 + self.assertFalse(e1.is_static_string) 1.159 + 1.160 + def test_get_functions(self): 1.161 + e1 = pymake.data.Expansion() 1.162 + e1.appendstr('foo') 1.163 + 1.164 + vname1 = pymake.data.StringExpansion('FOO', None) 1.165 + vname2 = pymake.data.StringExpansion('BAR', None) 1.166 + 1.167 + func1 = pymake.functions.VariableRef(None, vname1) 1.168 + func2 = pymake.functions.VariableRef(None, vname2) 1.169 + 1.170 + e1.appendfunc(func1) 1.171 + e1.appendfunc(func2) 1.172 + 1.173 + funcs = list(e1.functions()) 1.174 + self.assertEqual(len(funcs), 2) 1.175 + 1.176 + func3 = pymake.functions.SortFunction(None) 1.177 + func3.append(vname1) 1.178 + 1.179 + e1.appendfunc(func3) 1.180 + 1.181 + funcs = list(e1.functions()) 1.182 + self.assertEqual(len(funcs), 3) 1.183 + 1.184 + refs = list(e1.variable_references()) 1.185 + self.assertEqual(len(refs), 2) 1.186 + 1.187 + def test_get_functions_descend(self): 1.188 + e1 = pymake.data.Expansion() 1.189 + vname1 = pymake.data.StringExpansion('FOO', None) 1.190 + func1 = pymake.functions.VariableRef(None, vname1) 1.191 + e2 = pymake.data.Expansion() 1.192 + e2.appendfunc(func1) 1.193 + 1.194 + func2 = pymake.functions.SortFunction(None) 1.195 + func2.append(e2) 1.196 + 1.197 + e1.appendfunc(func2) 1.198 + 1.199 + funcs = list(e1.functions()) 1.200 + self.assertEqual(len(funcs), 1) 1.201 + 1.202 + funcs = list(e1.functions(True)) 1.203 + self.assertEqual(len(funcs), 2) 1.204 + 1.205 + self.assertTrue(isinstance(funcs[0], pymake.functions.SortFunction)) 1.206 + 1.207 + def test_is_filesystem_dependent(self): 1.208 + e = pymake.data.Expansion() 1.209 + vname1 = pymake.data.StringExpansion('FOO', None) 1.210 + func1 = pymake.functions.VariableRef(None, vname1) 1.211 + e.appendfunc(func1) 1.212 + 1.213 + self.assertFalse(e.is_filesystem_dependent) 1.214 + 1.215 + func2 = pymake.functions.WildcardFunction(None) 1.216 + func2.append(vname1) 1.217 + e.appendfunc(func2) 1.218 + 1.219 + self.assertTrue(e.is_filesystem_dependent) 1.220 + 1.221 + def test_is_filesystem_dependent_descend(self): 1.222 + sort = pymake.functions.SortFunction(None) 1.223 + wildcard = pymake.functions.WildcardFunction(None) 1.224 + 1.225 + e = pymake.data.StringExpansion('foo/*', None) 1.226 + wildcard.append(e) 1.227 + 1.228 + e = pymake.data.Expansion(None) 1.229 + e.appendfunc(wildcard) 1.230 + 1.231 + sort.append(e) 1.232 + 1.233 + e = pymake.data.Expansion(None) 1.234 + e.appendfunc(sort) 1.235 + 1.236 + self.assertTrue(e.is_filesystem_dependent) 1.237 + 1.238 + 1.239 +if __name__ == '__main__': 1.240 + unittest.main()