/build/pymake/tests/datatests.py

https://github.com/rillian/firefox · Python · 237 lines · 170 code · 65 blank · 2 comment · 6 complexity · 65bc4df8aee68e0805fb2ce70d8e9f39 MD5 · raw file

  1. import pymake.data, pymake.functions, pymake.util
  2. import unittest
  3. import re
  4. from cStringIO import StringIO
  5. def multitest(cls):
  6. for name in cls.testdata.iterkeys():
  7. def m(self, name=name):
  8. return self.runSingle(*self.testdata[name])
  9. setattr(cls, 'test_%s' % name, m)
  10. return cls
  11. class SplitWordsTest(unittest.TestCase):
  12. testdata = (
  13. (' test test.c test.o ', ['test', 'test.c', 'test.o']),
  14. ('\ttest\t test.c \ntest.o', ['test', 'test.c', 'test.o']),
  15. )
  16. def runTest(self):
  17. for s, e in self.testdata:
  18. w = s.split()
  19. self.assertEqual(w, e, 'splitwords(%r)' % (s,))
  20. class GetPatSubstTest(unittest.TestCase):
  21. testdata = (
  22. ('%.c', '%.o', ' test test.c test.o ', 'test test.o test.o'),
  23. ('%', '%.o', ' test.c test.o ', 'test.c.o test.o.o'),
  24. ('foo', 'bar', 'test foo bar', 'test bar bar'),
  25. ('foo', '%bar', 'test foo bar', 'test %bar bar'),
  26. ('%', 'perc_%', 'path', 'perc_path'),
  27. ('\\%', 'sub%', 'p %', 'p sub%'),
  28. ('%.c', '\\%%.o', 'foo.c bar.o baz.cpp', '%foo.o bar.o baz.cpp'),
  29. )
  30. def runTest(self):
  31. for s, r, d, e in self.testdata:
  32. words = d.split()
  33. p = pymake.data.Pattern(s)
  34. a = ' '.join((p.subst(r, word, False)
  35. for word in words))
  36. self.assertEqual(a, e, 'Pattern(%r).subst(%r, %r)' % (s, r, d))
  37. class LRUTest(unittest.TestCase):
  38. # getkey, expected, funccount, debugitems
  39. expected = (
  40. (0, '', 1, (0,)),
  41. (0, '', 2, (0,)),
  42. (1, ' ', 3, (1, 0)),
  43. (1, ' ', 3, (1, 0)),
  44. (0, '', 4, (0, 1)),
  45. (2, ' ', 5, (2, 0, 1)),
  46. (1, ' ', 5, (1, 2, 0)),
  47. (3, ' ', 6, (3, 1, 2)),
  48. )
  49. def spaceFunc(self, l):
  50. self.funccount += 1
  51. return ''.ljust(l)
  52. def runTest(self):
  53. self.funccount = 0
  54. c = pymake.util.LRUCache(3, self.spaceFunc, lambda k, v: k % 2)
  55. self.assertEqual(tuple(c.debugitems()), ())
  56. for i in xrange(0, len(self.expected)):
  57. k, e, fc, di = self.expected[i]
  58. v = c.get(k)
  59. self.assertEqual(v, e)
  60. self.assertEqual(self.funccount, fc,
  61. "funccount, iteration %i, got %i expected %i" % (i, self.funccount, fc))
  62. goti = tuple(c.debugitems())
  63. self.assertEqual(goti, di,
  64. "debugitems, iteration %i, got %r expected %r" % (i, goti, di))
  65. class EqualityTest(unittest.TestCase):
  66. def test_string_expansion(self):
  67. s1 = pymake.data.StringExpansion('foo bar', None)
  68. s2 = pymake.data.StringExpansion('foo bar', None)
  69. self.assertEqual(s1, s2)
  70. def test_expansion_simple(self):
  71. s1 = pymake.data.Expansion(None)
  72. s2 = pymake.data.Expansion(None)
  73. self.assertEqual(s1, s2)
  74. s1.appendstr('foo')
  75. s2.appendstr('foo')
  76. self.assertEqual(s1, s2)
  77. def test_expansion_string_finish(self):
  78. """Adjacent strings should normalize to same value."""
  79. s1 = pymake.data.Expansion(None)
  80. s2 = pymake.data.Expansion(None)
  81. s1.appendstr('foo')
  82. s2.appendstr('foo')
  83. s1.appendstr(' bar')
  84. s1.appendstr(' baz')
  85. s2.appendstr(' bar baz')
  86. self.assertEqual(s1, s2)
  87. def test_function(self):
  88. s1 = pymake.data.Expansion(None)
  89. s2 = pymake.data.Expansion(None)
  90. n1 = pymake.data.StringExpansion('FOO', None)
  91. n2 = pymake.data.StringExpansion('FOO', None)
  92. v1 = pymake.functions.VariableRef(None, n1)
  93. v2 = pymake.functions.VariableRef(None, n2)
  94. s1.appendfunc(v1)
  95. s2.appendfunc(v2)
  96. self.assertEqual(s1, s2)
  97. class StringExpansionTest(unittest.TestCase):
  98. def test_base_expansion_interface(self):
  99. s1 = pymake.data.StringExpansion('FOO', None)
  100. self.assertTrue(s1.is_static_string)
  101. funcs = list(s1.functions())
  102. self.assertEqual(len(funcs), 0)
  103. funcs = list(s1.functions(True))
  104. self.assertEqual(len(funcs), 0)
  105. refs = list(s1.variable_references())
  106. self.assertEqual(len(refs), 0)
  107. class ExpansionTest(unittest.TestCase):
  108. def test_is_static_string(self):
  109. e1 = pymake.data.Expansion()
  110. e1.appendstr('foo')
  111. self.assertTrue(e1.is_static_string)
  112. e1.appendstr('bar')
  113. self.assertTrue(e1.is_static_string)
  114. vname = pymake.data.StringExpansion('FOO', None)
  115. func = pymake.functions.VariableRef(None, vname)
  116. e1.appendfunc(func)
  117. self.assertFalse(e1.is_static_string)
  118. def test_get_functions(self):
  119. e1 = pymake.data.Expansion()
  120. e1.appendstr('foo')
  121. vname1 = pymake.data.StringExpansion('FOO', None)
  122. vname2 = pymake.data.StringExpansion('BAR', None)
  123. func1 = pymake.functions.VariableRef(None, vname1)
  124. func2 = pymake.functions.VariableRef(None, vname2)
  125. e1.appendfunc(func1)
  126. e1.appendfunc(func2)
  127. funcs = list(e1.functions())
  128. self.assertEqual(len(funcs), 2)
  129. func3 = pymake.functions.SortFunction(None)
  130. func3.append(vname1)
  131. e1.appendfunc(func3)
  132. funcs = list(e1.functions())
  133. self.assertEqual(len(funcs), 3)
  134. refs = list(e1.variable_references())
  135. self.assertEqual(len(refs), 2)
  136. def test_get_functions_descend(self):
  137. e1 = pymake.data.Expansion()
  138. vname1 = pymake.data.StringExpansion('FOO', None)
  139. func1 = pymake.functions.VariableRef(None, vname1)
  140. e2 = pymake.data.Expansion()
  141. e2.appendfunc(func1)
  142. func2 = pymake.functions.SortFunction(None)
  143. func2.append(e2)
  144. e1.appendfunc(func2)
  145. funcs = list(e1.functions())
  146. self.assertEqual(len(funcs), 1)
  147. funcs = list(e1.functions(True))
  148. self.assertEqual(len(funcs), 2)
  149. self.assertTrue(isinstance(funcs[0], pymake.functions.SortFunction))
  150. def test_is_filesystem_dependent(self):
  151. e = pymake.data.Expansion()
  152. vname1 = pymake.data.StringExpansion('FOO', None)
  153. func1 = pymake.functions.VariableRef(None, vname1)
  154. e.appendfunc(func1)
  155. self.assertFalse(e.is_filesystem_dependent)
  156. func2 = pymake.functions.WildcardFunction(None)
  157. func2.append(vname1)
  158. e.appendfunc(func2)
  159. self.assertTrue(e.is_filesystem_dependent)
  160. def test_is_filesystem_dependent_descend(self):
  161. sort = pymake.functions.SortFunction(None)
  162. wildcard = pymake.functions.WildcardFunction(None)
  163. e = pymake.data.StringExpansion('foo/*', None)
  164. wildcard.append(e)
  165. e = pymake.data.Expansion(None)
  166. e.appendfunc(wildcard)
  167. sort.append(e)
  168. e = pymake.data.Expansion(None)
  169. e.appendfunc(sort)
  170. self.assertTrue(e.is_filesystem_dependent)
  171. if __name__ == '__main__':
  172. unittest.main()