/Lib/test/test_string.py

http://unladen-swallow.googlecode.com/ · Python · 217 lines · 162 code · 42 blank · 13 comment · 17 complexity · e38a94e45aecc6273bcc9af567e164a4 MD5 · raw file

  1. import unittest, string
  2. from test import test_support, string_tests
  3. from UserList import UserList
  4. class StringTest(
  5. string_tests.CommonTest,
  6. string_tests.MixinStrStringUserStringTest
  7. ):
  8. type2test = str
  9. def checkequal(self, result, object, methodname, *args):
  10. realresult = getattr(string, methodname)(object, *args)
  11. self.assertEqual(
  12. result,
  13. realresult
  14. )
  15. def checkraises(self, exc, object, methodname, *args):
  16. self.assertRaises(
  17. exc,
  18. getattr(string, methodname),
  19. object,
  20. *args
  21. )
  22. def checkcall(self, object, methodname, *args):
  23. getattr(string, methodname)(object, *args)
  24. def test_join(self):
  25. # These are the same checks as in string_test.ObjectTest.test_join
  26. # but the argument order ist different
  27. self.checkequal('a b c d', ['a', 'b', 'c', 'd'], 'join', ' ')
  28. self.checkequal('abcd', ('a', 'b', 'c', 'd'), 'join', '')
  29. self.checkequal('w x y z', string_tests.Sequence(), 'join', ' ')
  30. self.checkequal('abc', ('abc',), 'join', 'a')
  31. self.checkequal('z', UserList(['z']), 'join', 'a')
  32. if test_support.have_unicode:
  33. self.checkequal(unicode('a.b.c'), ['a', 'b', 'c'], 'join', unicode('.'))
  34. self.checkequal(unicode('a.b.c'), [unicode('a'), 'b', 'c'], 'join', '.')
  35. self.checkequal(unicode('a.b.c'), ['a', unicode('b'), 'c'], 'join', '.')
  36. self.checkequal(unicode('a.b.c'), ['a', 'b', unicode('c')], 'join', '.')
  37. self.checkraises(TypeError, ['a', unicode('b'), 3], 'join', '.')
  38. for i in [5, 25, 125]:
  39. self.checkequal(
  40. ((('a' * i) + '-') * i)[:-1],
  41. ['a' * i] * i, 'join', '-')
  42. self.checkequal(
  43. ((('a' * i) + '-') * i)[:-1],
  44. ('a' * i,) * i, 'join', '-')
  45. self.checkraises(TypeError, string_tests.BadSeq1(), 'join', ' ')
  46. self.checkequal('a b c', string_tests.BadSeq2(), 'join', ' ')
  47. try:
  48. def f():
  49. yield 4 + ""
  50. self.fixtype(' ').join(f())
  51. except TypeError, e:
  52. if '+' not in str(e):
  53. self.fail('join() ate exception message')
  54. else:
  55. self.fail('exception not raised')
  56. class ModuleTest(unittest.TestCase):
  57. def test_attrs(self):
  58. string.whitespace
  59. string.lowercase
  60. string.uppercase
  61. string.letters
  62. string.digits
  63. string.hexdigits
  64. string.octdigits
  65. string.punctuation
  66. string.printable
  67. def test_atoi(self):
  68. self.assertEqual(string.atoi(" 1 "), 1)
  69. self.assertRaises(ValueError, string.atoi, " 1x")
  70. self.assertRaises(ValueError, string.atoi, " x1 ")
  71. def test_atol(self):
  72. self.assertEqual(string.atol(" 1 "), 1L)
  73. self.assertRaises(ValueError, string.atol, " 1x ")
  74. self.assertRaises(ValueError, string.atol, " x1 ")
  75. def test_atof(self):
  76. self.assertAlmostEqual(string.atof(" 1 "), 1.0)
  77. self.assertRaises(ValueError, string.atof, " 1x ")
  78. self.assertRaises(ValueError, string.atof, " x1 ")
  79. def test_maketrans(self):
  80. transtable = '\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377'
  81. self.assertEqual(string.maketrans('abc', 'xyz'), transtable)
  82. self.assertRaises(ValueError, string.maketrans, 'abc', 'xyzq')
  83. def test_capwords(self):
  84. self.assertEqual(string.capwords('abc def ghi'), 'Abc Def Ghi')
  85. self.assertEqual(string.capwords('abc\tdef\nghi'), 'Abc Def Ghi')
  86. self.assertEqual(string.capwords('abc\t def \nghi'), 'Abc Def Ghi')
  87. self.assertEqual(string.capwords('ABC DEF GHI'), 'Abc Def Ghi')
  88. self.assertEqual(string.capwords('ABC-DEF-GHI', '-'), 'Abc-Def-Ghi')
  89. self.assertEqual(string.capwords('ABC-def DEF-ghi GHI'), 'Abc-def Def-ghi Ghi')
  90. self.assertEqual(string.capwords(' aBc DeF '), 'Abc Def')
  91. self.assertEqual(string.capwords('\taBc\tDeF\t'), 'Abc Def')
  92. self.assertEqual(string.capwords('\taBc\tDeF\t', '\t'), '\tAbc\tDef\t')
  93. def test_formatter(self):
  94. fmt = string.Formatter()
  95. self.assertEqual(fmt.format("foo"), "foo")
  96. self.assertEqual(fmt.format("foo{0}", "bar"), "foobar")
  97. self.assertEqual(fmt.format("foo{1}{0}-{1}", "bar", 6), "foo6bar-6")
  98. self.assertEqual(fmt.format("-{arg!r}-", arg='test'), "-'test'-")
  99. # override get_value ############################################
  100. class NamespaceFormatter(string.Formatter):
  101. def __init__(self, namespace={}):
  102. string.Formatter.__init__(self)
  103. self.namespace = namespace
  104. def get_value(self, key, args, kwds):
  105. if isinstance(key, str):
  106. try:
  107. # Check explicitly passed arguments first
  108. return kwds[key]
  109. except KeyError:
  110. return self.namespace[key]
  111. else:
  112. string.Formatter.get_value(key, args, kwds)
  113. fmt = NamespaceFormatter({'greeting':'hello'})
  114. self.assertEqual(fmt.format("{greeting}, world!"), 'hello, world!')
  115. # override format_field #########################################
  116. class CallFormatter(string.Formatter):
  117. def format_field(self, value, format_spec):
  118. return format(value(), format_spec)
  119. fmt = CallFormatter()
  120. self.assertEqual(fmt.format('*{0}*', lambda : 'result'), '*result*')
  121. # override convert_field ########################################
  122. class XFormatter(string.Formatter):
  123. def convert_field(self, value, conversion):
  124. if conversion == 'x':
  125. return None
  126. return super(XFormatter, self).convert_field(value, conversion)
  127. fmt = XFormatter()
  128. self.assertEqual(fmt.format("{0!r}:{0!x}", 'foo', 'foo'), "'foo':None")
  129. # override parse ################################################
  130. class BarFormatter(string.Formatter):
  131. # returns an iterable that contains tuples of the form:
  132. # (literal_text, field_name, format_spec, conversion)
  133. def parse(self, format_string):
  134. for field in format_string.split('|'):
  135. if field[0] == '+':
  136. # it's markup
  137. field_name, _, format_spec = field[1:].partition(':')
  138. yield '', field_name, format_spec, None
  139. else:
  140. yield field, None, None, None
  141. fmt = BarFormatter()
  142. self.assertEqual(fmt.format('*|+0:^10s|*', 'foo'), '* foo *')
  143. # test all parameters used
  144. class CheckAllUsedFormatter(string.Formatter):
  145. def check_unused_args(self, used_args, args, kwargs):
  146. # Track which arguments actuallly got used
  147. unused_args = set(kwargs.keys())
  148. unused_args.update(range(0, len(args)))
  149. for arg in used_args:
  150. unused_args.remove(arg)
  151. if unused_args:
  152. raise ValueError("unused arguments")
  153. fmt = CheckAllUsedFormatter()
  154. self.assertEqual(fmt.format("{0}", 10), "10")
  155. self.assertEqual(fmt.format("{0}{i}", 10, i=100), "10100")
  156. self.assertEqual(fmt.format("{0}{i}{1}", 10, 20, i=100), "1010020")
  157. self.assertRaises(ValueError, fmt.format, "{0}{i}{1}", 10, 20, i=100, j=0)
  158. self.assertRaises(ValueError, fmt.format, "{0}", 10, 20)
  159. self.assertRaises(ValueError, fmt.format, "{0}", 10, 20, i=100)
  160. self.assertRaises(ValueError, fmt.format, "{i}", 10, 20, i=100)
  161. # Alternate formatting is not supported
  162. self.assertRaises(ValueError, format, '', '#')
  163. self.assertRaises(ValueError, format, '', '#20')
  164. class BytesAliasTest(unittest.TestCase):
  165. def test_builtin(self):
  166. self.assert_(str is bytes)
  167. def test_syntax(self):
  168. self.assertEqual(b"spam", "spam")
  169. self.assertEqual(br"egg\foo", "egg\\foo")
  170. self.assert_(type(b""), str)
  171. self.assert_(type(br""), str)
  172. def test_main():
  173. test_support.run_unittest(StringTest, ModuleTest, BytesAliasTest)
  174. if __name__ == "__main__":
  175. test_main()