build/pymake/tests/datatests.py

changeset 0
6474c204b198
     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()

mercurial