blob: 1729999366cefc24c9b6a2ceebe68adddfa6cdf0 [file] [log] [blame]
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +00001"""Common tests shared by test_string and test_userstring"""
2
3import string
Barry Warsaw817918c2002-08-06 16:58:21 +00004from test.test_support import verify, vereq, verbose, TestFailed, have_unicode
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +00005
6transtable = '\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'
7
Jeremy Hylton20f41b62000-07-11 03:31:55 +00008from UserList import UserList
9
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +000010class 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]
14
15class BadSeq1(Sequence):
16 def __init__(self): self.seq = [7, 'hello', 123L]
17
18class BadSeq2(Sequence):
19 def __init__(self): self.seq = ['a', 'b', 'c']
20 def __len__(self): return 8
21
22def run_module_tests(test):
23 """Run all tests that exercise a function in the string module"""
24
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)
34
35 test('maketrans', 'abc', transtable, 'xyz')
36 test('maketrans', 'abc', ValueError, 'xyzq')
37
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)
43
44 test('join', BadSeq1(), TypeError)
Jeremy Hylton20f41b62000-07-11 03:31:55 +000045 test('join', BadSeq2(), 'a b c')
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +000046
47 # try a few long ones
Eric S. Raymondfc170b12001-02-09 11:51:27 +000048 print ":".join(['x' * 100] * 100)
49 print ":".join(('x' * 100,) * 100)
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +000050
51
52def run_method_tests(test):
53 """Run all tests that exercise a method of a string object"""
54
55 test('capitalize', ' hello ', ' hello ')
56 test('capitalize', 'hello ', 'Hello ')
Marc-André Lemburgfde66e12001-01-29 11:14:16 +000057 test('capitalize', 'aaaa', 'Aaaa')
58 test('capitalize', 'AaAa', 'Aaaa')
Marc-André Lemburg3a645e42001-01-16 11:54:12 +000059
60 test('count', 'aaa', 3, 'a')
61 test('count', 'aaa', 0, 'b')
Tim Petersd2bf3b72001-01-18 02:22:22 +000062
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +000063 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')
71
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')
77
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)
82
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)
89
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)
96
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)
106
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)
113
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)
121
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())
Jeremy Hylton20f41b62000-07-11 03:31:55 +0000126 test('join', 'a', 'abc', ('abc',))
127 test('join', 'a', 'z', UserList(['z']))
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000128 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])
Jeremy Hylton88887aa2000-07-11 20:55:38 +0000134 for i in [5, 25, 125]:
135 test('join', '-', ((('a' * i) + '-') * i)[:-1],
136 ['a' * i] * i)
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +0000137
138 test('join', ' ', TypeError, BadSeq1())
Jeremy Hylton20f41b62000-07-11 03:31:55 +0000139 test('join', ' ', 'a b c', BadSeq2())
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +0000140
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)
148
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'])
160
161 test('strip', ' hello ', 'hello')
162 test('lstrip', ' hello ', 'hello ')
163 test('rstrip', ' hello ', ' hello')
164 test('strip', 'hello', 'hello')
165
Guido van Rossum018b0eb2002-04-13 00:56:08 +0000166 # 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)
171
Walter Dörwaldde02bcb2002-04-22 17:42:37 +0000172 # strip/lstrip/rstrip with str arg
Guido van Rossum018b0eb2002-04-13 00:56:08 +0000173 test('strip', 'xyzzyhelloxyzzy', 'hello', 'xyz')
174 test('lstrip', 'xyzzyhelloxyzzy', 'helloxyzzy', 'xyz')
175 test('rstrip', 'xyzzyhelloxyzzy', 'xyzzyhello', 'xyz')
176 test('strip', 'hello', 'hello', 'xyz')
177
Walter Dörwaldde02bcb2002-04-22 17:42:37 +0000178 # strip/lstrip/rstrip with unicode arg
Michael W. Hudsonf2072772002-05-20 14:48:16 +0000179 if have_unicode:
Tim Peters8ac14952002-05-23 15:15:30 +0000180 test('strip', 'xyzzyhelloxyzzy',
Michael W. Hudsonf2072772002-05-20 14:48:16 +0000181 unicode('hello', 'ascii'), unicode('xyz', 'ascii'))
Tim Peters8ac14952002-05-23 15:15:30 +0000182 test('lstrip', 'xyzzyhelloxyzzy',
Michael W. Hudsonf2072772002-05-20 14:48:16 +0000183 unicode('helloxyzzy', 'ascii'), unicode('xyz', 'ascii'))
184 test('rstrip', 'xyzzyhelloxyzzy',
185 unicode('xyzzyhello', 'ascii'), unicode('xyz', 'ascii'))
Tim Peters8ac14952002-05-23 15:15:30 +0000186 test('strip', 'hello',
Michael W. Hudsonf2072772002-05-20 14:48:16 +0000187 unicode('hello', 'ascii'), unicode('xyz', 'ascii'))
Walter Dörwaldde02bcb2002-04-22 17:42:37 +0000188
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +0000189 test('swapcase', 'HeLLo cOmpUteRs', 'hEllO CoMPuTErS')
190 test('translate', 'xyzabcdef', 'xyzxyz', transtable, 'def')
191
192 table = string.maketrans('a', 'A')
193 test('translate', 'abc', 'Abc', table)
194 test('translate', 'xyz', 'xyz', table)
195
196 test('replace', 'one!two!three!', 'one@two!three!', '!', '@', 1)
197 test('replace', 'one!two!three!', 'onetwothree', '!', '')
198 test('replace', 'one!two!three!', 'one@two@three!', '!', '@', 2)
199 test('replace', 'one!two!three!', 'one@two@three@', '!', '@', 3)
200 test('replace', 'one!two!three!', 'one@two@three@', '!', '@', 4)
201 test('replace', 'one!two!three!', 'one!two!three!', '!', '@', 0)
202 test('replace', 'one!two!three!', 'one@two@three@', '!', '@')
203 test('replace', 'one!two!three!', 'one!two!three!', 'x', '@')
204 test('replace', 'one!two!three!', 'one!two!three!', 'x', '@', 2)
Tim Peters1a7b3ee2001-05-09 23:00:26 +0000205 # Next three for SF bug 422088: [OSF1 alpha] string.replace(); died with
206 # MemoryError due to empty result (platform malloc issue when requesting
207 # 0 bytes).
208 test('replace', '123', '', '123', '')
209 test('replace', '123123', '', '123', '')
210 test('replace', '123x123', 'x', '123', '')
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +0000211
212 test('startswith', 'hello', 1, 'he')
213 test('startswith', 'hello', 1, 'hello')
214 test('startswith', 'hello', 0, 'hello world')
215 test('startswith', 'hello', 1, '')
216 test('startswith', 'hello', 0, 'ello')
217 test('startswith', 'hello', 1, 'ello', 1)
218 test('startswith', 'hello', 1, 'o', 4)
219 test('startswith', 'hello', 0, 'o', 5)
220 test('startswith', 'hello', 1, '', 5)
221 test('startswith', 'hello', 0, 'lo', 6)
222 test('startswith', 'helloworld', 1, 'lowo', 3)
223 test('startswith', 'helloworld', 1, 'lowo', 3, 7)
224 test('startswith', 'helloworld', 0, 'lowo', 3, 6)
225
Neal Norwitz1f68fc72002-06-14 00:50:42 +0000226 # test negative indices in startswith
227 test('startswith', 'hello', 1, 'he', 0, -1)
228 test('startswith', 'hello', 1, 'he', -53, -1)
229 test('startswith', 'hello', 0, 'hello', 0, -1)
230 test('startswith', 'hello', 0, 'hello world', -1, -10)
231 test('startswith', 'hello', 0, 'ello', -5)
232 test('startswith', 'hello', 1, 'ello', -4)
233 test('startswith', 'hello', 0, 'o', -2)
234 test('startswith', 'hello', 1, 'o', -1)
235 test('startswith', 'hello', 1, '', -3, -3)
236 test('startswith', 'hello', 0, 'lo', -9)
237
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +0000238 test('endswith', 'hello', 1, 'lo')
239 test('endswith', 'hello', 0, 'he')
240 test('endswith', 'hello', 1, '')
241 test('endswith', 'hello', 0, 'hello world')
242 test('endswith', 'helloworld', 0, 'worl')
243 test('endswith', 'helloworld', 1, 'worl', 3, 9)
244 test('endswith', 'helloworld', 1, 'world', 3, 12)
245 test('endswith', 'helloworld', 1, 'lowo', 1, 7)
246 test('endswith', 'helloworld', 1, 'lowo', 2, 7)
247 test('endswith', 'helloworld', 1, 'lowo', 3, 7)
248 test('endswith', 'helloworld', 0, 'lowo', 4, 7)
249 test('endswith', 'helloworld', 0, 'lowo', 3, 8)
250 test('endswith', 'ab', 0, 'ab', 0, 1)
251 test('endswith', 'ab', 0, 'ab', 0, 0)
Marc-André Lemburg2d920412001-05-15 12:00:02 +0000252
Neal Norwitz1f68fc72002-06-14 00:50:42 +0000253 # test negative indices in endswith
254 test('endswith', 'hello', 1, 'lo', -2)
255 test('endswith', 'hello', 0, 'he', -2)
256 test('endswith', 'hello', 1, '', -3, -3)
257 test('endswith', 'hello', 0, 'hello world', -10, -2)
258 test('endswith', 'helloworld', 0, 'worl', -6)
259 test('endswith', 'helloworld', 1, 'worl', -5, -1)
260 test('endswith', 'helloworld', 1, 'worl', -5, 9)
261 test('endswith', 'helloworld', 1, 'world', -7, 12)
262 test('endswith', 'helloworld', 1, 'lowo', -99, -3)
263 test('endswith', 'helloworld', 1, 'lowo', -8, -3)
264 test('endswith', 'helloworld', 1, 'lowo', -7, -3)
265 test('endswith', 'helloworld', 0, 'lowo', 3, -4)
266 test('endswith', 'helloworld', 0, 'lowo', -8, -2)
267
Walter Dörwald068325e2002-04-15 13:36:47 +0000268 test('zfill', '123', '123', 2)
269 test('zfill', '123', '123', 3)
270 test('zfill', '123', '0123', 4)
271 test('zfill', '+123', '+123', 3)
272 test('zfill', '+123', '+123', 4)
273 test('zfill', '+123', '+0123', 5)
274 test('zfill', '-123', '-123', 3)
275 test('zfill', '-123', '-123', 4)
276 test('zfill', '-123', '-0123', 5)
277 test('zfill', '', '000', 3)
Andrew M. Kuchlingc6c9c4a2002-03-29 16:00:13 +0000278 test('zfill', '34', '34', 1)
279 test('zfill', '34', '0034', 4)
Tim Peters863ac442002-04-16 01:38:40 +0000280
Marc-André Lemburg2d920412001-05-15 12:00:02 +0000281 # Encoding/decoding
282 codecs = [('rot13', 'uryyb jbeyq'),
283 ('base64', 'aGVsbG8gd29ybGQ=\n'),
284 ('hex', '68656c6c6f20776f726c64'),
285 ('uu', 'begin 666 <data>\n+:&5L;&\\@=V]R;&0 \n \nend\n')]
286 for encoding, data in codecs:
287 test('encode', 'hello world', data, encoding)
288 test('decode', data, 'hello world', encoding)
289 # zlib is optional, so we make the test optional too...
290 try:
291 import zlib
292 except ImportError:
293 pass
294 else:
295 data = 'x\x9c\xcbH\xcd\xc9\xc9W(\xcf/\xcaI\x01\x00\x1a\x0b\x04]'
296 verify('hello world'.encode('zlib') == data)
297 verify(data.decode('zlib') == 'hello world')
Barry Warsaw817918c2002-08-06 16:58:21 +0000298
299def test_exception(lhs, rhs, msg):
300 try:
301 lhs in rhs
302 except TypeError:
303 pass
304 else:
305 raise TestFailed, msg
306
307def run_contains_tests(test):
Raymond Hettinger8da9da02002-08-09 00:43:38 +0000308 test('__contains__', '', True, '') # vereq('' in '', True)
309 test('__contains__', 'abc', True, '') # vereq('' in 'abc', True)
310 test('__contains__', 'abc', False, '\0') # vereq('\0' in 'abc', False)
311 test('__contains__', '\0abc', True, '\0') # vereq('\0' in '\0abc', True)
312 test('__contains__', 'abc\0', True, '\0') # vereq('\0' in 'abc\0', True)
313 test('__contains__', '\0abc', True, 'a') # vereq('a' in '\0abc', True)
314 test('__contains__', 'asdf', True, 'asdf') # vereq('asdf' in 'asdf', True)
315 test('__contains__', 'asd', False, 'asdf') # vereq('asdf' in 'asd', False)
316 test('__contains__', '', False, 'asdf') # vereq('asdf' in '', False)