17db96d56Sopenharmony_ciimport builtins 27db96d56Sopenharmony_ciimport contextlib 37db96d56Sopenharmony_ciimport copy 47db96d56Sopenharmony_ciimport gc 57db96d56Sopenharmony_ciimport pickle 67db96d56Sopenharmony_cifrom random import randrange, shuffle 77db96d56Sopenharmony_ciimport struct 87db96d56Sopenharmony_ciimport sys 97db96d56Sopenharmony_ciimport unittest 107db96d56Sopenharmony_ciimport weakref 117db96d56Sopenharmony_cifrom collections.abc import MutableMapping 127db96d56Sopenharmony_cifrom test import mapping_tests, support 137db96d56Sopenharmony_cifrom test.support import import_helper 147db96d56Sopenharmony_ci 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_cipy_coll = import_helper.import_fresh_module('collections', 177db96d56Sopenharmony_ci blocked=['_collections']) 187db96d56Sopenharmony_cic_coll = import_helper.import_fresh_module('collections', 197db96d56Sopenharmony_ci fresh=['_collections']) 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci@contextlib.contextmanager 237db96d56Sopenharmony_cidef replaced_module(name, replacement): 247db96d56Sopenharmony_ci original_module = sys.modules[name] 257db96d56Sopenharmony_ci sys.modules[name] = replacement 267db96d56Sopenharmony_ci try: 277db96d56Sopenharmony_ci yield 287db96d56Sopenharmony_ci finally: 297db96d56Sopenharmony_ci sys.modules[name] = original_module 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ciclass OrderedDictTests: 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci def test_init(self): 357db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 367db96d56Sopenharmony_ci with self.assertRaises(TypeError): 377db96d56Sopenharmony_ci OrderedDict([('a', 1), ('b', 2)], None) # too many args 387db96d56Sopenharmony_ci pairs = [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)] 397db96d56Sopenharmony_ci self.assertEqual(sorted(OrderedDict(dict(pairs)).items()), pairs) # dict input 407db96d56Sopenharmony_ci self.assertEqual(sorted(OrderedDict(**dict(pairs)).items()), pairs) # kwds input 417db96d56Sopenharmony_ci self.assertEqual(list(OrderedDict(pairs).items()), pairs) # pairs input 427db96d56Sopenharmony_ci self.assertEqual(list(OrderedDict([('a', 1), ('b', 2), ('c', 9), ('d', 4)], 437db96d56Sopenharmony_ci c=3, e=5).items()), pairs) # mixed input 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ci # make sure no positional args conflict with possible kwdargs 467db96d56Sopenharmony_ci self.assertEqual(list(OrderedDict(self=42).items()), [('self', 42)]) 477db96d56Sopenharmony_ci self.assertEqual(list(OrderedDict(other=42).items()), [('other', 42)]) 487db96d56Sopenharmony_ci self.assertRaises(TypeError, OrderedDict, 42) 497db96d56Sopenharmony_ci self.assertRaises(TypeError, OrderedDict, (), ()) 507db96d56Sopenharmony_ci self.assertRaises(TypeError, OrderedDict.__init__) 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci # Make sure that direct calls to __init__ do not clear previous contents 537db96d56Sopenharmony_ci d = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 44), ('e', 55)]) 547db96d56Sopenharmony_ci d.__init__([('e', 5), ('f', 6)], g=7, d=4) 557db96d56Sopenharmony_ci self.assertEqual(list(d.items()), 567db96d56Sopenharmony_ci [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5), ('f', 6), ('g', 7)]) 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci def test_468(self): 597db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 607db96d56Sopenharmony_ci items = [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5), ('f', 6), ('g', 7)] 617db96d56Sopenharmony_ci shuffle(items) 627db96d56Sopenharmony_ci argdict = OrderedDict(items) 637db96d56Sopenharmony_ci d = OrderedDict(**argdict) 647db96d56Sopenharmony_ci self.assertEqual(list(d.items()), items) 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci def test_update(self): 677db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 687db96d56Sopenharmony_ci with self.assertRaises(TypeError): 697db96d56Sopenharmony_ci OrderedDict().update([('a', 1), ('b', 2)], None) # too many args 707db96d56Sopenharmony_ci pairs = [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)] 717db96d56Sopenharmony_ci od = OrderedDict() 727db96d56Sopenharmony_ci od.update(dict(pairs)) 737db96d56Sopenharmony_ci self.assertEqual(sorted(od.items()), pairs) # dict input 747db96d56Sopenharmony_ci od = OrderedDict() 757db96d56Sopenharmony_ci od.update(**dict(pairs)) 767db96d56Sopenharmony_ci self.assertEqual(sorted(od.items()), pairs) # kwds input 777db96d56Sopenharmony_ci od = OrderedDict() 787db96d56Sopenharmony_ci od.update(pairs) 797db96d56Sopenharmony_ci self.assertEqual(list(od.items()), pairs) # pairs input 807db96d56Sopenharmony_ci od = OrderedDict() 817db96d56Sopenharmony_ci od.update([('a', 1), ('b', 2), ('c', 9), ('d', 4)], c=3, e=5) 827db96d56Sopenharmony_ci self.assertEqual(list(od.items()), pairs) # mixed input 837db96d56Sopenharmony_ci 847db96d56Sopenharmony_ci # Issue 9137: Named argument called 'other' or 'self' 857db96d56Sopenharmony_ci # shouldn't be treated specially. 867db96d56Sopenharmony_ci od = OrderedDict() 877db96d56Sopenharmony_ci od.update(self=23) 887db96d56Sopenharmony_ci self.assertEqual(list(od.items()), [('self', 23)]) 897db96d56Sopenharmony_ci od = OrderedDict() 907db96d56Sopenharmony_ci od.update(other={}) 917db96d56Sopenharmony_ci self.assertEqual(list(od.items()), [('other', {})]) 927db96d56Sopenharmony_ci od = OrderedDict() 937db96d56Sopenharmony_ci od.update(red=5, blue=6, other=7, self=8) 947db96d56Sopenharmony_ci self.assertEqual(sorted(list(od.items())), 957db96d56Sopenharmony_ci [('blue', 6), ('other', 7), ('red', 5), ('self', 8)]) 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci # Make sure that direct calls to update do not clear previous contents 987db96d56Sopenharmony_ci # add that updates items are not moved to the end 997db96d56Sopenharmony_ci d = OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 44), ('e', 55)]) 1007db96d56Sopenharmony_ci d.update([('e', 5), ('f', 6)], g=7, d=4) 1017db96d56Sopenharmony_ci self.assertEqual(list(d.items()), 1027db96d56Sopenharmony_ci [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5), ('f', 6), ('g', 7)]) 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ci self.assertRaises(TypeError, OrderedDict().update, 42) 1057db96d56Sopenharmony_ci self.assertRaises(TypeError, OrderedDict().update, (), ()) 1067db96d56Sopenharmony_ci self.assertRaises(TypeError, OrderedDict.update) 1077db96d56Sopenharmony_ci 1087db96d56Sopenharmony_ci self.assertRaises(TypeError, OrderedDict().update, 42) 1097db96d56Sopenharmony_ci self.assertRaises(TypeError, OrderedDict().update, (), ()) 1107db96d56Sopenharmony_ci self.assertRaises(TypeError, OrderedDict.update) 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_ci def test_init_calls(self): 1137db96d56Sopenharmony_ci calls = [] 1147db96d56Sopenharmony_ci class Spam: 1157db96d56Sopenharmony_ci def keys(self): 1167db96d56Sopenharmony_ci calls.append('keys') 1177db96d56Sopenharmony_ci return () 1187db96d56Sopenharmony_ci def items(self): 1197db96d56Sopenharmony_ci calls.append('items') 1207db96d56Sopenharmony_ci return () 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci self.OrderedDict(Spam()) 1237db96d56Sopenharmony_ci self.assertEqual(calls, ['keys']) 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci def test_fromkeys(self): 1267db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 1277db96d56Sopenharmony_ci od = OrderedDict.fromkeys('abc') 1287db96d56Sopenharmony_ci self.assertEqual(list(od.items()), [(c, None) for c in 'abc']) 1297db96d56Sopenharmony_ci od = OrderedDict.fromkeys('abc', value=None) 1307db96d56Sopenharmony_ci self.assertEqual(list(od.items()), [(c, None) for c in 'abc']) 1317db96d56Sopenharmony_ci od = OrderedDict.fromkeys('abc', value=0) 1327db96d56Sopenharmony_ci self.assertEqual(list(od.items()), [(c, 0) for c in 'abc']) 1337db96d56Sopenharmony_ci 1347db96d56Sopenharmony_ci def test_abc(self): 1357db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 1367db96d56Sopenharmony_ci self.assertIsInstance(OrderedDict(), MutableMapping) 1377db96d56Sopenharmony_ci self.assertTrue(issubclass(OrderedDict, MutableMapping)) 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ci def test_clear(self): 1407db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 1417db96d56Sopenharmony_ci pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 1427db96d56Sopenharmony_ci shuffle(pairs) 1437db96d56Sopenharmony_ci od = OrderedDict(pairs) 1447db96d56Sopenharmony_ci self.assertEqual(len(od), len(pairs)) 1457db96d56Sopenharmony_ci od.clear() 1467db96d56Sopenharmony_ci self.assertEqual(len(od), 0) 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_ci def test_delitem(self): 1497db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 1507db96d56Sopenharmony_ci pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 1517db96d56Sopenharmony_ci od = OrderedDict(pairs) 1527db96d56Sopenharmony_ci del od['a'] 1537db96d56Sopenharmony_ci self.assertNotIn('a', od) 1547db96d56Sopenharmony_ci with self.assertRaises(KeyError): 1557db96d56Sopenharmony_ci del od['a'] 1567db96d56Sopenharmony_ci self.assertEqual(list(od.items()), pairs[:2] + pairs[3:]) 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci def test_setitem(self): 1597db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 1607db96d56Sopenharmony_ci od = OrderedDict([('d', 1), ('b', 2), ('c', 3), ('a', 4), ('e', 5)]) 1617db96d56Sopenharmony_ci od['c'] = 10 # existing element 1627db96d56Sopenharmony_ci od['f'] = 20 # new element 1637db96d56Sopenharmony_ci self.assertEqual(list(od.items()), 1647db96d56Sopenharmony_ci [('d', 1), ('b', 2), ('c', 10), ('a', 4), ('e', 5), ('f', 20)]) 1657db96d56Sopenharmony_ci 1667db96d56Sopenharmony_ci def test_iterators(self): 1677db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 1687db96d56Sopenharmony_ci pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 1697db96d56Sopenharmony_ci shuffle(pairs) 1707db96d56Sopenharmony_ci od = OrderedDict(pairs) 1717db96d56Sopenharmony_ci self.assertEqual(list(od), [t[0] for t in pairs]) 1727db96d56Sopenharmony_ci self.assertEqual(list(od.keys()), [t[0] for t in pairs]) 1737db96d56Sopenharmony_ci self.assertEqual(list(od.values()), [t[1] for t in pairs]) 1747db96d56Sopenharmony_ci self.assertEqual(list(od.items()), pairs) 1757db96d56Sopenharmony_ci self.assertEqual(list(reversed(od)), 1767db96d56Sopenharmony_ci [t[0] for t in reversed(pairs)]) 1777db96d56Sopenharmony_ci self.assertEqual(list(reversed(od.keys())), 1787db96d56Sopenharmony_ci [t[0] for t in reversed(pairs)]) 1797db96d56Sopenharmony_ci self.assertEqual(list(reversed(od.values())), 1807db96d56Sopenharmony_ci [t[1] for t in reversed(pairs)]) 1817db96d56Sopenharmony_ci self.assertEqual(list(reversed(od.items())), list(reversed(pairs))) 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ci def test_detect_deletion_during_iteration(self): 1847db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 1857db96d56Sopenharmony_ci od = OrderedDict.fromkeys('abc') 1867db96d56Sopenharmony_ci it = iter(od) 1877db96d56Sopenharmony_ci key = next(it) 1887db96d56Sopenharmony_ci del od[key] 1897db96d56Sopenharmony_ci with self.assertRaises(Exception): 1907db96d56Sopenharmony_ci # Note, the exact exception raised is not guaranteed 1917db96d56Sopenharmony_ci # The only guarantee that the next() will not succeed 1927db96d56Sopenharmony_ci next(it) 1937db96d56Sopenharmony_ci 1947db96d56Sopenharmony_ci def test_sorted_iterators(self): 1957db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 1967db96d56Sopenharmony_ci with self.assertRaises(TypeError): 1977db96d56Sopenharmony_ci OrderedDict([('a', 1), ('b', 2)], None) 1987db96d56Sopenharmony_ci pairs = [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)] 1997db96d56Sopenharmony_ci od = OrderedDict(pairs) 2007db96d56Sopenharmony_ci self.assertEqual(sorted(od), [t[0] for t in pairs]) 2017db96d56Sopenharmony_ci self.assertEqual(sorted(od.keys()), [t[0] for t in pairs]) 2027db96d56Sopenharmony_ci self.assertEqual(sorted(od.values()), [t[1] for t in pairs]) 2037db96d56Sopenharmony_ci self.assertEqual(sorted(od.items()), pairs) 2047db96d56Sopenharmony_ci self.assertEqual(sorted(reversed(od)), 2057db96d56Sopenharmony_ci sorted([t[0] for t in reversed(pairs)])) 2067db96d56Sopenharmony_ci 2077db96d56Sopenharmony_ci def test_iterators_empty(self): 2087db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 2097db96d56Sopenharmony_ci od = OrderedDict() 2107db96d56Sopenharmony_ci empty = [] 2117db96d56Sopenharmony_ci self.assertEqual(list(od), empty) 2127db96d56Sopenharmony_ci self.assertEqual(list(od.keys()), empty) 2137db96d56Sopenharmony_ci self.assertEqual(list(od.values()), empty) 2147db96d56Sopenharmony_ci self.assertEqual(list(od.items()), empty) 2157db96d56Sopenharmony_ci self.assertEqual(list(reversed(od)), empty) 2167db96d56Sopenharmony_ci self.assertEqual(list(reversed(od.keys())), empty) 2177db96d56Sopenharmony_ci self.assertEqual(list(reversed(od.values())), empty) 2187db96d56Sopenharmony_ci self.assertEqual(list(reversed(od.items())), empty) 2197db96d56Sopenharmony_ci 2207db96d56Sopenharmony_ci def test_popitem(self): 2217db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 2227db96d56Sopenharmony_ci pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 2237db96d56Sopenharmony_ci shuffle(pairs) 2247db96d56Sopenharmony_ci od = OrderedDict(pairs) 2257db96d56Sopenharmony_ci while pairs: 2267db96d56Sopenharmony_ci self.assertEqual(od.popitem(), pairs.pop()) 2277db96d56Sopenharmony_ci with self.assertRaises(KeyError): 2287db96d56Sopenharmony_ci od.popitem() 2297db96d56Sopenharmony_ci self.assertEqual(len(od), 0) 2307db96d56Sopenharmony_ci 2317db96d56Sopenharmony_ci def test_popitem_last(self): 2327db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 2337db96d56Sopenharmony_ci pairs = [(i, i) for i in range(30)] 2347db96d56Sopenharmony_ci 2357db96d56Sopenharmony_ci obj = OrderedDict(pairs) 2367db96d56Sopenharmony_ci for i in range(8): 2377db96d56Sopenharmony_ci obj.popitem(True) 2387db96d56Sopenharmony_ci obj.popitem(True) 2397db96d56Sopenharmony_ci obj.popitem(last=True) 2407db96d56Sopenharmony_ci self.assertEqual(len(obj), 20) 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ci def test_pop(self): 2437db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 2447db96d56Sopenharmony_ci pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 2457db96d56Sopenharmony_ci shuffle(pairs) 2467db96d56Sopenharmony_ci od = OrderedDict(pairs) 2477db96d56Sopenharmony_ci shuffle(pairs) 2487db96d56Sopenharmony_ci while pairs: 2497db96d56Sopenharmony_ci k, v = pairs.pop() 2507db96d56Sopenharmony_ci self.assertEqual(od.pop(k), v) 2517db96d56Sopenharmony_ci with self.assertRaises(KeyError): 2527db96d56Sopenharmony_ci od.pop('xyz') 2537db96d56Sopenharmony_ci self.assertEqual(len(od), 0) 2547db96d56Sopenharmony_ci self.assertEqual(od.pop(k, 12345), 12345) 2557db96d56Sopenharmony_ci 2567db96d56Sopenharmony_ci # make sure pop still works when __missing__ is defined 2577db96d56Sopenharmony_ci class Missing(OrderedDict): 2587db96d56Sopenharmony_ci def __missing__(self, key): 2597db96d56Sopenharmony_ci return 0 2607db96d56Sopenharmony_ci m = Missing(a=1) 2617db96d56Sopenharmony_ci self.assertEqual(m.pop('b', 5), 5) 2627db96d56Sopenharmony_ci self.assertEqual(m.pop('a', 6), 1) 2637db96d56Sopenharmony_ci self.assertEqual(m.pop('a', 6), 6) 2647db96d56Sopenharmony_ci self.assertEqual(m.pop('a', default=6), 6) 2657db96d56Sopenharmony_ci with self.assertRaises(KeyError): 2667db96d56Sopenharmony_ci m.pop('a') 2677db96d56Sopenharmony_ci 2687db96d56Sopenharmony_ci def test_equality(self): 2697db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 2707db96d56Sopenharmony_ci pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 2717db96d56Sopenharmony_ci shuffle(pairs) 2727db96d56Sopenharmony_ci od1 = OrderedDict(pairs) 2737db96d56Sopenharmony_ci od2 = OrderedDict(pairs) 2747db96d56Sopenharmony_ci self.assertEqual(od1, od2) # same order implies equality 2757db96d56Sopenharmony_ci pairs = pairs[2:] + pairs[:2] 2767db96d56Sopenharmony_ci od2 = OrderedDict(pairs) 2777db96d56Sopenharmony_ci self.assertNotEqual(od1, od2) # different order implies inequality 2787db96d56Sopenharmony_ci # comparison to regular dict is not order sensitive 2797db96d56Sopenharmony_ci self.assertEqual(od1, dict(od2)) 2807db96d56Sopenharmony_ci self.assertEqual(dict(od2), od1) 2817db96d56Sopenharmony_ci # different length implied inequality 2827db96d56Sopenharmony_ci self.assertNotEqual(od1, OrderedDict(pairs[:-1])) 2837db96d56Sopenharmony_ci 2847db96d56Sopenharmony_ci def test_copying(self): 2857db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 2867db96d56Sopenharmony_ci # Check that ordered dicts are copyable, deepcopyable, picklable, 2877db96d56Sopenharmony_ci # and have a repr/eval round-trip 2887db96d56Sopenharmony_ci pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 2897db96d56Sopenharmony_ci od = OrderedDict(pairs) 2907db96d56Sopenharmony_ci od.x = ['x'] 2917db96d56Sopenharmony_ci od.z = ['z'] 2927db96d56Sopenharmony_ci def check(dup): 2937db96d56Sopenharmony_ci msg = "\ncopy: %s\nod: %s" % (dup, od) 2947db96d56Sopenharmony_ci self.assertIsNot(dup, od, msg) 2957db96d56Sopenharmony_ci self.assertEqual(dup, od) 2967db96d56Sopenharmony_ci self.assertEqual(list(dup.items()), list(od.items())) 2977db96d56Sopenharmony_ci self.assertEqual(len(dup), len(od)) 2987db96d56Sopenharmony_ci self.assertEqual(type(dup), type(od)) 2997db96d56Sopenharmony_ci check(od.copy()) 3007db96d56Sopenharmony_ci dup = copy.copy(od) 3017db96d56Sopenharmony_ci check(dup) 3027db96d56Sopenharmony_ci self.assertIs(dup.x, od.x) 3037db96d56Sopenharmony_ci self.assertIs(dup.z, od.z) 3047db96d56Sopenharmony_ci self.assertFalse(hasattr(dup, 'y')) 3057db96d56Sopenharmony_ci dup = copy.deepcopy(od) 3067db96d56Sopenharmony_ci check(dup) 3077db96d56Sopenharmony_ci self.assertEqual(dup.x, od.x) 3087db96d56Sopenharmony_ci self.assertIsNot(dup.x, od.x) 3097db96d56Sopenharmony_ci self.assertEqual(dup.z, od.z) 3107db96d56Sopenharmony_ci self.assertIsNot(dup.z, od.z) 3117db96d56Sopenharmony_ci self.assertFalse(hasattr(dup, 'y')) 3127db96d56Sopenharmony_ci # pickle directly pulls the module, so we have to fake it 3137db96d56Sopenharmony_ci with replaced_module('collections', self.module): 3147db96d56Sopenharmony_ci for proto in range(pickle.HIGHEST_PROTOCOL + 1): 3157db96d56Sopenharmony_ci with self.subTest(proto=proto): 3167db96d56Sopenharmony_ci dup = pickle.loads(pickle.dumps(od, proto)) 3177db96d56Sopenharmony_ci check(dup) 3187db96d56Sopenharmony_ci self.assertEqual(dup.x, od.x) 3197db96d56Sopenharmony_ci self.assertEqual(dup.z, od.z) 3207db96d56Sopenharmony_ci self.assertFalse(hasattr(dup, 'y')) 3217db96d56Sopenharmony_ci check(eval(repr(od))) 3227db96d56Sopenharmony_ci update_test = OrderedDict() 3237db96d56Sopenharmony_ci update_test.update(od) 3247db96d56Sopenharmony_ci check(update_test) 3257db96d56Sopenharmony_ci check(OrderedDict(od)) 3267db96d56Sopenharmony_ci 3277db96d56Sopenharmony_ci def test_yaml_linkage(self): 3287db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 3297db96d56Sopenharmony_ci # Verify that __reduce__ is setup in a way that supports PyYAML's dump() feature. 3307db96d56Sopenharmony_ci # In yaml, lists are native but tuples are not. 3317db96d56Sopenharmony_ci pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 3327db96d56Sopenharmony_ci od = OrderedDict(pairs) 3337db96d56Sopenharmony_ci # yaml.dump(od) --> 3347db96d56Sopenharmony_ci # '!!python/object/apply:__main__.OrderedDict\n- - [a, 1]\n - [b, 2]\n' 3357db96d56Sopenharmony_ci self.assertTrue(all(type(pair)==list for pair in od.__reduce__()[1])) 3367db96d56Sopenharmony_ci 3377db96d56Sopenharmony_ci def test_reduce_not_too_fat(self): 3387db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 3397db96d56Sopenharmony_ci # do not save instance dictionary if not needed 3407db96d56Sopenharmony_ci pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 3417db96d56Sopenharmony_ci od = OrderedDict(pairs) 3427db96d56Sopenharmony_ci self.assertIsInstance(od.__dict__, dict) 3437db96d56Sopenharmony_ci self.assertIsNone(od.__reduce__()[2]) 3447db96d56Sopenharmony_ci od.x = 10 3457db96d56Sopenharmony_ci self.assertEqual(od.__dict__['x'], 10) 3467db96d56Sopenharmony_ci self.assertEqual(od.__reduce__()[2], {'x': 10}) 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci def test_pickle_recursive(self): 3497db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 3507db96d56Sopenharmony_ci od = OrderedDict() 3517db96d56Sopenharmony_ci od[1] = od 3527db96d56Sopenharmony_ci 3537db96d56Sopenharmony_ci # pickle directly pulls the module, so we have to fake it 3547db96d56Sopenharmony_ci with replaced_module('collections', self.module): 3557db96d56Sopenharmony_ci for proto in range(-1, pickle.HIGHEST_PROTOCOL + 1): 3567db96d56Sopenharmony_ci dup = pickle.loads(pickle.dumps(od, proto)) 3577db96d56Sopenharmony_ci self.assertIsNot(dup, od) 3587db96d56Sopenharmony_ci self.assertEqual(list(dup.keys()), [1]) 3597db96d56Sopenharmony_ci self.assertIs(dup[1], dup) 3607db96d56Sopenharmony_ci 3617db96d56Sopenharmony_ci def test_repr(self): 3627db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 3637db96d56Sopenharmony_ci od = OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)]) 3647db96d56Sopenharmony_ci self.assertEqual(repr(od), 3657db96d56Sopenharmony_ci "OrderedDict([('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)])") 3667db96d56Sopenharmony_ci self.assertEqual(eval(repr(od)), od) 3677db96d56Sopenharmony_ci self.assertEqual(repr(OrderedDict()), "OrderedDict()") 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci def test_repr_recursive(self): 3707db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 3717db96d56Sopenharmony_ci # See issue #9826 3727db96d56Sopenharmony_ci od = OrderedDict.fromkeys('abc') 3737db96d56Sopenharmony_ci od['x'] = od 3747db96d56Sopenharmony_ci self.assertEqual(repr(od), 3757db96d56Sopenharmony_ci "OrderedDict([('a', None), ('b', None), ('c', None), ('x', ...)])") 3767db96d56Sopenharmony_ci 3777db96d56Sopenharmony_ci def test_repr_recursive_values(self): 3787db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 3797db96d56Sopenharmony_ci od = OrderedDict() 3807db96d56Sopenharmony_ci od[42] = od.values() 3817db96d56Sopenharmony_ci r = repr(od) 3827db96d56Sopenharmony_ci # Cannot perform a stronger test, as the contents of the repr 3837db96d56Sopenharmony_ci # are implementation-dependent. All we can say is that we 3847db96d56Sopenharmony_ci # want a str result, not an exception of any sort. 3857db96d56Sopenharmony_ci self.assertIsInstance(r, str) 3867db96d56Sopenharmony_ci od[42] = od.items() 3877db96d56Sopenharmony_ci r = repr(od) 3887db96d56Sopenharmony_ci # Again. 3897db96d56Sopenharmony_ci self.assertIsInstance(r, str) 3907db96d56Sopenharmony_ci 3917db96d56Sopenharmony_ci def test_setdefault(self): 3927db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 3937db96d56Sopenharmony_ci pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 3947db96d56Sopenharmony_ci shuffle(pairs) 3957db96d56Sopenharmony_ci od = OrderedDict(pairs) 3967db96d56Sopenharmony_ci pair_order = list(od.items()) 3977db96d56Sopenharmony_ci self.assertEqual(od.setdefault('a', 10), 3) 3987db96d56Sopenharmony_ci # make sure order didn't change 3997db96d56Sopenharmony_ci self.assertEqual(list(od.items()), pair_order) 4007db96d56Sopenharmony_ci self.assertEqual(od.setdefault('x', 10), 10) 4017db96d56Sopenharmony_ci # make sure 'x' is added to the end 4027db96d56Sopenharmony_ci self.assertEqual(list(od.items())[-1], ('x', 10)) 4037db96d56Sopenharmony_ci self.assertEqual(od.setdefault('g', default=9), 9) 4047db96d56Sopenharmony_ci 4057db96d56Sopenharmony_ci # make sure setdefault still works when __missing__ is defined 4067db96d56Sopenharmony_ci class Missing(OrderedDict): 4077db96d56Sopenharmony_ci def __missing__(self, key): 4087db96d56Sopenharmony_ci return 0 4097db96d56Sopenharmony_ci self.assertEqual(Missing().setdefault(5, 9), 9) 4107db96d56Sopenharmony_ci 4117db96d56Sopenharmony_ci def test_reinsert(self): 4127db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 4137db96d56Sopenharmony_ci # Given insert a, insert b, delete a, re-insert a, 4147db96d56Sopenharmony_ci # verify that a is now later than b. 4157db96d56Sopenharmony_ci od = OrderedDict() 4167db96d56Sopenharmony_ci od['a'] = 1 4177db96d56Sopenharmony_ci od['b'] = 2 4187db96d56Sopenharmony_ci del od['a'] 4197db96d56Sopenharmony_ci self.assertEqual(list(od.items()), [('b', 2)]) 4207db96d56Sopenharmony_ci od['a'] = 1 4217db96d56Sopenharmony_ci self.assertEqual(list(od.items()), [('b', 2), ('a', 1)]) 4227db96d56Sopenharmony_ci 4237db96d56Sopenharmony_ci def test_move_to_end(self): 4247db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 4257db96d56Sopenharmony_ci od = OrderedDict.fromkeys('abcde') 4267db96d56Sopenharmony_ci self.assertEqual(list(od), list('abcde')) 4277db96d56Sopenharmony_ci od.move_to_end('c') 4287db96d56Sopenharmony_ci self.assertEqual(list(od), list('abdec')) 4297db96d56Sopenharmony_ci od.move_to_end('c', False) 4307db96d56Sopenharmony_ci self.assertEqual(list(od), list('cabde')) 4317db96d56Sopenharmony_ci od.move_to_end('c', False) 4327db96d56Sopenharmony_ci self.assertEqual(list(od), list('cabde')) 4337db96d56Sopenharmony_ci od.move_to_end('e') 4347db96d56Sopenharmony_ci self.assertEqual(list(od), list('cabde')) 4357db96d56Sopenharmony_ci od.move_to_end('b', last=False) 4367db96d56Sopenharmony_ci self.assertEqual(list(od), list('bcade')) 4377db96d56Sopenharmony_ci with self.assertRaises(KeyError): 4387db96d56Sopenharmony_ci od.move_to_end('x') 4397db96d56Sopenharmony_ci with self.assertRaises(KeyError): 4407db96d56Sopenharmony_ci od.move_to_end('x', False) 4417db96d56Sopenharmony_ci 4427db96d56Sopenharmony_ci def test_move_to_end_issue25406(self): 4437db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 4447db96d56Sopenharmony_ci od = OrderedDict.fromkeys('abc') 4457db96d56Sopenharmony_ci od.move_to_end('c', last=False) 4467db96d56Sopenharmony_ci self.assertEqual(list(od), list('cab')) 4477db96d56Sopenharmony_ci od.move_to_end('a', last=False) 4487db96d56Sopenharmony_ci self.assertEqual(list(od), list('acb')) 4497db96d56Sopenharmony_ci 4507db96d56Sopenharmony_ci od = OrderedDict.fromkeys('abc') 4517db96d56Sopenharmony_ci od.move_to_end('a') 4527db96d56Sopenharmony_ci self.assertEqual(list(od), list('bca')) 4537db96d56Sopenharmony_ci od.move_to_end('c') 4547db96d56Sopenharmony_ci self.assertEqual(list(od), list('bac')) 4557db96d56Sopenharmony_ci 4567db96d56Sopenharmony_ci def test_sizeof(self): 4577db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 4587db96d56Sopenharmony_ci # Wimpy test: Just verify the reported size is larger than a regular dict 4597db96d56Sopenharmony_ci d = dict(a=1) 4607db96d56Sopenharmony_ci od = OrderedDict(**d) 4617db96d56Sopenharmony_ci self.assertGreater(sys.getsizeof(od), sys.getsizeof(d)) 4627db96d56Sopenharmony_ci 4637db96d56Sopenharmony_ci def test_views(self): 4647db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 4657db96d56Sopenharmony_ci # See http://bugs.python.org/issue24286 4667db96d56Sopenharmony_ci s = 'the quick brown fox jumped over a lazy dog yesterday before dawn'.split() 4677db96d56Sopenharmony_ci od = OrderedDict.fromkeys(s) 4687db96d56Sopenharmony_ci self.assertEqual(od.keys(), dict(od).keys()) 4697db96d56Sopenharmony_ci self.assertEqual(od.items(), dict(od).items()) 4707db96d56Sopenharmony_ci 4717db96d56Sopenharmony_ci def test_override_update(self): 4727db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 4737db96d56Sopenharmony_ci # Verify that subclasses can override update() without breaking __init__() 4747db96d56Sopenharmony_ci class MyOD(OrderedDict): 4757db96d56Sopenharmony_ci def update(self, *args, **kwds): 4767db96d56Sopenharmony_ci raise Exception() 4777db96d56Sopenharmony_ci items = [('a', 1), ('c', 3), ('b', 2)] 4787db96d56Sopenharmony_ci self.assertEqual(list(MyOD(items).items()), items) 4797db96d56Sopenharmony_ci 4807db96d56Sopenharmony_ci def test_highly_nested(self): 4817db96d56Sopenharmony_ci # Issues 25395 and 35983: test that the trashcan mechanism works 4827db96d56Sopenharmony_ci # correctly for OrderedDict: deleting a highly nested OrderDict 4837db96d56Sopenharmony_ci # should not crash Python. 4847db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 4857db96d56Sopenharmony_ci obj = None 4867db96d56Sopenharmony_ci for _ in range(1000): 4877db96d56Sopenharmony_ci obj = OrderedDict([(None, obj)]) 4887db96d56Sopenharmony_ci del obj 4897db96d56Sopenharmony_ci support.gc_collect() 4907db96d56Sopenharmony_ci 4917db96d56Sopenharmony_ci def test_highly_nested_subclass(self): 4927db96d56Sopenharmony_ci # Issues 25395 and 35983: test that the trashcan mechanism works 4937db96d56Sopenharmony_ci # correctly for OrderedDict: deleting a highly nested OrderDict 4947db96d56Sopenharmony_ci # should not crash Python. 4957db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 4967db96d56Sopenharmony_ci deleted = [] 4977db96d56Sopenharmony_ci class MyOD(OrderedDict): 4987db96d56Sopenharmony_ci def __del__(self): 4997db96d56Sopenharmony_ci deleted.append(self.i) 5007db96d56Sopenharmony_ci obj = None 5017db96d56Sopenharmony_ci for i in range(100): 5027db96d56Sopenharmony_ci obj = MyOD([(None, obj)]) 5037db96d56Sopenharmony_ci obj.i = i 5047db96d56Sopenharmony_ci del obj 5057db96d56Sopenharmony_ci support.gc_collect() 5067db96d56Sopenharmony_ci self.assertEqual(deleted, list(reversed(range(100)))) 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ci def test_delitem_hash_collision(self): 5097db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 5107db96d56Sopenharmony_ci 5117db96d56Sopenharmony_ci class Key: 5127db96d56Sopenharmony_ci def __init__(self, hash): 5137db96d56Sopenharmony_ci self._hash = hash 5147db96d56Sopenharmony_ci self.value = str(id(self)) 5157db96d56Sopenharmony_ci def __hash__(self): 5167db96d56Sopenharmony_ci return self._hash 5177db96d56Sopenharmony_ci def __eq__(self, other): 5187db96d56Sopenharmony_ci try: 5197db96d56Sopenharmony_ci return self.value == other.value 5207db96d56Sopenharmony_ci except AttributeError: 5217db96d56Sopenharmony_ci return False 5227db96d56Sopenharmony_ci def __repr__(self): 5237db96d56Sopenharmony_ci return self.value 5247db96d56Sopenharmony_ci 5257db96d56Sopenharmony_ci def blocking_hash(hash): 5267db96d56Sopenharmony_ci # See the collision-handling in lookdict (in Objects/dictobject.c). 5277db96d56Sopenharmony_ci MINSIZE = 8 5287db96d56Sopenharmony_ci i = (hash & MINSIZE-1) 5297db96d56Sopenharmony_ci return (i << 2) + i + hash + 1 5307db96d56Sopenharmony_ci 5317db96d56Sopenharmony_ci COLLIDING = 1 5327db96d56Sopenharmony_ci 5337db96d56Sopenharmony_ci key = Key(COLLIDING) 5347db96d56Sopenharmony_ci colliding = Key(COLLIDING) 5357db96d56Sopenharmony_ci blocking = Key(blocking_hash(COLLIDING)) 5367db96d56Sopenharmony_ci 5377db96d56Sopenharmony_ci od = OrderedDict() 5387db96d56Sopenharmony_ci od[key] = ... 5397db96d56Sopenharmony_ci od[blocking] = ... 5407db96d56Sopenharmony_ci od[colliding] = ... 5417db96d56Sopenharmony_ci od['after'] = ... 5427db96d56Sopenharmony_ci 5437db96d56Sopenharmony_ci del od[blocking] 5447db96d56Sopenharmony_ci del od[colliding] 5457db96d56Sopenharmony_ci self.assertEqual(list(od.items()), [(key, ...), ('after', ...)]) 5467db96d56Sopenharmony_ci 5477db96d56Sopenharmony_ci def test_issue24347(self): 5487db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 5497db96d56Sopenharmony_ci 5507db96d56Sopenharmony_ci class Key: 5517db96d56Sopenharmony_ci def __hash__(self): 5527db96d56Sopenharmony_ci return randrange(100000) 5537db96d56Sopenharmony_ci 5547db96d56Sopenharmony_ci od = OrderedDict() 5557db96d56Sopenharmony_ci for i in range(100): 5567db96d56Sopenharmony_ci key = Key() 5577db96d56Sopenharmony_ci od[key] = i 5587db96d56Sopenharmony_ci 5597db96d56Sopenharmony_ci # These should not crash. 5607db96d56Sopenharmony_ci with self.assertRaises(KeyError): 5617db96d56Sopenharmony_ci list(od.values()) 5627db96d56Sopenharmony_ci with self.assertRaises(KeyError): 5637db96d56Sopenharmony_ci list(od.items()) 5647db96d56Sopenharmony_ci with self.assertRaises(KeyError): 5657db96d56Sopenharmony_ci repr(od) 5667db96d56Sopenharmony_ci with self.assertRaises(KeyError): 5677db96d56Sopenharmony_ci od.copy() 5687db96d56Sopenharmony_ci 5697db96d56Sopenharmony_ci def test_issue24348(self): 5707db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 5717db96d56Sopenharmony_ci 5727db96d56Sopenharmony_ci class Key: 5737db96d56Sopenharmony_ci def __hash__(self): 5747db96d56Sopenharmony_ci return 1 5757db96d56Sopenharmony_ci 5767db96d56Sopenharmony_ci od = OrderedDict() 5777db96d56Sopenharmony_ci od[Key()] = 0 5787db96d56Sopenharmony_ci # This should not crash. 5797db96d56Sopenharmony_ci od.popitem() 5807db96d56Sopenharmony_ci 5817db96d56Sopenharmony_ci def test_issue24667(self): 5827db96d56Sopenharmony_ci """ 5837db96d56Sopenharmony_ci dict resizes after a certain number of insertion operations, 5847db96d56Sopenharmony_ci whether or not there were deletions that freed up slots in the 5857db96d56Sopenharmony_ci hash table. During fast node lookup, OrderedDict must correctly 5867db96d56Sopenharmony_ci respond to all resizes, even if the current "size" is the same 5877db96d56Sopenharmony_ci as the old one. We verify that here by forcing a dict resize 5887db96d56Sopenharmony_ci on a sparse odict and then perform an operation that should 5897db96d56Sopenharmony_ci trigger an odict resize (e.g. popitem). One key aspect here is 5907db96d56Sopenharmony_ci that we will keep the size of the odict the same at each popitem 5917db96d56Sopenharmony_ci call. This verifies that we handled the dict resize properly. 5927db96d56Sopenharmony_ci """ 5937db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 5947db96d56Sopenharmony_ci 5957db96d56Sopenharmony_ci od = OrderedDict() 5967db96d56Sopenharmony_ci for c0 in '0123456789ABCDEF': 5977db96d56Sopenharmony_ci for c1 in '0123456789ABCDEF': 5987db96d56Sopenharmony_ci if len(od) == 4: 5997db96d56Sopenharmony_ci # This should not raise a KeyError. 6007db96d56Sopenharmony_ci od.popitem(last=False) 6017db96d56Sopenharmony_ci key = c0 + c1 6027db96d56Sopenharmony_ci od[key] = key 6037db96d56Sopenharmony_ci 6047db96d56Sopenharmony_ci # Direct use of dict methods 6057db96d56Sopenharmony_ci 6067db96d56Sopenharmony_ci def test_dict_setitem(self): 6077db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 6087db96d56Sopenharmony_ci od = OrderedDict() 6097db96d56Sopenharmony_ci dict.__setitem__(od, 'spam', 1) 6107db96d56Sopenharmony_ci self.assertNotIn('NULL', repr(od)) 6117db96d56Sopenharmony_ci 6127db96d56Sopenharmony_ci def test_dict_delitem(self): 6137db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 6147db96d56Sopenharmony_ci od = OrderedDict() 6157db96d56Sopenharmony_ci od['spam'] = 1 6167db96d56Sopenharmony_ci od['ham'] = 2 6177db96d56Sopenharmony_ci dict.__delitem__(od, 'spam') 6187db96d56Sopenharmony_ci with self.assertRaises(KeyError): 6197db96d56Sopenharmony_ci repr(od) 6207db96d56Sopenharmony_ci 6217db96d56Sopenharmony_ci def test_dict_clear(self): 6227db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 6237db96d56Sopenharmony_ci od = OrderedDict() 6247db96d56Sopenharmony_ci od['spam'] = 1 6257db96d56Sopenharmony_ci od['ham'] = 2 6267db96d56Sopenharmony_ci dict.clear(od) 6277db96d56Sopenharmony_ci self.assertNotIn('NULL', repr(od)) 6287db96d56Sopenharmony_ci 6297db96d56Sopenharmony_ci def test_dict_pop(self): 6307db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 6317db96d56Sopenharmony_ci od = OrderedDict() 6327db96d56Sopenharmony_ci od['spam'] = 1 6337db96d56Sopenharmony_ci od['ham'] = 2 6347db96d56Sopenharmony_ci dict.pop(od, 'spam') 6357db96d56Sopenharmony_ci with self.assertRaises(KeyError): 6367db96d56Sopenharmony_ci repr(od) 6377db96d56Sopenharmony_ci 6387db96d56Sopenharmony_ci def test_dict_popitem(self): 6397db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 6407db96d56Sopenharmony_ci od = OrderedDict() 6417db96d56Sopenharmony_ci od['spam'] = 1 6427db96d56Sopenharmony_ci od['ham'] = 2 6437db96d56Sopenharmony_ci dict.popitem(od) 6447db96d56Sopenharmony_ci with self.assertRaises(KeyError): 6457db96d56Sopenharmony_ci repr(od) 6467db96d56Sopenharmony_ci 6477db96d56Sopenharmony_ci def test_dict_setdefault(self): 6487db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 6497db96d56Sopenharmony_ci od = OrderedDict() 6507db96d56Sopenharmony_ci dict.setdefault(od, 'spam', 1) 6517db96d56Sopenharmony_ci self.assertNotIn('NULL', repr(od)) 6527db96d56Sopenharmony_ci 6537db96d56Sopenharmony_ci def test_dict_update(self): 6547db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 6557db96d56Sopenharmony_ci od = OrderedDict() 6567db96d56Sopenharmony_ci dict.update(od, [('spam', 1)]) 6577db96d56Sopenharmony_ci self.assertNotIn('NULL', repr(od)) 6587db96d56Sopenharmony_ci 6597db96d56Sopenharmony_ci def test_reference_loop(self): 6607db96d56Sopenharmony_ci # Issue 25935 6617db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 6627db96d56Sopenharmony_ci class A: 6637db96d56Sopenharmony_ci od = OrderedDict() 6647db96d56Sopenharmony_ci A.od[A] = None 6657db96d56Sopenharmony_ci r = weakref.ref(A) 6667db96d56Sopenharmony_ci del A 6677db96d56Sopenharmony_ci gc.collect() 6687db96d56Sopenharmony_ci self.assertIsNone(r()) 6697db96d56Sopenharmony_ci 6707db96d56Sopenharmony_ci def test_free_after_iterating(self): 6717db96d56Sopenharmony_ci support.check_free_after_iterating(self, iter, self.OrderedDict) 6727db96d56Sopenharmony_ci support.check_free_after_iterating(self, lambda d: iter(d.keys()), self.OrderedDict) 6737db96d56Sopenharmony_ci support.check_free_after_iterating(self, lambda d: iter(d.values()), self.OrderedDict) 6747db96d56Sopenharmony_ci support.check_free_after_iterating(self, lambda d: iter(d.items()), self.OrderedDict) 6757db96d56Sopenharmony_ci 6767db96d56Sopenharmony_ci def test_merge_operator(self): 6777db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 6787db96d56Sopenharmony_ci 6797db96d56Sopenharmony_ci a = OrderedDict({0: 0, 1: 1, 2: 1}) 6807db96d56Sopenharmony_ci b = OrderedDict({1: 1, 2: 2, 3: 3}) 6817db96d56Sopenharmony_ci 6827db96d56Sopenharmony_ci c = a.copy() 6837db96d56Sopenharmony_ci d = a.copy() 6847db96d56Sopenharmony_ci c |= b 6857db96d56Sopenharmony_ci d |= list(b.items()) 6867db96d56Sopenharmony_ci expected = OrderedDict({0: 0, 1: 1, 2: 2, 3: 3}) 6877db96d56Sopenharmony_ci self.assertEqual(a | dict(b), expected) 6887db96d56Sopenharmony_ci self.assertEqual(a | b, expected) 6897db96d56Sopenharmony_ci self.assertEqual(c, expected) 6907db96d56Sopenharmony_ci self.assertEqual(d, expected) 6917db96d56Sopenharmony_ci 6927db96d56Sopenharmony_ci c = b.copy() 6937db96d56Sopenharmony_ci c |= a 6947db96d56Sopenharmony_ci expected = OrderedDict({1: 1, 2: 1, 3: 3, 0: 0}) 6957db96d56Sopenharmony_ci self.assertEqual(dict(b) | a, expected) 6967db96d56Sopenharmony_ci self.assertEqual(b | a, expected) 6977db96d56Sopenharmony_ci self.assertEqual(c, expected) 6987db96d56Sopenharmony_ci 6997db96d56Sopenharmony_ci self.assertIs(type(a | b), OrderedDict) 7007db96d56Sopenharmony_ci self.assertIs(type(dict(a) | b), OrderedDict) 7017db96d56Sopenharmony_ci self.assertIs(type(a | dict(b)), OrderedDict) 7027db96d56Sopenharmony_ci 7037db96d56Sopenharmony_ci expected = a.copy() 7047db96d56Sopenharmony_ci a |= () 7057db96d56Sopenharmony_ci a |= "" 7067db96d56Sopenharmony_ci self.assertEqual(a, expected) 7077db96d56Sopenharmony_ci 7087db96d56Sopenharmony_ci with self.assertRaises(TypeError): 7097db96d56Sopenharmony_ci a | None 7107db96d56Sopenharmony_ci with self.assertRaises(TypeError): 7117db96d56Sopenharmony_ci a | () 7127db96d56Sopenharmony_ci with self.assertRaises(TypeError): 7137db96d56Sopenharmony_ci a | "BAD" 7147db96d56Sopenharmony_ci with self.assertRaises(TypeError): 7157db96d56Sopenharmony_ci a | "" 7167db96d56Sopenharmony_ci with self.assertRaises(ValueError): 7177db96d56Sopenharmony_ci a |= "BAD" 7187db96d56Sopenharmony_ci 7197db96d56Sopenharmony_ci @support.cpython_only 7207db96d56Sopenharmony_ci def test_ordered_dict_items_result_gc(self): 7217db96d56Sopenharmony_ci # bpo-42536: OrderedDict.items's tuple-reuse speed trick breaks the GC's 7227db96d56Sopenharmony_ci # assumptions about what can be untracked. Make sure we re-track result 7237db96d56Sopenharmony_ci # tuples whenever we reuse them. 7247db96d56Sopenharmony_ci it = iter(self.OrderedDict({None: []}).items()) 7257db96d56Sopenharmony_ci gc.collect() 7267db96d56Sopenharmony_ci # That GC collection probably untracked the recycled internal result 7277db96d56Sopenharmony_ci # tuple, which is initialized to (None, None). Make sure it's re-tracked 7287db96d56Sopenharmony_ci # when it's mutated and returned from __next__: 7297db96d56Sopenharmony_ci self.assertTrue(gc.is_tracked(next(it))) 7307db96d56Sopenharmony_ci 7317db96d56Sopenharmony_ciclass PurePythonOrderedDictTests(OrderedDictTests, unittest.TestCase): 7327db96d56Sopenharmony_ci 7337db96d56Sopenharmony_ci module = py_coll 7347db96d56Sopenharmony_ci OrderedDict = py_coll.OrderedDict 7357db96d56Sopenharmony_ci 7367db96d56Sopenharmony_ci 7377db96d56Sopenharmony_ciclass CPythonBuiltinDictTests(unittest.TestCase): 7387db96d56Sopenharmony_ci """Builtin dict preserves insertion order. 7397db96d56Sopenharmony_ci 7407db96d56Sopenharmony_ci Reuse some of tests in OrderedDict selectively. 7417db96d56Sopenharmony_ci """ 7427db96d56Sopenharmony_ci 7437db96d56Sopenharmony_ci module = builtins 7447db96d56Sopenharmony_ci OrderedDict = dict 7457db96d56Sopenharmony_ci 7467db96d56Sopenharmony_cifor method in ( 7477db96d56Sopenharmony_ci "test_init test_update test_abc test_clear test_delitem " + 7487db96d56Sopenharmony_ci "test_setitem test_detect_deletion_during_iteration " + 7497db96d56Sopenharmony_ci "test_popitem test_reinsert test_override_update " + 7507db96d56Sopenharmony_ci "test_highly_nested test_highly_nested_subclass " + 7517db96d56Sopenharmony_ci "test_delitem_hash_collision ").split(): 7527db96d56Sopenharmony_ci setattr(CPythonBuiltinDictTests, method, getattr(OrderedDictTests, method)) 7537db96d56Sopenharmony_cidel method 7547db96d56Sopenharmony_ci 7557db96d56Sopenharmony_ci 7567db96d56Sopenharmony_ci@unittest.skipUnless(c_coll, 'requires the C version of the collections module') 7577db96d56Sopenharmony_ciclass CPythonOrderedDictTests(OrderedDictTests, unittest.TestCase): 7587db96d56Sopenharmony_ci 7597db96d56Sopenharmony_ci module = c_coll 7607db96d56Sopenharmony_ci OrderedDict = c_coll.OrderedDict 7617db96d56Sopenharmony_ci check_sizeof = support.check_sizeof 7627db96d56Sopenharmony_ci 7637db96d56Sopenharmony_ci @support.cpython_only 7647db96d56Sopenharmony_ci def test_sizeof_exact(self): 7657db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 7667db96d56Sopenharmony_ci calcsize = struct.calcsize 7677db96d56Sopenharmony_ci size = support.calcobjsize 7687db96d56Sopenharmony_ci check = self.check_sizeof 7697db96d56Sopenharmony_ci 7707db96d56Sopenharmony_ci basicsize = size('nQ2P' + '3PnPn2P') 7717db96d56Sopenharmony_ci keysize = calcsize('n2BI2n') 7727db96d56Sopenharmony_ci 7737db96d56Sopenharmony_ci entrysize = calcsize('n2P') 7747db96d56Sopenharmony_ci p = calcsize('P') 7757db96d56Sopenharmony_ci nodesize = calcsize('Pn2P') 7767db96d56Sopenharmony_ci 7777db96d56Sopenharmony_ci od = OrderedDict() 7787db96d56Sopenharmony_ci check(od, basicsize) # 8byte indices + 8*2//3 * entry table 7797db96d56Sopenharmony_ci od.x = 1 7807db96d56Sopenharmony_ci check(od, basicsize) 7817db96d56Sopenharmony_ci od.update([(i, i) for i in range(3)]) 7827db96d56Sopenharmony_ci check(od, basicsize + keysize + 8*p + 8 + 5*entrysize + 3*nodesize) 7837db96d56Sopenharmony_ci od.update([(i, i) for i in range(3, 10)]) 7847db96d56Sopenharmony_ci check(od, basicsize + keysize + 16*p + 16 + 10*entrysize + 10*nodesize) 7857db96d56Sopenharmony_ci 7867db96d56Sopenharmony_ci check(od.keys(), size('P')) 7877db96d56Sopenharmony_ci check(od.items(), size('P')) 7887db96d56Sopenharmony_ci check(od.values(), size('P')) 7897db96d56Sopenharmony_ci 7907db96d56Sopenharmony_ci itersize = size('iP2n2P') 7917db96d56Sopenharmony_ci check(iter(od), itersize) 7927db96d56Sopenharmony_ci check(iter(od.keys()), itersize) 7937db96d56Sopenharmony_ci check(iter(od.items()), itersize) 7947db96d56Sopenharmony_ci check(iter(od.values()), itersize) 7957db96d56Sopenharmony_ci 7967db96d56Sopenharmony_ci def test_key_change_during_iteration(self): 7977db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 7987db96d56Sopenharmony_ci 7997db96d56Sopenharmony_ci od = OrderedDict.fromkeys('abcde') 8007db96d56Sopenharmony_ci self.assertEqual(list(od), list('abcde')) 8017db96d56Sopenharmony_ci with self.assertRaises(RuntimeError): 8027db96d56Sopenharmony_ci for i, k in enumerate(od): 8037db96d56Sopenharmony_ci od.move_to_end(k) 8047db96d56Sopenharmony_ci self.assertLess(i, 5) 8057db96d56Sopenharmony_ci with self.assertRaises(RuntimeError): 8067db96d56Sopenharmony_ci for k in od: 8077db96d56Sopenharmony_ci od['f'] = None 8087db96d56Sopenharmony_ci with self.assertRaises(RuntimeError): 8097db96d56Sopenharmony_ci for k in od: 8107db96d56Sopenharmony_ci del od['c'] 8117db96d56Sopenharmony_ci self.assertEqual(list(od), list('bdeaf')) 8127db96d56Sopenharmony_ci 8137db96d56Sopenharmony_ci def test_iterators_pickling(self): 8147db96d56Sopenharmony_ci OrderedDict = self.OrderedDict 8157db96d56Sopenharmony_ci pairs = [('c', 1), ('b', 2), ('a', 3), ('d', 4), ('e', 5), ('f', 6)] 8167db96d56Sopenharmony_ci od = OrderedDict(pairs) 8177db96d56Sopenharmony_ci 8187db96d56Sopenharmony_ci for method_name in ('keys', 'values', 'items'): 8197db96d56Sopenharmony_ci meth = getattr(od, method_name) 8207db96d56Sopenharmony_ci expected = list(meth())[1:] 8217db96d56Sopenharmony_ci for i in range(pickle.HIGHEST_PROTOCOL + 1): 8227db96d56Sopenharmony_ci with self.subTest(method_name=method_name, protocol=i): 8237db96d56Sopenharmony_ci it = iter(meth()) 8247db96d56Sopenharmony_ci next(it) 8257db96d56Sopenharmony_ci p = pickle.dumps(it, i) 8267db96d56Sopenharmony_ci unpickled = pickle.loads(p) 8277db96d56Sopenharmony_ci self.assertEqual(list(unpickled), expected) 8287db96d56Sopenharmony_ci self.assertEqual(list(it), expected) 8297db96d56Sopenharmony_ci 8307db96d56Sopenharmony_ci @support.cpython_only 8317db96d56Sopenharmony_ci def test_weakref_list_is_not_traversed(self): 8327db96d56Sopenharmony_ci # Check that the weakref list is not traversed when collecting 8337db96d56Sopenharmony_ci # OrderedDict objects. See bpo-39778 for more information. 8347db96d56Sopenharmony_ci 8357db96d56Sopenharmony_ci gc.collect() 8367db96d56Sopenharmony_ci 8377db96d56Sopenharmony_ci x = self.OrderedDict() 8387db96d56Sopenharmony_ci x.cycle = x 8397db96d56Sopenharmony_ci 8407db96d56Sopenharmony_ci cycle = [] 8417db96d56Sopenharmony_ci cycle.append(cycle) 8427db96d56Sopenharmony_ci 8437db96d56Sopenharmony_ci x_ref = weakref.ref(x) 8447db96d56Sopenharmony_ci cycle.append(x_ref) 8457db96d56Sopenharmony_ci 8467db96d56Sopenharmony_ci del x, cycle, x_ref 8477db96d56Sopenharmony_ci 8487db96d56Sopenharmony_ci gc.collect() 8497db96d56Sopenharmony_ci 8507db96d56Sopenharmony_ci 8517db96d56Sopenharmony_ciclass PurePythonOrderedDictSubclassTests(PurePythonOrderedDictTests): 8527db96d56Sopenharmony_ci 8537db96d56Sopenharmony_ci module = py_coll 8547db96d56Sopenharmony_ci class OrderedDict(py_coll.OrderedDict): 8557db96d56Sopenharmony_ci pass 8567db96d56Sopenharmony_ci 8577db96d56Sopenharmony_ci 8587db96d56Sopenharmony_ciclass CPythonOrderedDictSubclassTests(CPythonOrderedDictTests): 8597db96d56Sopenharmony_ci 8607db96d56Sopenharmony_ci module = c_coll 8617db96d56Sopenharmony_ci class OrderedDict(c_coll.OrderedDict): 8627db96d56Sopenharmony_ci pass 8637db96d56Sopenharmony_ci 8647db96d56Sopenharmony_ci 8657db96d56Sopenharmony_ciclass PurePythonOrderedDictWithSlotsCopyingTests(unittest.TestCase): 8667db96d56Sopenharmony_ci 8677db96d56Sopenharmony_ci module = py_coll 8687db96d56Sopenharmony_ci class OrderedDict(py_coll.OrderedDict): 8697db96d56Sopenharmony_ci __slots__ = ('x', 'y') 8707db96d56Sopenharmony_ci test_copying = OrderedDictTests.test_copying 8717db96d56Sopenharmony_ci 8727db96d56Sopenharmony_ci 8737db96d56Sopenharmony_ci@unittest.skipUnless(c_coll, 'requires the C version of the collections module') 8747db96d56Sopenharmony_ciclass CPythonOrderedDictWithSlotsCopyingTests(unittest.TestCase): 8757db96d56Sopenharmony_ci 8767db96d56Sopenharmony_ci module = c_coll 8777db96d56Sopenharmony_ci class OrderedDict(c_coll.OrderedDict): 8787db96d56Sopenharmony_ci __slots__ = ('x', 'y') 8797db96d56Sopenharmony_ci test_copying = OrderedDictTests.test_copying 8807db96d56Sopenharmony_ci 8817db96d56Sopenharmony_ci 8827db96d56Sopenharmony_ciclass PurePythonGeneralMappingTests(mapping_tests.BasicTestMappingProtocol): 8837db96d56Sopenharmony_ci 8847db96d56Sopenharmony_ci @classmethod 8857db96d56Sopenharmony_ci def setUpClass(cls): 8867db96d56Sopenharmony_ci cls.type2test = py_coll.OrderedDict 8877db96d56Sopenharmony_ci 8887db96d56Sopenharmony_ci def test_popitem(self): 8897db96d56Sopenharmony_ci d = self._empty_mapping() 8907db96d56Sopenharmony_ci self.assertRaises(KeyError, d.popitem) 8917db96d56Sopenharmony_ci 8927db96d56Sopenharmony_ci 8937db96d56Sopenharmony_ci@unittest.skipUnless(c_coll, 'requires the C version of the collections module') 8947db96d56Sopenharmony_ciclass CPythonGeneralMappingTests(mapping_tests.BasicTestMappingProtocol): 8957db96d56Sopenharmony_ci 8967db96d56Sopenharmony_ci @classmethod 8977db96d56Sopenharmony_ci def setUpClass(cls): 8987db96d56Sopenharmony_ci cls.type2test = c_coll.OrderedDict 8997db96d56Sopenharmony_ci 9007db96d56Sopenharmony_ci def test_popitem(self): 9017db96d56Sopenharmony_ci d = self._empty_mapping() 9027db96d56Sopenharmony_ci self.assertRaises(KeyError, d.popitem) 9037db96d56Sopenharmony_ci 9047db96d56Sopenharmony_ci 9057db96d56Sopenharmony_ciclass PurePythonSubclassMappingTests(mapping_tests.BasicTestMappingProtocol): 9067db96d56Sopenharmony_ci 9077db96d56Sopenharmony_ci @classmethod 9087db96d56Sopenharmony_ci def setUpClass(cls): 9097db96d56Sopenharmony_ci class MyOrderedDict(py_coll.OrderedDict): 9107db96d56Sopenharmony_ci pass 9117db96d56Sopenharmony_ci cls.type2test = MyOrderedDict 9127db96d56Sopenharmony_ci 9137db96d56Sopenharmony_ci def test_popitem(self): 9147db96d56Sopenharmony_ci d = self._empty_mapping() 9157db96d56Sopenharmony_ci self.assertRaises(KeyError, d.popitem) 9167db96d56Sopenharmony_ci 9177db96d56Sopenharmony_ci 9187db96d56Sopenharmony_ci@unittest.skipUnless(c_coll, 'requires the C version of the collections module') 9197db96d56Sopenharmony_ciclass CPythonSubclassMappingTests(mapping_tests.BasicTestMappingProtocol): 9207db96d56Sopenharmony_ci 9217db96d56Sopenharmony_ci @classmethod 9227db96d56Sopenharmony_ci def setUpClass(cls): 9237db96d56Sopenharmony_ci class MyOrderedDict(c_coll.OrderedDict): 9247db96d56Sopenharmony_ci pass 9257db96d56Sopenharmony_ci cls.type2test = MyOrderedDict 9267db96d56Sopenharmony_ci 9277db96d56Sopenharmony_ci def test_popitem(self): 9287db96d56Sopenharmony_ci d = self._empty_mapping() 9297db96d56Sopenharmony_ci self.assertRaises(KeyError, d.popitem) 9307db96d56Sopenharmony_ci 9317db96d56Sopenharmony_ci 9327db96d56Sopenharmony_ciclass SimpleLRUCache: 9337db96d56Sopenharmony_ci 9347db96d56Sopenharmony_ci def __init__(self, size): 9357db96d56Sopenharmony_ci super().__init__() 9367db96d56Sopenharmony_ci self.size = size 9377db96d56Sopenharmony_ci self.counts = dict.fromkeys(('get', 'set', 'del'), 0) 9387db96d56Sopenharmony_ci 9397db96d56Sopenharmony_ci def __getitem__(self, item): 9407db96d56Sopenharmony_ci self.counts['get'] += 1 9417db96d56Sopenharmony_ci value = super().__getitem__(item) 9427db96d56Sopenharmony_ci self.move_to_end(item) 9437db96d56Sopenharmony_ci return value 9447db96d56Sopenharmony_ci 9457db96d56Sopenharmony_ci def __setitem__(self, key, value): 9467db96d56Sopenharmony_ci self.counts['set'] += 1 9477db96d56Sopenharmony_ci while key not in self and len(self) >= self.size: 9487db96d56Sopenharmony_ci self.popitem(last=False) 9497db96d56Sopenharmony_ci super().__setitem__(key, value) 9507db96d56Sopenharmony_ci self.move_to_end(key) 9517db96d56Sopenharmony_ci 9527db96d56Sopenharmony_ci def __delitem__(self, key): 9537db96d56Sopenharmony_ci self.counts['del'] += 1 9547db96d56Sopenharmony_ci super().__delitem__(key) 9557db96d56Sopenharmony_ci 9567db96d56Sopenharmony_ci 9577db96d56Sopenharmony_ciclass SimpleLRUCacheTests: 9587db96d56Sopenharmony_ci 9597db96d56Sopenharmony_ci def test_add_after_full(self): 9607db96d56Sopenharmony_ci c = self.type2test(2) 9617db96d56Sopenharmony_ci c['t1'] = 1 9627db96d56Sopenharmony_ci c['t2'] = 2 9637db96d56Sopenharmony_ci c['t3'] = 3 9647db96d56Sopenharmony_ci self.assertEqual(c.counts, {'get': 0, 'set': 3, 'del': 0}) 9657db96d56Sopenharmony_ci self.assertEqual(list(c), ['t2', 't3']) 9667db96d56Sopenharmony_ci self.assertEqual(c.counts, {'get': 0, 'set': 3, 'del': 0}) 9677db96d56Sopenharmony_ci 9687db96d56Sopenharmony_ci def test_popitem(self): 9697db96d56Sopenharmony_ci c = self.type2test(3) 9707db96d56Sopenharmony_ci for i in range(1, 4): 9717db96d56Sopenharmony_ci c[i] = i 9727db96d56Sopenharmony_ci self.assertEqual(c.popitem(last=False), (1, 1)) 9737db96d56Sopenharmony_ci self.assertEqual(c.popitem(last=True), (3, 3)) 9747db96d56Sopenharmony_ci self.assertEqual(c.counts, {'get': 0, 'set': 3, 'del': 0}) 9757db96d56Sopenharmony_ci 9767db96d56Sopenharmony_ci def test_pop(self): 9777db96d56Sopenharmony_ci c = self.type2test(3) 9787db96d56Sopenharmony_ci for i in range(1, 4): 9797db96d56Sopenharmony_ci c[i] = i 9807db96d56Sopenharmony_ci self.assertEqual(c.counts, {'get': 0, 'set': 3, 'del': 0}) 9817db96d56Sopenharmony_ci self.assertEqual(c.pop(2), 2) 9827db96d56Sopenharmony_ci self.assertEqual(c.counts, {'get': 0, 'set': 3, 'del': 0}) 9837db96d56Sopenharmony_ci self.assertEqual(c.pop(4, 0), 0) 9847db96d56Sopenharmony_ci self.assertEqual(c.counts, {'get': 0, 'set': 3, 'del': 0}) 9857db96d56Sopenharmony_ci self.assertRaises(KeyError, c.pop, 4) 9867db96d56Sopenharmony_ci self.assertEqual(c.counts, {'get': 0, 'set': 3, 'del': 0}) 9877db96d56Sopenharmony_ci 9887db96d56Sopenharmony_ci def test_change_order_on_get(self): 9897db96d56Sopenharmony_ci c = self.type2test(3) 9907db96d56Sopenharmony_ci for i in range(1, 4): 9917db96d56Sopenharmony_ci c[i] = i 9927db96d56Sopenharmony_ci self.assertEqual(list(c), list(range(1, 4))) 9937db96d56Sopenharmony_ci self.assertEqual(c.counts, {'get': 0, 'set': 3, 'del': 0}) 9947db96d56Sopenharmony_ci self.assertEqual(c[2], 2) 9957db96d56Sopenharmony_ci self.assertEqual(c.counts, {'get': 1, 'set': 3, 'del': 0}) 9967db96d56Sopenharmony_ci self.assertEqual(list(c), [1, 3, 2]) 9977db96d56Sopenharmony_ci 9987db96d56Sopenharmony_ci 9997db96d56Sopenharmony_ciclass PySimpleLRUCacheTests(SimpleLRUCacheTests, unittest.TestCase): 10007db96d56Sopenharmony_ci 10017db96d56Sopenharmony_ci class type2test(SimpleLRUCache, py_coll.OrderedDict): 10027db96d56Sopenharmony_ci pass 10037db96d56Sopenharmony_ci 10047db96d56Sopenharmony_ci 10057db96d56Sopenharmony_ci@unittest.skipUnless(c_coll, 'requires the C version of the collections module') 10067db96d56Sopenharmony_ciclass CSimpleLRUCacheTests(SimpleLRUCacheTests, unittest.TestCase): 10077db96d56Sopenharmony_ci 10087db96d56Sopenharmony_ci @classmethod 10097db96d56Sopenharmony_ci def setUpClass(cls): 10107db96d56Sopenharmony_ci class type2test(SimpleLRUCache, c_coll.OrderedDict): 10117db96d56Sopenharmony_ci pass 10127db96d56Sopenharmony_ci cls.type2test = type2test 10137db96d56Sopenharmony_ci 10147db96d56Sopenharmony_ci 10157db96d56Sopenharmony_ciif __name__ == "__main__": 10167db96d56Sopenharmony_ci unittest.main() 1017