Changeset 391 for python/trunk/Lib/test/test_dict.py
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Lib/test/test_dict.py
r2 r391 10 10 # calling built-in types without argument must return empty 11 11 self.assertEqual(dict(), {}) 12 self.assert _(dict() is not{})12 self.assertIsNot(dict(), {}) 13 13 14 14 def test_literal_constructor(self): 15 # check literal constructor for different sized dicts (to exercise the BUILD_MAP oparg 15 # check literal constructor for different sized dicts 16 # (to exercise the BUILD_MAP oparg). 16 17 for n in (0, 1, 6, 256, 400): 17 items = [(''.join([random.choice(string.letters) 18 for j in range(8)]), 19 i) 18 items = [(''.join(random.sample(string.letters, 8)), i) 20 19 for i in range(n)] 21 20 random.shuffle(items) 22 dictliteral = '{' + ', '.join('%r: %d' % item for item in items) + '}' 21 formatted_items = ('{!r}: {:d}'.format(k, v) for k, v in items) 22 dictliteral = '{' + ', '.join(formatted_items) + '}' 23 23 self.assertEqual(eval(dictliteral), dict(items)) 24 24 25 25 def test_bool(self): 26 self.assert _(not {})27 self.assert _({1: 2})28 self.assert _(bool({}) isFalse)29 self.assert _(bool({1: 2}) isTrue)26 self.assertIs(not {}, True) 27 self.assertTrue({1: 2}) 28 self.assertIs(bool({}), False) 29 self.assertIs(bool({1: 2}), True) 30 30 31 31 def test_keys(self): … … 34 34 d = {'a': 1, 'b': 2} 35 35 k = d.keys() 36 self.assert_(d.has_key('a')) 37 self.assert_(d.has_key('b')) 38 36 self.assertEqual(set(k), {'a', 'b'}) 37 self.assertIn('a', k) 38 self.assertIn('b', k) 39 self.assertTrue(d.has_key('a')) 40 self.assertTrue(d.has_key('b')) 39 41 self.assertRaises(TypeError, d.keys, None) 40 42 … … 58 60 def test_has_key(self): 59 61 d = {} 60 self.assert _(notd.has_key('a'))62 self.assertFalse(d.has_key('a')) 61 63 d = {'a': 1, 'b': 2} 62 64 k = d.keys() … … 68 70 def test_contains(self): 69 71 d = {} 70 self.assert_(not ('a' in d)) 71 self.assert_('a' not in d) 72 self.assertNotIn('a', d) 73 self.assertFalse('a' in d) 74 self.assertTrue('a' not in d) 72 75 d = {'a': 1, 'b': 2} 73 self.assert _('a' ind)74 self.assert _('b' ind)75 self.assert _('c' not ind)76 self.assertIn('a', d) 77 self.assertIn('b', d) 78 self.assertNotIn('c', d) 76 79 77 80 self.assertRaises(TypeError, d.__contains__) … … 207 210 self.assertEqual(dict.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) 208 211 d = {} 209 self.assert _(not(d.fromkeys('abc') is d))212 self.assertIsNot(d.fromkeys('abc'), d) 210 213 self.assertEqual(d.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) 211 214 self.assertEqual(d.fromkeys((4,5),0), {4:0, 5:0}) … … 218 221 self.assertEqual(dictlike.fromkeys('a'), {'a':None}) 219 222 self.assertEqual(dictlike().fromkeys('a'), {'a':None}) 220 self.assert _(type(dictlike.fromkeys('a')) isdictlike)221 self.assert _(type(dictlike().fromkeys('a')) isdictlike)223 self.assertIsInstance(dictlike.fromkeys('a'), dictlike) 224 self.assertIsInstance(dictlike().fromkeys('a'), dictlike) 222 225 class mydict(dict): 223 226 def __new__(cls): … … 225 228 ud = mydict.fromkeys('ab') 226 229 self.assertEqual(ud, {'a':None, 'b':None}) 227 self.assert _(isinstance(ud, UserDict.UserDict))230 self.assertIsInstance(ud, UserDict.UserDict) 228 231 self.assertRaises(TypeError, dict.fromkeys) 229 232 … … 254 257 self.assertEqual(dict.fromkeys(d, 0), dict(zip(range(6), [0]*6))) 255 258 259 class baddict3(dict): 260 def __new__(cls): 261 return d 262 d = {i : i for i in range(10)} 263 res = d.copy() 264 res.update(a=None, b=None, c=None) 265 self.assertEqual(baddict3.fromkeys({"a", "b", "c"}), res) 266 256 267 def test_copy(self): 257 268 d = {1:1, 2:2, 3:3} … … 262 273 def test_get(self): 263 274 d = {} 264 self.assert _(d.get('c') isNone)275 self.assertIs(d.get('c'), None) 265 276 self.assertEqual(d.get('c', 3), 3) 266 d = {'a' : 1, 'b': 2}267 self.assert _(d.get('c') isNone)277 d = {'a': 1, 'b': 2} 278 self.assertIs(d.get('c'), None) 268 279 self.assertEqual(d.get('c', 3), 3) 269 280 self.assertEqual(d.get('a'), 1) … … 275 286 # dict.setdefault() 276 287 d = {} 277 self.assert _(d.setdefault('key0') isNone)288 self.assertIs(d.setdefault('key0'), None) 278 289 d.setdefault('key0', []) 279 self.assert _(d.setdefault('key0') isNone)290 self.assertIs(d.setdefault('key0'), None) 280 291 d.setdefault('key', []).append(3) 281 292 self.assertEqual(d['key'][0], 3) … … 298 309 x.fail = True 299 310 self.assertRaises(Exc, d.setdefault, x, []) 311 312 def test_setdefault_atomic(self): 313 # Issue #13521: setdefault() calls __hash__ and __eq__ only once. 314 class Hashed(object): 315 def __init__(self): 316 self.hash_count = 0 317 self.eq_count = 0 318 def __hash__(self): 319 self.hash_count += 1 320 return 42 321 def __eq__(self, other): 322 self.eq_count += 1 323 return id(self) == id(other) 324 hashed1 = Hashed() 325 y = {hashed1: 5} 326 hashed2 = Hashed() 327 y.setdefault(hashed2, []) 328 self.assertEqual(hashed1.hash_count, 1) 329 self.assertEqual(hashed2.hash_count, 1) 330 self.assertEqual(hashed1.eq_count + hashed2.eq_count, 1) 300 331 301 332 def test_popitem(self): … … 319 350 kb, vb = tb = b.popitem() 320 351 self.assertEqual(vb, int(kb)) 321 self.assert _(not(copymode < 0 and ta != tb))322 self.assert _(nota)323 self.assert _(notb)352 self.assertFalse(copymode < 0 and ta != tb) 353 self.assertFalse(a) 354 self.assertFalse(b) 324 355 325 356 d = {} … … 338 369 self.assertRaises(KeyError, d.pop, k) 339 370 340 # verify longs/ints get same value when key > 32 bits (for 64-bit archs)341 # see SF bug #689659371 # verify longs/ints get same value when key > 32 bits 372 # (for 64-bit archs). See SF bug #689659. 342 373 x = 4503599627370496L 343 374 y = 4503599627370496 … … 367 398 368 399 def test_mutatingiteration(self): 400 # changing dict size during iteration 369 401 d = {} 370 402 d[1] = 1 371 try:403 with self.assertRaises(RuntimeError): 372 404 for i in d: 373 405 d[i+1] = 1 374 except RuntimeError:375 pass376 else:377 self.fail("changing dict size during iteration doesn't raise Error")378 406 379 407 def test_repr(self): … … 396 424 397 425 def test_le(self): 398 self.assert _(not ({} < {}))399 self.assert _(not ({1: 2} < {1L: 2L}))426 self.assertFalse({} < {}) 427 self.assertFalse({1: 2} < {1L: 2L}) 400 428 401 429 class Exc(Exception): pass … … 409 437 d1 = {BadCmp(): 1} 410 438 d2 = {1: 1} 411 try: 439 440 with self.assertRaises(Exc): 412 441 d1 < d2 413 except Exc:414 pass415 else:416 self.fail("< didn't raise Exc")417 442 418 443 def test_missing(self): 419 444 # Make sure dict doesn't have a __missing__ method 420 self.assert Equal(hasattr(dict, "__missing__"), False)421 self.assert Equal(hasattr({}, "__missing__"), False)445 self.assertFalse(hasattr(dict, "__missing__")) 446 self.assertFalse(hasattr({}, "__missing__")) 422 447 # Test several cases: 423 448 # (D) subclass defines __missing__ method returning a value … … 431 456 self.assertEqual(d[1], 2) 432 457 self.assertEqual(d[3], 4) 433 self.assert _(2 not ind)434 self.assert _(2 not ind.keys())458 self.assertNotIn(2, d) 459 self.assertNotIn(2, d.keys()) 435 460 self.assertEqual(d[2], 42) 461 436 462 class E(dict): 437 463 def __missing__(self, key): 438 464 raise RuntimeError(key) 439 465 e = E() 440 try:466 with self.assertRaises(RuntimeError) as c: 441 467 e[42] 442 except RuntimeError, err: 443 self.assertEqual(err.args, (42,)) 444 else: 445 self.fail("e[42] didn't raise RuntimeError") 468 self.assertEqual(c.exception.args, (42,)) 469 446 470 class F(dict): 447 471 def __init__(self): … … 449 473 self.__missing__ = lambda key: None 450 474 f = F() 451 try:475 with self.assertRaises(KeyError) as c: 452 476 f[42] 453 except KeyError, err: 454 self.assertEqual(err.args, (42,)) 455 else: 456 self.fail("f[42] didn't raise KeyError") 477 self.assertEqual(c.exception.args, (42,)) 478 457 479 class G(dict): 458 480 pass 459 481 g = G() 460 try:482 with self.assertRaises(KeyError) as c: 461 483 g[42] 462 except KeyError, err: 463 self.assertEqual(err.args, (42,)) 464 else: 465 self.fail("g[42] didn't raise KeyError") 484 self.assertEqual(c.exception.args, (42,)) 466 485 467 486 def test_tuple_keyerror(self): 468 487 # SF #1576657 469 488 d = {} 470 try:489 with self.assertRaises(KeyError) as c: 471 490 d[(1,)] 472 except KeyError, e: 473 self.assertEqual(e.args, ((1,),)) 474 else: 475 self.fail("missing KeyError") 491 self.assertEqual(c.exception.args, ((1,),)) 476 492 477 493 def test_bad_key(self): … … 501 517 'd.pop(x2)', 502 518 'd.update({x2: 2})']: 503 try:519 with self.assertRaises(CustomException): 504 520 exec stmt in locals() 505 except CustomException:506 pass507 else:508 self.fail("Statement didn't raise exception")509 521 510 522 def test_resize1(self): … … 549 561 # Bug #3537: if an empty but presized dict with a size larger 550 562 # than 7 was in the freelist, it triggered an assertion failure 551 try:552 d = {'a': 1 /0,'b': None, 'c': None, 'd': None, 'e': None,563 with self.assertRaises(ZeroDivisionError): 564 d = {'a': 1 // 0, 'b': None, 'c': None, 'd': None, 'e': None, 553 565 'f': None, 'g': None, 'h': None} 554 except ZeroDivisionError:555 pass556 566 d = {} 557 567 … … 568 578 del obj, container 569 579 gc.collect() 570 self.assert_(ref() is None, "Cycle was not collected") 580 self.assertIs(ref(), None, "Cycle was not collected") 581 582 def _not_tracked(self, t): 583 # Nested containers can take several collections to untrack 584 gc.collect() 585 gc.collect() 586 self.assertFalse(gc.is_tracked(t), t) 587 588 def _tracked(self, t): 589 self.assertTrue(gc.is_tracked(t), t) 590 gc.collect() 591 gc.collect() 592 self.assertTrue(gc.is_tracked(t), t) 593 594 @test_support.cpython_only 595 def test_track_literals(self): 596 # Test GC-optimization of dict literals 597 x, y, z, w = 1.5, "a", (1, None), [] 598 599 self._not_tracked({}) 600 self._not_tracked({x:(), y:x, z:1}) 601 self._not_tracked({1: "a", "b": 2}) 602 self._not_tracked({1: 2, (None, True, False, ()): int}) 603 self._not_tracked({1: object()}) 604 605 # Dicts with mutable elements are always tracked, even if those 606 # elements are not tracked right now. 607 self._tracked({1: []}) 608 self._tracked({1: ([],)}) 609 self._tracked({1: {}}) 610 self._tracked({1: set()}) 611 612 @test_support.cpython_only 613 def test_track_dynamic(self): 614 # Test GC-optimization of dynamically-created dicts 615 class MyObject(object): 616 pass 617 x, y, z, w, o = 1.5, "a", (1, object()), [], MyObject() 618 619 d = dict() 620 self._not_tracked(d) 621 d[1] = "a" 622 self._not_tracked(d) 623 d[y] = 2 624 self._not_tracked(d) 625 d[z] = 3 626 self._not_tracked(d) 627 self._not_tracked(d.copy()) 628 d[4] = w 629 self._tracked(d) 630 self._tracked(d.copy()) 631 d[4] = None 632 self._not_tracked(d) 633 self._not_tracked(d.copy()) 634 635 # dd isn't tracked right now, but it may mutate and therefore d 636 # which contains it must be tracked. 637 d = dict() 638 dd = dict() 639 d[1] = dd 640 self._not_tracked(dd) 641 self._tracked(d) 642 dd[1] = d 643 self._tracked(dd) 644 645 d = dict.fromkeys([x, y, z]) 646 self._not_tracked(d) 647 dd = dict() 648 dd.update(d) 649 self._not_tracked(dd) 650 d = dict.fromkeys([x, y, z, o]) 651 self._tracked(d) 652 dd = dict() 653 dd.update(d) 654 self._tracked(dd) 655 656 d = dict(x=x, y=y, z=z) 657 self._not_tracked(d) 658 d = dict(x=x, y=y, z=z, w=w) 659 self._tracked(d) 660 d = dict() 661 d.update(x=x, y=y, z=z) 662 self._not_tracked(d) 663 d.update(w=w) 664 self._tracked(d) 665 666 d = dict([(x, y), (z, 1)]) 667 self._not_tracked(d) 668 d = dict([(x, y), (z, w)]) 669 self._tracked(d) 670 d = dict() 671 d.update([(x, y), (z, 1)]) 672 self._not_tracked(d) 673 d.update([(x, y), (z, w)]) 674 self._tracked(d) 675 676 @test_support.cpython_only 677 def test_track_subtypes(self): 678 # Dict subtypes are always tracked 679 class MyDict(dict): 680 pass 681 self._tracked(MyDict()) 571 682 572 683 … … 583 694 584 695 def test_main(): 585 test_support.run_unittest( 586 DictTest, 587 GeneralMappingTests, 588 SubclassMappingTests, 589 ) 696 with test_support.check_py3k_warnings( 697 ('dict(.has_key..| inequality comparisons) not supported in 3.x', 698 DeprecationWarning)): 699 test_support.run_unittest( 700 DictTest, 701 GeneralMappingTests, 702 SubclassMappingTests, 703 ) 590 704 591 705 if __name__ == "__main__":
Note:
See TracChangeset
for help on using the changeset viewer.