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