blob: feeb4ce52d5afafd1a38751bdc88a7ff5c168db6 [file] [log] [blame]
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001"""
2Common tests shared by test_str, test_unicode, test_userstring and test_string.
3"""
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +00004
Guido van Rossum360e4b82007-05-14 22:51:27 +00005import unittest, string, sys, struct
Benjamin Petersonee8712c2008-05-20 21:35:26 +00006from test import support
Raymond Hettinger53dbe392008-02-12 20:03:09 +00007from collections import UserList
Jeremy Hylton20f41b62000-07-11 03:31:55 +00008
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +00009class Sequence:
Walter Dörwald0fd583c2003-02-21 12:53:50 +000010 def __init__(self, seq='wxyz'): self.seq = seq
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +000011 def __len__(self): return len(self.seq)
12 def __getitem__(self, i): return self.seq[i]
13
14class BadSeq1(Sequence):
Guido van Rossume2a383d2007-01-15 16:59:06 +000015 def __init__(self): self.seq = [7, 'hello', 123]
Guido van Rossumf1044292007-09-27 18:01:22 +000016 def __str__(self): return '{0} {1} {2}'.format(*self.seq)
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +000017
18class BadSeq2(Sequence):
19 def __init__(self): self.seq = ['a', 'b', 'c']
20 def __len__(self): return 8
21
Georg Brandlc7885542007-03-06 19:16:20 +000022class BaseTest(unittest.TestCase):
23 # These tests are for buffers of values (bytes) and not
24 # specific to character interpretation, used for bytes objects
25 # and various string implementations
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +000026
Walter Dörwald0fd583c2003-02-21 12:53:50 +000027 # The type to be tested
28 # Change in subclasses to change the behaviour of fixtesttype()
29 type2test = None
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +000030
Antoine Pitrouac65d962011-10-20 23:54:17 +020031 # Whether the "contained items" of the container are integers in
32 # range(0, 256) (i.e. bytes, bytearray) or strings of length 1
33 # (str)
34 contains_bytes = False
35
Walter Dörwald0fd583c2003-02-21 12:53:50 +000036 # All tests pass their arguments to the testing methods
37 # as str objects. fixtesttype() can be used to propagate
38 # these arguments to the appropriate type
39 def fixtype(self, obj):
40 if isinstance(obj, str):
41 return self.__class__.type2test(obj)
42 elif isinstance(obj, list):
43 return [self.fixtype(x) for x in obj]
44 elif isinstance(obj, tuple):
45 return tuple([self.fixtype(x) for x in obj])
46 elif isinstance(obj, dict):
47 return dict([
48 (self.fixtype(key), self.fixtype(value))
Guido van Rossumcc2b0162007-02-11 06:12:03 +000049 for (key, value) in obj.items()
Walter Dörwald0fd583c2003-02-21 12:53:50 +000050 ])
51 else:
52 return obj
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +000053
Guido van Rossum09549f42007-08-27 20:40:10 +000054 # check that obj.method(*args) returns result
Mark Dickinson0d5f6ad2011-09-24 09:14:39 +010055 def checkequal(self, result, obj, methodname, *args, **kwargs):
Walter Dörwald0fd583c2003-02-21 12:53:50 +000056 result = self.fixtype(result)
Guido van Rossum09549f42007-08-27 20:40:10 +000057 obj = self.fixtype(obj)
Walter Dörwald0fd583c2003-02-21 12:53:50 +000058 args = self.fixtype(args)
Mark Dickinson0d5f6ad2011-09-24 09:14:39 +010059 kwargs = self.fixtype(kwargs)
60 realresult = getattr(obj, methodname)(*args, **kwargs)
Walter Dörwald0fd583c2003-02-21 12:53:50 +000061 self.assertEqual(
62 result,
63 realresult
64 )
65 # if the original is returned make sure that
66 # this doesn't happen with subclasses
Guido van Rossum09549f42007-08-27 20:40:10 +000067 if obj is realresult:
68 try:
69 class subtype(self.__class__.type2test):
70 pass
71 except TypeError:
72 pass # Skip this if we can't subclass
73 else:
74 obj = subtype(obj)
75 realresult = getattr(obj, methodname)(*args)
Ezio Melottib3aedd42010-11-20 19:04:17 +000076 self.assertIsNot(obj, realresult)
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +000077
Guido van Rossum09549f42007-08-27 20:40:10 +000078 # check that obj.method(*args) raises exc
79 def checkraises(self, exc, obj, methodname, *args):
80 obj = self.fixtype(obj)
Walter Dörwald0fd583c2003-02-21 12:53:50 +000081 args = self.fixtype(args)
82 self.assertRaises(
83 exc,
Guido van Rossum09549f42007-08-27 20:40:10 +000084 getattr(obj, methodname),
Walter Dörwald0fd583c2003-02-21 12:53:50 +000085 *args
86 )
Jeremy Hyltonf82b04e2000-07-10 17:08:42 +000087
Guido van Rossum09549f42007-08-27 20:40:10 +000088 # call obj.method(*args) without any checks
89 def checkcall(self, obj, methodname, *args):
90 obj = self.fixtype(obj)
Walter Dörwald0fd583c2003-02-21 12:53:50 +000091 args = self.fixtype(args)
Guido van Rossum09549f42007-08-27 20:40:10 +000092 getattr(obj, methodname)(*args)
Walter Dörwald0fd583c2003-02-21 12:53:50 +000093
Walter Dörwald0fd583c2003-02-21 12:53:50 +000094 def test_count(self):
95 self.checkequal(3, 'aaa', 'count', 'a')
96 self.checkequal(0, 'aaa', 'count', 'b')
97 self.checkequal(3, 'aaa', 'count', 'a')
98 self.checkequal(0, 'aaa', 'count', 'b')
99 self.checkequal(3, 'aaa', 'count', 'a')
100 self.checkequal(0, 'aaa', 'count', 'b')
101 self.checkequal(0, 'aaa', 'count', 'b')
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000102 self.checkequal(2, 'aaa', 'count', 'a', 1)
103 self.checkequal(0, 'aaa', 'count', 'a', 10)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000104 self.checkequal(1, 'aaa', 'count', 'a', -1)
105 self.checkequal(3, 'aaa', 'count', 'a', -10)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000106 self.checkequal(1, 'aaa', 'count', 'a', 0, 1)
107 self.checkequal(3, 'aaa', 'count', 'a', 0, 10)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000108 self.checkequal(2, 'aaa', 'count', 'a', 0, -1)
109 self.checkequal(0, 'aaa', 'count', 'a', 0, -10)
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000110 self.checkequal(3, 'aaa', 'count', '', 1)
111 self.checkequal(1, 'aaa', 'count', '', 3)
112 self.checkequal(0, 'aaa', 'count', '', 10)
113 self.checkequal(2, 'aaa', 'count', '', -1)
114 self.checkequal(4, 'aaa', 'count', '', -10)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000115
Amaury Forgeot d'Arcf2e93682008-09-26 22:48:41 +0000116 self.checkequal(1, '', 'count', '')
117 self.checkequal(0, '', 'count', '', 1, 1)
118 self.checkequal(0, '', 'count', '', sys.maxsize, 0)
119
120 self.checkequal(0, '', 'count', 'xx')
121 self.checkequal(0, '', 'count', 'xx', 1, 1)
122 self.checkequal(0, '', 'count', 'xx', sys.maxsize, 0)
123
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000124 self.checkraises(TypeError, 'hello', 'count')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200125
126 if self.contains_bytes:
127 self.checkequal(0, 'hello', 'count', 42)
128 else:
129 self.checkraises(TypeError, 'hello', 'count', 42)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000130
Raymond Hettinger57e74472005-02-20 09:54:53 +0000131 # For a variety of combinations,
132 # verify that str.count() matches an equivalent function
133 # replacing all occurrences and then differencing the string lengths
134 charset = ['', 'a', 'b']
135 digits = 7
136 base = len(charset)
137 teststrings = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000138 for i in range(base ** digits):
Raymond Hettinger57e74472005-02-20 09:54:53 +0000139 entry = []
Guido van Rossum805365e2007-05-07 22:24:25 +0000140 for j in range(digits):
Raymond Hettinger57e74472005-02-20 09:54:53 +0000141 i, m = divmod(i, base)
142 entry.append(charset[m])
143 teststrings.add(''.join(entry))
Guido van Rossum09549f42007-08-27 20:40:10 +0000144 teststrings = [self.fixtype(ts) for ts in teststrings]
Raymond Hettinger57e74472005-02-20 09:54:53 +0000145 for i in teststrings:
Raymond Hettinger57e74472005-02-20 09:54:53 +0000146 n = len(i)
147 for j in teststrings:
148 r1 = i.count(j)
149 if j:
Guido van Rossum09549f42007-08-27 20:40:10 +0000150 r2, rem = divmod(n - len(i.replace(j, self.fixtype(''))),
151 len(j))
Raymond Hettinger57e74472005-02-20 09:54:53 +0000152 else:
153 r2, rem = len(i)+1, 0
154 if rem or r1 != r2:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000155 self.assertEqual(rem, 0, '%s != 0 for %s' % (rem, i))
156 self.assertEqual(r1, r2, '%s != %s for %s' % (r1, r2, i))
Raymond Hettinger57e74472005-02-20 09:54:53 +0000157
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000158 def test_find(self):
159 self.checkequal(0, 'abcdefghiabc', 'find', 'abc')
160 self.checkequal(9, 'abcdefghiabc', 'find', 'abc', 1)
161 self.checkequal(-1, 'abcdefghiabc', 'find', 'def', 4)
162
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000163 self.checkequal(0, 'abc', 'find', '', 0)
164 self.checkequal(3, 'abc', 'find', '', 3)
165 self.checkequal(-1, 'abc', 'find', '', 4)
166
Christian Heimes9cd17752007-11-18 19:35:23 +0000167 # to check the ability to pass None as defaults
168 self.checkequal( 2, 'rrarrrrrrrrra', 'find', 'a')
169 self.checkequal(12, 'rrarrrrrrrrra', 'find', 'a', 4)
170 self.checkequal(-1, 'rrarrrrrrrrra', 'find', 'a', 4, 6)
171 self.checkequal(12, 'rrarrrrrrrrra', 'find', 'a', 4, None)
172 self.checkequal( 2, 'rrarrrrrrrrra', 'find', 'a', None, 6)
173
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000174 self.checkraises(TypeError, 'hello', 'find')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200175
176 if self.contains_bytes:
177 self.checkequal(-1, 'hello', 'find', 42)
178 else:
179 self.checkraises(TypeError, 'hello', 'find', 42)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000180
Amaury Forgeot d'Arcf2e93682008-09-26 22:48:41 +0000181 self.checkequal(0, '', 'find', '')
182 self.checkequal(-1, '', 'find', '', 1, 1)
183 self.checkequal(-1, '', 'find', '', sys.maxsize, 0)
184
185 self.checkequal(-1, '', 'find', 'xx')
186 self.checkequal(-1, '', 'find', 'xx', 1, 1)
187 self.checkequal(-1, '', 'find', 'xx', sys.maxsize, 0)
188
Antoine Pitrou74edda02010-01-02 21:51:33 +0000189 # issue 7458
190 self.checkequal(-1, 'ab', 'find', 'xxx', sys.maxsize + 1, 0)
191
Raymond Hettinger7cbf1bc2005-02-20 04:07:08 +0000192 # For a variety of combinations,
193 # verify that str.find() matches __contains__
194 # and that the found substring is really at that location
195 charset = ['', 'a', 'b', 'c']
196 digits = 5
197 base = len(charset)
198 teststrings = set()
Guido van Rossum805365e2007-05-07 22:24:25 +0000199 for i in range(base ** digits):
Raymond Hettinger7cbf1bc2005-02-20 04:07:08 +0000200 entry = []
Guido van Rossum805365e2007-05-07 22:24:25 +0000201 for j in range(digits):
Raymond Hettinger7cbf1bc2005-02-20 04:07:08 +0000202 i, m = divmod(i, base)
203 entry.append(charset[m])
204 teststrings.add(''.join(entry))
Guido van Rossum09549f42007-08-27 20:40:10 +0000205 teststrings = [self.fixtype(ts) for ts in teststrings]
Raymond Hettinger7cbf1bc2005-02-20 04:07:08 +0000206 for i in teststrings:
Raymond Hettinger7cbf1bc2005-02-20 04:07:08 +0000207 for j in teststrings:
208 loc = i.find(j)
209 r1 = (loc != -1)
210 r2 = j in i
Antoine Pitrou2e544fb2010-01-02 21:55:17 +0000211 self.assertEqual(r1, r2)
Raymond Hettinger7cbf1bc2005-02-20 04:07:08 +0000212 if loc != -1:
213 self.assertEqual(i[loc:loc+len(j)], j)
214
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000215 def test_rfind(self):
216 self.checkequal(9, 'abcdefghiabc', 'rfind', 'abc')
217 self.checkequal(12, 'abcdefghiabc', 'rfind', '')
218 self.checkequal(0, 'abcdefghiabc', 'rfind', 'abcd')
219 self.checkequal(-1, 'abcdefghiabc', 'rfind', 'abcz')
220
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000221 self.checkequal(3, 'abc', 'rfind', '', 0)
222 self.checkequal(3, 'abc', 'rfind', '', 3)
223 self.checkequal(-1, 'abc', 'rfind', '', 4)
224
Christian Heimes9cd17752007-11-18 19:35:23 +0000225 # to check the ability to pass None as defaults
226 self.checkequal(12, 'rrarrrrrrrrra', 'rfind', 'a')
227 self.checkequal(12, 'rrarrrrrrrrra', 'rfind', 'a', 4)
228 self.checkequal(-1, 'rrarrrrrrrrra', 'rfind', 'a', 4, 6)
229 self.checkequal(12, 'rrarrrrrrrrra', 'rfind', 'a', 4, None)
230 self.checkequal( 2, 'rrarrrrrrrrra', 'rfind', 'a', None, 6)
231
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000232 self.checkraises(TypeError, 'hello', 'rfind')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200233
234 if self.contains_bytes:
235 self.checkequal(-1, 'hello', 'rfind', 42)
236 else:
237 self.checkraises(TypeError, 'hello', 'rfind', 42)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000238
Antoine Pitrouda2ecaf2010-01-02 21:40:36 +0000239 # For a variety of combinations,
240 # verify that str.rfind() matches __contains__
241 # and that the found substring is really at that location
242 charset = ['', 'a', 'b', 'c']
243 digits = 5
244 base = len(charset)
245 teststrings = set()
246 for i in range(base ** digits):
247 entry = []
248 for j in range(digits):
249 i, m = divmod(i, base)
250 entry.append(charset[m])
251 teststrings.add(''.join(entry))
252 teststrings = [self.fixtype(ts) for ts in teststrings]
253 for i in teststrings:
254 for j in teststrings:
255 loc = i.rfind(j)
256 r1 = (loc != -1)
257 r2 = j in i
Antoine Pitrou2e544fb2010-01-02 21:55:17 +0000258 self.assertEqual(r1, r2)
Antoine Pitrouda2ecaf2010-01-02 21:40:36 +0000259 if loc != -1:
260 self.assertEqual(i[loc:loc+len(j)], j)
261
Antoine Pitrou74edda02010-01-02 21:51:33 +0000262 # issue 7458
263 self.checkequal(-1, 'ab', 'rfind', 'xxx', sys.maxsize + 1, 0)
264
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000265 def test_index(self):
266 self.checkequal(0, 'abcdefghiabc', 'index', '')
267 self.checkequal(3, 'abcdefghiabc', 'index', 'def')
268 self.checkequal(0, 'abcdefghiabc', 'index', 'abc')
269 self.checkequal(9, 'abcdefghiabc', 'index', 'abc', 1)
270
271 self.checkraises(ValueError, 'abcdefghiabc', 'index', 'hib')
272 self.checkraises(ValueError, 'abcdefghiab', 'index', 'abc', 1)
273 self.checkraises(ValueError, 'abcdefghi', 'index', 'ghi', 8)
274 self.checkraises(ValueError, 'abcdefghi', 'index', 'ghi', -1)
275
Christian Heimes9cd17752007-11-18 19:35:23 +0000276 # to check the ability to pass None as defaults
277 self.checkequal( 2, 'rrarrrrrrrrra', 'index', 'a')
278 self.checkequal(12, 'rrarrrrrrrrra', 'index', 'a', 4)
279 self.checkraises(ValueError, 'rrarrrrrrrrra', 'index', 'a', 4, 6)
280 self.checkequal(12, 'rrarrrrrrrrra', 'index', 'a', 4, None)
281 self.checkequal( 2, 'rrarrrrrrrrra', 'index', 'a', None, 6)
282
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000283 self.checkraises(TypeError, 'hello', 'index')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200284
285 if self.contains_bytes:
286 self.checkraises(ValueError, 'hello', 'index', 42)
287 else:
288 self.checkraises(TypeError, 'hello', 'index', 42)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000289
290 def test_rindex(self):
291 self.checkequal(12, 'abcdefghiabc', 'rindex', '')
292 self.checkequal(3, 'abcdefghiabc', 'rindex', 'def')
293 self.checkequal(9, 'abcdefghiabc', 'rindex', 'abc')
294 self.checkequal(0, 'abcdefghiabc', 'rindex', 'abc', 0, -1)
295
296 self.checkraises(ValueError, 'abcdefghiabc', 'rindex', 'hib')
297 self.checkraises(ValueError, 'defghiabc', 'rindex', 'def', 1)
298 self.checkraises(ValueError, 'defghiabc', 'rindex', 'abc', 0, -1)
299 self.checkraises(ValueError, 'abcdefghi', 'rindex', 'ghi', 0, 8)
300 self.checkraises(ValueError, 'abcdefghi', 'rindex', 'ghi', 0, -1)
301
Christian Heimes9cd17752007-11-18 19:35:23 +0000302 # to check the ability to pass None as defaults
303 self.checkequal(12, 'rrarrrrrrrrra', 'rindex', 'a')
304 self.checkequal(12, 'rrarrrrrrrrra', 'rindex', 'a', 4)
305 self.checkraises(ValueError, 'rrarrrrrrrrra', 'rindex', 'a', 4, 6)
306 self.checkequal(12, 'rrarrrrrrrrra', 'rindex', 'a', 4, None)
307 self.checkequal( 2, 'rrarrrrrrrrra', 'rindex', 'a', None, 6)
308
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000309 self.checkraises(TypeError, 'hello', 'rindex')
Antoine Pitrouac65d962011-10-20 23:54:17 +0200310
311 if self.contains_bytes:
312 self.checkraises(ValueError, 'hello', 'rindex', 42)
313 else:
314 self.checkraises(TypeError, 'hello', 'rindex', 42)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000315
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000316 def test_lower(self):
317 self.checkequal('hello', 'HeLLo', 'lower')
318 self.checkequal('hello', 'hello', 'lower')
319 self.checkraises(TypeError, 'hello', 'lower', 42)
320
321 def test_upper(self):
322 self.checkequal('HELLO', 'HeLLo', 'upper')
323 self.checkequal('HELLO', 'HELLO', 'upper')
324 self.checkraises(TypeError, 'hello', 'upper', 42)
325
326 def test_expandtabs(self):
327 self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs')
328 self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs', 8)
329 self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs', 4)
330 self.checkequal('abc\r\nab def\ng hi', 'abc\r\nab\tdef\ng\thi', 'expandtabs', 4)
331 self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs')
332 self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs', 8)
333 self.checkequal('abc\r\nab\r\ndef\ng\r\nhi', 'abc\r\nab\r\ndef\ng\r\nhi', 'expandtabs', 4)
334 self.checkequal(' a\n b', ' \ta\n\tb', 'expandtabs', 1)
335
336 self.checkraises(TypeError, 'hello', 'expandtabs', 42, 42)
337 # This test is only valid when sizeof(int) == sizeof(void*) == 4.
Christian Heimesa37d4c62007-12-04 23:02:19 +0000338 if sys.maxsize < (1 << 32) and struct.calcsize('P') == 4:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000339 self.checkraises(OverflowError,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000340 '\ta\n\tb', 'expandtabs', sys.maxsize)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000341
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000342 def test_split(self):
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000343 # by a char
344 self.checkequal(['a', 'b', 'c', 'd'], 'a|b|c|d', 'split', '|')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000345 self.checkequal(['a|b|c|d'], 'a|b|c|d', 'split', '|', 0)
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000346 self.checkequal(['a', 'b|c|d'], 'a|b|c|d', 'split', '|', 1)
347 self.checkequal(['a', 'b', 'c|d'], 'a|b|c|d', 'split', '|', 2)
348 self.checkequal(['a', 'b', 'c', 'd'], 'a|b|c|d', 'split', '|', 3)
349 self.checkequal(['a', 'b', 'c', 'd'], 'a|b|c|d', 'split', '|', 4)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000350 self.checkequal(['a', 'b', 'c', 'd'], 'a|b|c|d', 'split', '|',
Christian Heimesa37d4c62007-12-04 23:02:19 +0000351 sys.maxsize-2)
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000352 self.checkequal(['a|b|c|d'], 'a|b|c|d', 'split', '|', 0)
353 self.checkequal(['a', '', 'b||c||d'], 'a||b||c||d', 'split', '|', 2)
354 self.checkequal(['endcase ', ''], 'endcase |', 'split', '|')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000355 self.checkequal(['', ' startcase'], '| startcase', 'split', '|')
356 self.checkequal(['', 'bothcase', ''], '|bothcase|', 'split', '|')
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000357 self.checkequal(['a', '', 'b\x00c\x00d'], 'a\x00\x00b\x00c\x00d', 'split', '\x00', 2)
358
Thomas Wouters477c8d52006-05-27 19:21:47 +0000359 self.checkequal(['a']*20, ('a|'*20)[:-1], 'split', '|')
360 self.checkequal(['a']*15 +['a|a|a|a|a'],
361 ('a|'*20)[:-1], 'split', '|', 15)
362
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000363 # by string
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000364 self.checkequal(['a', 'b', 'c', 'd'], 'a//b//c//d', 'split', '//')
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000365 self.checkequal(['a', 'b//c//d'], 'a//b//c//d', 'split', '//', 1)
366 self.checkequal(['a', 'b', 'c//d'], 'a//b//c//d', 'split', '//', 2)
367 self.checkequal(['a', 'b', 'c', 'd'], 'a//b//c//d', 'split', '//', 3)
368 self.checkequal(['a', 'b', 'c', 'd'], 'a//b//c//d', 'split', '//', 4)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000369 self.checkequal(['a', 'b', 'c', 'd'], 'a//b//c//d', 'split', '//',
Christian Heimesa37d4c62007-12-04 23:02:19 +0000370 sys.maxsize-10)
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000371 self.checkequal(['a//b//c//d'], 'a//b//c//d', 'split', '//', 0)
372 self.checkequal(['a', '', 'b////c////d'], 'a////b////c////d', 'split', '//', 2)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000373 self.checkequal(['endcase ', ''], 'endcase test', 'split', 'test')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000374 self.checkequal(['', ' begincase'], 'test begincase', 'split', 'test')
375 self.checkequal(['', ' bothcase ', ''], 'test bothcase test',
376 'split', 'test')
377 self.checkequal(['a', 'bc'], 'abbbc', 'split', 'bb')
378 self.checkequal(['', ''], 'aaa', 'split', 'aaa')
379 self.checkequal(['aaa'], 'aaa', 'split', 'aaa', 0)
380 self.checkequal(['ab', 'ab'], 'abbaab', 'split', 'ba')
381 self.checkequal(['aaaa'], 'aaaa', 'split', 'aab')
382 self.checkequal([''], '', 'split', 'aaa')
383 self.checkequal(['aa'], 'aa', 'split', 'aaa')
384 self.checkequal(['A', 'bobb'], 'Abbobbbobb', 'split', 'bbobb')
385 self.checkequal(['A', 'B', ''], 'AbbobbBbbobb', 'split', 'bbobb')
386
387 self.checkequal(['a']*20, ('aBLAH'*20)[:-4], 'split', 'BLAH')
388 self.checkequal(['a']*20, ('aBLAH'*20)[:-4], 'split', 'BLAH', 19)
389 self.checkequal(['a']*18 + ['aBLAHa'], ('aBLAH'*20)[:-4],
390 'split', 'BLAH', 18)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000391
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000392 # argument type
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000393 self.checkraises(TypeError, 'hello', 'split', 42, 42, 42)
394
Thomas Wouters477c8d52006-05-27 19:21:47 +0000395 # null case
396 self.checkraises(ValueError, 'hello', 'split', '')
397 self.checkraises(ValueError, 'hello', 'split', '', 0)
398
Hye-Shik Chang3ae811b2003-12-15 18:49:53 +0000399 def test_rsplit(self):
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000400 # by a char
401 self.checkequal(['a', 'b', 'c', 'd'], 'a|b|c|d', 'rsplit', '|')
402 self.checkequal(['a|b|c', 'd'], 'a|b|c|d', 'rsplit', '|', 1)
403 self.checkequal(['a|b', 'c', 'd'], 'a|b|c|d', 'rsplit', '|', 2)
404 self.checkequal(['a', 'b', 'c', 'd'], 'a|b|c|d', 'rsplit', '|', 3)
405 self.checkequal(['a', 'b', 'c', 'd'], 'a|b|c|d', 'rsplit', '|', 4)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000406 self.checkequal(['a', 'b', 'c', 'd'], 'a|b|c|d', 'rsplit', '|',
Christian Heimesa37d4c62007-12-04 23:02:19 +0000407 sys.maxsize-100)
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000408 self.checkequal(['a|b|c|d'], 'a|b|c|d', 'rsplit', '|', 0)
409 self.checkequal(['a||b||c', '', 'd'], 'a||b||c||d', 'rsplit', '|', 2)
410 self.checkequal(['', ' begincase'], '| begincase', 'rsplit', '|')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000411 self.checkequal(['endcase ', ''], 'endcase |', 'rsplit', '|')
412 self.checkequal(['', 'bothcase', ''], '|bothcase|', 'rsplit', '|')
413
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000414 self.checkequal(['a\x00\x00b', 'c', 'd'], 'a\x00\x00b\x00c\x00d', 'rsplit', '\x00', 2)
415
Thomas Wouters477c8d52006-05-27 19:21:47 +0000416 self.checkequal(['a']*20, ('a|'*20)[:-1], 'rsplit', '|')
417 self.checkequal(['a|a|a|a|a']+['a']*15,
418 ('a|'*20)[:-1], 'rsplit', '|', 15)
419
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000420 # by string
421 self.checkequal(['a', 'b', 'c', 'd'], 'a//b//c//d', 'rsplit', '//')
422 self.checkequal(['a//b//c', 'd'], 'a//b//c//d', 'rsplit', '//', 1)
423 self.checkequal(['a//b', 'c', 'd'], 'a//b//c//d', 'rsplit', '//', 2)
424 self.checkequal(['a', 'b', 'c', 'd'], 'a//b//c//d', 'rsplit', '//', 3)
425 self.checkequal(['a', 'b', 'c', 'd'], 'a//b//c//d', 'rsplit', '//', 4)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000426 self.checkequal(['a', 'b', 'c', 'd'], 'a//b//c//d', 'rsplit', '//',
Christian Heimesa37d4c62007-12-04 23:02:19 +0000427 sys.maxsize-5)
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000428 self.checkequal(['a//b//c//d'], 'a//b//c//d', 'rsplit', '//', 0)
429 self.checkequal(['a////b////c', '', 'd'], 'a////b////c////d', 'rsplit', '//', 2)
430 self.checkequal(['', ' begincase'], 'test begincase', 'rsplit', 'test')
Thomas Wouters477c8d52006-05-27 19:21:47 +0000431 self.checkequal(['endcase ', ''], 'endcase test', 'rsplit', 'test')
432 self.checkequal(['', ' bothcase ', ''], 'test bothcase test',
433 'rsplit', 'test')
434 self.checkequal(['ab', 'c'], 'abbbc', 'rsplit', 'bb')
435 self.checkequal(['', ''], 'aaa', 'rsplit', 'aaa')
436 self.checkequal(['aaa'], 'aaa', 'rsplit', 'aaa', 0)
437 self.checkequal(['ab', 'ab'], 'abbaab', 'rsplit', 'ba')
438 self.checkequal(['aaaa'], 'aaaa', 'rsplit', 'aab')
439 self.checkequal([''], '', 'rsplit', 'aaa')
440 self.checkequal(['aa'], 'aa', 'rsplit', 'aaa')
441 self.checkequal(['bbob', 'A'], 'bbobbbobbA', 'rsplit', 'bbobb')
442 self.checkequal(['', 'B', 'A'], 'bbobbBbbobbA', 'rsplit', 'bbobb')
443
444 self.checkequal(['a']*20, ('aBLAH'*20)[:-4], 'rsplit', 'BLAH')
445 self.checkequal(['a']*20, ('aBLAH'*20)[:-4], 'rsplit', 'BLAH', 19)
446 self.checkequal(['aBLAHa'] + ['a']*18, ('aBLAH'*20)[:-4],
447 'rsplit', 'BLAH', 18)
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000448
Hye-Shik Chang75c00ef2004-01-05 00:29:51 +0000449 # argument type
450 self.checkraises(TypeError, 'hello', 'rsplit', 42, 42, 42)
Hye-Shik Chang3ae811b2003-12-15 18:49:53 +0000451
Thomas Wouters477c8d52006-05-27 19:21:47 +0000452 # null case
453 self.checkraises(ValueError, 'hello', 'rsplit', '')
454 self.checkraises(ValueError, 'hello', 'rsplit', '', 0)
455
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000456 def test_replace(self):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000457 EQ = self.checkequal
458
459 # Operations on the empty string
460 EQ("", "", "replace", "", "")
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000461 EQ("A", "", "replace", "", "A")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000462 EQ("", "", "replace", "A", "")
463 EQ("", "", "replace", "A", "A")
464 EQ("", "", "replace", "", "", 100)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000465 EQ("", "", "replace", "", "", sys.maxsize)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000466
467 # interleave (from=="", 'to' gets inserted everywhere)
468 EQ("A", "A", "replace", "", "")
469 EQ("*A*", "A", "replace", "", "*")
470 EQ("*1A*1", "A", "replace", "", "*1")
471 EQ("*-#A*-#", "A", "replace", "", "*-#")
472 EQ("*-A*-A*-", "AA", "replace", "", "*-")
473 EQ("*-A*-A*-", "AA", "replace", "", "*-", -1)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000474 EQ("*-A*-A*-", "AA", "replace", "", "*-", sys.maxsize)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000475 EQ("*-A*-A*-", "AA", "replace", "", "*-", 4)
476 EQ("*-A*-A*-", "AA", "replace", "", "*-", 3)
477 EQ("*-A*-A", "AA", "replace", "", "*-", 2)
478 EQ("*-AA", "AA", "replace", "", "*-", 1)
479 EQ("AA", "AA", "replace", "", "*-", 0)
480
481 # single character deletion (from=="A", to=="")
482 EQ("", "A", "replace", "A", "")
483 EQ("", "AAA", "replace", "A", "")
484 EQ("", "AAA", "replace", "A", "", -1)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000485 EQ("", "AAA", "replace", "A", "", sys.maxsize)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000486 EQ("", "AAA", "replace", "A", "", 4)
487 EQ("", "AAA", "replace", "A", "", 3)
488 EQ("A", "AAA", "replace", "A", "", 2)
489 EQ("AA", "AAA", "replace", "A", "", 1)
490 EQ("AAA", "AAA", "replace", "A", "", 0)
491 EQ("", "AAAAAAAAAA", "replace", "A", "")
492 EQ("BCD", "ABACADA", "replace", "A", "")
493 EQ("BCD", "ABACADA", "replace", "A", "", -1)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000494 EQ("BCD", "ABACADA", "replace", "A", "", sys.maxsize)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000495 EQ("BCD", "ABACADA", "replace", "A", "", 5)
496 EQ("BCD", "ABACADA", "replace", "A", "", 4)
497 EQ("BCDA", "ABACADA", "replace", "A", "", 3)
498 EQ("BCADA", "ABACADA", "replace", "A", "", 2)
499 EQ("BACADA", "ABACADA", "replace", "A", "", 1)
500 EQ("ABACADA", "ABACADA", "replace", "A", "", 0)
501 EQ("BCD", "ABCAD", "replace", "A", "")
502 EQ("BCD", "ABCADAA", "replace", "A", "")
503 EQ("BCD", "BCD", "replace", "A", "")
504 EQ("*************", "*************", "replace", "A", "")
505 EQ("^A^", "^"+"A"*1000+"^", "replace", "A", "", 999)
506
507 # substring deletion (from=="the", to=="")
508 EQ("", "the", "replace", "the", "")
509 EQ("ater", "theater", "replace", "the", "")
510 EQ("", "thethe", "replace", "the", "")
511 EQ("", "thethethethe", "replace", "the", "")
512 EQ("aaaa", "theatheatheathea", "replace", "the", "")
513 EQ("that", "that", "replace", "the", "")
514 EQ("thaet", "thaet", "replace", "the", "")
515 EQ("here and re", "here and there", "replace", "the", "")
516 EQ("here and re and re", "here and there and there",
Christian Heimesa37d4c62007-12-04 23:02:19 +0000517 "replace", "the", "", sys.maxsize)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000518 EQ("here and re and re", "here and there and there",
519 "replace", "the", "", -1)
520 EQ("here and re and re", "here and there and there",
521 "replace", "the", "", 3)
522 EQ("here and re and re", "here and there and there",
523 "replace", "the", "", 2)
524 EQ("here and re and there", "here and there and there",
525 "replace", "the", "", 1)
526 EQ("here and there and there", "here and there and there",
527 "replace", "the", "", 0)
528 EQ("here and re and re", "here and there and there", "replace", "the", "")
529
530 EQ("abc", "abc", "replace", "the", "")
531 EQ("abcdefg", "abcdefg", "replace", "the", "")
532
533 # substring deletion (from=="bob", to=="")
534 EQ("bob", "bbobob", "replace", "bob", "")
535 EQ("bobXbob", "bbobobXbbobob", "replace", "bob", "")
536 EQ("aaaaaaa", "aaaaaaabob", "replace", "bob", "")
537 EQ("aaaaaaa", "aaaaaaa", "replace", "bob", "")
538
539 # single character replace in place (len(from)==len(to)==1)
540 EQ("Who goes there?", "Who goes there?", "replace", "o", "o")
541 EQ("WhO gOes there?", "Who goes there?", "replace", "o", "O")
Christian Heimesa37d4c62007-12-04 23:02:19 +0000542 EQ("WhO gOes there?", "Who goes there?", "replace", "o", "O", sys.maxsize)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000543 EQ("WhO gOes there?", "Who goes there?", "replace", "o", "O", -1)
544 EQ("WhO gOes there?", "Who goes there?", "replace", "o", "O", 3)
545 EQ("WhO gOes there?", "Who goes there?", "replace", "o", "O", 2)
546 EQ("WhO goes there?", "Who goes there?", "replace", "o", "O", 1)
547 EQ("Who goes there?", "Who goes there?", "replace", "o", "O", 0)
548
549 EQ("Who goes there?", "Who goes there?", "replace", "a", "q")
550 EQ("who goes there?", "Who goes there?", "replace", "W", "w")
551 EQ("wwho goes there?ww", "WWho goes there?WW", "replace", "W", "w")
552 EQ("Who goes there!", "Who goes there?", "replace", "?", "!")
553 EQ("Who goes there!!", "Who goes there??", "replace", "?", "!")
554
555 EQ("Who goes there?", "Who goes there?", "replace", ".", "!")
556
557 # substring replace in place (len(from)==len(to) > 1)
558 EQ("Th** ** a t**sue", "This is a tissue", "replace", "is", "**")
Christian Heimesa37d4c62007-12-04 23:02:19 +0000559 EQ("Th** ** a t**sue", "This is a tissue", "replace", "is", "**", sys.maxsize)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000560 EQ("Th** ** a t**sue", "This is a tissue", "replace", "is", "**", -1)
561 EQ("Th** ** a t**sue", "This is a tissue", "replace", "is", "**", 4)
562 EQ("Th** ** a t**sue", "This is a tissue", "replace", "is", "**", 3)
563 EQ("Th** ** a tissue", "This is a tissue", "replace", "is", "**", 2)
564 EQ("Th** is a tissue", "This is a tissue", "replace", "is", "**", 1)
565 EQ("This is a tissue", "This is a tissue", "replace", "is", "**", 0)
566 EQ("cobob", "bobob", "replace", "bob", "cob")
567 EQ("cobobXcobocob", "bobobXbobobob", "replace", "bob", "cob")
568 EQ("bobob", "bobob", "replace", "bot", "bot")
569
570 # replace single character (len(from)==1, len(to)>1)
571 EQ("ReyKKjaviKK", "Reykjavik", "replace", "k", "KK")
572 EQ("ReyKKjaviKK", "Reykjavik", "replace", "k", "KK", -1)
Christian Heimesa37d4c62007-12-04 23:02:19 +0000573 EQ("ReyKKjaviKK", "Reykjavik", "replace", "k", "KK", sys.maxsize)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000574 EQ("ReyKKjaviKK", "Reykjavik", "replace", "k", "KK", 2)
575 EQ("ReyKKjavik", "Reykjavik", "replace", "k", "KK", 1)
576 EQ("Reykjavik", "Reykjavik", "replace", "k", "KK", 0)
577 EQ("A----B----C----", "A.B.C.", "replace", ".", "----")
578
579 EQ("Reykjavik", "Reykjavik", "replace", "q", "KK")
580
581 # replace substring (len(from)>1, len(to)!=len(from))
582 EQ("ham, ham, eggs and ham", "spam, spam, eggs and spam",
583 "replace", "spam", "ham")
584 EQ("ham, ham, eggs and ham", "spam, spam, eggs and spam",
Christian Heimesa37d4c62007-12-04 23:02:19 +0000585 "replace", "spam", "ham", sys.maxsize)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000586 EQ("ham, ham, eggs and ham", "spam, spam, eggs and spam",
587 "replace", "spam", "ham", -1)
588 EQ("ham, ham, eggs and ham", "spam, spam, eggs and spam",
589 "replace", "spam", "ham", 4)
590 EQ("ham, ham, eggs and ham", "spam, spam, eggs and spam",
591 "replace", "spam", "ham", 3)
592 EQ("ham, ham, eggs and spam", "spam, spam, eggs and spam",
593 "replace", "spam", "ham", 2)
594 EQ("ham, spam, eggs and spam", "spam, spam, eggs and spam",
595 "replace", "spam", "ham", 1)
596 EQ("spam, spam, eggs and spam", "spam, spam, eggs and spam",
597 "replace", "spam", "ham", 0)
598
599 EQ("bobob", "bobobob", "replace", "bobob", "bob")
600 EQ("bobobXbobob", "bobobobXbobobob", "replace", "bobob", "bob")
601 EQ("BOBOBOB", "BOBOBOB", "replace", "bob", "bobby")
602
Guido van Rossum39478e82007-08-27 17:23:59 +0000603 # XXX Commented out. Is there any reason to support buffer objects
604 # as arguments for str.replace()? GvR
Guido van Rossum254348e2007-11-21 19:29:53 +0000605## ba = bytearray('a')
606## bb = bytearray('b')
Guido van Rossum39478e82007-08-27 17:23:59 +0000607## EQ("bbc", "abc", "replace", ba, bb)
608## EQ("aac", "abc", "replace", bb, ba)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000609
Thomas Wouters477c8d52006-05-27 19:21:47 +0000610 #
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000611 self.checkequal('one@two!three!', 'one!two!three!', 'replace', '!', '@', 1)
612 self.checkequal('onetwothree', 'one!two!three!', 'replace', '!', '')
613 self.checkequal('one@two@three!', 'one!two!three!', 'replace', '!', '@', 2)
614 self.checkequal('one@two@three@', 'one!two!three!', 'replace', '!', '@', 3)
615 self.checkequal('one@two@three@', 'one!two!three!', 'replace', '!', '@', 4)
616 self.checkequal('one!two!three!', 'one!two!three!', 'replace', '!', '@', 0)
617 self.checkequal('one@two@three@', 'one!two!three!', 'replace', '!', '@')
618 self.checkequal('one!two!three!', 'one!two!three!', 'replace', 'x', '@')
619 self.checkequal('one!two!three!', 'one!two!three!', 'replace', 'x', '@', 2)
620 self.checkequal('-a-b-c-', 'abc', 'replace', '', '-')
621 self.checkequal('-a-b-c', 'abc', 'replace', '', '-', 3)
622 self.checkequal('abc', 'abc', 'replace', '', '-', 0)
623 self.checkequal('', '', 'replace', '', '')
624 self.checkequal('abc', 'abc', 'replace', 'ab', '--', 0)
625 self.checkequal('abc', 'abc', 'replace', 'xy', '--')
626 # Next three for SF bug 422088: [OSF1 alpha] string.replace(); died with
627 # MemoryError due to empty result (platform malloc issue when requesting
628 # 0 bytes).
629 self.checkequal('', '123', 'replace', '123', '')
630 self.checkequal('', '123123', 'replace', '123', '')
631 self.checkequal('x', '123x123', 'replace', '123', '')
632
633 self.checkraises(TypeError, 'hello', 'replace')
634 self.checkraises(TypeError, 'hello', 'replace', 42)
635 self.checkraises(TypeError, 'hello', 'replace', 42, 'h')
636 self.checkraises(TypeError, 'hello', 'replace', 'h', 42)
637
Thomas Wouters477c8d52006-05-27 19:21:47 +0000638 def test_replace_overflow(self):
639 # Check for overflow checking on 32 bit machines
Christian Heimesa37d4c62007-12-04 23:02:19 +0000640 if sys.maxsize != 2147483647 or struct.calcsize("P") > 4:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000641 return
642 A2_16 = "A" * (2**16)
643 self.checkraises(OverflowError, A2_16, "replace", "", A2_16)
644 self.checkraises(OverflowError, A2_16, "replace", "A", A2_16)
645 self.checkraises(OverflowError, A2_16, "replace", "AA", A2_16+A2_16)
646
Georg Brandlc7885542007-03-06 19:16:20 +0000647
648
649class CommonTest(BaseTest):
650 # This testcase contains test that can be used in all
651 # stringlike classes. Currently this is str, unicode
652 # UserString and the string module.
653
654 def test_hash(self):
655 # SF bug 1054139: += optimization was not invalidating cached hash value
656 a = self.type2test('DNSSEC')
657 b = self.type2test('')
658 for c in a:
659 b += c
660 hash(b)
661 self.assertEqual(hash(a), hash(b))
662
663 def test_capitalize(self):
664 self.checkequal(' hello ', ' hello ', 'capitalize')
665 self.checkequal('Hello ', 'Hello ','capitalize')
666 self.checkequal('Hello ', 'hello ','capitalize')
667 self.checkequal('Aaaa', 'aaaa', 'capitalize')
668 self.checkequal('Aaaa', 'AaAa', 'capitalize')
669
Ezio Melottiee8d9982011-08-15 09:09:57 +0300670 # check that titlecased chars are lowered correctly
671 # \u1ffc is the titlecased char
Benjamin Petersonb2bf01d2012-01-11 18:17:06 -0500672 self.checkequal('\u03a9\u0399\u1ff3\u1ff3\u1ff3',
Ezio Melottiee8d9982011-08-15 09:09:57 +0300673 '\u1ff3\u1ff3\u1ffc\u1ffc', 'capitalize')
674 # check with cased non-letter chars
675 self.checkequal('\u24c5\u24e8\u24e3\u24d7\u24de\u24dd',
676 '\u24c5\u24ce\u24c9\u24bd\u24c4\u24c3', 'capitalize')
677 self.checkequal('\u24c5\u24e8\u24e3\u24d7\u24de\u24dd',
678 '\u24df\u24e8\u24e3\u24d7\u24de\u24dd', 'capitalize')
679 self.checkequal('\u2160\u2171\u2172',
680 '\u2160\u2161\u2162', 'capitalize')
681 self.checkequal('\u2160\u2171\u2172',
682 '\u2170\u2171\u2172', 'capitalize')
683 # check with Ll chars with no upper - nothing changes here
684 self.checkequal('\u019b\u1d00\u1d86\u0221\u1fb7',
685 '\u019b\u1d00\u1d86\u0221\u1fb7', 'capitalize')
686
Georg Brandlc7885542007-03-06 19:16:20 +0000687 self.checkraises(TypeError, 'hello', 'capitalize', 42)
688
689 def test_lower(self):
690 self.checkequal('hello', 'HeLLo', 'lower')
691 self.checkequal('hello', 'hello', 'lower')
692 self.checkraises(TypeError, 'hello', 'lower', 42)
693
694 def test_upper(self):
695 self.checkequal('HELLO', 'HeLLo', 'upper')
696 self.checkequal('HELLO', 'HELLO', 'upper')
697 self.checkraises(TypeError, 'hello', 'upper', 42)
698
699 def test_expandtabs(self):
700 self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs')
701 self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs', 8)
702 self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs', 4)
703 self.checkequal('abc\r\nab def\ng hi', 'abc\r\nab\tdef\ng\thi', 'expandtabs', 4)
704 self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs')
705 self.checkequal('abc\rab def\ng hi', 'abc\rab\tdef\ng\thi', 'expandtabs', 8)
706 self.checkequal('abc\r\nab\r\ndef\ng\r\nhi', 'abc\r\nab\r\ndef\ng\r\nhi', 'expandtabs', 4)
707
708 self.checkraises(TypeError, 'hello', 'expandtabs', 42, 42)
709
710 def test_additional_split(self):
711 self.checkequal(['this', 'is', 'the', 'split', 'function'],
712 'this is the split function', 'split')
713
714 # by whitespace
715 self.checkequal(['a', 'b', 'c', 'd'], 'a b c d ', 'split')
716 self.checkequal(['a', 'b c d'], 'a b c d', 'split', None, 1)
717 self.checkequal(['a', 'b', 'c d'], 'a b c d', 'split', None, 2)
718 self.checkequal(['a', 'b', 'c', 'd'], 'a b c d', 'split', None, 3)
719 self.checkequal(['a', 'b', 'c', 'd'], 'a b c d', 'split', None, 4)
720 self.checkequal(['a', 'b', 'c', 'd'], 'a b c d', 'split', None,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000721 sys.maxsize-1)
Georg Brandlc7885542007-03-06 19:16:20 +0000722 self.checkequal(['a b c d'], 'a b c d', 'split', None, 0)
723 self.checkequal(['a b c d'], ' a b c d', 'split', None, 0)
724 self.checkequal(['a', 'b', 'c d'], 'a b c d', 'split', None, 2)
725
726 self.checkequal([], ' ', 'split')
727 self.checkequal(['a'], ' a ', 'split')
728 self.checkequal(['a', 'b'], ' a b ', 'split')
729 self.checkequal(['a', 'b '], ' a b ', 'split', None, 1)
730 self.checkequal(['a', 'b c '], ' a b c ', 'split', None, 1)
731 self.checkequal(['a', 'b', 'c '], ' a b c ', 'split', None, 2)
732 self.checkequal(['a', 'b'], '\n\ta \t\r b \v ', 'split')
733 aaa = ' a '*20
734 self.checkequal(['a']*20, aaa, 'split')
735 self.checkequal(['a'] + [aaa[4:]], aaa, 'split', None, 1)
736 self.checkequal(['a']*19 + ['a '], aaa, 'split', None, 19)
737
738 # mixed use of str and unicode
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000739 self.checkequal(['a', 'b', 'c d'], 'a b c d', 'split', ' ', 2)
Georg Brandlc7885542007-03-06 19:16:20 +0000740
741 def test_additional_rsplit(self):
742 self.checkequal(['this', 'is', 'the', 'rsplit', 'function'],
743 'this is the rsplit function', 'rsplit')
744
745 # by whitespace
746 self.checkequal(['a', 'b', 'c', 'd'], 'a b c d ', 'rsplit')
747 self.checkequal(['a b c', 'd'], 'a b c d', 'rsplit', None, 1)
748 self.checkequal(['a b', 'c', 'd'], 'a b c d', 'rsplit', None, 2)
749 self.checkequal(['a', 'b', 'c', 'd'], 'a b c d', 'rsplit', None, 3)
750 self.checkequal(['a', 'b', 'c', 'd'], 'a b c d', 'rsplit', None, 4)
751 self.checkequal(['a', 'b', 'c', 'd'], 'a b c d', 'rsplit', None,
Christian Heimesa37d4c62007-12-04 23:02:19 +0000752 sys.maxsize-20)
Georg Brandlc7885542007-03-06 19:16:20 +0000753 self.checkequal(['a b c d'], 'a b c d', 'rsplit', None, 0)
754 self.checkequal(['a b c d'], 'a b c d ', 'rsplit', None, 0)
755 self.checkequal(['a b', 'c', 'd'], 'a b c d', 'rsplit', None, 2)
756
757 self.checkequal([], ' ', 'rsplit')
758 self.checkequal(['a'], ' a ', 'rsplit')
759 self.checkequal(['a', 'b'], ' a b ', 'rsplit')
760 self.checkequal([' a', 'b'], ' a b ', 'rsplit', None, 1)
761 self.checkequal([' a b','c'], ' a b c ', 'rsplit',
762 None, 1)
763 self.checkequal([' a', 'b', 'c'], ' a b c ', 'rsplit',
764 None, 2)
765 self.checkequal(['a', 'b'], '\n\ta \t\r b \v ', 'rsplit', None, 88)
766 aaa = ' a '*20
767 self.checkequal(['a']*20, aaa, 'rsplit')
768 self.checkequal([aaa[:-4]] + ['a'], aaa, 'rsplit', None, 1)
769 self.checkequal([' a a'] + ['a']*18, aaa, 'rsplit', None, 18)
770
771 # mixed use of str and unicode
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000772 self.checkequal(['a b', 'c', 'd'], 'a b c d', 'rsplit', ' ', 2)
Georg Brandlc7885542007-03-06 19:16:20 +0000773
774 def test_strip(self):
775 self.checkequal('hello', ' hello ', 'strip')
776 self.checkequal('hello ', ' hello ', 'lstrip')
777 self.checkequal(' hello', ' hello ', 'rstrip')
778 self.checkequal('hello', 'hello', 'strip')
779
780 # strip/lstrip/rstrip with None arg
781 self.checkequal('hello', ' hello ', 'strip', None)
782 self.checkequal('hello ', ' hello ', 'lstrip', None)
783 self.checkequal(' hello', ' hello ', 'rstrip', None)
784 self.checkequal('hello', 'hello', 'strip', None)
785
786 # strip/lstrip/rstrip with str arg
787 self.checkequal('hello', 'xyzzyhelloxyzzy', 'strip', 'xyz')
788 self.checkequal('helloxyzzy', 'xyzzyhelloxyzzy', 'lstrip', 'xyz')
789 self.checkequal('xyzzyhello', 'xyzzyhelloxyzzy', 'rstrip', 'xyz')
790 self.checkequal('hello', 'hello', 'strip', 'xyz')
791
Georg Brandlc7885542007-03-06 19:16:20 +0000792 self.checkraises(TypeError, 'hello', 'strip', 42, 42)
793 self.checkraises(TypeError, 'hello', 'lstrip', 42, 42)
794 self.checkraises(TypeError, 'hello', 'rstrip', 42, 42)
795
796 def test_ljust(self):
797 self.checkequal('abc ', 'abc', 'ljust', 10)
798 self.checkequal('abc ', 'abc', 'ljust', 6)
799 self.checkequal('abc', 'abc', 'ljust', 3)
800 self.checkequal('abc', 'abc', 'ljust', 2)
801 self.checkequal('abc*******', 'abc', 'ljust', 10, '*')
802 self.checkraises(TypeError, 'abc', 'ljust')
803
804 def test_rjust(self):
805 self.checkequal(' abc', 'abc', 'rjust', 10)
806 self.checkequal(' abc', 'abc', 'rjust', 6)
807 self.checkequal('abc', 'abc', 'rjust', 3)
808 self.checkequal('abc', 'abc', 'rjust', 2)
809 self.checkequal('*******abc', 'abc', 'rjust', 10, '*')
810 self.checkraises(TypeError, 'abc', 'rjust')
811
812 def test_center(self):
813 self.checkequal(' abc ', 'abc', 'center', 10)
814 self.checkequal(' abc ', 'abc', 'center', 6)
815 self.checkequal('abc', 'abc', 'center', 3)
816 self.checkequal('abc', 'abc', 'center', 2)
817 self.checkequal('***abc****', 'abc', 'center', 10, '*')
818 self.checkraises(TypeError, 'abc', 'center')
819
820 def test_swapcase(self):
821 self.checkequal('hEllO CoMPuTErS', 'HeLLo cOmpUteRs', 'swapcase')
822
823 self.checkraises(TypeError, 'hello', 'swapcase', 42)
824
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000825 def test_zfill(self):
826 self.checkequal('123', '123', 'zfill', 2)
827 self.checkequal('123', '123', 'zfill', 3)
828 self.checkequal('0123', '123', 'zfill', 4)
829 self.checkequal('+123', '+123', 'zfill', 3)
830 self.checkequal('+123', '+123', 'zfill', 4)
831 self.checkequal('+0123', '+123', 'zfill', 5)
832 self.checkequal('-123', '-123', 'zfill', 3)
833 self.checkequal('-123', '-123', 'zfill', 4)
834 self.checkequal('-0123', '-123', 'zfill', 5)
835 self.checkequal('000', '', 'zfill', 3)
836 self.checkequal('34', '34', 'zfill', 1)
837 self.checkequal('0034', '34', 'zfill', 4)
838
839 self.checkraises(TypeError, '123', 'zfill')
840
841class MixinStrUnicodeUserStringTest:
842 # additional tests that only work for
843 # stringlike objects, i.e. str, unicode, UserString
844 # (but not the string module)
845
846 def test_islower(self):
847 self.checkequal(False, '', 'islower')
848 self.checkequal(True, 'a', 'islower')
849 self.checkequal(False, 'A', 'islower')
850 self.checkequal(False, '\n', 'islower')
851 self.checkequal(True, 'abc', 'islower')
852 self.checkequal(False, 'aBc', 'islower')
853 self.checkequal(True, 'abc\n', 'islower')
854 self.checkraises(TypeError, 'abc', 'islower', 42)
855
856 def test_isupper(self):
857 self.checkequal(False, '', 'isupper')
858 self.checkequal(False, 'a', 'isupper')
859 self.checkequal(True, 'A', 'isupper')
860 self.checkequal(False, '\n', 'isupper')
861 self.checkequal(True, 'ABC', 'isupper')
862 self.checkequal(False, 'AbC', 'isupper')
863 self.checkequal(True, 'ABC\n', 'isupper')
864 self.checkraises(TypeError, 'abc', 'isupper', 42)
865
866 def test_istitle(self):
867 self.checkequal(False, '', 'istitle')
868 self.checkequal(False, 'a', 'istitle')
869 self.checkequal(True, 'A', 'istitle')
870 self.checkequal(False, '\n', 'istitle')
871 self.checkequal(True, 'A Titlecased Line', 'istitle')
872 self.checkequal(True, 'A\nTitlecased Line', 'istitle')
873 self.checkequal(True, 'A Titlecased, Line', 'istitle')
874 self.checkequal(False, 'Not a capitalized String', 'istitle')
875 self.checkequal(False, 'Not\ta Titlecase String', 'istitle')
876 self.checkequal(False, 'Not--a Titlecase String', 'istitle')
877 self.checkequal(False, 'NOT', 'istitle')
878 self.checkraises(TypeError, 'abc', 'istitle', 42)
879
880 def test_isspace(self):
881 self.checkequal(False, '', 'isspace')
882 self.checkequal(False, 'a', 'isspace')
883 self.checkequal(True, ' ', 'isspace')
884 self.checkequal(True, '\t', 'isspace')
885 self.checkequal(True, '\r', 'isspace')
886 self.checkequal(True, '\n', 'isspace')
887 self.checkequal(True, ' \t\r\n', 'isspace')
888 self.checkequal(False, ' \t\r\na', 'isspace')
889 self.checkraises(TypeError, 'abc', 'isspace', 42)
890
891 def test_isalpha(self):
892 self.checkequal(False, '', 'isalpha')
893 self.checkequal(True, 'a', 'isalpha')
894 self.checkequal(True, 'A', 'isalpha')
895 self.checkequal(False, '\n', 'isalpha')
896 self.checkequal(True, 'abc', 'isalpha')
897 self.checkequal(False, 'aBc123', 'isalpha')
898 self.checkequal(False, 'abc\n', 'isalpha')
899 self.checkraises(TypeError, 'abc', 'isalpha', 42)
900
901 def test_isalnum(self):
902 self.checkequal(False, '', 'isalnum')
903 self.checkequal(True, 'a', 'isalnum')
904 self.checkequal(True, 'A', 'isalnum')
905 self.checkequal(False, '\n', 'isalnum')
906 self.checkequal(True, '123abc456', 'isalnum')
907 self.checkequal(True, 'a1b3c', 'isalnum')
908 self.checkequal(False, 'aBc000 ', 'isalnum')
909 self.checkequal(False, 'abc\n', 'isalnum')
910 self.checkraises(TypeError, 'abc', 'isalnum', 42)
911
912 def test_isdigit(self):
913 self.checkequal(False, '', 'isdigit')
914 self.checkequal(False, 'a', 'isdigit')
915 self.checkequal(True, '0', 'isdigit')
916 self.checkequal(True, '0123456789', 'isdigit')
917 self.checkequal(False, '0123456789a', 'isdigit')
918
919 self.checkraises(TypeError, 'abc', 'isdigit', 42)
920
921 def test_title(self):
922 self.checkequal(' Hello ', ' hello ', 'title')
923 self.checkequal('Hello ', 'hello ', 'title')
924 self.checkequal('Hello ', 'Hello ', 'title')
925 self.checkequal('Format This As Title String', "fOrMaT thIs aS titLe String", 'title')
926 self.checkequal('Format,This-As*Title;String', "fOrMaT,thIs-aS*titLe;String", 'title', )
927 self.checkequal('Getint', "getInt", 'title')
928 self.checkraises(TypeError, 'hello', 'title', 42)
929
930 def test_splitlines(self):
931 self.checkequal(['abc', 'def', '', 'ghi'], "abc\ndef\n\rghi", 'splitlines')
932 self.checkequal(['abc', 'def', '', 'ghi'], "abc\ndef\n\r\nghi", 'splitlines')
933 self.checkequal(['abc', 'def', 'ghi'], "abc\ndef\r\nghi", 'splitlines')
934 self.checkequal(['abc', 'def', 'ghi'], "abc\ndef\r\nghi\n", 'splitlines')
935 self.checkequal(['abc', 'def', 'ghi', ''], "abc\ndef\r\nghi\n\r", 'splitlines')
936 self.checkequal(['', 'abc', 'def', 'ghi', ''], "\nabc\ndef\r\nghi\n\r", 'splitlines')
Mark Dickinson0d5f6ad2011-09-24 09:14:39 +0100937 self.checkequal(['', 'abc', 'def', 'ghi', ''],
938 "\nabc\ndef\r\nghi\n\r", 'splitlines', False)
939 self.checkequal(['\n', 'abc\n', 'def\r\n', 'ghi\n', '\r'],
940 "\nabc\ndef\r\nghi\n\r", 'splitlines', True)
941 self.checkequal(['', 'abc', 'def', 'ghi', ''], "\nabc\ndef\r\nghi\n\r",
942 'splitlines', keepends=False)
943 self.checkequal(['\n', 'abc\n', 'def\r\n', 'ghi\n', '\r'],
944 "\nabc\ndef\r\nghi\n\r", 'splitlines', keepends=True)
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000945
946 self.checkraises(TypeError, 'abc', 'splitlines', 42, 42)
947
948 def test_startswith(self):
949 self.checkequal(True, 'hello', 'startswith', 'he')
950 self.checkequal(True, 'hello', 'startswith', 'hello')
951 self.checkequal(False, 'hello', 'startswith', 'hello world')
952 self.checkequal(True, 'hello', 'startswith', '')
953 self.checkequal(False, 'hello', 'startswith', 'ello')
954 self.checkequal(True, 'hello', 'startswith', 'ello', 1)
955 self.checkequal(True, 'hello', 'startswith', 'o', 4)
956 self.checkequal(False, 'hello', 'startswith', 'o', 5)
957 self.checkequal(True, 'hello', 'startswith', '', 5)
958 self.checkequal(False, 'hello', 'startswith', 'lo', 6)
959 self.checkequal(True, 'helloworld', 'startswith', 'lowo', 3)
960 self.checkequal(True, 'helloworld', 'startswith', 'lowo', 3, 7)
961 self.checkequal(False, 'helloworld', 'startswith', 'lowo', 3, 6)
962
963 # test negative indices
964 self.checkequal(True, 'hello', 'startswith', 'he', 0, -1)
965 self.checkequal(True, 'hello', 'startswith', 'he', -53, -1)
966 self.checkequal(False, 'hello', 'startswith', 'hello', 0, -1)
967 self.checkequal(False, 'hello', 'startswith', 'hello world', -1, -10)
968 self.checkequal(False, 'hello', 'startswith', 'ello', -5)
969 self.checkequal(True, 'hello', 'startswith', 'ello', -4)
970 self.checkequal(False, 'hello', 'startswith', 'o', -2)
971 self.checkequal(True, 'hello', 'startswith', 'o', -1)
972 self.checkequal(True, 'hello', 'startswith', '', -3, -3)
973 self.checkequal(False, 'hello', 'startswith', 'lo', -9)
974
975 self.checkraises(TypeError, 'hello', 'startswith')
976 self.checkraises(TypeError, 'hello', 'startswith', 42)
977
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000978 # test tuple arguments
979 self.checkequal(True, 'hello', 'startswith', ('he', 'ha'))
980 self.checkequal(False, 'hello', 'startswith', ('lo', 'llo'))
981 self.checkequal(True, 'hello', 'startswith', ('hellox', 'hello'))
982 self.checkequal(False, 'hello', 'startswith', ())
983 self.checkequal(True, 'helloworld', 'startswith', ('hellowo',
984 'rld', 'lowo'), 3)
985 self.checkequal(False, 'helloworld', 'startswith', ('hellowo', 'ello',
986 'rld'), 3)
987 self.checkequal(True, 'hello', 'startswith', ('lo', 'he'), 0, -1)
988 self.checkequal(False, 'hello', 'startswith', ('he', 'hel'), 0, 1)
989 self.checkequal(True, 'hello', 'startswith', ('he', 'hel'), 0, 2)
990
991 self.checkraises(TypeError, 'hello', 'startswith', (42,))
992
Walter Dörwald0fd583c2003-02-21 12:53:50 +0000993 def test_endswith(self):
994 self.checkequal(True, 'hello', 'endswith', 'lo')
995 self.checkequal(False, 'hello', 'endswith', 'he')
996 self.checkequal(True, 'hello', 'endswith', '')
997 self.checkequal(False, 'hello', 'endswith', 'hello world')
998 self.checkequal(False, 'helloworld', 'endswith', 'worl')
999 self.checkequal(True, 'helloworld', 'endswith', 'worl', 3, 9)
1000 self.checkequal(True, 'helloworld', 'endswith', 'world', 3, 12)
1001 self.checkequal(True, 'helloworld', 'endswith', 'lowo', 1, 7)
1002 self.checkequal(True, 'helloworld', 'endswith', 'lowo', 2, 7)
1003 self.checkequal(True, 'helloworld', 'endswith', 'lowo', 3, 7)
1004 self.checkequal(False, 'helloworld', 'endswith', 'lowo', 4, 7)
1005 self.checkequal(False, 'helloworld', 'endswith', 'lowo', 3, 8)
1006 self.checkequal(False, 'ab', 'endswith', 'ab', 0, 1)
1007 self.checkequal(False, 'ab', 'endswith', 'ab', 0, 0)
1008
1009 # test negative indices
1010 self.checkequal(True, 'hello', 'endswith', 'lo', -2)
1011 self.checkequal(False, 'hello', 'endswith', 'he', -2)
1012 self.checkequal(True, 'hello', 'endswith', '', -3, -3)
1013 self.checkequal(False, 'hello', 'endswith', 'hello world', -10, -2)
1014 self.checkequal(False, 'helloworld', 'endswith', 'worl', -6)
1015 self.checkequal(True, 'helloworld', 'endswith', 'worl', -5, -1)
1016 self.checkequal(True, 'helloworld', 'endswith', 'worl', -5, 9)
1017 self.checkequal(True, 'helloworld', 'endswith', 'world', -7, 12)
1018 self.checkequal(True, 'helloworld', 'endswith', 'lowo', -99, -3)
1019 self.checkequal(True, 'helloworld', 'endswith', 'lowo', -8, -3)
1020 self.checkequal(True, 'helloworld', 'endswith', 'lowo', -7, -3)
1021 self.checkequal(False, 'helloworld', 'endswith', 'lowo', 3, -4)
1022 self.checkequal(False, 'helloworld', 'endswith', 'lowo', -8, -2)
1023
1024 self.checkraises(TypeError, 'hello', 'endswith')
1025 self.checkraises(TypeError, 'hello', 'endswith', 42)
1026
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001027 # test tuple arguments
1028 self.checkequal(False, 'hello', 'endswith', ('he', 'ha'))
1029 self.checkequal(True, 'hello', 'endswith', ('lo', 'llo'))
1030 self.checkequal(True, 'hello', 'endswith', ('hellox', 'hello'))
1031 self.checkequal(False, 'hello', 'endswith', ())
1032 self.checkequal(True, 'helloworld', 'endswith', ('hellowo',
1033 'rld', 'lowo'), 3)
1034 self.checkequal(False, 'helloworld', 'endswith', ('hellowo', 'ello',
1035 'rld'), 3, -1)
1036 self.checkequal(True, 'hello', 'endswith', ('hell', 'ell'), 0, -1)
1037 self.checkequal(False, 'hello', 'endswith', ('he', 'hel'), 0, 1)
1038 self.checkequal(True, 'hello', 'endswith', ('he', 'hell'), 0, 4)
1039
1040 self.checkraises(TypeError, 'hello', 'endswith', (42,))
1041
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001042 def test___contains__(self):
Ezio Melottib19f43d2010-01-24 20:59:24 +00001043 self.checkequal(True, '', '__contains__', '')
1044 self.checkequal(True, 'abc', '__contains__', '')
1045 self.checkequal(False, 'abc', '__contains__', '\0')
1046 self.checkequal(True, '\0abc', '__contains__', '\0')
1047 self.checkequal(True, 'abc\0', '__contains__', '\0')
1048 self.checkequal(True, '\0abc', '__contains__', 'a')
1049 self.checkequal(True, 'asdf', '__contains__', 'asdf')
1050 self.checkequal(False, 'asd', '__contains__', 'asdf')
1051 self.checkequal(False, '', '__contains__', 'asdf')
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001052
1053 def test_subscript(self):
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001054 self.checkequal('a', 'abc', '__getitem__', 0)
1055 self.checkequal('c', 'abc', '__getitem__', -1)
1056 self.checkequal('a', 'abc', '__getitem__', 0)
1057 self.checkequal('abc', 'abc', '__getitem__', slice(0, 3))
1058 self.checkequal('abc', 'abc', '__getitem__', slice(0, 1000))
1059 self.checkequal('a', 'abc', '__getitem__', slice(0, 1))
1060 self.checkequal('', 'abc', '__getitem__', slice(0, 0))
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001061
1062 self.checkraises(TypeError, 'abc', '__getitem__', 'def')
1063
1064 def test_slice(self):
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001065 self.checkequal('abc', 'abc', '__getitem__', slice(0, 1000))
1066 self.checkequal('abc', 'abc', '__getitem__', slice(0, 3))
1067 self.checkequal('ab', 'abc', '__getitem__', slice(0, 2))
1068 self.checkequal('bc', 'abc', '__getitem__', slice(1, 3))
1069 self.checkequal('b', 'abc', '__getitem__', slice(1, 2))
1070 self.checkequal('', 'abc', '__getitem__', slice(2, 2))
1071 self.checkequal('', 'abc', '__getitem__', slice(1000, 1000))
1072 self.checkequal('', 'abc', '__getitem__', slice(2000, 1000))
1073 self.checkequal('', 'abc', '__getitem__', slice(2, 1))
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001074
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001075 self.checkraises(TypeError, 'abc', '__getitem__', 'def')
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001076
Thomas Woutersed03b412007-08-28 21:37:11 +00001077 def test_extended_getslice(self):
1078 # Test extended slicing by comparing with list slicing.
1079 s = string.ascii_letters + string.digits
1080 indices = (0, None, 1, 3, 41, -1, -2, -37)
1081 for start in indices:
1082 for stop in indices:
1083 # Skip step 0 (invalid)
1084 for step in indices[1:]:
1085 L = list(s)[start:stop:step]
1086 self.checkequal("".join(L), s, '__getitem__',
1087 slice(start, stop, step))
1088
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001089 def test_mul(self):
1090 self.checkequal('', 'abc', '__mul__', -1)
1091 self.checkequal('', 'abc', '__mul__', 0)
1092 self.checkequal('abc', 'abc', '__mul__', 1)
1093 self.checkequal('abcabcabc', 'abc', '__mul__', 3)
1094 self.checkraises(TypeError, 'abc', '__mul__')
1095 self.checkraises(TypeError, 'abc', '__mul__', '')
Martin v. Löwis18e16552006-02-15 17:27:45 +00001096 # XXX: on a 64-bit system, this doesn't raise an overflow error,
1097 # but either raises a MemoryError, or succeeds (if you have 54TiB)
1098 #self.checkraises(OverflowError, 10000*'abc', '__mul__', 2000000000)
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001099
1100 def test_join(self):
1101 # join now works with any sequence type
1102 # moved here, because the argument order is
1103 # different in string.join (see the test in
1104 # test.test_string.StringTest.test_join)
1105 self.checkequal('a b c d', ' ', 'join', ['a', 'b', 'c', 'd'])
1106 self.checkequal('abcd', '', 'join', ('a', 'b', 'c', 'd'))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001107 self.checkequal('bd', '', 'join', ('', 'b', '', 'd'))
1108 self.checkequal('ac', '', 'join', ('a', '', 'c', ''))
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001109 self.checkequal('w x y z', ' ', 'join', Sequence())
1110 self.checkequal('abc', 'a', 'join', ('abc',))
1111 self.checkequal('z', 'a', 'join', UserList(['z']))
Walter Dörwald67e83882007-05-05 12:26:27 +00001112 self.checkequal('a.b.c', '.', 'join', ['a', 'b', 'c'])
Guido van Rossum98297ee2007-11-06 21:34:58 +00001113 self.assertRaises(TypeError, '.'.join, ['a', 'b', 3])
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001114 for i in [5, 25, 125]:
1115 self.checkequal(((('a' * i) + '-') * i)[:-1], '-', 'join',
1116 ['a' * i] * i)
1117 self.checkequal(((('a' * i) + '-') * i)[:-1], '-', 'join',
1118 ('a' * i,) * i)
1119
Guido van Rossum98297ee2007-11-06 21:34:58 +00001120 #self.checkequal(str(BadSeq1()), ' ', 'join', BadSeq1())
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001121 self.checkequal('a b c', ' ', 'join', BadSeq2())
1122
1123 self.checkraises(TypeError, ' ', 'join')
1124 self.checkraises(TypeError, ' ', 'join', 7)
Guido van Rossumf1044292007-09-27 18:01:22 +00001125 self.checkraises(TypeError, ' ', 'join', [1, 2, bytes()])
Michael W. Hudsonb2308bb2005-10-21 11:45:01 +00001126 try:
1127 def f():
1128 yield 4 + ""
1129 self.fixtype(' ').join(f())
Guido van Rossumb940e112007-01-10 16:19:56 +00001130 except TypeError as e:
Michael W. Hudsonb2308bb2005-10-21 11:45:01 +00001131 if '+' not in str(e):
1132 self.fail('join() ate exception message')
1133 else:
1134 self.fail('exception not raised')
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001135
1136 def test_formatting(self):
1137 self.checkequal('+hello+', '+%s+', '__mod__', 'hello')
1138 self.checkequal('+10+', '+%d+', '__mod__', 10)
1139 self.checkequal('a', "%c", '__mod__', "a")
1140 self.checkequal('a', "%c", '__mod__', "a")
1141 self.checkequal('"', "%c", '__mod__', 34)
1142 self.checkequal('$', "%c", '__mod__', 36)
1143 self.checkequal('10', "%d", '__mod__', 10)
Walter Dörwald43440a62003-03-31 18:07:50 +00001144 self.checkequal('\x7f', "%c", '__mod__', 0x7f)
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001145
1146 for ordinal in (-100, 0x200000):
1147 # unicode raises ValueError, str raises OverflowError
1148 self.checkraises((ValueError, OverflowError), '%c', '__mod__', ordinal)
1149
Christian Heimesa612dc02008-02-24 13:08:18 +00001150 longvalue = sys.maxsize + 10
1151 slongvalue = str(longvalue)
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001152 self.checkequal(' 42', '%3ld', '__mod__', 42)
Christian Heimesa612dc02008-02-24 13:08:18 +00001153 self.checkequal('42', '%d', '__mod__', 42.0)
1154 self.checkequal(slongvalue, '%d', '__mod__', longvalue)
1155 self.checkcall('%d', '__mod__', float(longvalue))
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001156 self.checkequal('0042.00', '%07.2f', '__mod__', 42)
Raymond Hettinger9bfe5332003-08-27 04:55:52 +00001157 self.checkequal('0042.00', '%07.2F', '__mod__', 42)
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001158
1159 self.checkraises(TypeError, 'abc', '__mod__')
1160 self.checkraises(TypeError, '%(foo)s', '__mod__', 42)
1161 self.checkraises(TypeError, '%s%s', '__mod__', (42,))
1162 self.checkraises(TypeError, '%c', '__mod__', (None,))
1163 self.checkraises(ValueError, '%(foo', '__mod__', {})
1164 self.checkraises(TypeError, '%(foo)s %(bar)s', '__mod__', ('foo', 42))
Christian Heimesa612dc02008-02-24 13:08:18 +00001165 self.checkraises(TypeError, '%d', '__mod__', "42") # not numeric
Mark Dickinson5c2db372009-12-05 20:28:34 +00001166 self.checkraises(TypeError, '%d', '__mod__', (42+0j)) # no int conversion provided
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001167
1168 # argument names with properly nested brackets are supported
1169 self.checkequal('bar', '%((foo))s', '__mod__', {'(foo)': 'bar'})
1170
1171 # 100 is a magic number in PyUnicode_Format, this forces a resize
1172 self.checkequal(103*'a'+'x', '%sx', '__mod__', 103*'a')
1173
1174 self.checkraises(TypeError, '%*s', '__mod__', ('foo', 'bar'))
1175 self.checkraises(TypeError, '%10.*f', '__mod__', ('foo', 42.))
1176 self.checkraises(ValueError, '%10', '__mod__', (42,))
1177
1178 def test_floatformatting(self):
1179 # float formatting
Guido van Rossum805365e2007-05-07 22:24:25 +00001180 for prec in range(100):
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001181 format = '%%.%if' % prec
1182 value = 0.01
Guido van Rossum805365e2007-05-07 22:24:25 +00001183 for x in range(60):
Florent Xiclunaa87b3832010-09-13 02:28:18 +00001184 value = value * 3.14159265359 / 3.0 * 10.0
Mark Dickinsonf489caf2009-05-01 11:42:00 +00001185 self.checkcall(format, "__mod__", value)
Walter Dörwald0fd583c2003-02-21 12:53:50 +00001186
Thomas Wouters477c8d52006-05-27 19:21:47 +00001187 def test_inplace_rewrites(self):
1188 # Check that strings don't copy and modify cached single-character strings
1189 self.checkequal('a', 'A', 'lower')
1190 self.checkequal(True, 'A', 'isupper')
1191 self.checkequal('A', 'a', 'upper')
1192 self.checkequal(True, 'a', 'islower')
1193
1194 self.checkequal('a', 'A', 'replace', 'A', 'a')
1195 self.checkequal(True, 'A', 'isupper')
1196
1197 self.checkequal('A', 'a', 'capitalize')
1198 self.checkequal(True, 'a', 'islower')
1199
1200 self.checkequal('A', 'a', 'swapcase')
1201 self.checkequal(True, 'a', 'islower')
1202
1203 self.checkequal('A', 'a', 'title')
1204 self.checkequal(True, 'a', 'islower')
1205
1206 def test_partition(self):
1207
1208 self.checkequal(('this is the par', 'ti', 'tion method'),
1209 'this is the partition method', 'partition', 'ti')
1210
1211 # from raymond's original specification
1212 S = 'http://www.python.org'
1213 self.checkequal(('http', '://', 'www.python.org'), S, 'partition', '://')
1214 self.checkequal(('http://www.python.org', '', ''), S, 'partition', '?')
1215 self.checkequal(('', 'http://', 'www.python.org'), S, 'partition', 'http://')
1216 self.checkequal(('http://www.python.', 'org', ''), S, 'partition', 'org')
1217
1218 self.checkraises(ValueError, S, 'partition', '')
1219 self.checkraises(TypeError, S, 'partition', None)
1220
1221 def test_rpartition(self):
1222
1223 self.checkequal(('this is the rparti', 'ti', 'on method'),
1224 'this is the rpartition method', 'rpartition', 'ti')
1225
1226 # from raymond's original specification
1227 S = 'http://www.python.org'
1228 self.checkequal(('http', '://', 'www.python.org'), S, 'rpartition', '://')
Thomas Wouters89f507f2006-12-13 04:49:30 +00001229 self.checkequal(('', '', 'http://www.python.org'), S, 'rpartition', '?')
Thomas Wouters477c8d52006-05-27 19:21:47 +00001230 self.checkequal(('', 'http://', 'www.python.org'), S, 'rpartition', 'http://')
1231 self.checkequal(('http://www.python.', 'org', ''), S, 'rpartition', 'org')
1232
1233 self.checkraises(ValueError, S, 'rpartition', '')
1234 self.checkraises(TypeError, S, 'rpartition', None)
1235
Jesus Ceaac451502011-04-20 17:09:23 +02001236 def test_none_arguments(self):
1237 # issue 11828
1238 s = 'hello'
1239 self.checkequal(2, s, 'find', 'l', None)
1240 self.checkequal(3, s, 'find', 'l', -2, None)
1241 self.checkequal(2, s, 'find', 'l', None, -2)
1242 self.checkequal(0, s, 'find', 'h', None, None)
1243
1244 self.checkequal(3, s, 'rfind', 'l', None)
1245 self.checkequal(3, s, 'rfind', 'l', -2, None)
1246 self.checkequal(2, s, 'rfind', 'l', None, -2)
1247 self.checkequal(0, s, 'rfind', 'h', None, None)
1248
1249 self.checkequal(2, s, 'index', 'l', None)
1250 self.checkequal(3, s, 'index', 'l', -2, None)
1251 self.checkequal(2, s, 'index', 'l', None, -2)
1252 self.checkequal(0, s, 'index', 'h', None, None)
1253
1254 self.checkequal(3, s, 'rindex', 'l', None)
1255 self.checkequal(3, s, 'rindex', 'l', -2, None)
1256 self.checkequal(2, s, 'rindex', 'l', None, -2)
1257 self.checkequal(0, s, 'rindex', 'h', None, None)
1258
1259 self.checkequal(2, s, 'count', 'l', None)
1260 self.checkequal(1, s, 'count', 'l', -2, None)
1261 self.checkequal(1, s, 'count', 'l', None, -2)
1262 self.checkequal(0, s, 'count', 'x', None, None)
1263
1264 self.checkequal(True, s, 'endswith', 'o', None)
1265 self.checkequal(True, s, 'endswith', 'lo', -2, None)
1266 self.checkequal(True, s, 'endswith', 'l', None, -2)
1267 self.checkequal(False, s, 'endswith', 'x', None, None)
1268
1269 self.checkequal(True, s, 'startswith', 'h', None)
1270 self.checkequal(True, s, 'startswith', 'l', -2, None)
1271 self.checkequal(True, s, 'startswith', 'h', None, -2)
1272 self.checkequal(False, s, 'startswith', 'x', None, None)
1273
1274 def test_find_etc_raise_correct_error_messages(self):
1275 # issue 11828
1276 s = 'hello'
1277 x = 'x'
Ezio Melottiaf928422011-04-20 21:56:21 +03001278 self.assertRaisesRegex(TypeError, r'^find\(', s.find,
Jesus Ceaac451502011-04-20 17:09:23 +02001279 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +03001280 self.assertRaisesRegex(TypeError, r'^rfind\(', s.rfind,
Jesus Ceaac451502011-04-20 17:09:23 +02001281 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +03001282 self.assertRaisesRegex(TypeError, r'^index\(', s.index,
Jesus Ceaac451502011-04-20 17:09:23 +02001283 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +03001284 self.assertRaisesRegex(TypeError, r'^rindex\(', s.rindex,
Jesus Ceaac451502011-04-20 17:09:23 +02001285 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +03001286 self.assertRaisesRegex(TypeError, r'^count\(', s.count,
Jesus Ceaac451502011-04-20 17:09:23 +02001287 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +03001288 self.assertRaisesRegex(TypeError, r'^startswith\(', s.startswith,
Jesus Ceaac451502011-04-20 17:09:23 +02001289 x, None, None, None)
Ezio Melottiaf928422011-04-20 21:56:21 +03001290 self.assertRaisesRegex(TypeError, r'^endswith\(', s.endswith,
Jesus Ceaac451502011-04-20 17:09:23 +02001291 x, None, None, None)
1292
Walter Dörwald57d88e52004-08-26 16:53:04 +00001293
Walter Dörwald57d88e52004-08-26 16:53:04 +00001294class MixinStrUnicodeTest:
Tim Peters108f1372004-08-27 05:36:07 +00001295 # Additional tests that only work with str and unicode.
Walter Dörwald57d88e52004-08-26 16:53:04 +00001296
1297 def test_bug1001011(self):
1298 # Make sure join returns a NEW object for single item sequences
Tim Peters108f1372004-08-27 05:36:07 +00001299 # involving a subclass.
1300 # Make sure that it is of the appropriate type.
1301 # Check the optimisation still occurs for standard objects.
Walter Dörwald57d88e52004-08-26 16:53:04 +00001302 t = self.type2test
1303 class subclass(t):
1304 pass
1305 s1 = subclass("abcd")
1306 s2 = t().join([s1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001307 self.assertIsNot(s1, s2)
1308 self.assertIs(type(s2), t)
Tim Peters108f1372004-08-27 05:36:07 +00001309
1310 s1 = t("abcd")
1311 s2 = t().join([s1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001312 self.assertIs(s1, s2)
Tim Peters108f1372004-08-27 05:36:07 +00001313
1314 # Should also test mixed-type join.
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001315 if t is str:
Tim Peters108f1372004-08-27 05:36:07 +00001316 s1 = subclass("abcd")
1317 s2 = "".join([s1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001318 self.assertIsNot(s1, s2)
1319 self.assertIs(type(s2), t)
Tim Peters108f1372004-08-27 05:36:07 +00001320
1321 s1 = t("abcd")
1322 s2 = "".join([s1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001323 self.assertIs(s1, s2)
Tim Peters108f1372004-08-27 05:36:07 +00001324
Guido van Rossum98297ee2007-11-06 21:34:58 +00001325## elif t is str8:
1326## s1 = subclass("abcd")
1327## s2 = "".join([s1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001328## self.assertIsNot(s1, s2)
1329## self.assertIs(type(s2), str) # promotes!
Tim Peters108f1372004-08-27 05:36:07 +00001330
Guido van Rossum98297ee2007-11-06 21:34:58 +00001331## s1 = t("abcd")
1332## s2 = "".join([s1])
Ezio Melottib3aedd42010-11-20 19:04:17 +00001333## self.assertIsNot(s1, s2)
1334## self.assertIs(type(s2), str) # promotes!
Tim Peters108f1372004-08-27 05:36:07 +00001335
1336 else:
1337 self.fail("unexpected type for MixinStrUnicodeTest %r" % t)