More installation info. Bump alpha version.
[python/dscho.git] / Lib / test / string_tests.py
blobb64917b4492a24f1e3c9c4d0357c955bab2d60c3
1 """Common tests shared by test_string and test_userstring"""
3 import string
4 from test.test_support import verify, vereq, verbose, TestFailed, have_unicode
6 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'
8 from UserList import UserList
10 class Sequence:
11 def __init__(self): self.seq = 'wxyz'
12 def __len__(self): return len(self.seq)
13 def __getitem__(self, i): return self.seq[i]
15 class BadSeq1(Sequence):
16 def __init__(self): self.seq = [7, 'hello', 123L]
18 class BadSeq2(Sequence):
19 def __init__(self): self.seq = ['a', 'b', 'c']
20 def __len__(self): return 8
22 def run_module_tests(test):
23 """Run all tests that exercise a function in the string module"""
25 test('atoi', " 1 ", 1)
26 test('atoi', " 1x", ValueError)
27 test('atoi', " x1 ", ValueError)
28 test('atol', " 1 ", 1L)
29 test('atol', " 1x ", ValueError)
30 test('atol', " x1 ", ValueError)
31 test('atof', " 1 ", 1.0)
32 test('atof', " 1x ", ValueError)
33 test('atof', " x1 ", ValueError)
35 test('maketrans', 'abc', transtable, 'xyz')
36 test('maketrans', 'abc', ValueError, 'xyzq')
38 # join now works with any sequence type
39 test('join', ['a', 'b', 'c', 'd'], 'a b c d')
40 test('join', ('a', 'b', 'c', 'd'), 'abcd', '')
41 test('join', Sequence(), 'w x y z')
42 test('join', 7, TypeError)
44 test('join', BadSeq1(), TypeError)
45 test('join', BadSeq2(), 'a b c')
47 # try a few long ones
48 print ":".join(['x' * 100] * 100)
49 print ":".join(('x' * 100,) * 100)
52 def run_method_tests(test):
53 """Run all tests that exercise a method of a string object"""
55 test('capitalize', ' hello ', ' hello ')
56 test('capitalize', 'hello ', 'Hello ')
57 test('capitalize', 'aaaa', 'Aaaa')
58 test('capitalize', 'AaAa', 'Aaaa')
60 test('count', 'aaa', 3, 'a')
61 test('count', 'aaa', 0, 'b')
63 test('find', 'abcdefghiabc', 0, 'abc')
64 test('find', 'abcdefghiabc', 9, 'abc', 1)
65 test('find', 'abcdefghiabc', -1, 'def', 4)
66 test('rfind', 'abcdefghiabc', 9, 'abc')
67 test('lower', 'HeLLo', 'hello')
68 test('lower', 'hello', 'hello')
69 test('upper', 'HeLLo', 'HELLO')
70 test('upper', 'HELLO', 'HELLO')
72 test('title', ' hello ', ' Hello ')
73 test('title', 'hello ', 'Hello ')
74 test('title', "fOrMaT thIs aS titLe String", 'Format This As Title String')
75 test('title', "fOrMaT,thIs-aS*titLe;String", 'Format,This-As*Title;String')
76 test('title', "getInt", 'Getint')
78 test('expandtabs', 'abc\rab\tdef\ng\thi', 'abc\rab def\ng hi')
79 test('expandtabs', 'abc\rab\tdef\ng\thi', 'abc\rab def\ng hi', 8)
80 test('expandtabs', 'abc\rab\tdef\ng\thi', 'abc\rab def\ng hi', 4)
81 test('expandtabs', 'abc\r\nab\tdef\ng\thi', 'abc\r\nab def\ng hi', 4)
83 test('islower', 'a', 1)
84 test('islower', 'A', 0)
85 test('islower', '\n', 0)
86 test('islower', 'abc', 1)
87 test('islower', 'aBc', 0)
88 test('islower', 'abc\n', 1)
90 test('isupper', 'a', 0)
91 test('isupper', 'A', 1)
92 test('isupper', '\n', 0)
93 test('isupper', 'ABC', 1)
94 test('isupper', 'AbC', 0)
95 test('isupper', 'ABC\n', 1)
97 test('istitle', 'a', 0)
98 test('istitle', 'A', 1)
99 test('istitle', '\n', 0)
100 test('istitle', 'A Titlecased Line', 1)
101 test('istitle', 'A\nTitlecased Line', 1)
102 test('istitle', 'A Titlecased, Line', 1)
103 test('istitle', 'Not a capitalized String', 0)
104 test('istitle', 'Not\ta Titlecase String', 0)
105 test('istitle', 'Not--a Titlecase String', 0)
107 test('isalpha', 'a', 1)
108 test('isalpha', 'A', 1)
109 test('isalpha', '\n', 0)
110 test('isalpha', 'abc', 1)
111 test('isalpha', 'aBc123', 0)
112 test('isalpha', 'abc\n', 0)
114 test('isalnum', 'a', 1)
115 test('isalnum', 'A', 1)
116 test('isalnum', '\n', 0)
117 test('isalnum', '123abc456', 1)
118 test('isalnum', 'a1b3c', 1)
119 test('isalnum', 'aBc000 ', 0)
120 test('isalnum', 'abc\n', 0)
122 # join now works with any sequence type
123 test('join', ' ', 'a b c d', ['a', 'b', 'c', 'd'])
124 test('join', '', 'abcd', ('a', 'b', 'c', 'd'))
125 test('join', ' ', 'w x y z', Sequence())
126 test('join', 'a', 'abc', ('abc',))
127 test('join', 'a', 'z', UserList(['z']))
128 if have_unicode:
129 test('join', unicode('.'), unicode('a.b.c'), ['a', 'b', 'c'])
130 test('join', '.', unicode('a.b.c'), [unicode('a'), 'b', 'c'])
131 test('join', '.', unicode('a.b.c'), ['a', unicode('b'), 'c'])
132 test('join', '.', unicode('a.b.c'), ['a', 'b', unicode('c')])
133 test('join', '.', TypeError, ['a', unicode('b'), 3])
134 for i in [5, 25, 125]:
135 test('join', '-', ((('a' * i) + '-') * i)[:-1],
136 ['a' * i] * i)
138 test('join', ' ', TypeError, BadSeq1())
139 test('join', ' ', 'a b c', BadSeq2())
141 test('splitlines', "abc\ndef\n\rghi", ['abc', 'def', '', 'ghi'])
142 test('splitlines', "abc\ndef\n\r\nghi", ['abc', 'def', '', 'ghi'])
143 test('splitlines', "abc\ndef\r\nghi", ['abc', 'def', 'ghi'])
144 test('splitlines', "abc\ndef\r\nghi\n", ['abc', 'def', 'ghi'])
145 test('splitlines', "abc\ndef\r\nghi\n\r", ['abc', 'def', 'ghi', ''])
146 test('splitlines', "\nabc\ndef\r\nghi\n\r", ['', 'abc', 'def', 'ghi', ''])
147 test('splitlines', "\nabc\ndef\r\nghi\n\r", ['\n', 'abc\n', 'def\r\n', 'ghi\n', '\r'], 1)
149 test('split', 'this is the split function',
150 ['this', 'is', 'the', 'split', 'function'])
151 test('split', 'a|b|c|d', ['a', 'b', 'c', 'd'], '|')
152 test('split', 'a|b|c|d', ['a', 'b', 'c|d'], '|', 2)
153 test('split', 'a b c d', ['a', 'b c d'], None, 1)
154 test('split', 'a b c d', ['a', 'b', 'c d'], None, 2)
155 test('split', 'a b c d', ['a', 'b', 'c', 'd'], None, 3)
156 test('split', 'a b c d', ['a', 'b', 'c', 'd'], None, 4)
157 test('split', 'a b c d', ['a b c d'], None, 0)
158 test('split', 'a b c d', ['a', 'b', 'c d'], None, 2)
159 test('split', 'a b c d ', ['a', 'b', 'c', 'd'])
161 test('strip', ' hello ', 'hello')
162 test('lstrip', ' hello ', 'hello ')
163 test('rstrip', ' hello ', ' hello')
164 test('strip', 'hello', 'hello')
166 # strip/lstrip/rstrip with None arg
167 test('strip', ' hello ', 'hello', None)
168 test('lstrip', ' hello ', 'hello ', None)
169 test('rstrip', ' hello ', ' hello', None)
170 test('strip', 'hello', 'hello', None)
172 # strip/lstrip/rstrip with str arg
173 test('strip', 'xyzzyhelloxyzzy', 'hello', 'xyz')
174 test('lstrip', 'xyzzyhelloxyzzy', 'helloxyzzy', 'xyz')
175 test('rstrip', 'xyzzyhelloxyzzy', 'xyzzyhello', 'xyz')
176 test('strip', 'hello', 'hello', 'xyz')
178 # strip/lstrip/rstrip with unicode arg
179 if have_unicode:
180 test('strip', 'xyzzyhelloxyzzy',
181 unicode('hello', 'ascii'), unicode('xyz', 'ascii'))
182 test('lstrip', 'xyzzyhelloxyzzy',
183 unicode('helloxyzzy', 'ascii'), unicode('xyz', 'ascii'))
184 test('rstrip', 'xyzzyhelloxyzzy',
185 unicode('xyzzyhello', 'ascii'), unicode('xyz', 'ascii'))
186 test('strip', 'hello',
187 unicode('hello', 'ascii'), unicode('xyz', 'ascii'))
189 test('swapcase', 'HeLLo cOmpUteRs', 'hEllO CoMPuTErS')
190 test('translate', 'xyzabcdef', 'xyzxyz', transtable, 'def')
192 table = string.maketrans('a', 'A')
193 test('translate', 'abc', 'Abc', table)
194 test('translate', 'xyz', 'xyz', table)
195 test('translate', 'xyz', ValueError, 'too short', 'strip')
196 test('translate', 'xyz', ValueError, 'too short')
198 test('replace', 'one!two!three!', 'one@two!three!', '!', '@', 1)
199 test('replace', 'one!two!three!', 'onetwothree', '!', '')
200 test('replace', 'one!two!three!', 'one@two@three!', '!', '@', 2)
201 test('replace', 'one!two!three!', 'one@two@three@', '!', '@', 3)
202 test('replace', 'one!two!three!', 'one@two@three@', '!', '@', 4)
203 test('replace', 'one!two!three!', 'one!two!three!', '!', '@', 0)
204 test('replace', 'one!two!three!', 'one@two@three@', '!', '@')
205 test('replace', 'one!two!three!', 'one!two!three!', 'x', '@')
206 test('replace', 'one!two!three!', 'one!two!three!', 'x', '@', 2)
207 test('replace', 'abc', '-a-b-c-', '', '-')
208 test('replace', 'abc', '-a-b-c', '', '-', 3)
209 test('replace', 'abc', 'abc', '', '-', 0)
210 test('replace', '', '', '', '')
211 # Next three for SF bug 422088: [OSF1 alpha] string.replace(); died with
212 # MemoryError due to empty result (platform malloc issue when requesting
213 # 0 bytes).
214 test('replace', '123', '', '123', '')
215 test('replace', '123123', '', '123', '')
216 test('replace', '123x123', 'x', '123', '')
218 test('startswith', 'hello', 1, 'he')
219 test('startswith', 'hello', 1, 'hello')
220 test('startswith', 'hello', 0, 'hello world')
221 test('startswith', 'hello', 1, '')
222 test('startswith', 'hello', 0, 'ello')
223 test('startswith', 'hello', 1, 'ello', 1)
224 test('startswith', 'hello', 1, 'o', 4)
225 test('startswith', 'hello', 0, 'o', 5)
226 test('startswith', 'hello', 1, '', 5)
227 test('startswith', 'hello', 0, 'lo', 6)
228 test('startswith', 'helloworld', 1, 'lowo', 3)
229 test('startswith', 'helloworld', 1, 'lowo', 3, 7)
230 test('startswith', 'helloworld', 0, 'lowo', 3, 6)
232 # test negative indices in startswith
233 test('startswith', 'hello', 1, 'he', 0, -1)
234 test('startswith', 'hello', 1, 'he', -53, -1)
235 test('startswith', 'hello', 0, 'hello', 0, -1)
236 test('startswith', 'hello', 0, 'hello world', -1, -10)
237 test('startswith', 'hello', 0, 'ello', -5)
238 test('startswith', 'hello', 1, 'ello', -4)
239 test('startswith', 'hello', 0, 'o', -2)
240 test('startswith', 'hello', 1, 'o', -1)
241 test('startswith', 'hello', 1, '', -3, -3)
242 test('startswith', 'hello', 0, 'lo', -9)
244 test('endswith', 'hello', 1, 'lo')
245 test('endswith', 'hello', 0, 'he')
246 test('endswith', 'hello', 1, '')
247 test('endswith', 'hello', 0, 'hello world')
248 test('endswith', 'helloworld', 0, 'worl')
249 test('endswith', 'helloworld', 1, 'worl', 3, 9)
250 test('endswith', 'helloworld', 1, 'world', 3, 12)
251 test('endswith', 'helloworld', 1, 'lowo', 1, 7)
252 test('endswith', 'helloworld', 1, 'lowo', 2, 7)
253 test('endswith', 'helloworld', 1, 'lowo', 3, 7)
254 test('endswith', 'helloworld', 0, 'lowo', 4, 7)
255 test('endswith', 'helloworld', 0, 'lowo', 3, 8)
256 test('endswith', 'ab', 0, 'ab', 0, 1)
257 test('endswith', 'ab', 0, 'ab', 0, 0)
259 # test negative indices in endswith
260 test('endswith', 'hello', 1, 'lo', -2)
261 test('endswith', 'hello', 0, 'he', -2)
262 test('endswith', 'hello', 1, '', -3, -3)
263 test('endswith', 'hello', 0, 'hello world', -10, -2)
264 test('endswith', 'helloworld', 0, 'worl', -6)
265 test('endswith', 'helloworld', 1, 'worl', -5, -1)
266 test('endswith', 'helloworld', 1, 'worl', -5, 9)
267 test('endswith', 'helloworld', 1, 'world', -7, 12)
268 test('endswith', 'helloworld', 1, 'lowo', -99, -3)
269 test('endswith', 'helloworld', 1, 'lowo', -8, -3)
270 test('endswith', 'helloworld', 1, 'lowo', -7, -3)
271 test('endswith', 'helloworld', 0, 'lowo', 3, -4)
272 test('endswith', 'helloworld', 0, 'lowo', -8, -2)
274 test('zfill', '123', '123', 2)
275 test('zfill', '123', '123', 3)
276 test('zfill', '123', '0123', 4)
277 test('zfill', '+123', '+123', 3)
278 test('zfill', '+123', '+123', 4)
279 test('zfill', '+123', '+0123', 5)
280 test('zfill', '-123', '-123', 3)
281 test('zfill', '-123', '-123', 4)
282 test('zfill', '-123', '-0123', 5)
283 test('zfill', '', '000', 3)
284 test('zfill', '34', '34', 1)
285 test('zfill', '34', '0034', 4)
287 test('__mod__', '+%s+', '+hello+', 'hello')
288 test('__mod__', '+%d+', '+10+', 10)
290 # Encoding/decoding
291 codecs = [('rot13', 'uryyb jbeyq'),
292 ('base64', 'aGVsbG8gd29ybGQ=\n'),
293 ('hex', '68656c6c6f20776f726c64'),
294 ('uu', 'begin 666 <data>\n+:&5L;&\\@=V]R;&0 \n \nend\n')]
295 for encoding, data in codecs:
296 test('encode', 'hello world', data, encoding)
297 test('decode', data, 'hello world', encoding)
298 # zlib is optional, so we make the test optional too...
299 try:
300 import zlib
301 except ImportError:
302 pass
303 else:
304 data = 'x\x9c\xcbH\xcd\xc9\xc9W(\xcf/\xcaI\x01\x00\x1a\x0b\x04]'
305 verify('hello world'.encode('zlib') == data)
306 verify(data.decode('zlib') == 'hello world')
308 def test_exception(lhs, rhs, msg):
309 try:
310 lhs in rhs
311 except TypeError:
312 pass
313 else:
314 raise TestFailed, msg
316 def run_contains_tests(test):
317 test('__contains__', '', True, '') # vereq('' in '', True)
318 test('__contains__', 'abc', True, '') # vereq('' in 'abc', True)
319 test('__contains__', 'abc', False, '\0') # vereq('\0' in 'abc', False)
320 test('__contains__', '\0abc', True, '\0') # vereq('\0' in '\0abc', True)
321 test('__contains__', 'abc\0', True, '\0') # vereq('\0' in 'abc\0', True)
322 test('__contains__', '\0abc', True, 'a') # vereq('a' in '\0abc', True)
323 test('__contains__', 'asdf', True, 'asdf') # vereq('asdf' in 'asdf', True)
324 test('__contains__', 'asd', False, 'asdf') # vereq('asdf' in 'asd', False)
325 test('__contains__', '', False, 'asdf') # vereq('asdf' in '', False)
327 def run_inplace_tests(constructor):
328 # Verify clearing of SF bug #592573
329 s = t = constructor('abc')
330 s += constructor('def')
331 verify(s != t, 'in-place concatenate should create a new object')