2012-08-06 21:23:25 +04:00
|
|
|
import pymake.data, pymake.functions, pymake.util
|
2009-03-19 17:19:38 +03:00
|
|
|
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))
|
|
|
|
|
2009-04-02 00:13:55 +04:00
|
|
|
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))
|
|
|
|
|
2012-08-06 21:23:25 +04:00
|
|
|
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)
|
|
|
|
|
2012-08-06 21:23:58 +04:00
|
|
|
|
|
|
|
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))
|
|
|
|
|
2012-08-06 21:24:10 +04:00
|
|
|
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)
|
|
|
|
|
|
|
|
|
2009-03-19 17:19:38 +03:00
|
|
|
if __name__ == '__main__':
|
|
|
|
unittest.main()
|