1 | import unittest, string
|
---|
2 | from test import test_support, string_tests
|
---|
3 | from UserList import UserList
|
---|
4 |
|
---|
5 | class StringTest(
|
---|
6 | string_tests.CommonTest,
|
---|
7 | string_tests.MixinStrStringUserStringTest
|
---|
8 | ):
|
---|
9 |
|
---|
10 | type2test = str
|
---|
11 |
|
---|
12 | def checkequal(self, result, object, methodname, *args):
|
---|
13 | realresult = getattr(string, methodname)(object, *args)
|
---|
14 | self.assertEqual(
|
---|
15 | result,
|
---|
16 | realresult
|
---|
17 | )
|
---|
18 |
|
---|
19 | def checkraises(self, exc, object, methodname, *args):
|
---|
20 | self.assertRaises(
|
---|
21 | exc,
|
---|
22 | getattr(string, methodname),
|
---|
23 | object,
|
---|
24 | *args
|
---|
25 | )
|
---|
26 |
|
---|
27 | def checkcall(self, object, methodname, *args):
|
---|
28 | getattr(string, methodname)(object, *args)
|
---|
29 |
|
---|
30 | def test_join(self):
|
---|
31 | # These are the same checks as in string_test.ObjectTest.test_join
|
---|
32 | # but the argument order ist different
|
---|
33 | self.checkequal('a b c d', ['a', 'b', 'c', 'd'], 'join', ' ')
|
---|
34 | self.checkequal('abcd', ('a', 'b', 'c', 'd'), 'join', '')
|
---|
35 | self.checkequal('w x y z', string_tests.Sequence(), 'join', ' ')
|
---|
36 | self.checkequal('abc', ('abc',), 'join', 'a')
|
---|
37 | self.checkequal('z', UserList(['z']), 'join', 'a')
|
---|
38 | if test_support.have_unicode:
|
---|
39 | self.checkequal(unicode('a.b.c'), ['a', 'b', 'c'], 'join', unicode('.'))
|
---|
40 | self.checkequal(unicode('a.b.c'), [unicode('a'), 'b', 'c'], 'join', '.')
|
---|
41 | self.checkequal(unicode('a.b.c'), ['a', unicode('b'), 'c'], 'join', '.')
|
---|
42 | self.checkequal(unicode('a.b.c'), ['a', 'b', unicode('c')], 'join', '.')
|
---|
43 | self.checkraises(TypeError, ['a', unicode('b'), 3], 'join', '.')
|
---|
44 | for i in [5, 25, 125]:
|
---|
45 | self.checkequal(
|
---|
46 | ((('a' * i) + '-') * i)[:-1],
|
---|
47 | ['a' * i] * i, 'join', '-')
|
---|
48 | self.checkequal(
|
---|
49 | ((('a' * i) + '-') * i)[:-1],
|
---|
50 | ('a' * i,) * i, 'join', '-')
|
---|
51 |
|
---|
52 | self.checkraises(TypeError, string_tests.BadSeq1(), 'join', ' ')
|
---|
53 | self.checkequal('a b c', string_tests.BadSeq2(), 'join', ' ')
|
---|
54 | try:
|
---|
55 | def f():
|
---|
56 | yield 4 + ""
|
---|
57 | self.fixtype(' ').join(f())
|
---|
58 | except TypeError, e:
|
---|
59 | if '+' not in str(e):
|
---|
60 | self.fail('join() ate exception message')
|
---|
61 | else:
|
---|
62 | self.fail('exception not raised')
|
---|
63 |
|
---|
64 |
|
---|
65 |
|
---|
66 |
|
---|
67 | class ModuleTest(unittest.TestCase):
|
---|
68 |
|
---|
69 | def test_attrs(self):
|
---|
70 | string.whitespace
|
---|
71 | string.lowercase
|
---|
72 | string.uppercase
|
---|
73 | string.letters
|
---|
74 | string.digits
|
---|
75 | string.hexdigits
|
---|
76 | string.octdigits
|
---|
77 | string.punctuation
|
---|
78 | string.printable
|
---|
79 |
|
---|
80 | def test_atoi(self):
|
---|
81 | self.assertEqual(string.atoi(" 1 "), 1)
|
---|
82 | self.assertRaises(ValueError, string.atoi, " 1x")
|
---|
83 | self.assertRaises(ValueError, string.atoi, " x1 ")
|
---|
84 |
|
---|
85 | def test_atol(self):
|
---|
86 | self.assertEqual(string.atol(" 1 "), 1L)
|
---|
87 | self.assertRaises(ValueError, string.atol, " 1x ")
|
---|
88 | self.assertRaises(ValueError, string.atol, " x1 ")
|
---|
89 |
|
---|
90 | def test_atof(self):
|
---|
91 | self.assertAlmostEqual(string.atof(" 1 "), 1.0)
|
---|
92 | self.assertRaises(ValueError, string.atof, " 1x ")
|
---|
93 | self.assertRaises(ValueError, string.atof, " x1 ")
|
---|
94 |
|
---|
95 | def test_maketrans(self):
|
---|
96 | 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'
|
---|
97 |
|
---|
98 | self.assertEqual(string.maketrans('abc', 'xyz'), transtable)
|
---|
99 | self.assertRaises(ValueError, string.maketrans, 'abc', 'xyzq')
|
---|
100 |
|
---|
101 | def test_capwords(self):
|
---|
102 | self.assertEqual(string.capwords('abc def ghi'), 'Abc Def Ghi')
|
---|
103 | self.assertEqual(string.capwords('abc\tdef\nghi'), 'Abc Def Ghi')
|
---|
104 | self.assertEqual(string.capwords('abc\t def \nghi'), 'Abc Def Ghi')
|
---|
105 | self.assertEqual(string.capwords('ABC DEF GHI'), 'Abc Def Ghi')
|
---|
106 | self.assertEqual(string.capwords('ABC-DEF-GHI', '-'), 'Abc-Def-Ghi')
|
---|
107 | self.assertEqual(string.capwords('ABC-def DEF-ghi GHI'), 'Abc-def Def-ghi Ghi')
|
---|
108 | self.assertEqual(string.capwords(' aBc DeF '), 'Abc Def')
|
---|
109 | self.assertEqual(string.capwords('\taBc\tDeF\t'), 'Abc Def')
|
---|
110 | self.assertEqual(string.capwords('\taBc\tDeF\t', '\t'), '\tAbc\tDef\t')
|
---|
111 |
|
---|
112 | def test_formatter(self):
|
---|
113 | fmt = string.Formatter()
|
---|
114 | self.assertEqual(fmt.format("foo"), "foo")
|
---|
115 |
|
---|
116 | self.assertEqual(fmt.format("foo{0}", "bar"), "foobar")
|
---|
117 | self.assertEqual(fmt.format("foo{1}{0}-{1}", "bar", 6), "foo6bar-6")
|
---|
118 | self.assertEqual(fmt.format("-{arg!r}-", arg='test'), "-'test'-")
|
---|
119 |
|
---|
120 | # override get_value ############################################
|
---|
121 | class NamespaceFormatter(string.Formatter):
|
---|
122 | def __init__(self, namespace={}):
|
---|
123 | string.Formatter.__init__(self)
|
---|
124 | self.namespace = namespace
|
---|
125 |
|
---|
126 | def get_value(self, key, args, kwds):
|
---|
127 | if isinstance(key, str):
|
---|
128 | try:
|
---|
129 | # Check explicitly passed arguments first
|
---|
130 | return kwds[key]
|
---|
131 | except KeyError:
|
---|
132 | return self.namespace[key]
|
---|
133 | else:
|
---|
134 | string.Formatter.get_value(key, args, kwds)
|
---|
135 |
|
---|
136 | fmt = NamespaceFormatter({'greeting':'hello'})
|
---|
137 | self.assertEqual(fmt.format("{greeting}, world!"), 'hello, world!')
|
---|
138 |
|
---|
139 |
|
---|
140 | # override format_field #########################################
|
---|
141 | class CallFormatter(string.Formatter):
|
---|
142 | def format_field(self, value, format_spec):
|
---|
143 | return format(value(), format_spec)
|
---|
144 |
|
---|
145 | fmt = CallFormatter()
|
---|
146 | self.assertEqual(fmt.format('*{0}*', lambda : 'result'), '*result*')
|
---|
147 |
|
---|
148 |
|
---|
149 | # override convert_field ########################################
|
---|
150 | class XFormatter(string.Formatter):
|
---|
151 | def convert_field(self, value, conversion):
|
---|
152 | if conversion == 'x':
|
---|
153 | return None
|
---|
154 | return super(XFormatter, self).convert_field(value, conversion)
|
---|
155 |
|
---|
156 | fmt = XFormatter()
|
---|
157 | self.assertEqual(fmt.format("{0!r}:{0!x}", 'foo', 'foo'), "'foo':None")
|
---|
158 |
|
---|
159 |
|
---|
160 | # override parse ################################################
|
---|
161 | class BarFormatter(string.Formatter):
|
---|
162 | # returns an iterable that contains tuples of the form:
|
---|
163 | # (literal_text, field_name, format_spec, conversion)
|
---|
164 | def parse(self, format_string):
|
---|
165 | for field in format_string.split('|'):
|
---|
166 | if field[0] == '+':
|
---|
167 | # it's markup
|
---|
168 | field_name, _, format_spec = field[1:].partition(':')
|
---|
169 | yield '', field_name, format_spec, None
|
---|
170 | else:
|
---|
171 | yield field, None, None, None
|
---|
172 |
|
---|
173 | fmt = BarFormatter()
|
---|
174 | self.assertEqual(fmt.format('*|+0:^10s|*', 'foo'), '* foo *')
|
---|
175 |
|
---|
176 | # test all parameters used
|
---|
177 | class CheckAllUsedFormatter(string.Formatter):
|
---|
178 | def check_unused_args(self, used_args, args, kwargs):
|
---|
179 | # Track which arguments actually got used
|
---|
180 | unused_args = set(kwargs.keys())
|
---|
181 | unused_args.update(range(0, len(args)))
|
---|
182 |
|
---|
183 | for arg in used_args:
|
---|
184 | unused_args.remove(arg)
|
---|
185 |
|
---|
186 | if unused_args:
|
---|
187 | raise ValueError("unused arguments")
|
---|
188 |
|
---|
189 | fmt = CheckAllUsedFormatter()
|
---|
190 | self.assertEqual(fmt.format("{0}", 10), "10")
|
---|
191 | self.assertEqual(fmt.format("{0}{i}", 10, i=100), "10100")
|
---|
192 | self.assertEqual(fmt.format("{0}{i}{1}", 10, 20, i=100), "1010020")
|
---|
193 | self.assertRaises(ValueError, fmt.format, "{0}{i}{1}", 10, 20, i=100, j=0)
|
---|
194 | self.assertRaises(ValueError, fmt.format, "{0}", 10, 20)
|
---|
195 | self.assertRaises(ValueError, fmt.format, "{0}", 10, 20, i=100)
|
---|
196 | self.assertRaises(ValueError, fmt.format, "{i}", 10, 20, i=100)
|
---|
197 |
|
---|
198 | # Alternate formatting is not supported
|
---|
199 | self.assertRaises(ValueError, format, '', '#')
|
---|
200 | self.assertRaises(ValueError, format, '', '#20')
|
---|
201 |
|
---|
202 | class BytesAliasTest(unittest.TestCase):
|
---|
203 |
|
---|
204 | def test_builtin(self):
|
---|
205 | self.assertTrue(str is bytes)
|
---|
206 |
|
---|
207 | def test_syntax(self):
|
---|
208 | self.assertEqual(b"spam", "spam")
|
---|
209 | self.assertEqual(br"egg\foo", "egg\\foo")
|
---|
210 | self.assertTrue(type(b""), str)
|
---|
211 | self.assertTrue(type(br""), str)
|
---|
212 |
|
---|
213 | def test_main():
|
---|
214 | test_support.run_unittest(StringTest, ModuleTest, BytesAliasTest)
|
---|
215 |
|
---|
216 | if __name__ == "__main__":
|
---|
217 | test_main()
|
---|