blob: 5edc13907bc837c208e2413560871a213a231b87 [file] [log] [blame]
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001from test import support
Neal Norwitz3ce5d922008-08-24 07:08:55 +00002from test.support import bigmemtest, _1G, _2G, _4G, precisionbigmemtest
Thomas Wouters477c8d52006-05-27 19:21:47 +00003
4import unittest
5import operator
Thomas Wouters477c8d52006-05-27 19:21:47 +00006import sys
7
8# Bigmem testing houserules:
9#
10# - Try not to allocate too many large objects. It's okay to rely on
11# refcounting semantics, but don't forget that 's = create_largestring()'
12# doesn't release the old 's' (if it exists) until well after its new
13# value has been created. Use 'del s' before the create_largestring call.
14#
15# - Do *not* compare large objects using assertEquals or similar. It's a
16# lengty operation and the errormessage will be utterly useless due to
17# its size. To make sure whether a result has the right contents, better
18# to use the strip or count methods, or compare meaningful slices.
19#
20# - Don't forget to test for large indices, offsets and results and such,
21# in addition to large sizes.
22#
23# - When repeating an object (say, a substring, or a small list) to create
24# a large object, make the subobject of a length that is not a power of
25# 2. That way, int-wrapping problems are more easily detected.
26#
27# - While the bigmemtest decorator speaks of 'minsize', all tests will
28# actually be called with a much smaller number too, in the normal
29# test run (5Kb currently.) This is so the tests themselves get frequent
Thomas Wouters0e3f5912006-08-11 14:57:12 +000030# testing. Consequently, always make all large allocations based on the
Thomas Wouters477c8d52006-05-27 19:21:47 +000031# passed-in 'size', and don't rely on the size being very large. Also,
32# memuse-per-size should remain sane (less than a few thousand); if your
33# test uses more, adjust 'size' upward, instead.
34
35class StrTest(unittest.TestCase):
36 @bigmemtest(minsize=_2G, memuse=2)
37 def test_capitalize(self, size):
38 SUBSTR = ' abc def ghi'
39 s = '-' * size + SUBSTR
40 caps = s.capitalize()
41 self.assertEquals(caps[-len(SUBSTR):],
42 SUBSTR.capitalize())
43 self.assertEquals(caps.lstrip('-'), SUBSTR)
44
45 @bigmemtest(minsize=_2G + 10, memuse=1)
46 def test_center(self, size):
47 SUBSTR = ' abc def ghi'
48 s = SUBSTR.center(size)
49 self.assertEquals(len(s), size)
50 lpadsize = rpadsize = (len(s) - len(SUBSTR)) // 2
51 if len(s) % 2:
52 lpadsize += 1
53 self.assertEquals(s[lpadsize:-rpadsize], SUBSTR)
54 self.assertEquals(s.strip(), SUBSTR.strip())
55
Neal Norwitz3ce5d922008-08-24 07:08:55 +000056 @precisionbigmemtest(size=_2G - 1, memuse=1)
57 def test_center_unicode(self, size):
58 SUBSTR = ' abc def ghi'
59 try:
60 s = SUBSTR.center(size)
61 except OverflowError:
62 pass # acceptable on 32-bit
63 else:
64 self.assertEquals(len(s), size)
65 lpadsize = rpadsize = (len(s) - len(SUBSTR)) // 2
66 if len(s) % 2:
67 lpadsize += 1
68 self.assertEquals(s[lpadsize:-rpadsize], SUBSTR)
69 self.assertEquals(s.strip(), SUBSTR.strip())
70 del s
71
Thomas Wouters477c8d52006-05-27 19:21:47 +000072 @bigmemtest(minsize=_2G, memuse=2)
73 def test_count(self, size):
74 SUBSTR = ' abc def ghi'
75 s = '.' * size + SUBSTR
76 self.assertEquals(s.count('.'), size)
77 s += '.'
78 self.assertEquals(s.count('.'), size + 1)
79 self.assertEquals(s.count(' '), 3)
80 self.assertEquals(s.count('i'), 1)
81 self.assertEquals(s.count('j'), 0)
82
Christian Heimes4e30a842007-11-30 22:12:06 +000083 @bigmemtest(minsize=_2G + 2, memuse=3)
Thomas Wouters477c8d52006-05-27 19:21:47 +000084 def test_decode(self, size):
Amaury Forgeot d'Arc85984222007-11-30 23:45:17 +000085 s = b'.' * size
Christian Heimes4e30a842007-11-30 22:12:06 +000086 self.assertEquals(len(s.decode('utf-8')), size)
Thomas Wouters477c8d52006-05-27 19:21:47 +000087
Neal Norwitz3ce5d922008-08-24 07:08:55 +000088 def basic_encode_test(self, size, enc, c='.', expectedsize=None):
89 if expectedsize is None:
90 expectedsize = size
91
92 s = c * size
93 self.assertEquals(len(s.encode(enc)), expectedsize)
94
Christian Heimes4e30a842007-11-30 22:12:06 +000095 @bigmemtest(minsize=_2G + 2, memuse=3)
Thomas Wouters477c8d52006-05-27 19:21:47 +000096 def test_encode(self, size):
Neal Norwitz3ce5d922008-08-24 07:08:55 +000097 return self.basic_encode_test(size, 'utf-8')
98
99 @precisionbigmemtest(size=_4G / 6 + 2, memuse=2)
100 def test_encode_raw_unicode_escape(self, size):
101 try:
102 return self.basic_encode_test(size, 'raw_unicode_escape')
103 except MemoryError:
104 pass # acceptable on 32-bit
105
106 @precisionbigmemtest(size=_4G / 5 + 70, memuse=3)
107 def test_encode_utf7(self, size):
108 try:
109 return self.basic_encode_test(size, 'utf7')
110 except MemoryError:
111 pass # acceptable on 32-bit
112
113 @precisionbigmemtest(size=_4G / 4 + 5, memuse=6)
114 def test_encode_utf32(self, size):
115 try:
116 return self.basic_encode_test(size, 'utf32', expectedsize=4*size+4)
117 except MemoryError:
118 pass # acceptable on 32-bit
119
120 @precisionbigmemtest(size=_2G-1, memuse=2)
121 def test_decodeascii(self, size):
122 return self.basic_encode_test(size, 'ascii', c='A')
123
124 @precisionbigmemtest(size=_4G / 5, memuse=6+2)
125 def test_unicode_repr_oflw(self, size):
126 try:
127 s = "\uAAAA"*size
128 r = repr(s)
129 except MemoryError:
130 pass # acceptable on 32-bit
131 else:
132 self.failUnless(s == eval(r))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000133
134 @bigmemtest(minsize=_2G, memuse=2)
135 def test_endswith(self, size):
136 SUBSTR = ' abc def ghi'
137 s = '-' * size + SUBSTR
138 self.failUnless(s.endswith(SUBSTR))
139 self.failUnless(s.endswith(s))
140 s2 = '...' + s
141 self.failUnless(s2.endswith(s))
142 self.failIf(s.endswith('a' + SUBSTR))
143 self.failIf(SUBSTR.endswith(s))
144
145 @bigmemtest(minsize=_2G + 10, memuse=2)
146 def test_expandtabs(self, size):
147 s = '-' * size
148 tabsize = 8
149 self.assertEquals(s.expandtabs(), s)
150 del s
151 slen, remainder = divmod(size, tabsize)
152 s = ' \t' * slen
153 s = s.expandtabs(tabsize)
154 self.assertEquals(len(s), size - remainder)
155 self.assertEquals(len(s.strip(' ')), 0)
156
157 @bigmemtest(minsize=_2G, memuse=2)
158 def test_find(self, size):
159 SUBSTR = ' abc def ghi'
160 sublen = len(SUBSTR)
161 s = ''.join([SUBSTR, '-' * size, SUBSTR])
162 self.assertEquals(s.find(' '), 0)
163 self.assertEquals(s.find(SUBSTR), 0)
164 self.assertEquals(s.find(' ', sublen), sublen + size)
165 self.assertEquals(s.find(SUBSTR, len(SUBSTR)), sublen + size)
166 self.assertEquals(s.find('i'), SUBSTR.find('i'))
167 self.assertEquals(s.find('i', sublen),
168 sublen + size + SUBSTR.find('i'))
169 self.assertEquals(s.find('i', size),
170 sublen + size + SUBSTR.find('i'))
171 self.assertEquals(s.find('j'), -1)
172
173 @bigmemtest(minsize=_2G, memuse=2)
174 def test_index(self, size):
175 SUBSTR = ' abc def ghi'
176 sublen = len(SUBSTR)
177 s = ''.join([SUBSTR, '-' * size, SUBSTR])
178 self.assertEquals(s.index(' '), 0)
179 self.assertEquals(s.index(SUBSTR), 0)
180 self.assertEquals(s.index(' ', sublen), sublen + size)
181 self.assertEquals(s.index(SUBSTR, sublen), sublen + size)
182 self.assertEquals(s.index('i'), SUBSTR.index('i'))
183 self.assertEquals(s.index('i', sublen),
184 sublen + size + SUBSTR.index('i'))
185 self.assertEquals(s.index('i', size),
186 sublen + size + SUBSTR.index('i'))
187 self.assertRaises(ValueError, s.index, 'j')
188
189 @bigmemtest(minsize=_2G, memuse=2)
190 def test_isalnum(self, size):
191 SUBSTR = '123456'
192 s = 'a' * size + SUBSTR
193 self.failUnless(s.isalnum())
194 s += '.'
195 self.failIf(s.isalnum())
196
197 @bigmemtest(minsize=_2G, memuse=2)
198 def test_isalpha(self, size):
199 SUBSTR = 'zzzzzzz'
200 s = 'a' * size + SUBSTR
201 self.failUnless(s.isalpha())
202 s += '.'
203 self.failIf(s.isalpha())
204
205 @bigmemtest(minsize=_2G, memuse=2)
206 def test_isdigit(self, size):
207 SUBSTR = '123456'
208 s = '9' * size + SUBSTR
209 self.failUnless(s.isdigit())
210 s += 'z'
211 self.failIf(s.isdigit())
212
213 @bigmemtest(minsize=_2G, memuse=2)
214 def test_islower(self, size):
215 chars = ''.join([ chr(c) for c in range(255) if not chr(c).isupper() ])
216 repeats = size // len(chars) + 2
217 s = chars * repeats
218 self.failUnless(s.islower())
219 s += 'A'
220 self.failIf(s.islower())
221
222 @bigmemtest(minsize=_2G, memuse=2)
223 def test_isspace(self, size):
224 whitespace = ' \f\n\r\t\v'
225 repeats = size // len(whitespace) + 2
226 s = whitespace * repeats
227 self.failUnless(s.isspace())
228 s += 'j'
229 self.failIf(s.isspace())
230
231 @bigmemtest(minsize=_2G, memuse=2)
232 def test_istitle(self, size):
233 SUBSTR = '123456'
234 s = ''.join(['A', 'a' * size, SUBSTR])
235 self.failUnless(s.istitle())
236 s += 'A'
237 self.failUnless(s.istitle())
238 s += 'aA'
239 self.failIf(s.istitle())
240
241 @bigmemtest(minsize=_2G, memuse=2)
242 def test_isupper(self, size):
243 chars = ''.join([ chr(c) for c in range(255) if not chr(c).islower() ])
244 repeats = size // len(chars) + 2
245 s = chars * repeats
246 self.failUnless(s.isupper())
247 s += 'a'
248 self.failIf(s.isupper())
249
250 @bigmemtest(minsize=_2G, memuse=2)
251 def test_join(self, size):
252 s = 'A' * size
253 x = s.join(['aaaaa', 'bbbbb'])
254 self.assertEquals(x.count('a'), 5)
255 self.assertEquals(x.count('b'), 5)
256 self.failUnless(x.startswith('aaaaaA'))
257 self.failUnless(x.endswith('Abbbbb'))
258
259 @bigmemtest(minsize=_2G + 10, memuse=1)
260 def test_ljust(self, size):
261 SUBSTR = ' abc def ghi'
262 s = SUBSTR.ljust(size)
263 self.failUnless(s.startswith(SUBSTR + ' '))
264 self.assertEquals(len(s), size)
265 self.assertEquals(s.strip(), SUBSTR.strip())
266
267 @bigmemtest(minsize=_2G + 10, memuse=2)
268 def test_lower(self, size):
269 s = 'A' * size
270 s = s.lower()
271 self.assertEquals(len(s), size)
272 self.assertEquals(s.count('a'), size)
273
274 @bigmemtest(minsize=_2G + 10, memuse=1)
275 def test_lstrip(self, size):
276 SUBSTR = 'abc def ghi'
277 s = SUBSTR.rjust(size)
278 self.assertEquals(len(s), size)
279 self.assertEquals(s.lstrip(), SUBSTR.lstrip())
280 del s
281 s = SUBSTR.ljust(size)
282 self.assertEquals(len(s), size)
283 stripped = s.lstrip()
284 self.failUnless(stripped is s)
285
286 @bigmemtest(minsize=_2G + 10, memuse=2)
287 def test_replace(self, size):
288 replacement = 'a'
289 s = ' ' * size
290 s = s.replace(' ', replacement)
291 self.assertEquals(len(s), size)
292 self.assertEquals(s.count(replacement), size)
293 s = s.replace(replacement, ' ', size - 4)
294 self.assertEquals(len(s), size)
295 self.assertEquals(s.count(replacement), 4)
296 self.assertEquals(s[-10:], ' aaaa')
297
298 @bigmemtest(minsize=_2G, memuse=2)
299 def test_rfind(self, size):
300 SUBSTR = ' abc def ghi'
301 sublen = len(SUBSTR)
302 s = ''.join([SUBSTR, '-' * size, SUBSTR])
303 self.assertEquals(s.rfind(' '), sublen + size + SUBSTR.rfind(' '))
304 self.assertEquals(s.rfind(SUBSTR), sublen + size)
305 self.assertEquals(s.rfind(' ', 0, size), SUBSTR.rfind(' '))
306 self.assertEquals(s.rfind(SUBSTR, 0, sublen + size), 0)
307 self.assertEquals(s.rfind('i'), sublen + size + SUBSTR.rfind('i'))
308 self.assertEquals(s.rfind('i', 0, sublen), SUBSTR.rfind('i'))
309 self.assertEquals(s.rfind('i', 0, sublen + size),
310 SUBSTR.rfind('i'))
311 self.assertEquals(s.rfind('j'), -1)
312
313 @bigmemtest(minsize=_2G, memuse=2)
314 def test_rindex(self, size):
315 SUBSTR = ' abc def ghi'
316 sublen = len(SUBSTR)
317 s = ''.join([SUBSTR, '-' * size, SUBSTR])
318 self.assertEquals(s.rindex(' '),
319 sublen + size + SUBSTR.rindex(' '))
320 self.assertEquals(s.rindex(SUBSTR), sublen + size)
321 self.assertEquals(s.rindex(' ', 0, sublen + size - 1),
322 SUBSTR.rindex(' '))
323 self.assertEquals(s.rindex(SUBSTR, 0, sublen + size), 0)
324 self.assertEquals(s.rindex('i'),
325 sublen + size + SUBSTR.rindex('i'))
326 self.assertEquals(s.rindex('i', 0, sublen), SUBSTR.rindex('i'))
327 self.assertEquals(s.rindex('i', 0, sublen + size),
328 SUBSTR.rindex('i'))
329 self.assertRaises(ValueError, s.rindex, 'j')
330
331 @bigmemtest(minsize=_2G + 10, memuse=1)
332 def test_rjust(self, size):
333 SUBSTR = ' abc def ghi'
334 s = SUBSTR.ljust(size)
335 self.failUnless(s.startswith(SUBSTR + ' '))
336 self.assertEquals(len(s), size)
337 self.assertEquals(s.strip(), SUBSTR.strip())
338
339 @bigmemtest(minsize=_2G + 10, memuse=1)
340 def test_rstrip(self, size):
341 SUBSTR = ' abc def ghi'
342 s = SUBSTR.ljust(size)
343 self.assertEquals(len(s), size)
344 self.assertEquals(s.rstrip(), SUBSTR.rstrip())
345 del s
346 s = SUBSTR.rjust(size)
347 self.assertEquals(len(s), size)
348 stripped = s.rstrip()
349 self.failUnless(stripped is s)
350
351 # The test takes about size bytes to build a string, and then about
352 # sqrt(size) substrings of sqrt(size) in size and a list to
353 # hold sqrt(size) items. It's close but just over 2x size.
354 @bigmemtest(minsize=_2G, memuse=2.1)
355 def test_split_small(self, size):
356 # Crudely calculate an estimate so that the result of s.split won't
357 # take up an inordinate amount of memory
358 chunksize = int(size ** 0.5 + 2)
359 SUBSTR = 'a' + ' ' * chunksize
360 s = SUBSTR * chunksize
361 l = s.split()
362 self.assertEquals(len(l), chunksize)
363 self.assertEquals(set(l), set(['a']))
364 del l
365 l = s.split('a')
366 self.assertEquals(len(l), chunksize + 1)
367 self.assertEquals(set(l), set(['', ' ' * chunksize]))
368
369 # Allocates a string of twice size (and briefly two) and a list of
370 # size. Because of internal affairs, the s.split() call produces a
371 # list of size times the same one-character string, so we only
372 # suffer for the list size. (Otherwise, it'd cost another 48 times
373 # size in bytes!) Nevertheless, a list of size takes
374 # 8*size bytes.
375 @bigmemtest(minsize=_2G + 5, memuse=10)
376 def test_split_large(self, size):
377 s = ' a' * size + ' '
378 l = s.split()
379 self.assertEquals(len(l), size)
380 self.assertEquals(set(l), set(['a']))
381 del l
382 l = s.split('a')
383 self.assertEquals(len(l), size + 1)
384 self.assertEquals(set(l), set([' ']))
385
386 @bigmemtest(minsize=_2G, memuse=2.1)
387 def test_splitlines(self, size):
388 # Crudely calculate an estimate so that the result of s.split won't
389 # take up an inordinate amount of memory
390 chunksize = int(size ** 0.5 + 2) // 2
391 SUBSTR = ' ' * chunksize + '\n' + ' ' * chunksize + '\r\n'
392 s = SUBSTR * chunksize
393 l = s.splitlines()
394 self.assertEquals(len(l), chunksize * 2)
395 self.assertEquals(set(l), set([' ' * chunksize]))
396
397 @bigmemtest(minsize=_2G, memuse=2)
398 def test_startswith(self, size):
399 SUBSTR = ' abc def ghi'
400 s = '-' * size + SUBSTR
401 self.failUnless(s.startswith(s))
402 self.failUnless(s.startswith('-' * size))
403 self.failIf(s.startswith(SUBSTR))
404
405 @bigmemtest(minsize=_2G, memuse=1)
406 def test_strip(self, size):
407 SUBSTR = ' abc def ghi '
408 s = SUBSTR.rjust(size)
409 self.assertEquals(len(s), size)
410 self.assertEquals(s.strip(), SUBSTR.strip())
411 del s
412 s = SUBSTR.ljust(size)
413 self.assertEquals(len(s), size)
414 self.assertEquals(s.strip(), SUBSTR.strip())
415
416 @bigmemtest(minsize=_2G, memuse=2)
417 def test_swapcase(self, size):
418 SUBSTR = "aBcDeFG12.'\xa9\x00"
419 sublen = len(SUBSTR)
420 repeats = size // sublen + 2
421 s = SUBSTR * repeats
422 s = s.swapcase()
423 self.assertEquals(len(s), sublen * repeats)
424 self.assertEquals(s[:sublen * 3], SUBSTR.swapcase() * 3)
425 self.assertEquals(s[-sublen * 3:], SUBSTR.swapcase() * 3)
426
427 @bigmemtest(minsize=_2G, memuse=2)
428 def test_title(self, size):
429 SUBSTR = 'SpaaHAaaAaham'
430 s = SUBSTR * (size // len(SUBSTR) + 2)
431 s = s.title()
432 self.failUnless(s.startswith((SUBSTR * 3).title()))
433 self.failUnless(s.endswith(SUBSTR.lower() * 3))
434
435 @bigmemtest(minsize=_2G, memuse=2)
436 def test_translate(self, size):
Georg Brandl7f13e6b2007-08-31 10:37:15 +0000437 trans = {ord('.'):'-', ord('a'):'!', ord('Z'):'$'}
Thomas Wouters477c8d52006-05-27 19:21:47 +0000438 SUBSTR = 'aZz.z.Aaz.'
439 sublen = len(SUBSTR)
440 repeats = size // sublen + 2
441 s = SUBSTR * repeats
442 s = s.translate(trans)
443 self.assertEquals(len(s), repeats * sublen)
444 self.assertEquals(s[:sublen], SUBSTR.translate(trans))
445 self.assertEquals(s[-sublen:], SUBSTR.translate(trans))
446 self.assertEquals(s.count('.'), 0)
447 self.assertEquals(s.count('!'), repeats * 2)
448 self.assertEquals(s.count('z'), repeats * 3)
449
450 @bigmemtest(minsize=_2G + 5, memuse=2)
451 def test_upper(self, size):
452 s = 'a' * size
453 s = s.upper()
454 self.assertEquals(len(s), size)
455 self.assertEquals(s.count('A'), size)
456
457 @bigmemtest(minsize=_2G + 20, memuse=1)
458 def test_zfill(self, size):
459 SUBSTR = '-568324723598234'
460 s = SUBSTR.zfill(size)
461 self.failUnless(s.endswith('0' + SUBSTR[1:]))
462 self.failUnless(s.startswith('-0'))
463 self.assertEquals(len(s), size)
464 self.assertEquals(s.count('0'), size - len(SUBSTR))
465
466 @bigmemtest(minsize=_2G + 10, memuse=2)
467 def test_format(self, size):
468 s = '-' * size
469 sf = '%s' % (s,)
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000470 self.assertEqual(s, sf)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000471 del sf
472 sf = '..%s..' % (s,)
473 self.assertEquals(len(sf), len(s) + 4)
474 self.failUnless(sf.startswith('..-'))
475 self.failUnless(sf.endswith('-..'))
476 del s, sf
477
478 size //= 2
479 edge = '-' * size
480 s = ''.join([edge, '%s', edge])
481 del edge
482 s = s % '...'
483 self.assertEquals(len(s), size * 2 + 3)
484 self.assertEquals(s.count('.'), 3)
485 self.assertEquals(s.count('-'), size * 2)
486
487 @bigmemtest(minsize=_2G + 10, memuse=2)
488 def test_repr_small(self, size):
489 s = '-' * size
490 s = repr(s)
491 self.assertEquals(len(s), size + 2)
492 self.assertEquals(s[0], "'")
493 self.assertEquals(s[-1], "'")
494 self.assertEquals(s.count('-'), size)
495 del s
496 # repr() will create a string four times as large as this 'binary
497 # string', but we don't want to allocate much more than twice
498 # size in total. (We do extra testing in test_repr_large())
499 size = size // 5 * 2
500 s = '\x00' * size
501 s = repr(s)
502 self.assertEquals(len(s), size * 4 + 2)
503 self.assertEquals(s[0], "'")
504 self.assertEquals(s[-1], "'")
505 self.assertEquals(s.count('\\'), size)
506 self.assertEquals(s.count('0'), size * 2)
507
508 @bigmemtest(minsize=_2G + 10, memuse=5)
509 def test_repr_large(self, size):
510 s = '\x00' * size
511 s = repr(s)
512 self.assertEquals(len(s), size * 4 + 2)
513 self.assertEquals(s[0], "'")
514 self.assertEquals(s[-1], "'")
515 self.assertEquals(s.count('\\'), size)
516 self.assertEquals(s.count('0'), size * 2)
517
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000518 @bigmemtest(minsize=2**32 / 5, memuse=6+2)
519 def test_unicode_repr(self, size):
520 s = "\uAAAA" * size
521 self.failUnless(len(repr(s)) > size)
522
Thomas Wouters477c8d52006-05-27 19:21:47 +0000523 # This test is meaningful even with size < 2G, as long as the
524 # doubled string is > 2G (but it tests more if both are > 2G :)
525 @bigmemtest(minsize=_1G + 2, memuse=3)
526 def test_concat(self, size):
527 s = '.' * size
528 self.assertEquals(len(s), size)
529 s = s + s
530 self.assertEquals(len(s), size * 2)
531 self.assertEquals(s.count('.'), size * 2)
532
533 # This test is meaningful even with size < 2G, as long as the
534 # repeated string is > 2G (but it tests more if both are > 2G :)
535 @bigmemtest(minsize=_1G + 2, memuse=3)
536 def test_repeat(self, size):
537 s = '.' * size
538 self.assertEquals(len(s), size)
539 s = s * 2
540 self.assertEquals(len(s), size * 2)
541 self.assertEquals(s.count('.'), size * 2)
542
543 @bigmemtest(minsize=_2G + 20, memuse=1)
544 def test_slice_and_getitem(self, size):
545 SUBSTR = '0123456789'
546 sublen = len(SUBSTR)
547 s = SUBSTR * (size // sublen)
548 stepsize = len(s) // 100
549 stepsize = stepsize - (stepsize % sublen)
550 for i in range(0, len(s) - stepsize, stepsize):
551 self.assertEquals(s[i], SUBSTR[0])
552 self.assertEquals(s[i:i + sublen], SUBSTR)
553 self.assertEquals(s[i:i + sublen:2], SUBSTR[::2])
554 if i > 0:
555 self.assertEquals(s[i + sublen - 1:i - 1:-3],
556 SUBSTR[sublen::-3])
557 # Make sure we do some slicing and indexing near the end of the
558 # string, too.
559 self.assertEquals(s[len(s) - 1], SUBSTR[-1])
560 self.assertEquals(s[-1], SUBSTR[-1])
561 self.assertEquals(s[len(s) - 10], SUBSTR[0])
562 self.assertEquals(s[-sublen], SUBSTR[0])
563 self.assertEquals(s[len(s):], '')
564 self.assertEquals(s[len(s) - 1:], SUBSTR[-1])
565 self.assertEquals(s[-1:], SUBSTR[-1])
566 self.assertEquals(s[len(s) - sublen:], SUBSTR)
567 self.assertEquals(s[-sublen:], SUBSTR)
568 self.assertEquals(len(s[:]), len(s))
569 self.assertEquals(len(s[:len(s) - 5]), len(s) - 5)
570 self.assertEquals(len(s[5:-5]), len(s) - 10)
571
572 self.assertRaises(IndexError, operator.getitem, s, len(s))
573 self.assertRaises(IndexError, operator.getitem, s, len(s) + 1)
574 self.assertRaises(IndexError, operator.getitem, s, len(s) + 1<<31)
575
576 @bigmemtest(minsize=_2G, memuse=2)
577 def test_contains(self, size):
578 SUBSTR = '0123456789'
579 edge = '-' * (size // 2)
580 s = ''.join([edge, SUBSTR, edge])
581 del edge
582 self.failUnless(SUBSTR in s)
583 self.failIf(SUBSTR * 2 in s)
584 self.failUnless('-' in s)
585 self.failIf('a' in s)
586 s += 'a'
587 self.failUnless('a' in s)
588
589 @bigmemtest(minsize=_2G + 10, memuse=2)
590 def test_compare(self, size):
591 s1 = '-' * size
592 s2 = '-' * size
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000593 self.assertEqual(s1, s2)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000594 del s2
595 s2 = s1 + 'a'
596 self.failIf(s1 == s2)
597 del s2
598 s2 = '.' * size
599 self.failIf(s1 == s2)
600
601 @bigmemtest(minsize=_2G + 10, memuse=1)
602 def test_hash(self, size):
603 # Not sure if we can do any meaningful tests here... Even if we
604 # start relying on the exact algorithm used, the result will be
605 # different depending on the size of the C 'long int'. Even this
606 # test is dodgy (there's no *guarantee* that the two things should
607 # have a different hash, even if they, in the current
608 # implementation, almost always do.)
609 s = '\x00' * size
610 h1 = hash(s)
611 del s
612 s = '\x00' * (size + 1)
613 self.failIf(h1 == hash(s))
614
615class TupleTest(unittest.TestCase):
616
617 # Tuples have a small, fixed-sized head and an array of pointers to
618 # data. Since we're testing 64-bit addressing, we can assume that the
619 # pointers are 8 bytes, and that thus that the tuples take up 8 bytes
620 # per size.
621
622 # As a side-effect of testing long tuples, these tests happen to test
623 # having more than 2<<31 references to any given object. Hence the
624 # use of different types of objects as contents in different tests.
625
626 @bigmemtest(minsize=_2G + 2, memuse=16)
627 def test_compare(self, size):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000628 t1 = ('',) * size
629 t2 = ('',) * size
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000630 self.assertEqual(t1, t2)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000631 del t2
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000632 t2 = ('',) * (size + 1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000633 self.failIf(t1 == t2)
634 del t2
635 t2 = (1,) * size
636 self.failIf(t1 == t2)
637
638 # Test concatenating into a single tuple of more than 2G in length,
639 # and concatenating a tuple of more than 2G in length separately, so
640 # the smaller test still gets run even if there isn't memory for the
641 # larger test (but we still let the tester know the larger test is
642 # skipped, in verbose mode.)
643 def basic_concat_test(self, size):
644 t = ((),) * size
645 self.assertEquals(len(t), size)
646 t = t + t
647 self.assertEquals(len(t), size * 2)
648
649 @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
650 def test_concat_small(self, size):
651 return self.basic_concat_test(size)
652
653 @bigmemtest(minsize=_2G + 2, memuse=24)
654 def test_concat_large(self, size):
655 return self.basic_concat_test(size)
656
657 @bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5)
658 def test_contains(self, size):
659 t = (1, 2, 3, 4, 5) * size
660 self.assertEquals(len(t), size * 5)
661 self.failUnless(5 in t)
662 self.failIf((1, 2, 3, 4, 5) in t)
663 self.failIf(0 in t)
664
665 @bigmemtest(minsize=_2G + 10, memuse=8)
666 def test_hash(self, size):
667 t1 = (0,) * size
668 h1 = hash(t1)
669 del t1
670 t2 = (0,) * (size + 1)
671 self.failIf(h1 == hash(t2))
672
673 @bigmemtest(minsize=_2G + 10, memuse=8)
674 def test_index_and_slice(self, size):
675 t = (None,) * size
676 self.assertEquals(len(t), size)
677 self.assertEquals(t[-1], None)
678 self.assertEquals(t[5], None)
679 self.assertEquals(t[size - 1], None)
680 self.assertRaises(IndexError, operator.getitem, t, size)
681 self.assertEquals(t[:5], (None,) * 5)
682 self.assertEquals(t[-5:], (None,) * 5)
683 self.assertEquals(t[20:25], (None,) * 5)
684 self.assertEquals(t[-25:-20], (None,) * 5)
685 self.assertEquals(t[size - 5:], (None,) * 5)
686 self.assertEquals(t[size - 5:size], (None,) * 5)
687 self.assertEquals(t[size - 6:size - 2], (None,) * 4)
688 self.assertEquals(t[size:size], ())
689 self.assertEquals(t[size:size+5], ())
690
691 # Like test_concat, split in two.
692 def basic_test_repeat(self, size):
693 t = ('',) * size
694 self.assertEquals(len(t), size)
695 t = t * 2
696 self.assertEquals(len(t), size * 2)
697
698 @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
699 def test_repeat_small(self, size):
700 return self.basic_test_repeat(size)
701
702 @bigmemtest(minsize=_2G + 2, memuse=24)
703 def test_repeat_large(self, size):
704 return self.basic_test_repeat(size)
705
Neal Norwitz3ce5d922008-08-24 07:08:55 +0000706 @bigmemtest(minsize=_1G - 1, memuse=12)
707 def test_repeat_large_2(self, size):
708 return self.basic_test_repeat(size)
709
710 @precisionbigmemtest(size=_1G - 1, memuse=9)
711 def test_from_2G_generator(self, size):
712 try:
713 t = tuple(range(size))
714 except MemoryError:
715 pass # acceptable on 32-bit
716 else:
717 count = 0
718 for item in t:
719 self.assertEquals(item, count)
720 count += 1
721 self.assertEquals(count, size)
722
723 @precisionbigmemtest(size=_1G - 25, memuse=9)
724 def test_from_almost_2G_generator(self, size):
725 try:
726 t = tuple(range(size))
727 count = 0
728 for item in t:
729 self.assertEquals(item, count)
730 count += 1
731 self.assertEquals(count, size)
732 except MemoryError:
733 pass # acceptable, expected on 32-bit
734
Thomas Wouters477c8d52006-05-27 19:21:47 +0000735 # Like test_concat, split in two.
736 def basic_test_repr(self, size):
737 t = (0,) * size
738 s = repr(t)
739 # The repr of a tuple of 0's is exactly three times the tuple length.
740 self.assertEquals(len(s), size * 3)
741 self.assertEquals(s[:5], '(0, 0')
742 self.assertEquals(s[-5:], '0, 0)')
743 self.assertEquals(s.count('0'), size)
744
745 @bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3)
746 def test_repr_small(self, size):
747 return self.basic_test_repr(size)
748
749 @bigmemtest(minsize=_2G + 2, memuse=8 + 3)
750 def test_repr_large(self, size):
751 return self.basic_test_repr(size)
752
753class ListTest(unittest.TestCase):
754
755 # Like tuples, lists have a small, fixed-sized head and an array of
756 # pointers to data, so 8 bytes per size. Also like tuples, we make the
757 # lists hold references to various objects to test their refcount
758 # limits.
759
760 @bigmemtest(minsize=_2G + 2, memuse=16)
761 def test_compare(self, size):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000762 l1 = [''] * size
763 l2 = [''] * size
Guido van Rossume61fd5b2007-07-11 12:20:59 +0000764 self.assertEqual(l1, l2)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000765 del l2
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000766 l2 = [''] * (size + 1)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000767 self.failIf(l1 == l2)
768 del l2
769 l2 = [2] * size
770 self.failIf(l1 == l2)
771
772 # Test concatenating into a single list of more than 2G in length,
773 # and concatenating a list of more than 2G in length separately, so
774 # the smaller test still gets run even if there isn't memory for the
775 # larger test (but we still let the tester know the larger test is
776 # skipped, in verbose mode.)
777 def basic_test_concat(self, size):
778 l = [[]] * size
779 self.assertEquals(len(l), size)
780 l = l + l
781 self.assertEquals(len(l), size * 2)
782
783 @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
784 def test_concat_small(self, size):
785 return self.basic_test_concat(size)
786
787 @bigmemtest(minsize=_2G + 2, memuse=24)
788 def test_concat_large(self, size):
789 return self.basic_test_concat(size)
790
791 def basic_test_inplace_concat(self, size):
792 l = [sys.stdout] * size
793 l += l
794 self.assertEquals(len(l), size * 2)
795 self.failUnless(l[0] is l[-1])
796 self.failUnless(l[size - 1] is l[size + 1])
797
798 @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
799 def test_inplace_concat_small(self, size):
800 return self.basic_test_inplace_concat(size)
801
802 @bigmemtest(minsize=_2G + 2, memuse=24)
803 def test_inplace_concat_large(self, size):
804 return self.basic_test_inplace_concat(size)
805
806 @bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5)
807 def test_contains(self, size):
808 l = [1, 2, 3, 4, 5] * size
809 self.assertEquals(len(l), size * 5)
810 self.failUnless(5 in l)
811 self.failIf([1, 2, 3, 4, 5] in l)
812 self.failIf(0 in l)
813
814 @bigmemtest(minsize=_2G + 10, memuse=8)
815 def test_hash(self, size):
816 l = [0] * size
817 self.failUnlessRaises(TypeError, hash, l)
818
819 @bigmemtest(minsize=_2G + 10, memuse=8)
820 def test_index_and_slice(self, size):
821 l = [None] * size
822 self.assertEquals(len(l), size)
823 self.assertEquals(l[-1], None)
824 self.assertEquals(l[5], None)
825 self.assertEquals(l[size - 1], None)
826 self.assertRaises(IndexError, operator.getitem, l, size)
827 self.assertEquals(l[:5], [None] * 5)
828 self.assertEquals(l[-5:], [None] * 5)
829 self.assertEquals(l[20:25], [None] * 5)
830 self.assertEquals(l[-25:-20], [None] * 5)
831 self.assertEquals(l[size - 5:], [None] * 5)
832 self.assertEquals(l[size - 5:size], [None] * 5)
833 self.assertEquals(l[size - 6:size - 2], [None] * 4)
834 self.assertEquals(l[size:size], [])
835 self.assertEquals(l[size:size+5], [])
836
837 l[size - 2] = 5
838 self.assertEquals(len(l), size)
839 self.assertEquals(l[-3:], [None, 5, None])
840 self.assertEquals(l.count(5), 1)
841 self.assertRaises(IndexError, operator.setitem, l, size, 6)
842 self.assertEquals(len(l), size)
843
844 l[size - 7:] = [1, 2, 3, 4, 5]
845 size -= 2
846 self.assertEquals(len(l), size)
847 self.assertEquals(l[-7:], [None, None, 1, 2, 3, 4, 5])
848
849 l[:7] = [1, 2, 3, 4, 5]
850 size -= 2
851 self.assertEquals(len(l), size)
852 self.assertEquals(l[:7], [1, 2, 3, 4, 5, None, None])
853
854 del l[size - 1]
855 size -= 1
856 self.assertEquals(len(l), size)
857 self.assertEquals(l[-1], 4)
858
859 del l[-2:]
860 size -= 2
861 self.assertEquals(len(l), size)
862 self.assertEquals(l[-1], 2)
863
864 del l[0]
865 size -= 1
866 self.assertEquals(len(l), size)
867 self.assertEquals(l[0], 2)
868
869 del l[:2]
870 size -= 2
871 self.assertEquals(len(l), size)
872 self.assertEquals(l[0], 4)
873
874 # Like test_concat, split in two.
875 def basic_test_repeat(self, size):
876 l = [] * size
877 self.failIf(l)
878 l = [''] * size
879 self.assertEquals(len(l), size)
880 l = l * 2
881 self.assertEquals(len(l), size * 2)
882
883 @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
884 def test_repeat_small(self, size):
885 return self.basic_test_repeat(size)
886
887 @bigmemtest(minsize=_2G + 2, memuse=24)
888 def test_repeat_large(self, size):
889 return self.basic_test_repeat(size)
890
891 def basic_test_inplace_repeat(self, size):
892 l = ['']
893 l *= size
894 self.assertEquals(len(l), size)
895 self.failUnless(l[0] is l[-1])
896 del l
897
898 l = [''] * size
899 l *= 2
900 self.assertEquals(len(l), size * 2)
901 self.failUnless(l[size - 1] is l[-1])
902
903 @bigmemtest(minsize=_2G // 2 + 2, memuse=16)
904 def test_inplace_repeat_small(self, size):
905 return self.basic_test_inplace_repeat(size)
906
907 @bigmemtest(minsize=_2G + 2, memuse=16)
908 def test_inplace_repeat_large(self, size):
909 return self.basic_test_inplace_repeat(size)
910
911 def basic_test_repr(self, size):
912 l = [0] * size
913 s = repr(l)
914 # The repr of a list of 0's is exactly three times the list length.
915 self.assertEquals(len(s), size * 3)
916 self.assertEquals(s[:5], '[0, 0')
917 self.assertEquals(s[-5:], '0, 0]')
918 self.assertEquals(s.count('0'), size)
919
920 @bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3)
921 def test_repr_small(self, size):
922 return self.basic_test_repr(size)
923
924 @bigmemtest(minsize=_2G + 2, memuse=8 + 3)
925 def test_repr_large(self, size):
926 return self.basic_test_repr(size)
927
928 # list overallocates ~1/8th of the total size (on first expansion) so
929 # the single list.append call puts memuse at 9 bytes per size.
930 @bigmemtest(minsize=_2G, memuse=9)
931 def test_append(self, size):
932 l = [object()] * size
933 l.append(object())
934 self.assertEquals(len(l), size+1)
935 self.failUnless(l[-3] is l[-2])
936 self.failIf(l[-2] is l[-1])
937
938 @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
939 def test_count(self, size):
940 l = [1, 2, 3, 4, 5] * size
941 self.assertEquals(l.count(1), size)
942 self.assertEquals(l.count("1"), 0)
943
944 def basic_test_extend(self, size):
Guido van Rossuma5d0c262007-07-12 08:11:23 +0000945 l = [object] * size
Thomas Wouters477c8d52006-05-27 19:21:47 +0000946 l.extend(l)
947 self.assertEquals(len(l), size * 2)
948 self.failUnless(l[0] is l[-1])
949 self.failUnless(l[size - 1] is l[size + 1])
950
951 @bigmemtest(minsize=_2G // 2 + 2, memuse=16)
952 def test_extend_small(self, size):
953 return self.basic_test_extend(size)
954
955 @bigmemtest(minsize=_2G + 2, memuse=16)
956 def test_extend_large(self, size):
957 return self.basic_test_extend(size)
958
959 @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
960 def test_index(self, size):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000961 l = [1, 2, 3, 4, 5] * size
Thomas Wouters477c8d52006-05-27 19:21:47 +0000962 size *= 5
963 self.assertEquals(l.index(1), 0)
964 self.assertEquals(l.index(5, size - 5), size - 1)
965 self.assertEquals(l.index(5, size - 5, size), size - 1)
966 self.assertRaises(ValueError, l.index, 1, size - 4, size)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000967 self.assertRaises(ValueError, l.index, 6)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000968
969 # This tests suffers from overallocation, just like test_append.
970 @bigmemtest(minsize=_2G + 10, memuse=9)
971 def test_insert(self, size):
972 l = [1.0] * size
973 l.insert(size - 1, "A")
974 size += 1
975 self.assertEquals(len(l), size)
976 self.assertEquals(l[-3:], [1.0, "A", 1.0])
977
978 l.insert(size + 1, "B")
979 size += 1
980 self.assertEquals(len(l), size)
981 self.assertEquals(l[-3:], ["A", 1.0, "B"])
982
983 l.insert(1, "C")
984 size += 1
985 self.assertEquals(len(l), size)
986 self.assertEquals(l[:3], [1.0, "C", 1.0])
987 self.assertEquals(l[size - 3:], ["A", 1.0, "B"])
988
989 @bigmemtest(minsize=_2G // 5 + 4, memuse=8 * 5)
990 def test_pop(self, size):
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000991 l = ["a", "b", "c", "d", "e"] * size
Thomas Wouters477c8d52006-05-27 19:21:47 +0000992 size *= 5
993 self.assertEquals(len(l), size)
994
995 item = l.pop()
996 size -= 1
997 self.assertEquals(len(l), size)
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000998 self.assertEquals(item, "e")
999 self.assertEquals(l[-2:], ["c", "d"])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001000
1001 item = l.pop(0)
1002 size -= 1
1003 self.assertEquals(len(l), size)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001004 self.assertEquals(item, "a")
1005 self.assertEquals(l[:2], ["b", "c"])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001006
1007 item = l.pop(size - 2)
1008 size -= 1
1009 self.assertEquals(len(l), size)
Guido van Rossumef87d6e2007-05-02 19:09:54 +00001010 self.assertEquals(item, "c")
1011 self.assertEquals(l[-2:], ["b", "d"])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001012
1013 @bigmemtest(minsize=_2G + 10, memuse=8)
1014 def test_remove(self, size):
1015 l = [10] * size
1016 self.assertEquals(len(l), size)
1017
1018 l.remove(10)
1019 size -= 1
1020 self.assertEquals(len(l), size)
1021
1022 # Because of the earlier l.remove(), this append doesn't trigger
1023 # a resize.
1024 l.append(5)
1025 size += 1
1026 self.assertEquals(len(l), size)
1027 self.assertEquals(l[-2:], [10, 5])
1028 l.remove(5)
1029 size -= 1
1030 self.assertEquals(len(l), size)
1031 self.assertEquals(l[-2:], [10, 10])
1032
1033 @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
1034 def test_reverse(self, size):
1035 l = [1, 2, 3, 4, 5] * size
1036 l.reverse()
1037 self.assertEquals(len(l), size * 5)
1038 self.assertEquals(l[-5:], [5, 4, 3, 2, 1])
1039 self.assertEquals(l[:5], [5, 4, 3, 2, 1])
1040
1041 @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
1042 def test_sort(self, size):
1043 l = [1, 2, 3, 4, 5] * size
1044 l.sort()
1045 self.assertEquals(len(l), size * 5)
1046 self.assertEquals(l.count(1), size)
1047 self.assertEquals(l[:10], [1] * 10)
1048 self.assertEquals(l[-10:], [5] * 10)
1049
1050def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001051 support.run_unittest(StrTest, TupleTest, ListTest)
Thomas Wouters477c8d52006-05-27 19:21:47 +00001052
1053if __name__ == '__main__':
1054 if len(sys.argv) > 1:
Benjamin Petersonee8712c2008-05-20 21:35:26 +00001055 support.set_memlimit(sys.argv[1])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001056 test_main()