1"""Bigmem tests - tests for the 32-bit boundary in containers. 2 3These tests try to exercise the 32-bit boundary that is sometimes, if 4rarely, exceeded in practice, but almost never tested. They are really only 5meaningful on 64-bit builds on machines with a *lot* of memory, but the 6tests are always run, usually with very low memory limits to make sure the 7tests themselves don't suffer from bitrot. To run them for real, pass a 8high memory limit to regrtest, with the -M option. 9""" 10 11from test import support 12from test.support import bigmemtest, _1G, _2G, _4G 13 14import unittest 15import operator 16import sys 17 18# These tests all use one of the bigmemtest decorators to indicate how much 19# memory they use and how much memory they need to be even meaningful. The 20# decorators take two arguments: a 'memuse' indicator declaring 21# (approximate) bytes per size-unit the test will use (at peak usage), and a 22# 'minsize' indicator declaring a minimum *useful* size. A test that 23# allocates a bytestring to test various operations near the end will have a 24# minsize of at least 2Gb (or it wouldn't reach the 32-bit limit, so the 25# test wouldn't be very useful) and a memuse of 1 (one byte per size-unit, 26# if it allocates only one big string at a time.) 27# 28# When run with a memory limit set, both decorators skip tests that need 29# more memory than available to be meaningful. The precisionbigmemtest will 30# always pass minsize as size, even if there is much more memory available. 31# The bigmemtest decorator will scale size upward to fill available memory. 32# 33# Bigmem testing houserules: 34# 35# - Try not to allocate too many large objects. It's okay to rely on 36# refcounting semantics, and don't forget that 's = create_largestring()' 37# doesn't release the old 's' (if it exists) until well after its new 38# value has been created. Use 'del s' before the create_largestring call. 39# 40# - Do *not* compare large objects using assertEqual, assertIn or similar. 41# It's a lengthy operation and the errormessage will be utterly useless 42# due to its size. To make sure whether a result has the right contents, 43# better to use the strip or count methods, or compare meaningful slices. 44# 45# - Don't forget to test for large indices, offsets and results and such, 46# in addition to large sizes. Anything that probes the 32-bit boundary. 47# 48# - When repeating an object (say, a substring, or a small list) to create 49# a large object, make the subobject of a length that is not a power of 50# 2. That way, int-wrapping problems are more easily detected. 51# 52# - Despite the bigmemtest decorator, all tests will actually be called 53# with a much smaller number too, in the normal test run (5Kb currently.) 54# This is so the tests themselves get frequent testing. 55# Consequently, always make all large allocations based on the 56# passed-in 'size', and don't rely on the size being very large. Also, 57# memuse-per-size should remain sane (less than a few thousand); if your 58# test uses more, adjust 'size' upward, instead. 59 60# BEWARE: it seems that one failing test can yield other subsequent tests to 61# fail as well. I do not know whether it is due to memory fragmentation 62# issues, or other specifics of the platform malloc() routine. 63 64ascii_char_size = 1 65ucs2_char_size = 2 66ucs4_char_size = 4 67pointer_size = 4 if sys.maxsize < 2**32 else 8 68 69 70class BaseStrTest: 71 72 def _test_capitalize(self, size): 73 _ = self.from_latin1 74 SUBSTR = self.from_latin1(' abc def ghi') 75 s = _('-') * size + SUBSTR 76 caps = s.capitalize() 77 self.assertEqual(caps[-len(SUBSTR):], 78 SUBSTR.capitalize()) 79 self.assertEqual(caps.lstrip(_('-')), SUBSTR) 80 81 @bigmemtest(size=_2G + 10, memuse=1) 82 def test_center(self, size): 83 SUBSTR = self.from_latin1(' abc def ghi') 84 s = SUBSTR.center(size) 85 self.assertEqual(len(s), size) 86 lpadsize = rpadsize = (len(s) - len(SUBSTR)) // 2 87 if len(s) % 2: 88 lpadsize += 1 89 self.assertEqual(s[lpadsize:-rpadsize], SUBSTR) 90 self.assertEqual(s.strip(), SUBSTR.strip()) 91 92 @bigmemtest(size=_2G, memuse=2) 93 def test_count(self, size): 94 _ = self.from_latin1 95 SUBSTR = _(' abc def ghi') 96 s = _('.') * size + SUBSTR 97 self.assertEqual(s.count(_('.')), size) 98 s += _('.') 99 self.assertEqual(s.count(_('.')), size + 1) 100 self.assertEqual(s.count(_(' ')), 3) 101 self.assertEqual(s.count(_('i')), 1) 102 self.assertEqual(s.count(_('j')), 0) 103 104 @bigmemtest(size=_2G, memuse=2) 105 def test_endswith(self, size): 106 _ = self.from_latin1 107 SUBSTR = _(' abc def ghi') 108 s = _('-') * size + SUBSTR 109 self.assertTrue(s.endswith(SUBSTR)) 110 self.assertTrue(s.endswith(s)) 111 s2 = _('...') + s 112 self.assertTrue(s2.endswith(s)) 113 self.assertFalse(s.endswith(_('a') + SUBSTR)) 114 self.assertFalse(SUBSTR.endswith(s)) 115 116 @bigmemtest(size=_2G + 10, memuse=2) 117 def test_expandtabs(self, size): 118 _ = self.from_latin1 119 s = _('-') * size 120 tabsize = 8 121 self.assertTrue(s.expandtabs() == s) 122 del s 123 slen, remainder = divmod(size, tabsize) 124 s = _(' \t') * slen 125 s = s.expandtabs(tabsize) 126 self.assertEqual(len(s), size - remainder) 127 self.assertEqual(len(s.strip(_(' '))), 0) 128 129 @bigmemtest(size=_2G, memuse=2) 130 def test_find(self, size): 131 _ = self.from_latin1 132 SUBSTR = _(' abc def ghi') 133 sublen = len(SUBSTR) 134 s = _('').join([SUBSTR, _('-') * size, SUBSTR]) 135 self.assertEqual(s.find(_(' ')), 0) 136 self.assertEqual(s.find(SUBSTR), 0) 137 self.assertEqual(s.find(_(' '), sublen), sublen + size) 138 self.assertEqual(s.find(SUBSTR, len(SUBSTR)), sublen + size) 139 self.assertEqual(s.find(_('i')), SUBSTR.find(_('i'))) 140 self.assertEqual(s.find(_('i'), sublen), 141 sublen + size + SUBSTR.find(_('i'))) 142 self.assertEqual(s.find(_('i'), size), 143 sublen + size + SUBSTR.find(_('i'))) 144 self.assertEqual(s.find(_('j')), -1) 145 146 @bigmemtest(size=_2G, memuse=2) 147 def test_index(self, size): 148 _ = self.from_latin1 149 SUBSTR = _(' abc def ghi') 150 sublen = len(SUBSTR) 151 s = _('').join([SUBSTR, _('-') * size, SUBSTR]) 152 self.assertEqual(s.index(_(' ')), 0) 153 self.assertEqual(s.index(SUBSTR), 0) 154 self.assertEqual(s.index(_(' '), sublen), sublen + size) 155 self.assertEqual(s.index(SUBSTR, sublen), sublen + size) 156 self.assertEqual(s.index(_('i')), SUBSTR.index(_('i'))) 157 self.assertEqual(s.index(_('i'), sublen), 158 sublen + size + SUBSTR.index(_('i'))) 159 self.assertEqual(s.index(_('i'), size), 160 sublen + size + SUBSTR.index(_('i'))) 161 self.assertRaises(ValueError, s.index, _('j')) 162 163 @bigmemtest(size=_2G, memuse=2) 164 def test_isalnum(self, size): 165 _ = self.from_latin1 166 SUBSTR = _('123456') 167 s = _('a') * size + SUBSTR 168 self.assertTrue(s.isalnum()) 169 s += _('.') 170 self.assertFalse(s.isalnum()) 171 172 @bigmemtest(size=_2G, memuse=2) 173 def test_isalpha(self, size): 174 _ = self.from_latin1 175 SUBSTR = _('zzzzzzz') 176 s = _('a') * size + SUBSTR 177 self.assertTrue(s.isalpha()) 178 s += _('.') 179 self.assertFalse(s.isalpha()) 180 181 @bigmemtest(size=_2G, memuse=2) 182 def test_isdigit(self, size): 183 _ = self.from_latin1 184 SUBSTR = _('123456') 185 s = _('9') * size + SUBSTR 186 self.assertTrue(s.isdigit()) 187 s += _('z') 188 self.assertFalse(s.isdigit()) 189 190 @bigmemtest(size=_2G, memuse=2) 191 def test_islower(self, size): 192 _ = self.from_latin1 193 chars = _(''.join( 194 chr(c) for c in range(255) if not chr(c).isupper())) 195 repeats = size // len(chars) + 2 196 s = chars * repeats 197 self.assertTrue(s.islower()) 198 s += _('A') 199 self.assertFalse(s.islower()) 200 201 @bigmemtest(size=_2G, memuse=2) 202 def test_isspace(self, size): 203 _ = self.from_latin1 204 whitespace = _(' \f\n\r\t\v') 205 repeats = size // len(whitespace) + 2 206 s = whitespace * repeats 207 self.assertTrue(s.isspace()) 208 s += _('j') 209 self.assertFalse(s.isspace()) 210 211 @bigmemtest(size=_2G, memuse=2) 212 def test_istitle(self, size): 213 _ = self.from_latin1 214 SUBSTR = _('123456') 215 s = _('').join([_('A'), _('a') * size, SUBSTR]) 216 self.assertTrue(s.istitle()) 217 s += _('A') 218 self.assertTrue(s.istitle()) 219 s += _('aA') 220 self.assertFalse(s.istitle()) 221 222 @bigmemtest(size=_2G, memuse=2) 223 def test_isupper(self, size): 224 _ = self.from_latin1 225 chars = _(''.join( 226 chr(c) for c in range(255) if not chr(c).islower())) 227 repeats = size // len(chars) + 2 228 s = chars * repeats 229 self.assertTrue(s.isupper()) 230 s += _('a') 231 self.assertFalse(s.isupper()) 232 233 @bigmemtest(size=_2G, memuse=2) 234 def test_join(self, size): 235 _ = self.from_latin1 236 s = _('A') * size 237 x = s.join([_('aaaaa'), _('bbbbb')]) 238 self.assertEqual(x.count(_('a')), 5) 239 self.assertEqual(x.count(_('b')), 5) 240 self.assertTrue(x.startswith(_('aaaaaA'))) 241 self.assertTrue(x.endswith(_('Abbbbb'))) 242 243 @bigmemtest(size=_2G + 10, memuse=1) 244 def test_ljust(self, size): 245 _ = self.from_latin1 246 SUBSTR = _(' abc def ghi') 247 s = SUBSTR.ljust(size) 248 self.assertTrue(s.startswith(SUBSTR + _(' '))) 249 self.assertEqual(len(s), size) 250 self.assertEqual(s.strip(), SUBSTR.strip()) 251 252 @bigmemtest(size=_2G + 10, memuse=2) 253 def test_lower(self, size): 254 _ = self.from_latin1 255 s = _('A') * size 256 s = s.lower() 257 self.assertEqual(len(s), size) 258 self.assertEqual(s.count(_('a')), size) 259 260 @bigmemtest(size=_2G + 10, memuse=1) 261 def test_lstrip(self, size): 262 _ = self.from_latin1 263 SUBSTR = _('abc def ghi') 264 s = SUBSTR.rjust(size) 265 self.assertEqual(len(s), size) 266 self.assertEqual(s.lstrip(), SUBSTR.lstrip()) 267 del s 268 s = SUBSTR.ljust(size) 269 self.assertEqual(len(s), size) 270 # Type-specific optimization 271 if isinstance(s, (str, bytes)): 272 stripped = s.lstrip() 273 self.assertTrue(stripped is s) 274 275 @bigmemtest(size=_2G + 10, memuse=2) 276 def test_replace(self, size): 277 _ = self.from_latin1 278 replacement = _('a') 279 s = _(' ') * size 280 s = s.replace(_(' '), replacement) 281 self.assertEqual(len(s), size) 282 self.assertEqual(s.count(replacement), size) 283 s = s.replace(replacement, _(' '), size - 4) 284 self.assertEqual(len(s), size) 285 self.assertEqual(s.count(replacement), 4) 286 self.assertEqual(s[-10:], _(' aaaa')) 287 288 @bigmemtest(size=_2G, memuse=2) 289 def test_rfind(self, size): 290 _ = self.from_latin1 291 SUBSTR = _(' abc def ghi') 292 sublen = len(SUBSTR) 293 s = _('').join([SUBSTR, _('-') * size, SUBSTR]) 294 self.assertEqual(s.rfind(_(' ')), sublen + size + SUBSTR.rfind(_(' '))) 295 self.assertEqual(s.rfind(SUBSTR), sublen + size) 296 self.assertEqual(s.rfind(_(' '), 0, size), SUBSTR.rfind(_(' '))) 297 self.assertEqual(s.rfind(SUBSTR, 0, sublen + size), 0) 298 self.assertEqual(s.rfind(_('i')), sublen + size + SUBSTR.rfind(_('i'))) 299 self.assertEqual(s.rfind(_('i'), 0, sublen), SUBSTR.rfind(_('i'))) 300 self.assertEqual(s.rfind(_('i'), 0, sublen + size), 301 SUBSTR.rfind(_('i'))) 302 self.assertEqual(s.rfind(_('j')), -1) 303 304 @bigmemtest(size=_2G, memuse=2) 305 def test_rindex(self, size): 306 _ = self.from_latin1 307 SUBSTR = _(' abc def ghi') 308 sublen = len(SUBSTR) 309 s = _('').join([SUBSTR, _('-') * size, SUBSTR]) 310 self.assertEqual(s.rindex(_(' ')), 311 sublen + size + SUBSTR.rindex(_(' '))) 312 self.assertEqual(s.rindex(SUBSTR), sublen + size) 313 self.assertEqual(s.rindex(_(' '), 0, sublen + size - 1), 314 SUBSTR.rindex(_(' '))) 315 self.assertEqual(s.rindex(SUBSTR, 0, sublen + size), 0) 316 self.assertEqual(s.rindex(_('i')), 317 sublen + size + SUBSTR.rindex(_('i'))) 318 self.assertEqual(s.rindex(_('i'), 0, sublen), SUBSTR.rindex(_('i'))) 319 self.assertEqual(s.rindex(_('i'), 0, sublen + size), 320 SUBSTR.rindex(_('i'))) 321 self.assertRaises(ValueError, s.rindex, _('j')) 322 323 @bigmemtest(size=_2G + 10, memuse=1) 324 def test_rjust(self, size): 325 _ = self.from_latin1 326 SUBSTR = _(' abc def ghi') 327 s = SUBSTR.ljust(size) 328 self.assertTrue(s.startswith(SUBSTR + _(' '))) 329 self.assertEqual(len(s), size) 330 self.assertEqual(s.strip(), SUBSTR.strip()) 331 332 @bigmemtest(size=_2G + 10, memuse=1) 333 def test_rstrip(self, size): 334 _ = self.from_latin1 335 SUBSTR = _(' abc def ghi') 336 s = SUBSTR.ljust(size) 337 self.assertEqual(len(s), size) 338 self.assertEqual(s.rstrip(), SUBSTR.rstrip()) 339 del s 340 s = SUBSTR.rjust(size) 341 self.assertEqual(len(s), size) 342 # Type-specific optimization 343 if isinstance(s, (str, bytes)): 344 stripped = s.rstrip() 345 self.assertTrue(stripped is s) 346 347 # The test takes about size bytes to build a string, and then about 348 # sqrt(size) substrings of sqrt(size) in size and a list to 349 # hold sqrt(size) items. It's close but just over 2x size. 350 @bigmemtest(size=_2G, memuse=2.1) 351 def test_split_small(self, size): 352 _ = self.from_latin1 353 # Crudely calculate an estimate so that the result of s.split won't 354 # take up an inordinate amount of memory 355 chunksize = int(size ** 0.5 + 2) 356 SUBSTR = _('a') + _(' ') * chunksize 357 s = SUBSTR * chunksize 358 l = s.split() 359 self.assertEqual(len(l), chunksize) 360 expected = _('a') 361 for item in l: 362 self.assertEqual(item, expected) 363 del l 364 l = s.split(_('a')) 365 self.assertEqual(len(l), chunksize + 1) 366 expected = _(' ') * chunksize 367 for item in filter(None, l): 368 self.assertEqual(item, expected) 369 370 # Allocates a string of twice size (and briefly two) and a list of 371 # size. Because of internal affairs, the s.split() call produces a 372 # list of size times the same one-character string, so we only 373 # suffer for the list size. (Otherwise, it'd cost another 48 times 374 # size in bytes!) Nevertheless, a list of size takes 375 # 8*size bytes. 376 @bigmemtest(size=_2G + 5, memuse=ascii_char_size * 2 + pointer_size) 377 def test_split_large(self, size): 378 _ = self.from_latin1 379 s = _(' a') * size + _(' ') 380 l = s.split() 381 self.assertEqual(len(l), size) 382 self.assertEqual(set(l), set([_('a')])) 383 del l 384 l = s.split(_('a')) 385 self.assertEqual(len(l), size + 1) 386 self.assertEqual(set(l), set([_(' ')])) 387 388 @bigmemtest(size=_2G, memuse=2.1) 389 def test_splitlines(self, size): 390 _ = self.from_latin1 391 # Crudely calculate an estimate so that the result of s.split won't 392 # take up an inordinate amount of memory 393 chunksize = int(size ** 0.5 + 2) // 2 394 SUBSTR = _(' ') * chunksize + _('\n') + _(' ') * chunksize + _('\r\n') 395 s = SUBSTR * (chunksize * 2) 396 l = s.splitlines() 397 self.assertEqual(len(l), chunksize * 4) 398 expected = _(' ') * chunksize 399 for item in l: 400 self.assertEqual(item, expected) 401 402 @bigmemtest(size=_2G, memuse=2) 403 def test_startswith(self, size): 404 _ = self.from_latin1 405 SUBSTR = _(' abc def ghi') 406 s = _('-') * size + SUBSTR 407 self.assertTrue(s.startswith(s)) 408 self.assertTrue(s.startswith(_('-') * size)) 409 self.assertFalse(s.startswith(SUBSTR)) 410 411 @bigmemtest(size=_2G, memuse=1) 412 def test_strip(self, size): 413 _ = self.from_latin1 414 SUBSTR = _(' abc def ghi ') 415 s = SUBSTR.rjust(size) 416 self.assertEqual(len(s), size) 417 self.assertEqual(s.strip(), SUBSTR.strip()) 418 del s 419 s = SUBSTR.ljust(size) 420 self.assertEqual(len(s), size) 421 self.assertEqual(s.strip(), SUBSTR.strip()) 422 423 def _test_swapcase(self, size): 424 _ = self.from_latin1 425 SUBSTR = _("aBcDeFG12.'\xa9\x00") 426 sublen = len(SUBSTR) 427 repeats = size // sublen + 2 428 s = SUBSTR * repeats 429 s = s.swapcase() 430 self.assertEqual(len(s), sublen * repeats) 431 self.assertEqual(s[:sublen * 3], SUBSTR.swapcase() * 3) 432 self.assertEqual(s[-sublen * 3:], SUBSTR.swapcase() * 3) 433 434 def _test_title(self, size): 435 _ = self.from_latin1 436 SUBSTR = _('SpaaHAaaAaham') 437 s = SUBSTR * (size // len(SUBSTR) + 2) 438 s = s.title() 439 self.assertTrue(s.startswith((SUBSTR * 3).title())) 440 self.assertTrue(s.endswith(SUBSTR.lower() * 3)) 441 442 @bigmemtest(size=_2G, memuse=2) 443 def test_translate(self, size): 444 _ = self.from_latin1 445 SUBSTR = _('aZz.z.Aaz.') 446 trans = bytes.maketrans(b'.aZ', b'-!$') 447 sublen = len(SUBSTR) 448 repeats = size // sublen + 2 449 s = SUBSTR * repeats 450 s = s.translate(trans) 451 self.assertEqual(len(s), repeats * sublen) 452 self.assertEqual(s[:sublen], SUBSTR.translate(trans)) 453 self.assertEqual(s[-sublen:], SUBSTR.translate(trans)) 454 self.assertEqual(s.count(_('.')), 0) 455 self.assertEqual(s.count(_('!')), repeats * 2) 456 self.assertEqual(s.count(_('z')), repeats * 3) 457 458 @bigmemtest(size=_2G + 5, memuse=2) 459 def test_upper(self, size): 460 _ = self.from_latin1 461 s = _('a') * size 462 s = s.upper() 463 self.assertEqual(len(s), size) 464 self.assertEqual(s.count(_('A')), size) 465 466 @bigmemtest(size=_2G + 20, memuse=1) 467 def test_zfill(self, size): 468 _ = self.from_latin1 469 SUBSTR = _('-568324723598234') 470 s = SUBSTR.zfill(size) 471 self.assertTrue(s.endswith(_('0') + SUBSTR[1:])) 472 self.assertTrue(s.startswith(_('-0'))) 473 self.assertEqual(len(s), size) 474 self.assertEqual(s.count(_('0')), size - len(SUBSTR)) 475 476 # This test is meaningful even with size < 2G, as long as the 477 # doubled string is > 2G (but it tests more if both are > 2G :) 478 @bigmemtest(size=_1G + 2, memuse=3) 479 def test_concat(self, size): 480 _ = self.from_latin1 481 s = _('.') * size 482 self.assertEqual(len(s), size) 483 s = s + s 484 self.assertEqual(len(s), size * 2) 485 self.assertEqual(s.count(_('.')), size * 2) 486 487 # This test is meaningful even with size < 2G, as long as the 488 # repeated string is > 2G (but it tests more if both are > 2G :) 489 @bigmemtest(size=_1G + 2, memuse=3) 490 def test_repeat(self, size): 491 _ = self.from_latin1 492 s = _('.') * size 493 self.assertEqual(len(s), size) 494 s = s * 2 495 self.assertEqual(len(s), size * 2) 496 self.assertEqual(s.count(_('.')), size * 2) 497 498 @bigmemtest(size=_2G + 20, memuse=2) 499 def test_slice_and_getitem(self, size): 500 _ = self.from_latin1 501 SUBSTR = _('0123456789') 502 sublen = len(SUBSTR) 503 s = SUBSTR * (size // sublen) 504 stepsize = len(s) // 100 505 stepsize = stepsize - (stepsize % sublen) 506 for i in range(0, len(s) - stepsize, stepsize): 507 self.assertEqual(s[i], SUBSTR[0]) 508 self.assertEqual(s[i:i + sublen], SUBSTR) 509 self.assertEqual(s[i:i + sublen:2], SUBSTR[::2]) 510 if i > 0: 511 self.assertEqual(s[i + sublen - 1:i - 1:-3], 512 SUBSTR[sublen::-3]) 513 # Make sure we do some slicing and indexing near the end of the 514 # string, too. 515 self.assertEqual(s[len(s) - 1], SUBSTR[-1]) 516 self.assertEqual(s[-1], SUBSTR[-1]) 517 self.assertEqual(s[len(s) - 10], SUBSTR[0]) 518 self.assertEqual(s[-sublen], SUBSTR[0]) 519 self.assertEqual(s[len(s):], _('')) 520 self.assertEqual(s[len(s) - 1:], SUBSTR[-1:]) 521 self.assertEqual(s[-1:], SUBSTR[-1:]) 522 self.assertEqual(s[len(s) - sublen:], SUBSTR) 523 self.assertEqual(s[-sublen:], SUBSTR) 524 self.assertEqual(len(s[:]), len(s)) 525 self.assertEqual(len(s[:len(s) - 5]), len(s) - 5) 526 self.assertEqual(len(s[5:-5]), len(s) - 10) 527 528 self.assertRaises(IndexError, operator.getitem, s, len(s)) 529 self.assertRaises(IndexError, operator.getitem, s, len(s) + 1) 530 self.assertRaises(IndexError, operator.getitem, s, len(s) + 1<<31) 531 532 @bigmemtest(size=_2G, memuse=2) 533 def test_contains(self, size): 534 _ = self.from_latin1 535 SUBSTR = _('0123456789') 536 edge = _('-') * (size // 2) 537 s = _('').join([edge, SUBSTR, edge]) 538 del edge 539 self.assertTrue(SUBSTR in s) 540 self.assertFalse(SUBSTR * 2 in s) 541 self.assertTrue(_('-') in s) 542 self.assertFalse(_('a') in s) 543 s += _('a') 544 self.assertTrue(_('a') in s) 545 546 @bigmemtest(size=_2G + 10, memuse=2) 547 def test_compare(self, size): 548 _ = self.from_latin1 549 s1 = _('-') * size 550 s2 = _('-') * size 551 self.assertTrue(s1 == s2) 552 del s2 553 s2 = s1 + _('a') 554 self.assertFalse(s1 == s2) 555 del s2 556 s2 = _('.') * size 557 self.assertFalse(s1 == s2) 558 559 @bigmemtest(size=_2G + 10, memuse=1) 560 def test_hash(self, size): 561 # Not sure if we can do any meaningful tests here... Even if we 562 # start relying on the exact algorithm used, the result will be 563 # different depending on the size of the C 'long int'. Even this 564 # test is dodgy (there's no *guarantee* that the two things should 565 # have a different hash, even if they, in the current 566 # implementation, almost always do.) 567 _ = self.from_latin1 568 s = _('\x00') * size 569 h1 = hash(s) 570 del s 571 s = _('\x00') * (size + 1) 572 self.assertNotEqual(h1, hash(s)) 573 574 575class StrTest(unittest.TestCase, BaseStrTest): 576 577 def from_latin1(self, s): 578 return s 579 580 def basic_encode_test(self, size, enc, c='.', expectedsize=None): 581 if expectedsize is None: 582 expectedsize = size 583 try: 584 s = c * size 585 self.assertEqual(len(s.encode(enc)), expectedsize) 586 finally: 587 s = None 588 589 def setUp(self): 590 # HACK: adjust memory use of tests inherited from BaseStrTest 591 # according to character size. 592 self._adjusted = {} 593 for name in dir(BaseStrTest): 594 if not name.startswith('test_'): 595 continue 596 meth = getattr(type(self), name) 597 try: 598 memuse = meth.memuse 599 except AttributeError: 600 continue 601 meth.memuse = ascii_char_size * memuse 602 self._adjusted[name] = memuse 603 604 def tearDown(self): 605 for name, memuse in self._adjusted.items(): 606 getattr(type(self), name).memuse = memuse 607 608 @bigmemtest(size=_2G, memuse=ucs4_char_size * 3 + ascii_char_size * 2) 609 def test_capitalize(self, size): 610 self._test_capitalize(size) 611 612 @bigmemtest(size=_2G, memuse=ucs4_char_size * 3 + ascii_char_size * 2) 613 def test_title(self, size): 614 self._test_title(size) 615 616 @bigmemtest(size=_2G, memuse=ucs4_char_size * 3 + ascii_char_size * 2) 617 def test_swapcase(self, size): 618 self._test_swapcase(size) 619 620 # Many codecs convert to the legacy representation first, explaining 621 # why we add 'ucs4_char_size' to the 'memuse' below. 622 623 @bigmemtest(size=_2G + 2, memuse=ascii_char_size + 1) 624 def test_encode(self, size): 625 return self.basic_encode_test(size, 'utf-8') 626 627 @bigmemtest(size=_4G // 6 + 2, memuse=ascii_char_size + ucs4_char_size + 1) 628 def test_encode_raw_unicode_escape(self, size): 629 try: 630 return self.basic_encode_test(size, 'raw_unicode_escape') 631 except MemoryError: 632 pass # acceptable on 32-bit 633 634 @bigmemtest(size=_4G // 5 + 70, memuse=ascii_char_size + 8 + 1) 635 def test_encode_utf7(self, size): 636 try: 637 return self.basic_encode_test(size, 'utf7') 638 except MemoryError: 639 pass # acceptable on 32-bit 640 641 @bigmemtest(size=_4G // 4 + 5, memuse=ascii_char_size + ucs4_char_size + 4) 642 def test_encode_utf32(self, size): 643 try: 644 return self.basic_encode_test(size, 'utf32', expectedsize=4 * size + 4) 645 except MemoryError: 646 pass # acceptable on 32-bit 647 648 @bigmemtest(size=_2G - 1, memuse=ascii_char_size + 1) 649 def test_encode_ascii(self, size): 650 return self.basic_encode_test(size, 'ascii', c='A') 651 652 # str % (...) uses a Py_UCS4 intermediate representation 653 654 @bigmemtest(size=_2G + 10, memuse=ascii_char_size * 2 + ucs4_char_size) 655 def test_format(self, size): 656 s = '-' * size 657 sf = '%s' % (s,) 658 self.assertTrue(s == sf) 659 del sf 660 sf = '..%s..' % (s,) 661 self.assertEqual(len(sf), len(s) + 4) 662 self.assertTrue(sf.startswith('..-')) 663 self.assertTrue(sf.endswith('-..')) 664 del s, sf 665 666 size //= 2 667 edge = '-' * size 668 s = ''.join([edge, '%s', edge]) 669 del edge 670 s = s % '...' 671 self.assertEqual(len(s), size * 2 + 3) 672 self.assertEqual(s.count('.'), 3) 673 self.assertEqual(s.count('-'), size * 2) 674 675 @bigmemtest(size=_2G + 10, memuse=ascii_char_size * 2) 676 def test_repr_small(self, size): 677 s = '-' * size 678 s = repr(s) 679 self.assertEqual(len(s), size + 2) 680 self.assertEqual(s[0], "'") 681 self.assertEqual(s[-1], "'") 682 self.assertEqual(s.count('-'), size) 683 del s 684 # repr() will create a string four times as large as this 'binary 685 # string', but we don't want to allocate much more than twice 686 # size in total. (We do extra testing in test_repr_large()) 687 size = size // 5 * 2 688 s = '\x00' * size 689 s = repr(s) 690 self.assertEqual(len(s), size * 4 + 2) 691 self.assertEqual(s[0], "'") 692 self.assertEqual(s[-1], "'") 693 self.assertEqual(s.count('\\'), size) 694 self.assertEqual(s.count('0'), size * 2) 695 696 @bigmemtest(size=_2G + 10, memuse=ascii_char_size * 5) 697 def test_repr_large(self, size): 698 s = '\x00' * size 699 s = repr(s) 700 self.assertEqual(len(s), size * 4 + 2) 701 self.assertEqual(s[0], "'") 702 self.assertEqual(s[-1], "'") 703 self.assertEqual(s.count('\\'), size) 704 self.assertEqual(s.count('0'), size * 2) 705 706 # ascii() calls encode('ascii', 'backslashreplace'), which itself 707 # creates a temporary Py_UNICODE representation in addition to the 708 # original (Py_UCS2) one 709 # There's also some overallocation when resizing the ascii() result 710 # that isn't taken into account here. 711 @bigmemtest(size=_2G // 5 + 1, memuse=ucs2_char_size + 712 ucs4_char_size + ascii_char_size * 6) 713 def test_unicode_repr(self, size): 714 # Use an assigned, but not printable code point. 715 # It is in the range of the low surrogates \uDC00-\uDFFF. 716 char = "\uDCBA" 717 s = char * size 718 try: 719 for f in (repr, ascii): 720 r = f(s) 721 self.assertEqual(len(r), 2 + (len(f(char)) - 2) * size) 722 self.assertTrue(r.endswith(r"\udcba'"), r[-10:]) 723 r = None 724 finally: 725 r = s = None 726 727 @bigmemtest(size=_2G // 5 + 1, memuse=ucs4_char_size * 2 + ascii_char_size * 10) 728 def test_unicode_repr_wide(self, size): 729 char = "\U0001DCBA" 730 s = char * size 731 try: 732 for f in (repr, ascii): 733 r = f(s) 734 self.assertEqual(len(r), 2 + (len(f(char)) - 2) * size) 735 self.assertTrue(r.endswith(r"\U0001dcba'"), r[-12:]) 736 r = None 737 finally: 738 r = s = None 739 740 # The original test_translate is overridden here, so as to get the 741 # correct size estimate: str.translate() uses an intermediate Py_UCS4 742 # representation. 743 744 @bigmemtest(size=_2G, memuse=ascii_char_size * 2 + ucs4_char_size) 745 def test_translate(self, size): 746 _ = self.from_latin1 747 SUBSTR = _('aZz.z.Aaz.') 748 trans = { 749 ord(_('.')): _('-'), 750 ord(_('a')): _('!'), 751 ord(_('Z')): _('$'), 752 } 753 sublen = len(SUBSTR) 754 repeats = size // sublen + 2 755 s = SUBSTR * repeats 756 s = s.translate(trans) 757 self.assertEqual(len(s), repeats * sublen) 758 self.assertEqual(s[:sublen], SUBSTR.translate(trans)) 759 self.assertEqual(s[-sublen:], SUBSTR.translate(trans)) 760 self.assertEqual(s.count(_('.')), 0) 761 self.assertEqual(s.count(_('!')), repeats * 2) 762 self.assertEqual(s.count(_('z')), repeats * 3) 763 764 765class BytesTest(unittest.TestCase, BaseStrTest): 766 767 def from_latin1(self, s): 768 return s.encode("latin-1") 769 770 @bigmemtest(size=_2G + 2, memuse=1 + ascii_char_size) 771 def test_decode(self, size): 772 s = self.from_latin1('.') * size 773 self.assertEqual(len(s.decode('utf-8')), size) 774 775 @bigmemtest(size=_2G, memuse=2) 776 def test_capitalize(self, size): 777 self._test_capitalize(size) 778 779 @bigmemtest(size=_2G, memuse=2) 780 def test_title(self, size): 781 self._test_title(size) 782 783 @bigmemtest(size=_2G, memuse=2) 784 def test_swapcase(self, size): 785 self._test_swapcase(size) 786 787 788class BytearrayTest(unittest.TestCase, BaseStrTest): 789 790 def from_latin1(self, s): 791 return bytearray(s.encode("latin-1")) 792 793 @bigmemtest(size=_2G + 2, memuse=1 + ascii_char_size) 794 def test_decode(self, size): 795 s = self.from_latin1('.') * size 796 self.assertEqual(len(s.decode('utf-8')), size) 797 798 @bigmemtest(size=_2G, memuse=2) 799 def test_capitalize(self, size): 800 self._test_capitalize(size) 801 802 @bigmemtest(size=_2G, memuse=2) 803 def test_title(self, size): 804 self._test_title(size) 805 806 @bigmemtest(size=_2G, memuse=2) 807 def test_swapcase(self, size): 808 self._test_swapcase(size) 809 810 test_hash = None 811 test_split_large = None 812 813class TupleTest(unittest.TestCase): 814 815 # Tuples have a small, fixed-sized head and an array of pointers to 816 # data. Since we're testing 64-bit addressing, we can assume that the 817 # pointers are 8 bytes, and that thus that the tuples take up 8 bytes 818 # per size. 819 820 # As a side-effect of testing long tuples, these tests happen to test 821 # having more than 2<<31 references to any given object. Hence the 822 # use of different types of objects as contents in different tests. 823 824 @bigmemtest(size=_2G + 2, memuse=pointer_size * 2) 825 def test_compare(self, size): 826 t1 = ('',) * size 827 t2 = ('',) * size 828 self.assertTrue(t1 == t2) 829 del t2 830 t2 = ('',) * (size + 1) 831 self.assertFalse(t1 == t2) 832 del t2 833 t2 = (1,) * size 834 self.assertFalse(t1 == t2) 835 836 # Test concatenating into a single tuple of more than 2G in length, 837 # and concatenating a tuple of more than 2G in length separately, so 838 # the smaller test still gets run even if there isn't memory for the 839 # larger test (but we still let the tester know the larger test is 840 # skipped, in verbose mode.) 841 def basic_concat_test(self, size): 842 t = ((),) * size 843 self.assertEqual(len(t), size) 844 t = t + t 845 self.assertEqual(len(t), size * 2) 846 847 @bigmemtest(size=_2G // 2 + 2, memuse=pointer_size * 3) 848 def test_concat_small(self, size): 849 return self.basic_concat_test(size) 850 851 @bigmemtest(size=_2G + 2, memuse=pointer_size * 3) 852 def test_concat_large(self, size): 853 return self.basic_concat_test(size) 854 855 @bigmemtest(size=_2G // 5 + 10, memuse=pointer_size * 5) 856 def test_contains(self, size): 857 t = (1, 2, 3, 4, 5) * size 858 self.assertEqual(len(t), size * 5) 859 self.assertTrue(5 in t) 860 self.assertFalse((1, 2, 3, 4, 5) in t) 861 self.assertFalse(0 in t) 862 863 @bigmemtest(size=_2G + 10, memuse=pointer_size) 864 def test_hash(self, size): 865 t1 = (0,) * size 866 h1 = hash(t1) 867 del t1 868 t2 = (0,) * (size + 1) 869 self.assertFalse(h1 == hash(t2)) 870 871 @bigmemtest(size=_2G + 10, memuse=pointer_size) 872 def test_index_and_slice(self, size): 873 t = (None,) * size 874 self.assertEqual(len(t), size) 875 self.assertEqual(t[-1], None) 876 self.assertEqual(t[5], None) 877 self.assertEqual(t[size - 1], None) 878 self.assertRaises(IndexError, operator.getitem, t, size) 879 self.assertEqual(t[:5], (None,) * 5) 880 self.assertEqual(t[-5:], (None,) * 5) 881 self.assertEqual(t[20:25], (None,) * 5) 882 self.assertEqual(t[-25:-20], (None,) * 5) 883 self.assertEqual(t[size - 5:], (None,) * 5) 884 self.assertEqual(t[size - 5:size], (None,) * 5) 885 self.assertEqual(t[size - 6:size - 2], (None,) * 4) 886 self.assertEqual(t[size:size], ()) 887 self.assertEqual(t[size:size+5], ()) 888 889 # Like test_concat, split in two. 890 def basic_test_repeat(self, size): 891 t = ('',) * size 892 self.assertEqual(len(t), size) 893 t = t * 2 894 self.assertEqual(len(t), size * 2) 895 896 @bigmemtest(size=_2G // 2 + 2, memuse=pointer_size * 3) 897 def test_repeat_small(self, size): 898 return self.basic_test_repeat(size) 899 900 @bigmemtest(size=_2G + 2, memuse=pointer_size * 3) 901 def test_repeat_large(self, size): 902 return self.basic_test_repeat(size) 903 904 @bigmemtest(size=_1G - 1, memuse=12) 905 def test_repeat_large_2(self, size): 906 return self.basic_test_repeat(size) 907 908 @bigmemtest(size=_1G - 1, memuse=pointer_size * 2) 909 def test_from_2G_generator(self, size): 910 try: 911 t = tuple(iter([42]*size)) 912 except MemoryError: 913 pass # acceptable on 32-bit 914 else: 915 self.assertEqual(len(t), size) 916 self.assertEqual(t[:10], (42,) * 10) 917 self.assertEqual(t[-10:], (42,) * 10) 918 919 @bigmemtest(size=_1G - 25, memuse=pointer_size * 2) 920 def test_from_almost_2G_generator(self, size): 921 try: 922 t = tuple(iter([42]*size)) 923 except MemoryError: 924 pass # acceptable on 32-bit 925 else: 926 self.assertEqual(len(t), size) 927 self.assertEqual(t[:10], (42,) * 10) 928 self.assertEqual(t[-10:], (42,) * 10) 929 930 # Like test_concat, split in two. 931 def basic_test_repr(self, size): 932 t = (False,) * size 933 s = repr(t) 934 # The repr of a tuple of Falses is exactly 7 times the tuple length. 935 self.assertEqual(len(s), size * 7) 936 self.assertEqual(s[:10], '(False, Fa') 937 self.assertEqual(s[-10:], 'se, False)') 938 939 @bigmemtest(size=_2G // 7 + 2, memuse=pointer_size + ascii_char_size * 7) 940 def test_repr_small(self, size): 941 return self.basic_test_repr(size) 942 943 @bigmemtest(size=_2G + 2, memuse=pointer_size + ascii_char_size * 7) 944 def test_repr_large(self, size): 945 return self.basic_test_repr(size) 946 947class ListTest(unittest.TestCase): 948 949 # Like tuples, lists have a small, fixed-sized head and an array of 950 # pointers to data, so 8 bytes per size. Also like tuples, we make the 951 # lists hold references to various objects to test their refcount 952 # limits. 953 954 @bigmemtest(size=_2G + 2, memuse=pointer_size * 2) 955 def test_compare(self, size): 956 l1 = [''] * size 957 l2 = [''] * size 958 self.assertTrue(l1 == l2) 959 del l2 960 l2 = [''] * (size + 1) 961 self.assertFalse(l1 == l2) 962 del l2 963 l2 = [2] * size 964 self.assertFalse(l1 == l2) 965 966 # Test concatenating into a single list of more than 2G in length, 967 # and concatenating a list of more than 2G in length separately, so 968 # the smaller test still gets run even if there isn't memory for the 969 # larger test (but we still let the tester know the larger test is 970 # skipped, in verbose mode.) 971 def basic_test_concat(self, size): 972 l = [[]] * size 973 self.assertEqual(len(l), size) 974 l = l + l 975 self.assertEqual(len(l), size * 2) 976 977 @bigmemtest(size=_2G // 2 + 2, memuse=pointer_size * 3) 978 def test_concat_small(self, size): 979 return self.basic_test_concat(size) 980 981 @bigmemtest(size=_2G + 2, memuse=pointer_size * 3) 982 def test_concat_large(self, size): 983 return self.basic_test_concat(size) 984 985 # XXX This tests suffers from overallocation, just like test_append. 986 # This should be fixed in future. 987 def basic_test_inplace_concat(self, size): 988 l = [sys.stdout] * size 989 l += l 990 self.assertEqual(len(l), size * 2) 991 self.assertTrue(l[0] is l[-1]) 992 self.assertTrue(l[size - 1] is l[size + 1]) 993 994 @bigmemtest(size=_2G // 2 + 2, memuse=pointer_size * 2 * 9/8) 995 def test_inplace_concat_small(self, size): 996 return self.basic_test_inplace_concat(size) 997 998 @bigmemtest(size=_2G + 2, memuse=pointer_size * 2 * 9/8) 999 def test_inplace_concat_large(self, size): 1000 return self.basic_test_inplace_concat(size) 1001 1002 @bigmemtest(size=_2G // 5 + 10, memuse=pointer_size * 5) 1003 def test_contains(self, size): 1004 l = [1, 2, 3, 4, 5] * size 1005 self.assertEqual(len(l), size * 5) 1006 self.assertTrue(5 in l) 1007 self.assertFalse([1, 2, 3, 4, 5] in l) 1008 self.assertFalse(0 in l) 1009 1010 @bigmemtest(size=_2G + 10, memuse=pointer_size) 1011 def test_hash(self, size): 1012 l = [0] * size 1013 self.assertRaises(TypeError, hash, l) 1014 1015 @bigmemtest(size=_2G + 10, memuse=pointer_size) 1016 def test_index_and_slice(self, size): 1017 l = [None] * size 1018 self.assertEqual(len(l), size) 1019 self.assertEqual(l[-1], None) 1020 self.assertEqual(l[5], None) 1021 self.assertEqual(l[size - 1], None) 1022 self.assertRaises(IndexError, operator.getitem, l, size) 1023 self.assertEqual(l[:5], [None] * 5) 1024 self.assertEqual(l[-5:], [None] * 5) 1025 self.assertEqual(l[20:25], [None] * 5) 1026 self.assertEqual(l[-25:-20], [None] * 5) 1027 self.assertEqual(l[size - 5:], [None] * 5) 1028 self.assertEqual(l[size - 5:size], [None] * 5) 1029 self.assertEqual(l[size - 6:size - 2], [None] * 4) 1030 self.assertEqual(l[size:size], []) 1031 self.assertEqual(l[size:size+5], []) 1032 1033 l[size - 2] = 5 1034 self.assertEqual(len(l), size) 1035 self.assertEqual(l[-3:], [None, 5, None]) 1036 self.assertEqual(l.count(5), 1) 1037 self.assertRaises(IndexError, operator.setitem, l, size, 6) 1038 self.assertEqual(len(l), size) 1039 1040 l[size - 7:] = [1, 2, 3, 4, 5] 1041 size -= 2 1042 self.assertEqual(len(l), size) 1043 self.assertEqual(l[-7:], [None, None, 1, 2, 3, 4, 5]) 1044 1045 l[:7] = [1, 2, 3, 4, 5] 1046 size -= 2 1047 self.assertEqual(len(l), size) 1048 self.assertEqual(l[:7], [1, 2, 3, 4, 5, None, None]) 1049 1050 del l[size - 1] 1051 size -= 1 1052 self.assertEqual(len(l), size) 1053 self.assertEqual(l[-1], 4) 1054 1055 del l[-2:] 1056 size -= 2 1057 self.assertEqual(len(l), size) 1058 self.assertEqual(l[-1], 2) 1059 1060 del l[0] 1061 size -= 1 1062 self.assertEqual(len(l), size) 1063 self.assertEqual(l[0], 2) 1064 1065 del l[:2] 1066 size -= 2 1067 self.assertEqual(len(l), size) 1068 self.assertEqual(l[0], 4) 1069 1070 # Like test_concat, split in two. 1071 def basic_test_repeat(self, size): 1072 l = [] * size 1073 self.assertFalse(l) 1074 l = [''] * size 1075 self.assertEqual(len(l), size) 1076 l = l * 2 1077 self.assertEqual(len(l), size * 2) 1078 1079 @bigmemtest(size=_2G // 2 + 2, memuse=pointer_size * 3) 1080 def test_repeat_small(self, size): 1081 return self.basic_test_repeat(size) 1082 1083 @bigmemtest(size=_2G + 2, memuse=pointer_size * 3) 1084 def test_repeat_large(self, size): 1085 return self.basic_test_repeat(size) 1086 1087 # XXX This tests suffers from overallocation, just like test_append. 1088 # This should be fixed in future. 1089 def basic_test_inplace_repeat(self, size): 1090 l = [''] 1091 l *= size 1092 self.assertEqual(len(l), size) 1093 self.assertTrue(l[0] is l[-1]) 1094 del l 1095 1096 l = [''] * size 1097 l *= 2 1098 self.assertEqual(len(l), size * 2) 1099 self.assertTrue(l[size - 1] is l[-1]) 1100 1101 @bigmemtest(size=_2G // 2 + 2, memuse=pointer_size * 2 * 9/8) 1102 def test_inplace_repeat_small(self, size): 1103 return self.basic_test_inplace_repeat(size) 1104 1105 @bigmemtest(size=_2G + 2, memuse=pointer_size * 2 * 9/8) 1106 def test_inplace_repeat_large(self, size): 1107 return self.basic_test_inplace_repeat(size) 1108 1109 def basic_test_repr(self, size): 1110 l = [False] * size 1111 s = repr(l) 1112 # The repr of a list of Falses is exactly 7 times the list length. 1113 self.assertEqual(len(s), size * 7) 1114 self.assertEqual(s[:10], '[False, Fa') 1115 self.assertEqual(s[-10:], 'se, False]') 1116 self.assertEqual(s.count('F'), size) 1117 1118 @bigmemtest(size=_2G // 7 + 2, memuse=pointer_size + ascii_char_size * 7) 1119 def test_repr_small(self, size): 1120 return self.basic_test_repr(size) 1121 1122 @bigmemtest(size=_2G + 2, memuse=pointer_size + ascii_char_size * 7) 1123 def test_repr_large(self, size): 1124 return self.basic_test_repr(size) 1125 1126 # list overallocates ~1/8th of the total size (on first expansion) so 1127 # the single list.append call puts memuse at 9 bytes per size. 1128 @bigmemtest(size=_2G, memuse=pointer_size * 9/8) 1129 def test_append(self, size): 1130 l = [object()] * size 1131 l.append(object()) 1132 self.assertEqual(len(l), size+1) 1133 self.assertTrue(l[-3] is l[-2]) 1134 self.assertFalse(l[-2] is l[-1]) 1135 1136 @bigmemtest(size=_2G // 5 + 2, memuse=pointer_size * 5) 1137 def test_count(self, size): 1138 l = [1, 2, 3, 4, 5] * size 1139 self.assertEqual(l.count(1), size) 1140 self.assertEqual(l.count("1"), 0) 1141 1142 # XXX This tests suffers from overallocation, just like test_append. 1143 # This should be fixed in future. 1144 def basic_test_extend(self, size): 1145 l = [object] * size 1146 l.extend(l) 1147 self.assertEqual(len(l), size * 2) 1148 self.assertTrue(l[0] is l[-1]) 1149 self.assertTrue(l[size - 1] is l[size + 1]) 1150 1151 @bigmemtest(size=_2G // 2 + 2, memuse=pointer_size * 2 * 9/8) 1152 def test_extend_small(self, size): 1153 return self.basic_test_extend(size) 1154 1155 @bigmemtest(size=_2G + 2, memuse=pointer_size * 2 * 9/8) 1156 def test_extend_large(self, size): 1157 return self.basic_test_extend(size) 1158 1159 @bigmemtest(size=_2G // 5 + 2, memuse=pointer_size * 5) 1160 def test_index(self, size): 1161 l = [1, 2, 3, 4, 5] * size 1162 size *= 5 1163 self.assertEqual(l.index(1), 0) 1164 self.assertEqual(l.index(5, size - 5), size - 1) 1165 self.assertEqual(l.index(5, size - 5, size), size - 1) 1166 self.assertRaises(ValueError, l.index, 1, size - 4, size) 1167 self.assertRaises(ValueError, l.index, 6) 1168 1169 # This tests suffers from overallocation, just like test_append. 1170 @bigmemtest(size=_2G + 10, memuse=pointer_size * 9/8) 1171 def test_insert(self, size): 1172 l = [1.0] * size 1173 l.insert(size - 1, "A") 1174 size += 1 1175 self.assertEqual(len(l), size) 1176 self.assertEqual(l[-3:], [1.0, "A", 1.0]) 1177 1178 l.insert(size + 1, "B") 1179 size += 1 1180 self.assertEqual(len(l), size) 1181 self.assertEqual(l[-3:], ["A", 1.0, "B"]) 1182 1183 l.insert(1, "C") 1184 size += 1 1185 self.assertEqual(len(l), size) 1186 self.assertEqual(l[:3], [1.0, "C", 1.0]) 1187 self.assertEqual(l[size - 3:], ["A", 1.0, "B"]) 1188 1189 @bigmemtest(size=_2G // 5 + 4, memuse=pointer_size * 5) 1190 def test_pop(self, size): 1191 l = ["a", "b", "c", "d", "e"] * size 1192 size *= 5 1193 self.assertEqual(len(l), size) 1194 1195 item = l.pop() 1196 size -= 1 1197 self.assertEqual(len(l), size) 1198 self.assertEqual(item, "e") 1199 self.assertEqual(l[-2:], ["c", "d"]) 1200 1201 item = l.pop(0) 1202 size -= 1 1203 self.assertEqual(len(l), size) 1204 self.assertEqual(item, "a") 1205 self.assertEqual(l[:2], ["b", "c"]) 1206 1207 item = l.pop(size - 2) 1208 size -= 1 1209 self.assertEqual(len(l), size) 1210 self.assertEqual(item, "c") 1211 self.assertEqual(l[-2:], ["b", "d"]) 1212 1213 @bigmemtest(size=_2G + 10, memuse=pointer_size) 1214 def test_remove(self, size): 1215 l = [10] * size 1216 self.assertEqual(len(l), size) 1217 1218 l.remove(10) 1219 size -= 1 1220 self.assertEqual(len(l), size) 1221 1222 # Because of the earlier l.remove(), this append doesn't trigger 1223 # a resize. 1224 l.append(5) 1225 size += 1 1226 self.assertEqual(len(l), size) 1227 self.assertEqual(l[-2:], [10, 5]) 1228 l.remove(5) 1229 size -= 1 1230 self.assertEqual(len(l), size) 1231 self.assertEqual(l[-2:], [10, 10]) 1232 1233 @bigmemtest(size=_2G // 5 + 2, memuse=pointer_size * 5) 1234 def test_reverse(self, size): 1235 l = [1, 2, 3, 4, 5] * size 1236 l.reverse() 1237 self.assertEqual(len(l), size * 5) 1238 self.assertEqual(l[-5:], [5, 4, 3, 2, 1]) 1239 self.assertEqual(l[:5], [5, 4, 3, 2, 1]) 1240 1241 @bigmemtest(size=_2G // 5 + 2, memuse=pointer_size * 5 * 1.5) 1242 def test_sort(self, size): 1243 l = [1, 2, 3, 4, 5] * size 1244 l.sort() 1245 self.assertEqual(len(l), size * 5) 1246 self.assertEqual(l.count(1), size) 1247 self.assertEqual(l[:10], [1] * 10) 1248 self.assertEqual(l[-10:], [5] * 10) 1249 1250 1251if __name__ == '__main__': 1252 if len(sys.argv) > 1: 1253 support.set_memlimit(sys.argv[1]) 1254 unittest.main() 1255