Merged release21-maint changes.
[python/dscho.git] / Lib / test / string_tests.py
blob9b95a8e111b5955fe9780f80d29ad152f95d25ef
1 """Common tests shared by test_string and test_userstring"""
3 import string
4 from test_support import verify, verbose, TestFailed
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 test('join', u'.', u'a.b.c', ['a', 'b', 'c'])
129 test('join', '.', u'a.b.c', [u'a', 'b', 'c'])
130 test('join', '.', u'a.b.c', ['a', u'b', 'c'])
131 test('join', '.', u'a.b.c', ['a', 'b', u'c'])
132 test('join', '.', TypeError, ['a', u'b', 3])
133 for i in [5, 25, 125]:
134 test('join', '-', ((('a' * i) + '-') * i)[:-1],
135 ['a' * i] * i)
137 test('join', ' ', TypeError, BadSeq1())
138 test('join', ' ', 'a b c', BadSeq2())
140 test('splitlines', "abc\ndef\n\rghi", ['abc', 'def', '', 'ghi'])
141 test('splitlines', "abc\ndef\n\r\nghi", ['abc', 'def', '', 'ghi'])
142 test('splitlines', "abc\ndef\r\nghi", ['abc', 'def', 'ghi'])
143 test('splitlines', "abc\ndef\r\nghi\n", ['abc', 'def', 'ghi'])
144 test('splitlines', "abc\ndef\r\nghi\n\r", ['abc', 'def', 'ghi', ''])
145 test('splitlines', "\nabc\ndef\r\nghi\n\r", ['', 'abc', 'def', 'ghi', ''])
146 test('splitlines', "\nabc\ndef\r\nghi\n\r", ['\n', 'abc\n', 'def\r\n', 'ghi\n', '\r'], 1)
148 test('split', 'this is the split function',
149 ['this', 'is', 'the', 'split', 'function'])
150 test('split', 'a|b|c|d', ['a', 'b', 'c', 'd'], '|')
151 test('split', 'a|b|c|d', ['a', 'b', 'c|d'], '|', 2)
152 test('split', 'a b c d', ['a', 'b c d'], None, 1)
153 test('split', 'a b c d', ['a', 'b', 'c d'], None, 2)
154 test('split', 'a b c d', ['a', 'b', 'c', 'd'], None, 3)
155 test('split', 'a b c d', ['a', 'b', 'c', 'd'], None, 4)
156 test('split', 'a b c d', ['a b c d'], None, 0)
157 test('split', 'a b c d', ['a', 'b', 'c d'], None, 2)
158 test('split', 'a b c d ', ['a', 'b', 'c', 'd'])
160 test('strip', ' hello ', 'hello')
161 test('lstrip', ' hello ', 'hello ')
162 test('rstrip', ' hello ', ' hello')
163 test('strip', 'hello', 'hello')
165 test('swapcase', 'HeLLo cOmpUteRs', 'hEllO CoMPuTErS')
166 test('translate', 'xyzabcdef', 'xyzxyz', transtable, 'def')
168 table = string.maketrans('a', 'A')
169 test('translate', 'abc', 'Abc', table)
170 test('translate', 'xyz', 'xyz', table)
172 test('replace', 'one!two!three!', 'one@two!three!', '!', '@', 1)
173 test('replace', 'one!two!three!', 'onetwothree', '!', '')
174 test('replace', 'one!two!three!', 'one@two@three!', '!', '@', 2)
175 test('replace', 'one!two!three!', 'one@two@three@', '!', '@', 3)
176 test('replace', 'one!two!three!', 'one@two@three@', '!', '@', 4)
177 test('replace', 'one!two!three!', 'one!two!three!', '!', '@', 0)
178 test('replace', 'one!two!three!', 'one@two@three@', '!', '@')
179 test('replace', 'one!two!three!', 'one!two!three!', 'x', '@')
180 test('replace', 'one!two!three!', 'one!two!three!', 'x', '@', 2)
181 # Next three for SF bug 422088: [OSF1 alpha] string.replace(); died with
182 # MemoryError due to empty result (platform malloc issue when requesting
183 # 0 bytes).
184 test('replace', '123', '', '123', '')
185 test('replace', '123123', '', '123', '')
186 test('replace', '123x123', 'x', '123', '')
188 test('startswith', 'hello', 1, 'he')
189 test('startswith', 'hello', 1, 'hello')
190 test('startswith', 'hello', 0, 'hello world')
191 test('startswith', 'hello', 1, '')
192 test('startswith', 'hello', 0, 'ello')
193 test('startswith', 'hello', 1, 'ello', 1)
194 test('startswith', 'hello', 1, 'o', 4)
195 test('startswith', 'hello', 0, 'o', 5)
196 test('startswith', 'hello', 1, '', 5)
197 test('startswith', 'hello', 0, 'lo', 6)
198 test('startswith', 'helloworld', 1, 'lowo', 3)
199 test('startswith', 'helloworld', 1, 'lowo', 3, 7)
200 test('startswith', 'helloworld', 0, 'lowo', 3, 6)
202 test('endswith', 'hello', 1, 'lo')
203 test('endswith', 'hello', 0, 'he')
204 test('endswith', 'hello', 1, '')
205 test('endswith', 'hello', 0, 'hello world')
206 test('endswith', 'helloworld', 0, 'worl')
207 test('endswith', 'helloworld', 1, 'worl', 3, 9)
208 test('endswith', 'helloworld', 1, 'world', 3, 12)
209 test('endswith', 'helloworld', 1, 'lowo', 1, 7)
210 test('endswith', 'helloworld', 1, 'lowo', 2, 7)
211 test('endswith', 'helloworld', 1, 'lowo', 3, 7)
212 test('endswith', 'helloworld', 0, 'lowo', 4, 7)
213 test('endswith', 'helloworld', 0, 'lowo', 3, 8)
214 test('endswith', 'ab', 0, 'ab', 0, 1)
215 test('endswith', 'ab', 0, 'ab', 0, 0)
217 # Encoding/decoding
218 codecs = [('rot13', 'uryyb jbeyq'),
219 ('base64', 'aGVsbG8gd29ybGQ=\n'),
220 ('hex', '68656c6c6f20776f726c64'),
221 ('uu', 'begin 666 <data>\n+:&5L;&\\@=V]R;&0 \n \nend\n')]
222 for encoding, data in codecs:
223 test('encode', 'hello world', data, encoding)
224 test('decode', data, 'hello world', encoding)
225 # zlib is optional, so we make the test optional too...
226 try:
227 import zlib
228 except ImportError:
229 pass
230 else:
231 data = 'x\x9c\xcbH\xcd\xc9\xc9W(\xcf/\xcaI\x01\x00\x1a\x0b\x04]'
232 verify('hello world'.encode('zlib') == data)
233 verify(data.decode('zlib') == 'hello world')