17db96d56Sopenharmony_ciimport concurrent.futures
27db96d56Sopenharmony_ciimport contextvars
37db96d56Sopenharmony_ciimport functools
47db96d56Sopenharmony_ciimport gc
57db96d56Sopenharmony_ciimport random
67db96d56Sopenharmony_ciimport time
77db96d56Sopenharmony_ciimport unittest
87db96d56Sopenharmony_ciimport weakref
97db96d56Sopenharmony_cifrom test.support import threading_helper
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_citry:
127db96d56Sopenharmony_ci    from _testcapi import hamt
137db96d56Sopenharmony_ciexcept ImportError:
147db96d56Sopenharmony_ci    hamt = None
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_cidef isolated_context(func):
187db96d56Sopenharmony_ci    """Needed to make reftracking test mode work."""
197db96d56Sopenharmony_ci    @functools.wraps(func)
207db96d56Sopenharmony_ci    def wrapper(*args, **kwargs):
217db96d56Sopenharmony_ci        ctx = contextvars.Context()
227db96d56Sopenharmony_ci        return ctx.run(func, *args, **kwargs)
237db96d56Sopenharmony_ci    return wrapper
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ciclass ContextTest(unittest.TestCase):
277db96d56Sopenharmony_ci    def test_context_var_new_1(self):
287db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'takes exactly 1'):
297db96d56Sopenharmony_ci            contextvars.ContextVar()
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'must be a str'):
327db96d56Sopenharmony_ci            contextvars.ContextVar(1)
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_ci        c = contextvars.ContextVar('aaa')
357db96d56Sopenharmony_ci        self.assertEqual(c.name, 'aaa')
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
387db96d56Sopenharmony_ci            c.name = 'bbb'
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci        self.assertNotEqual(hash(c), hash('aaa'))
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci    @isolated_context
437db96d56Sopenharmony_ci    def test_context_var_repr_1(self):
447db96d56Sopenharmony_ci        c = contextvars.ContextVar('a')
457db96d56Sopenharmony_ci        self.assertIn('a', repr(c))
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci        c = contextvars.ContextVar('a', default=123)
487db96d56Sopenharmony_ci        self.assertIn('123', repr(c))
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci        lst = []
517db96d56Sopenharmony_ci        c = contextvars.ContextVar('a', default=lst)
527db96d56Sopenharmony_ci        lst.append(c)
537db96d56Sopenharmony_ci        self.assertIn('...', repr(c))
547db96d56Sopenharmony_ci        self.assertIn('...', repr(lst))
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci        t = c.set(1)
577db96d56Sopenharmony_ci        self.assertIn(repr(c), repr(t))
587db96d56Sopenharmony_ci        self.assertNotIn(' used ', repr(t))
597db96d56Sopenharmony_ci        c.reset(t)
607db96d56Sopenharmony_ci        self.assertIn(' used ', repr(t))
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci    def test_context_subclassing_1(self):
637db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'not an acceptable base type'):
647db96d56Sopenharmony_ci            class MyContextVar(contextvars.ContextVar):
657db96d56Sopenharmony_ci                # Potentially we might want ContextVars to be subclassable.
667db96d56Sopenharmony_ci                pass
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'not an acceptable base type'):
697db96d56Sopenharmony_ci            class MyContext(contextvars.Context):
707db96d56Sopenharmony_ci                pass
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'not an acceptable base type'):
737db96d56Sopenharmony_ci            class MyToken(contextvars.Token):
747db96d56Sopenharmony_ci                pass
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci    def test_context_new_1(self):
777db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'any arguments'):
787db96d56Sopenharmony_ci            contextvars.Context(1)
797db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'any arguments'):
807db96d56Sopenharmony_ci            contextvars.Context(1, a=1)
817db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'any arguments'):
827db96d56Sopenharmony_ci            contextvars.Context(a=1)
837db96d56Sopenharmony_ci        contextvars.Context(**{})
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci    def test_context_typerrors_1(self):
867db96d56Sopenharmony_ci        ctx = contextvars.Context()
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'ContextVar key was expected'):
897db96d56Sopenharmony_ci            ctx[1]
907db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'ContextVar key was expected'):
917db96d56Sopenharmony_ci            1 in ctx
927db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'ContextVar key was expected'):
937db96d56Sopenharmony_ci            ctx.get(1)
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci    def test_context_get_context_1(self):
967db96d56Sopenharmony_ci        ctx = contextvars.copy_context()
977db96d56Sopenharmony_ci        self.assertIsInstance(ctx, contextvars.Context)
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci    def test_context_run_1(self):
1007db96d56Sopenharmony_ci        ctx = contextvars.Context()
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'missing 1 required'):
1037db96d56Sopenharmony_ci            ctx.run()
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci    def test_context_run_2(self):
1067db96d56Sopenharmony_ci        ctx = contextvars.Context()
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci        def func(*args, **kwargs):
1097db96d56Sopenharmony_ci            kwargs['spam'] = 'foo'
1107db96d56Sopenharmony_ci            args += ('bar',)
1117db96d56Sopenharmony_ci            return args, kwargs
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci        for f in (func, functools.partial(func)):
1147db96d56Sopenharmony_ci            # partial doesn't support FASTCALL
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci            self.assertEqual(ctx.run(f), (('bar',), {'spam': 'foo'}))
1177db96d56Sopenharmony_ci            self.assertEqual(ctx.run(f, 1), ((1, 'bar'), {'spam': 'foo'}))
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci            self.assertEqual(
1207db96d56Sopenharmony_ci                ctx.run(f, a=2),
1217db96d56Sopenharmony_ci                (('bar',), {'a': 2, 'spam': 'foo'}))
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci            self.assertEqual(
1247db96d56Sopenharmony_ci                ctx.run(f, 11, a=2),
1257db96d56Sopenharmony_ci                ((11, 'bar'), {'a': 2, 'spam': 'foo'}))
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ci            a = {}
1287db96d56Sopenharmony_ci            self.assertEqual(
1297db96d56Sopenharmony_ci                ctx.run(f, 11, **a),
1307db96d56Sopenharmony_ci                ((11, 'bar'), {'spam': 'foo'}))
1317db96d56Sopenharmony_ci            self.assertEqual(a, {})
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci    def test_context_run_3(self):
1347db96d56Sopenharmony_ci        ctx = contextvars.Context()
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci        def func(*args, **kwargs):
1377db96d56Sopenharmony_ci            1 / 0
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci        with self.assertRaises(ZeroDivisionError):
1407db96d56Sopenharmony_ci            ctx.run(func)
1417db96d56Sopenharmony_ci        with self.assertRaises(ZeroDivisionError):
1427db96d56Sopenharmony_ci            ctx.run(func, 1, 2)
1437db96d56Sopenharmony_ci        with self.assertRaises(ZeroDivisionError):
1447db96d56Sopenharmony_ci            ctx.run(func, 1, 2, a=123)
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci    @isolated_context
1477db96d56Sopenharmony_ci    def test_context_run_4(self):
1487db96d56Sopenharmony_ci        ctx1 = contextvars.Context()
1497db96d56Sopenharmony_ci        ctx2 = contextvars.Context()
1507db96d56Sopenharmony_ci        var = contextvars.ContextVar('var')
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci        def func2():
1537db96d56Sopenharmony_ci            self.assertIsNone(var.get(None))
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci        def func1():
1567db96d56Sopenharmony_ci            self.assertIsNone(var.get(None))
1577db96d56Sopenharmony_ci            var.set('spam')
1587db96d56Sopenharmony_ci            ctx2.run(func2)
1597db96d56Sopenharmony_ci            self.assertEqual(var.get(None), 'spam')
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci            cur = contextvars.copy_context()
1627db96d56Sopenharmony_ci            self.assertEqual(len(cur), 1)
1637db96d56Sopenharmony_ci            self.assertEqual(cur[var], 'spam')
1647db96d56Sopenharmony_ci            return cur
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci        returned_ctx = ctx1.run(func1)
1677db96d56Sopenharmony_ci        self.assertEqual(ctx1, returned_ctx)
1687db96d56Sopenharmony_ci        self.assertEqual(returned_ctx[var], 'spam')
1697db96d56Sopenharmony_ci        self.assertIn(var, returned_ctx)
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci    def test_context_run_5(self):
1727db96d56Sopenharmony_ci        ctx = contextvars.Context()
1737db96d56Sopenharmony_ci        var = contextvars.ContextVar('var')
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci        def func():
1767db96d56Sopenharmony_ci            self.assertIsNone(var.get(None))
1777db96d56Sopenharmony_ci            var.set('spam')
1787db96d56Sopenharmony_ci            1 / 0
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci        with self.assertRaises(ZeroDivisionError):
1817db96d56Sopenharmony_ci            ctx.run(func)
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ci        self.assertIsNone(var.get(None))
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci    def test_context_run_6(self):
1867db96d56Sopenharmony_ci        ctx = contextvars.Context()
1877db96d56Sopenharmony_ci        c = contextvars.ContextVar('a', default=0)
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ci        def fun():
1907db96d56Sopenharmony_ci            self.assertEqual(c.get(), 0)
1917db96d56Sopenharmony_ci            self.assertIsNone(ctx.get(c))
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci            c.set(42)
1947db96d56Sopenharmony_ci            self.assertEqual(c.get(), 42)
1957db96d56Sopenharmony_ci            self.assertEqual(ctx.get(c), 42)
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci        ctx.run(fun)
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci    def test_context_run_7(self):
2007db96d56Sopenharmony_ci        ctx = contextvars.Context()
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci        def fun():
2037db96d56Sopenharmony_ci            with self.assertRaisesRegex(RuntimeError, 'is already entered'):
2047db96d56Sopenharmony_ci                ctx.run(fun)
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci        ctx.run(fun)
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci    @isolated_context
2097db96d56Sopenharmony_ci    def test_context_getset_1(self):
2107db96d56Sopenharmony_ci        c = contextvars.ContextVar('c')
2117db96d56Sopenharmony_ci        with self.assertRaises(LookupError):
2127db96d56Sopenharmony_ci            c.get()
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci        self.assertIsNone(c.get(None))
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci        t0 = c.set(42)
2177db96d56Sopenharmony_ci        self.assertEqual(c.get(), 42)
2187db96d56Sopenharmony_ci        self.assertEqual(c.get(None), 42)
2197db96d56Sopenharmony_ci        self.assertIs(t0.old_value, t0.MISSING)
2207db96d56Sopenharmony_ci        self.assertIs(t0.old_value, contextvars.Token.MISSING)
2217db96d56Sopenharmony_ci        self.assertIs(t0.var, c)
2227db96d56Sopenharmony_ci
2237db96d56Sopenharmony_ci        t = c.set('spam')
2247db96d56Sopenharmony_ci        self.assertEqual(c.get(), 'spam')
2257db96d56Sopenharmony_ci        self.assertEqual(c.get(None), 'spam')
2267db96d56Sopenharmony_ci        self.assertEqual(t.old_value, 42)
2277db96d56Sopenharmony_ci        c.reset(t)
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ci        self.assertEqual(c.get(), 42)
2307db96d56Sopenharmony_ci        self.assertEqual(c.get(None), 42)
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci        c.set('spam2')
2337db96d56Sopenharmony_ci        with self.assertRaisesRegex(RuntimeError, 'has already been used'):
2347db96d56Sopenharmony_ci            c.reset(t)
2357db96d56Sopenharmony_ci        self.assertEqual(c.get(), 'spam2')
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci        ctx1 = contextvars.copy_context()
2387db96d56Sopenharmony_ci        self.assertIn(c, ctx1)
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci        c.reset(t0)
2417db96d56Sopenharmony_ci        with self.assertRaisesRegex(RuntimeError, 'has already been used'):
2427db96d56Sopenharmony_ci            c.reset(t0)
2437db96d56Sopenharmony_ci        self.assertIsNone(c.get(None))
2447db96d56Sopenharmony_ci
2457db96d56Sopenharmony_ci        self.assertIn(c, ctx1)
2467db96d56Sopenharmony_ci        self.assertEqual(ctx1[c], 'spam2')
2477db96d56Sopenharmony_ci        self.assertEqual(ctx1.get(c, 'aa'), 'spam2')
2487db96d56Sopenharmony_ci        self.assertEqual(len(ctx1), 1)
2497db96d56Sopenharmony_ci        self.assertEqual(list(ctx1.items()), [(c, 'spam2')])
2507db96d56Sopenharmony_ci        self.assertEqual(list(ctx1.values()), ['spam2'])
2517db96d56Sopenharmony_ci        self.assertEqual(list(ctx1.keys()), [c])
2527db96d56Sopenharmony_ci        self.assertEqual(list(ctx1), [c])
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci        ctx2 = contextvars.copy_context()
2557db96d56Sopenharmony_ci        self.assertNotIn(c, ctx2)
2567db96d56Sopenharmony_ci        with self.assertRaises(KeyError):
2577db96d56Sopenharmony_ci            ctx2[c]
2587db96d56Sopenharmony_ci        self.assertEqual(ctx2.get(c, 'aa'), 'aa')
2597db96d56Sopenharmony_ci        self.assertEqual(len(ctx2), 0)
2607db96d56Sopenharmony_ci        self.assertEqual(list(ctx2), [])
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ci    @isolated_context
2637db96d56Sopenharmony_ci    def test_context_getset_2(self):
2647db96d56Sopenharmony_ci        v1 = contextvars.ContextVar('v1')
2657db96d56Sopenharmony_ci        v2 = contextvars.ContextVar('v2')
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ci        t1 = v1.set(42)
2687db96d56Sopenharmony_ci        with self.assertRaisesRegex(ValueError, 'by a different'):
2697db96d56Sopenharmony_ci            v2.reset(t1)
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci    @isolated_context
2727db96d56Sopenharmony_ci    def test_context_getset_3(self):
2737db96d56Sopenharmony_ci        c = contextvars.ContextVar('c', default=42)
2747db96d56Sopenharmony_ci        ctx = contextvars.Context()
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ci        def fun():
2777db96d56Sopenharmony_ci            self.assertEqual(c.get(), 42)
2787db96d56Sopenharmony_ci            with self.assertRaises(KeyError):
2797db96d56Sopenharmony_ci                ctx[c]
2807db96d56Sopenharmony_ci            self.assertIsNone(ctx.get(c))
2817db96d56Sopenharmony_ci            self.assertEqual(ctx.get(c, 'spam'), 'spam')
2827db96d56Sopenharmony_ci            self.assertNotIn(c, ctx)
2837db96d56Sopenharmony_ci            self.assertEqual(list(ctx.keys()), [])
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci            t = c.set(1)
2867db96d56Sopenharmony_ci            self.assertEqual(list(ctx.keys()), [c])
2877db96d56Sopenharmony_ci            self.assertEqual(ctx[c], 1)
2887db96d56Sopenharmony_ci
2897db96d56Sopenharmony_ci            c.reset(t)
2907db96d56Sopenharmony_ci            self.assertEqual(list(ctx.keys()), [])
2917db96d56Sopenharmony_ci            with self.assertRaises(KeyError):
2927db96d56Sopenharmony_ci                ctx[c]
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci        ctx.run(fun)
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci    @isolated_context
2977db96d56Sopenharmony_ci    def test_context_getset_4(self):
2987db96d56Sopenharmony_ci        c = contextvars.ContextVar('c', default=42)
2997db96d56Sopenharmony_ci        ctx = contextvars.Context()
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci        tok = ctx.run(c.set, 1)
3027db96d56Sopenharmony_ci
3037db96d56Sopenharmony_ci        with self.assertRaisesRegex(ValueError, 'different Context'):
3047db96d56Sopenharmony_ci            c.reset(tok)
3057db96d56Sopenharmony_ci
3067db96d56Sopenharmony_ci    @isolated_context
3077db96d56Sopenharmony_ci    def test_context_getset_5(self):
3087db96d56Sopenharmony_ci        c = contextvars.ContextVar('c', default=42)
3097db96d56Sopenharmony_ci        c.set([])
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci        def fun():
3127db96d56Sopenharmony_ci            c.set([])
3137db96d56Sopenharmony_ci            c.get().append(42)
3147db96d56Sopenharmony_ci            self.assertEqual(c.get(), [42])
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ci        contextvars.copy_context().run(fun)
3177db96d56Sopenharmony_ci        self.assertEqual(c.get(), [])
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ci    def test_context_copy_1(self):
3207db96d56Sopenharmony_ci        ctx1 = contextvars.Context()
3217db96d56Sopenharmony_ci        c = contextvars.ContextVar('c', default=42)
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci        def ctx1_fun():
3247db96d56Sopenharmony_ci            c.set(10)
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci            ctx2 = ctx1.copy()
3277db96d56Sopenharmony_ci            self.assertEqual(ctx2[c], 10)
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci            c.set(20)
3307db96d56Sopenharmony_ci            self.assertEqual(ctx1[c], 20)
3317db96d56Sopenharmony_ci            self.assertEqual(ctx2[c], 10)
3327db96d56Sopenharmony_ci
3337db96d56Sopenharmony_ci            ctx2.run(ctx2_fun)
3347db96d56Sopenharmony_ci            self.assertEqual(ctx1[c], 20)
3357db96d56Sopenharmony_ci            self.assertEqual(ctx2[c], 30)
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ci        def ctx2_fun():
3387db96d56Sopenharmony_ci            self.assertEqual(c.get(), 10)
3397db96d56Sopenharmony_ci            c.set(30)
3407db96d56Sopenharmony_ci            self.assertEqual(c.get(), 30)
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci        ctx1.run(ctx1_fun)
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_ci    @isolated_context
3457db96d56Sopenharmony_ci    @threading_helper.requires_working_threading()
3467db96d56Sopenharmony_ci    def test_context_threads_1(self):
3477db96d56Sopenharmony_ci        cvar = contextvars.ContextVar('cvar')
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci        def sub(num):
3507db96d56Sopenharmony_ci            for i in range(10):
3517db96d56Sopenharmony_ci                cvar.set(num + i)
3527db96d56Sopenharmony_ci                time.sleep(random.uniform(0.001, 0.05))
3537db96d56Sopenharmony_ci                self.assertEqual(cvar.get(), num + i)
3547db96d56Sopenharmony_ci            return num
3557db96d56Sopenharmony_ci
3567db96d56Sopenharmony_ci        tp = concurrent.futures.ThreadPoolExecutor(max_workers=10)
3577db96d56Sopenharmony_ci        try:
3587db96d56Sopenharmony_ci            results = list(tp.map(sub, range(10)))
3597db96d56Sopenharmony_ci        finally:
3607db96d56Sopenharmony_ci            tp.shutdown()
3617db96d56Sopenharmony_ci        self.assertEqual(results, list(range(10)))
3627db96d56Sopenharmony_ci
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ci# HAMT Tests
3657db96d56Sopenharmony_ci
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ciclass HashKey:
3687db96d56Sopenharmony_ci    _crasher = None
3697db96d56Sopenharmony_ci
3707db96d56Sopenharmony_ci    def __init__(self, hash, name, *, error_on_eq_to=None):
3717db96d56Sopenharmony_ci        assert hash != -1
3727db96d56Sopenharmony_ci        self.name = name
3737db96d56Sopenharmony_ci        self.hash = hash
3747db96d56Sopenharmony_ci        self.error_on_eq_to = error_on_eq_to
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci    def __repr__(self):
3777db96d56Sopenharmony_ci        return f'<Key name:{self.name} hash:{self.hash}>'
3787db96d56Sopenharmony_ci
3797db96d56Sopenharmony_ci    def __hash__(self):
3807db96d56Sopenharmony_ci        if self._crasher is not None and self._crasher.error_on_hash:
3817db96d56Sopenharmony_ci            raise HashingError
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci        return self.hash
3847db96d56Sopenharmony_ci
3857db96d56Sopenharmony_ci    def __eq__(self, other):
3867db96d56Sopenharmony_ci        if not isinstance(other, HashKey):
3877db96d56Sopenharmony_ci            return NotImplemented
3887db96d56Sopenharmony_ci
3897db96d56Sopenharmony_ci        if self._crasher is not None and self._crasher.error_on_eq:
3907db96d56Sopenharmony_ci            raise EqError
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_ci        if self.error_on_eq_to is not None and self.error_on_eq_to is other:
3937db96d56Sopenharmony_ci            raise ValueError(f'cannot compare {self!r} to {other!r}')
3947db96d56Sopenharmony_ci        if other.error_on_eq_to is not None and other.error_on_eq_to is self:
3957db96d56Sopenharmony_ci            raise ValueError(f'cannot compare {other!r} to {self!r}')
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ci        return (self.name, self.hash) == (other.name, other.hash)
3987db96d56Sopenharmony_ci
3997db96d56Sopenharmony_ci
4007db96d56Sopenharmony_ciclass KeyStr(str):
4017db96d56Sopenharmony_ci    def __hash__(self):
4027db96d56Sopenharmony_ci        if HashKey._crasher is not None and HashKey._crasher.error_on_hash:
4037db96d56Sopenharmony_ci            raise HashingError
4047db96d56Sopenharmony_ci        return super().__hash__()
4057db96d56Sopenharmony_ci
4067db96d56Sopenharmony_ci    def __eq__(self, other):
4077db96d56Sopenharmony_ci        if HashKey._crasher is not None and HashKey._crasher.error_on_eq:
4087db96d56Sopenharmony_ci            raise EqError
4097db96d56Sopenharmony_ci        return super().__eq__(other)
4107db96d56Sopenharmony_ci
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ciclass HaskKeyCrasher:
4137db96d56Sopenharmony_ci    def __init__(self, *, error_on_hash=False, error_on_eq=False):
4147db96d56Sopenharmony_ci        self.error_on_hash = error_on_hash
4157db96d56Sopenharmony_ci        self.error_on_eq = error_on_eq
4167db96d56Sopenharmony_ci
4177db96d56Sopenharmony_ci    def __enter__(self):
4187db96d56Sopenharmony_ci        if HashKey._crasher is not None:
4197db96d56Sopenharmony_ci            raise RuntimeError('cannot nest crashers')
4207db96d56Sopenharmony_ci        HashKey._crasher = self
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci    def __exit__(self, *exc):
4237db96d56Sopenharmony_ci        HashKey._crasher = None
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ciclass HashingError(Exception):
4277db96d56Sopenharmony_ci    pass
4287db96d56Sopenharmony_ci
4297db96d56Sopenharmony_ci
4307db96d56Sopenharmony_ciclass EqError(Exception):
4317db96d56Sopenharmony_ci    pass
4327db96d56Sopenharmony_ci
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci@unittest.skipIf(hamt is None, '_testcapi lacks "hamt()" function')
4357db96d56Sopenharmony_ciclass HamtTest(unittest.TestCase):
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ci    def test_hashkey_helper_1(self):
4387db96d56Sopenharmony_ci        k1 = HashKey(10, 'aaa')
4397db96d56Sopenharmony_ci        k2 = HashKey(10, 'bbb')
4407db96d56Sopenharmony_ci
4417db96d56Sopenharmony_ci        self.assertNotEqual(k1, k2)
4427db96d56Sopenharmony_ci        self.assertEqual(hash(k1), hash(k2))
4437db96d56Sopenharmony_ci
4447db96d56Sopenharmony_ci        d = dict()
4457db96d56Sopenharmony_ci        d[k1] = 'a'
4467db96d56Sopenharmony_ci        d[k2] = 'b'
4477db96d56Sopenharmony_ci
4487db96d56Sopenharmony_ci        self.assertEqual(d[k1], 'a')
4497db96d56Sopenharmony_ci        self.assertEqual(d[k2], 'b')
4507db96d56Sopenharmony_ci
4517db96d56Sopenharmony_ci    def test_hamt_basics_1(self):
4527db96d56Sopenharmony_ci        h = hamt()
4537db96d56Sopenharmony_ci        h = None  # NoQA
4547db96d56Sopenharmony_ci
4557db96d56Sopenharmony_ci    def test_hamt_basics_2(self):
4567db96d56Sopenharmony_ci        h = hamt()
4577db96d56Sopenharmony_ci        self.assertEqual(len(h), 0)
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci        h2 = h.set('a', 'b')
4607db96d56Sopenharmony_ci        self.assertIsNot(h, h2)
4617db96d56Sopenharmony_ci        self.assertEqual(len(h), 0)
4627db96d56Sopenharmony_ci        self.assertEqual(len(h2), 1)
4637db96d56Sopenharmony_ci
4647db96d56Sopenharmony_ci        self.assertIsNone(h.get('a'))
4657db96d56Sopenharmony_ci        self.assertEqual(h.get('a', 42), 42)
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci        self.assertEqual(h2.get('a'), 'b')
4687db96d56Sopenharmony_ci
4697db96d56Sopenharmony_ci        h3 = h2.set('b', 10)
4707db96d56Sopenharmony_ci        self.assertIsNot(h2, h3)
4717db96d56Sopenharmony_ci        self.assertEqual(len(h), 0)
4727db96d56Sopenharmony_ci        self.assertEqual(len(h2), 1)
4737db96d56Sopenharmony_ci        self.assertEqual(len(h3), 2)
4747db96d56Sopenharmony_ci        self.assertEqual(h3.get('a'), 'b')
4757db96d56Sopenharmony_ci        self.assertEqual(h3.get('b'), 10)
4767db96d56Sopenharmony_ci
4777db96d56Sopenharmony_ci        self.assertIsNone(h.get('b'))
4787db96d56Sopenharmony_ci        self.assertIsNone(h2.get('b'))
4797db96d56Sopenharmony_ci
4807db96d56Sopenharmony_ci        self.assertIsNone(h.get('a'))
4817db96d56Sopenharmony_ci        self.assertEqual(h2.get('a'), 'b')
4827db96d56Sopenharmony_ci
4837db96d56Sopenharmony_ci        h = h2 = h3 = None
4847db96d56Sopenharmony_ci
4857db96d56Sopenharmony_ci    def test_hamt_basics_3(self):
4867db96d56Sopenharmony_ci        h = hamt()
4877db96d56Sopenharmony_ci        o = object()
4887db96d56Sopenharmony_ci        h1 = h.set('1', o)
4897db96d56Sopenharmony_ci        h2 = h1.set('1', o)
4907db96d56Sopenharmony_ci        self.assertIs(h1, h2)
4917db96d56Sopenharmony_ci
4927db96d56Sopenharmony_ci    def test_hamt_basics_4(self):
4937db96d56Sopenharmony_ci        h = hamt()
4947db96d56Sopenharmony_ci        h1 = h.set('key', [])
4957db96d56Sopenharmony_ci        h2 = h1.set('key', [])
4967db96d56Sopenharmony_ci        self.assertIsNot(h1, h2)
4977db96d56Sopenharmony_ci        self.assertEqual(len(h1), 1)
4987db96d56Sopenharmony_ci        self.assertEqual(len(h2), 1)
4997db96d56Sopenharmony_ci        self.assertIsNot(h1.get('key'), h2.get('key'))
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci    def test_hamt_collision_1(self):
5027db96d56Sopenharmony_ci        k1 = HashKey(10, 'aaa')
5037db96d56Sopenharmony_ci        k2 = HashKey(10, 'bbb')
5047db96d56Sopenharmony_ci        k3 = HashKey(10, 'ccc')
5057db96d56Sopenharmony_ci
5067db96d56Sopenharmony_ci        h = hamt()
5077db96d56Sopenharmony_ci        h2 = h.set(k1, 'a')
5087db96d56Sopenharmony_ci        h3 = h2.set(k2, 'b')
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_ci        self.assertEqual(h.get(k1), None)
5117db96d56Sopenharmony_ci        self.assertEqual(h.get(k2), None)
5127db96d56Sopenharmony_ci
5137db96d56Sopenharmony_ci        self.assertEqual(h2.get(k1), 'a')
5147db96d56Sopenharmony_ci        self.assertEqual(h2.get(k2), None)
5157db96d56Sopenharmony_ci
5167db96d56Sopenharmony_ci        self.assertEqual(h3.get(k1), 'a')
5177db96d56Sopenharmony_ci        self.assertEqual(h3.get(k2), 'b')
5187db96d56Sopenharmony_ci
5197db96d56Sopenharmony_ci        h4 = h3.set(k2, 'cc')
5207db96d56Sopenharmony_ci        h5 = h4.set(k3, 'aa')
5217db96d56Sopenharmony_ci
5227db96d56Sopenharmony_ci        self.assertEqual(h3.get(k1), 'a')
5237db96d56Sopenharmony_ci        self.assertEqual(h3.get(k2), 'b')
5247db96d56Sopenharmony_ci        self.assertEqual(h4.get(k1), 'a')
5257db96d56Sopenharmony_ci        self.assertEqual(h4.get(k2), 'cc')
5267db96d56Sopenharmony_ci        self.assertEqual(h4.get(k3), None)
5277db96d56Sopenharmony_ci        self.assertEqual(h5.get(k1), 'a')
5287db96d56Sopenharmony_ci        self.assertEqual(h5.get(k2), 'cc')
5297db96d56Sopenharmony_ci        self.assertEqual(h5.get(k2), 'cc')
5307db96d56Sopenharmony_ci        self.assertEqual(h5.get(k3), 'aa')
5317db96d56Sopenharmony_ci
5327db96d56Sopenharmony_ci        self.assertEqual(len(h), 0)
5337db96d56Sopenharmony_ci        self.assertEqual(len(h2), 1)
5347db96d56Sopenharmony_ci        self.assertEqual(len(h3), 2)
5357db96d56Sopenharmony_ci        self.assertEqual(len(h4), 2)
5367db96d56Sopenharmony_ci        self.assertEqual(len(h5), 3)
5377db96d56Sopenharmony_ci
5387db96d56Sopenharmony_ci    def test_hamt_collision_3(self):
5397db96d56Sopenharmony_ci        # Test that iteration works with the deepest tree possible.
5407db96d56Sopenharmony_ci        # https://github.com/python/cpython/issues/93065
5417db96d56Sopenharmony_ci
5427db96d56Sopenharmony_ci        C = HashKey(0b10000000_00000000_00000000_00000000, 'C')
5437db96d56Sopenharmony_ci        D = HashKey(0b10000000_00000000_00000000_00000000, 'D')
5447db96d56Sopenharmony_ci
5457db96d56Sopenharmony_ci        E = HashKey(0b00000000_00000000_00000000_00000000, 'E')
5467db96d56Sopenharmony_ci
5477db96d56Sopenharmony_ci        h = hamt()
5487db96d56Sopenharmony_ci        h = h.set(C, 'C')
5497db96d56Sopenharmony_ci        h = h.set(D, 'D')
5507db96d56Sopenharmony_ci        h = h.set(E, 'E')
5517db96d56Sopenharmony_ci
5527db96d56Sopenharmony_ci        # BitmapNode(size=2 count=1 bitmap=0b1):
5537db96d56Sopenharmony_ci        #   NULL:
5547db96d56Sopenharmony_ci        #     BitmapNode(size=2 count=1 bitmap=0b1):
5557db96d56Sopenharmony_ci        #       NULL:
5567db96d56Sopenharmony_ci        #         BitmapNode(size=2 count=1 bitmap=0b1):
5577db96d56Sopenharmony_ci        #           NULL:
5587db96d56Sopenharmony_ci        #             BitmapNode(size=2 count=1 bitmap=0b1):
5597db96d56Sopenharmony_ci        #               NULL:
5607db96d56Sopenharmony_ci        #                 BitmapNode(size=2 count=1 bitmap=0b1):
5617db96d56Sopenharmony_ci        #                   NULL:
5627db96d56Sopenharmony_ci        #                     BitmapNode(size=2 count=1 bitmap=0b1):
5637db96d56Sopenharmony_ci        #                       NULL:
5647db96d56Sopenharmony_ci        #                         BitmapNode(size=4 count=2 bitmap=0b101):
5657db96d56Sopenharmony_ci        #                           <Key name:E hash:0>: 'E'
5667db96d56Sopenharmony_ci        #                           NULL:
5677db96d56Sopenharmony_ci        #                             CollisionNode(size=4 id=0x107a24520):
5687db96d56Sopenharmony_ci        #                               <Key name:C hash:2147483648>: 'C'
5697db96d56Sopenharmony_ci        #                               <Key name:D hash:2147483648>: 'D'
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci        self.assertEqual({k.name for k in h.keys()}, {'C', 'D', 'E'})
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ci    def test_hamt_stress(self):
5747db96d56Sopenharmony_ci        COLLECTION_SIZE = 7000
5757db96d56Sopenharmony_ci        TEST_ITERS_EVERY = 647
5767db96d56Sopenharmony_ci        CRASH_HASH_EVERY = 97
5777db96d56Sopenharmony_ci        CRASH_EQ_EVERY = 11
5787db96d56Sopenharmony_ci        RUN_XTIMES = 3
5797db96d56Sopenharmony_ci
5807db96d56Sopenharmony_ci        for _ in range(RUN_XTIMES):
5817db96d56Sopenharmony_ci            h = hamt()
5827db96d56Sopenharmony_ci            d = dict()
5837db96d56Sopenharmony_ci
5847db96d56Sopenharmony_ci            for i in range(COLLECTION_SIZE):
5857db96d56Sopenharmony_ci                key = KeyStr(i)
5867db96d56Sopenharmony_ci
5877db96d56Sopenharmony_ci                if not (i % CRASH_HASH_EVERY):
5887db96d56Sopenharmony_ci                    with HaskKeyCrasher(error_on_hash=True):
5897db96d56Sopenharmony_ci                        with self.assertRaises(HashingError):
5907db96d56Sopenharmony_ci                            h.set(key, i)
5917db96d56Sopenharmony_ci
5927db96d56Sopenharmony_ci                h = h.set(key, i)
5937db96d56Sopenharmony_ci
5947db96d56Sopenharmony_ci                if not (i % CRASH_EQ_EVERY):
5957db96d56Sopenharmony_ci                    with HaskKeyCrasher(error_on_eq=True):
5967db96d56Sopenharmony_ci                        with self.assertRaises(EqError):
5977db96d56Sopenharmony_ci                            h.get(KeyStr(i))  # really trigger __eq__
5987db96d56Sopenharmony_ci
5997db96d56Sopenharmony_ci                d[key] = i
6007db96d56Sopenharmony_ci                self.assertEqual(len(d), len(h))
6017db96d56Sopenharmony_ci
6027db96d56Sopenharmony_ci                if not (i % TEST_ITERS_EVERY):
6037db96d56Sopenharmony_ci                    self.assertEqual(set(h.items()), set(d.items()))
6047db96d56Sopenharmony_ci                    self.assertEqual(len(h.items()), len(d.items()))
6057db96d56Sopenharmony_ci
6067db96d56Sopenharmony_ci            self.assertEqual(len(h), COLLECTION_SIZE)
6077db96d56Sopenharmony_ci
6087db96d56Sopenharmony_ci            for key in range(COLLECTION_SIZE):
6097db96d56Sopenharmony_ci                self.assertEqual(h.get(KeyStr(key), 'not found'), key)
6107db96d56Sopenharmony_ci
6117db96d56Sopenharmony_ci            keys_to_delete = list(range(COLLECTION_SIZE))
6127db96d56Sopenharmony_ci            random.shuffle(keys_to_delete)
6137db96d56Sopenharmony_ci            for iter_i, i in enumerate(keys_to_delete):
6147db96d56Sopenharmony_ci                key = KeyStr(i)
6157db96d56Sopenharmony_ci
6167db96d56Sopenharmony_ci                if not (iter_i % CRASH_HASH_EVERY):
6177db96d56Sopenharmony_ci                    with HaskKeyCrasher(error_on_hash=True):
6187db96d56Sopenharmony_ci                        with self.assertRaises(HashingError):
6197db96d56Sopenharmony_ci                            h.delete(key)
6207db96d56Sopenharmony_ci
6217db96d56Sopenharmony_ci                if not (iter_i % CRASH_EQ_EVERY):
6227db96d56Sopenharmony_ci                    with HaskKeyCrasher(error_on_eq=True):
6237db96d56Sopenharmony_ci                        with self.assertRaises(EqError):
6247db96d56Sopenharmony_ci                            h.delete(KeyStr(i))
6257db96d56Sopenharmony_ci
6267db96d56Sopenharmony_ci                h = h.delete(key)
6277db96d56Sopenharmony_ci                self.assertEqual(h.get(key, 'not found'), 'not found')
6287db96d56Sopenharmony_ci                del d[key]
6297db96d56Sopenharmony_ci                self.assertEqual(len(d), len(h))
6307db96d56Sopenharmony_ci
6317db96d56Sopenharmony_ci                if iter_i == COLLECTION_SIZE // 2:
6327db96d56Sopenharmony_ci                    hm = h
6337db96d56Sopenharmony_ci                    dm = d.copy()
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci                if not (iter_i % TEST_ITERS_EVERY):
6367db96d56Sopenharmony_ci                    self.assertEqual(set(h.keys()), set(d.keys()))
6377db96d56Sopenharmony_ci                    self.assertEqual(len(h.keys()), len(d.keys()))
6387db96d56Sopenharmony_ci
6397db96d56Sopenharmony_ci            self.assertEqual(len(d), 0)
6407db96d56Sopenharmony_ci            self.assertEqual(len(h), 0)
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ci            # ============
6437db96d56Sopenharmony_ci
6447db96d56Sopenharmony_ci            for key in dm:
6457db96d56Sopenharmony_ci                self.assertEqual(hm.get(str(key)), dm[key])
6467db96d56Sopenharmony_ci            self.assertEqual(len(dm), len(hm))
6477db96d56Sopenharmony_ci
6487db96d56Sopenharmony_ci            for i, key in enumerate(keys_to_delete):
6497db96d56Sopenharmony_ci                hm = hm.delete(str(key))
6507db96d56Sopenharmony_ci                self.assertEqual(hm.get(str(key), 'not found'), 'not found')
6517db96d56Sopenharmony_ci                dm.pop(str(key), None)
6527db96d56Sopenharmony_ci                self.assertEqual(len(d), len(h))
6537db96d56Sopenharmony_ci
6547db96d56Sopenharmony_ci                if not (i % TEST_ITERS_EVERY):
6557db96d56Sopenharmony_ci                    self.assertEqual(set(h.values()), set(d.values()))
6567db96d56Sopenharmony_ci                    self.assertEqual(len(h.values()), len(d.values()))
6577db96d56Sopenharmony_ci
6587db96d56Sopenharmony_ci            self.assertEqual(len(d), 0)
6597db96d56Sopenharmony_ci            self.assertEqual(len(h), 0)
6607db96d56Sopenharmony_ci            self.assertEqual(list(h.items()), [])
6617db96d56Sopenharmony_ci
6627db96d56Sopenharmony_ci    def test_hamt_delete_1(self):
6637db96d56Sopenharmony_ci        A = HashKey(100, 'A')
6647db96d56Sopenharmony_ci        B = HashKey(101, 'B')
6657db96d56Sopenharmony_ci        C = HashKey(102, 'C')
6667db96d56Sopenharmony_ci        D = HashKey(103, 'D')
6677db96d56Sopenharmony_ci        E = HashKey(104, 'E')
6687db96d56Sopenharmony_ci        Z = HashKey(-100, 'Z')
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci        Er = HashKey(103, 'Er', error_on_eq_to=D)
6717db96d56Sopenharmony_ci
6727db96d56Sopenharmony_ci        h = hamt()
6737db96d56Sopenharmony_ci        h = h.set(A, 'a')
6747db96d56Sopenharmony_ci        h = h.set(B, 'b')
6757db96d56Sopenharmony_ci        h = h.set(C, 'c')
6767db96d56Sopenharmony_ci        h = h.set(D, 'd')
6777db96d56Sopenharmony_ci        h = h.set(E, 'e')
6787db96d56Sopenharmony_ci
6797db96d56Sopenharmony_ci        orig_len = len(h)
6807db96d56Sopenharmony_ci
6817db96d56Sopenharmony_ci        # BitmapNode(size=10 bitmap=0b111110000 id=0x10eadc618):
6827db96d56Sopenharmony_ci        #     <Key name:A hash:100>: 'a'
6837db96d56Sopenharmony_ci        #     <Key name:B hash:101>: 'b'
6847db96d56Sopenharmony_ci        #     <Key name:C hash:102>: 'c'
6857db96d56Sopenharmony_ci        #     <Key name:D hash:103>: 'd'
6867db96d56Sopenharmony_ci        #     <Key name:E hash:104>: 'e'
6877db96d56Sopenharmony_ci
6887db96d56Sopenharmony_ci        h = h.delete(C)
6897db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len - 1)
6907db96d56Sopenharmony_ci
6917db96d56Sopenharmony_ci        with self.assertRaisesRegex(ValueError, 'cannot compare'):
6927db96d56Sopenharmony_ci            h.delete(Er)
6937db96d56Sopenharmony_ci
6947db96d56Sopenharmony_ci        h = h.delete(D)
6957db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len - 2)
6967db96d56Sopenharmony_ci
6977db96d56Sopenharmony_ci        h2 = h.delete(Z)
6987db96d56Sopenharmony_ci        self.assertIs(h2, h)
6997db96d56Sopenharmony_ci
7007db96d56Sopenharmony_ci        h = h.delete(A)
7017db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len - 3)
7027db96d56Sopenharmony_ci
7037db96d56Sopenharmony_ci        self.assertEqual(h.get(A, 42), 42)
7047db96d56Sopenharmony_ci        self.assertEqual(h.get(B), 'b')
7057db96d56Sopenharmony_ci        self.assertEqual(h.get(E), 'e')
7067db96d56Sopenharmony_ci
7077db96d56Sopenharmony_ci    def test_hamt_delete_2(self):
7087db96d56Sopenharmony_ci        A = HashKey(100, 'A')
7097db96d56Sopenharmony_ci        B = HashKey(201001, 'B')
7107db96d56Sopenharmony_ci        C = HashKey(101001, 'C')
7117db96d56Sopenharmony_ci        D = HashKey(103, 'D')
7127db96d56Sopenharmony_ci        E = HashKey(104, 'E')
7137db96d56Sopenharmony_ci        Z = HashKey(-100, 'Z')
7147db96d56Sopenharmony_ci
7157db96d56Sopenharmony_ci        Er = HashKey(201001, 'Er', error_on_eq_to=B)
7167db96d56Sopenharmony_ci
7177db96d56Sopenharmony_ci        h = hamt()
7187db96d56Sopenharmony_ci        h = h.set(A, 'a')
7197db96d56Sopenharmony_ci        h = h.set(B, 'b')
7207db96d56Sopenharmony_ci        h = h.set(C, 'c')
7217db96d56Sopenharmony_ci        h = h.set(D, 'd')
7227db96d56Sopenharmony_ci        h = h.set(E, 'e')
7237db96d56Sopenharmony_ci
7247db96d56Sopenharmony_ci        orig_len = len(h)
7257db96d56Sopenharmony_ci
7267db96d56Sopenharmony_ci        # BitmapNode(size=8 bitmap=0b1110010000):
7277db96d56Sopenharmony_ci        #     <Key name:A hash:100>: 'a'
7287db96d56Sopenharmony_ci        #     <Key name:D hash:103>: 'd'
7297db96d56Sopenharmony_ci        #     <Key name:E hash:104>: 'e'
7307db96d56Sopenharmony_ci        #     NULL:
7317db96d56Sopenharmony_ci        #         BitmapNode(size=4 bitmap=0b100000000001000000000):
7327db96d56Sopenharmony_ci        #             <Key name:B hash:201001>: 'b'
7337db96d56Sopenharmony_ci        #             <Key name:C hash:101001>: 'c'
7347db96d56Sopenharmony_ci
7357db96d56Sopenharmony_ci        with self.assertRaisesRegex(ValueError, 'cannot compare'):
7367db96d56Sopenharmony_ci            h.delete(Er)
7377db96d56Sopenharmony_ci
7387db96d56Sopenharmony_ci        h = h.delete(Z)
7397db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len)
7407db96d56Sopenharmony_ci
7417db96d56Sopenharmony_ci        h = h.delete(C)
7427db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len - 1)
7437db96d56Sopenharmony_ci
7447db96d56Sopenharmony_ci        h = h.delete(B)
7457db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len - 2)
7467db96d56Sopenharmony_ci
7477db96d56Sopenharmony_ci        h = h.delete(A)
7487db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len - 3)
7497db96d56Sopenharmony_ci
7507db96d56Sopenharmony_ci        self.assertEqual(h.get(D), 'd')
7517db96d56Sopenharmony_ci        self.assertEqual(h.get(E), 'e')
7527db96d56Sopenharmony_ci
7537db96d56Sopenharmony_ci        h = h.delete(A)
7547db96d56Sopenharmony_ci        h = h.delete(B)
7557db96d56Sopenharmony_ci        h = h.delete(D)
7567db96d56Sopenharmony_ci        h = h.delete(E)
7577db96d56Sopenharmony_ci        self.assertEqual(len(h), 0)
7587db96d56Sopenharmony_ci
7597db96d56Sopenharmony_ci    def test_hamt_delete_3(self):
7607db96d56Sopenharmony_ci        A = HashKey(100, 'A')
7617db96d56Sopenharmony_ci        B = HashKey(101, 'B')
7627db96d56Sopenharmony_ci        C = HashKey(100100, 'C')
7637db96d56Sopenharmony_ci        D = HashKey(100100, 'D')
7647db96d56Sopenharmony_ci        E = HashKey(104, 'E')
7657db96d56Sopenharmony_ci
7667db96d56Sopenharmony_ci        h = hamt()
7677db96d56Sopenharmony_ci        h = h.set(A, 'a')
7687db96d56Sopenharmony_ci        h = h.set(B, 'b')
7697db96d56Sopenharmony_ci        h = h.set(C, 'c')
7707db96d56Sopenharmony_ci        h = h.set(D, 'd')
7717db96d56Sopenharmony_ci        h = h.set(E, 'e')
7727db96d56Sopenharmony_ci
7737db96d56Sopenharmony_ci        orig_len = len(h)
7747db96d56Sopenharmony_ci
7757db96d56Sopenharmony_ci        # BitmapNode(size=6 bitmap=0b100110000):
7767db96d56Sopenharmony_ci        #     NULL:
7777db96d56Sopenharmony_ci        #         BitmapNode(size=4 bitmap=0b1000000000000000000001000):
7787db96d56Sopenharmony_ci        #             <Key name:A hash:100>: 'a'
7797db96d56Sopenharmony_ci        #             NULL:
7807db96d56Sopenharmony_ci        #                 CollisionNode(size=4 id=0x108572410):
7817db96d56Sopenharmony_ci        #                     <Key name:C hash:100100>: 'c'
7827db96d56Sopenharmony_ci        #                     <Key name:D hash:100100>: 'd'
7837db96d56Sopenharmony_ci        #     <Key name:B hash:101>: 'b'
7847db96d56Sopenharmony_ci        #     <Key name:E hash:104>: 'e'
7857db96d56Sopenharmony_ci
7867db96d56Sopenharmony_ci        h = h.delete(A)
7877db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len - 1)
7887db96d56Sopenharmony_ci
7897db96d56Sopenharmony_ci        h = h.delete(E)
7907db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len - 2)
7917db96d56Sopenharmony_ci
7927db96d56Sopenharmony_ci        self.assertEqual(h.get(C), 'c')
7937db96d56Sopenharmony_ci        self.assertEqual(h.get(B), 'b')
7947db96d56Sopenharmony_ci
7957db96d56Sopenharmony_ci    def test_hamt_delete_4(self):
7967db96d56Sopenharmony_ci        A = HashKey(100, 'A')
7977db96d56Sopenharmony_ci        B = HashKey(101, 'B')
7987db96d56Sopenharmony_ci        C = HashKey(100100, 'C')
7997db96d56Sopenharmony_ci        D = HashKey(100100, 'D')
8007db96d56Sopenharmony_ci        E = HashKey(100100, 'E')
8017db96d56Sopenharmony_ci
8027db96d56Sopenharmony_ci        h = hamt()
8037db96d56Sopenharmony_ci        h = h.set(A, 'a')
8047db96d56Sopenharmony_ci        h = h.set(B, 'b')
8057db96d56Sopenharmony_ci        h = h.set(C, 'c')
8067db96d56Sopenharmony_ci        h = h.set(D, 'd')
8077db96d56Sopenharmony_ci        h = h.set(E, 'e')
8087db96d56Sopenharmony_ci
8097db96d56Sopenharmony_ci        orig_len = len(h)
8107db96d56Sopenharmony_ci
8117db96d56Sopenharmony_ci        # BitmapNode(size=4 bitmap=0b110000):
8127db96d56Sopenharmony_ci        #     NULL:
8137db96d56Sopenharmony_ci        #         BitmapNode(size=4 bitmap=0b1000000000000000000001000):
8147db96d56Sopenharmony_ci        #             <Key name:A hash:100>: 'a'
8157db96d56Sopenharmony_ci        #             NULL:
8167db96d56Sopenharmony_ci        #                 CollisionNode(size=6 id=0x10515ef30):
8177db96d56Sopenharmony_ci        #                     <Key name:C hash:100100>: 'c'
8187db96d56Sopenharmony_ci        #                     <Key name:D hash:100100>: 'd'
8197db96d56Sopenharmony_ci        #                     <Key name:E hash:100100>: 'e'
8207db96d56Sopenharmony_ci        #     <Key name:B hash:101>: 'b'
8217db96d56Sopenharmony_ci
8227db96d56Sopenharmony_ci        h = h.delete(D)
8237db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len - 1)
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_ci        h = h.delete(E)
8267db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len - 2)
8277db96d56Sopenharmony_ci
8287db96d56Sopenharmony_ci        h = h.delete(C)
8297db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len - 3)
8307db96d56Sopenharmony_ci
8317db96d56Sopenharmony_ci        h = h.delete(A)
8327db96d56Sopenharmony_ci        self.assertEqual(len(h), orig_len - 4)
8337db96d56Sopenharmony_ci
8347db96d56Sopenharmony_ci        h = h.delete(B)
8357db96d56Sopenharmony_ci        self.assertEqual(len(h), 0)
8367db96d56Sopenharmony_ci
8377db96d56Sopenharmony_ci    def test_hamt_delete_5(self):
8387db96d56Sopenharmony_ci        h = hamt()
8397db96d56Sopenharmony_ci
8407db96d56Sopenharmony_ci        keys = []
8417db96d56Sopenharmony_ci        for i in range(17):
8427db96d56Sopenharmony_ci            key = HashKey(i, str(i))
8437db96d56Sopenharmony_ci            keys.append(key)
8447db96d56Sopenharmony_ci            h = h.set(key, f'val-{i}')
8457db96d56Sopenharmony_ci
8467db96d56Sopenharmony_ci        collision_key16 = HashKey(16, '18')
8477db96d56Sopenharmony_ci        h = h.set(collision_key16, 'collision')
8487db96d56Sopenharmony_ci
8497db96d56Sopenharmony_ci        # ArrayNode(id=0x10f8b9318):
8507db96d56Sopenharmony_ci        #     0::
8517db96d56Sopenharmony_ci        #     BitmapNode(size=2 count=1 bitmap=0b1):
8527db96d56Sopenharmony_ci        #         <Key name:0 hash:0>: 'val-0'
8537db96d56Sopenharmony_ci        #
8547db96d56Sopenharmony_ci        # ... 14 more BitmapNodes ...
8557db96d56Sopenharmony_ci        #
8567db96d56Sopenharmony_ci        #     15::
8577db96d56Sopenharmony_ci        #     BitmapNode(size=2 count=1 bitmap=0b1):
8587db96d56Sopenharmony_ci        #         <Key name:15 hash:15>: 'val-15'
8597db96d56Sopenharmony_ci        #
8607db96d56Sopenharmony_ci        #     16::
8617db96d56Sopenharmony_ci        #     BitmapNode(size=2 count=1 bitmap=0b1):
8627db96d56Sopenharmony_ci        #         NULL:
8637db96d56Sopenharmony_ci        #             CollisionNode(size=4 id=0x10f2f5af8):
8647db96d56Sopenharmony_ci        #                 <Key name:16 hash:16>: 'val-16'
8657db96d56Sopenharmony_ci        #                 <Key name:18 hash:16>: 'collision'
8667db96d56Sopenharmony_ci
8677db96d56Sopenharmony_ci        self.assertEqual(len(h), 18)
8687db96d56Sopenharmony_ci
8697db96d56Sopenharmony_ci        h = h.delete(keys[2])
8707db96d56Sopenharmony_ci        self.assertEqual(len(h), 17)
8717db96d56Sopenharmony_ci
8727db96d56Sopenharmony_ci        h = h.delete(collision_key16)
8737db96d56Sopenharmony_ci        self.assertEqual(len(h), 16)
8747db96d56Sopenharmony_ci        h = h.delete(keys[16])
8757db96d56Sopenharmony_ci        self.assertEqual(len(h), 15)
8767db96d56Sopenharmony_ci
8777db96d56Sopenharmony_ci        h = h.delete(keys[1])
8787db96d56Sopenharmony_ci        self.assertEqual(len(h), 14)
8797db96d56Sopenharmony_ci        h = h.delete(keys[1])
8807db96d56Sopenharmony_ci        self.assertEqual(len(h), 14)
8817db96d56Sopenharmony_ci
8827db96d56Sopenharmony_ci        for key in keys:
8837db96d56Sopenharmony_ci            h = h.delete(key)
8847db96d56Sopenharmony_ci        self.assertEqual(len(h), 0)
8857db96d56Sopenharmony_ci
8867db96d56Sopenharmony_ci    def test_hamt_items_1(self):
8877db96d56Sopenharmony_ci        A = HashKey(100, 'A')
8887db96d56Sopenharmony_ci        B = HashKey(201001, 'B')
8897db96d56Sopenharmony_ci        C = HashKey(101001, 'C')
8907db96d56Sopenharmony_ci        D = HashKey(103, 'D')
8917db96d56Sopenharmony_ci        E = HashKey(104, 'E')
8927db96d56Sopenharmony_ci        F = HashKey(110, 'F')
8937db96d56Sopenharmony_ci
8947db96d56Sopenharmony_ci        h = hamt()
8957db96d56Sopenharmony_ci        h = h.set(A, 'a')
8967db96d56Sopenharmony_ci        h = h.set(B, 'b')
8977db96d56Sopenharmony_ci        h = h.set(C, 'c')
8987db96d56Sopenharmony_ci        h = h.set(D, 'd')
8997db96d56Sopenharmony_ci        h = h.set(E, 'e')
9007db96d56Sopenharmony_ci        h = h.set(F, 'f')
9017db96d56Sopenharmony_ci
9027db96d56Sopenharmony_ci        it = h.items()
9037db96d56Sopenharmony_ci        self.assertEqual(
9047db96d56Sopenharmony_ci            set(list(it)),
9057db96d56Sopenharmony_ci            {(A, 'a'), (B, 'b'), (C, 'c'), (D, 'd'), (E, 'e'), (F, 'f')})
9067db96d56Sopenharmony_ci
9077db96d56Sopenharmony_ci    def test_hamt_items_2(self):
9087db96d56Sopenharmony_ci        A = HashKey(100, 'A')
9097db96d56Sopenharmony_ci        B = HashKey(101, 'B')
9107db96d56Sopenharmony_ci        C = HashKey(100100, 'C')
9117db96d56Sopenharmony_ci        D = HashKey(100100, 'D')
9127db96d56Sopenharmony_ci        E = HashKey(100100, 'E')
9137db96d56Sopenharmony_ci        F = HashKey(110, 'F')
9147db96d56Sopenharmony_ci
9157db96d56Sopenharmony_ci        h = hamt()
9167db96d56Sopenharmony_ci        h = h.set(A, 'a')
9177db96d56Sopenharmony_ci        h = h.set(B, 'b')
9187db96d56Sopenharmony_ci        h = h.set(C, 'c')
9197db96d56Sopenharmony_ci        h = h.set(D, 'd')
9207db96d56Sopenharmony_ci        h = h.set(E, 'e')
9217db96d56Sopenharmony_ci        h = h.set(F, 'f')
9227db96d56Sopenharmony_ci
9237db96d56Sopenharmony_ci        it = h.items()
9247db96d56Sopenharmony_ci        self.assertEqual(
9257db96d56Sopenharmony_ci            set(list(it)),
9267db96d56Sopenharmony_ci            {(A, 'a'), (B, 'b'), (C, 'c'), (D, 'd'), (E, 'e'), (F, 'f')})
9277db96d56Sopenharmony_ci
9287db96d56Sopenharmony_ci    def test_hamt_keys_1(self):
9297db96d56Sopenharmony_ci        A = HashKey(100, 'A')
9307db96d56Sopenharmony_ci        B = HashKey(101, 'B')
9317db96d56Sopenharmony_ci        C = HashKey(100100, 'C')
9327db96d56Sopenharmony_ci        D = HashKey(100100, 'D')
9337db96d56Sopenharmony_ci        E = HashKey(100100, 'E')
9347db96d56Sopenharmony_ci        F = HashKey(110, 'F')
9357db96d56Sopenharmony_ci
9367db96d56Sopenharmony_ci        h = hamt()
9377db96d56Sopenharmony_ci        h = h.set(A, 'a')
9387db96d56Sopenharmony_ci        h = h.set(B, 'b')
9397db96d56Sopenharmony_ci        h = h.set(C, 'c')
9407db96d56Sopenharmony_ci        h = h.set(D, 'd')
9417db96d56Sopenharmony_ci        h = h.set(E, 'e')
9427db96d56Sopenharmony_ci        h = h.set(F, 'f')
9437db96d56Sopenharmony_ci
9447db96d56Sopenharmony_ci        self.assertEqual(set(list(h.keys())), {A, B, C, D, E, F})
9457db96d56Sopenharmony_ci        self.assertEqual(set(list(h)), {A, B, C, D, E, F})
9467db96d56Sopenharmony_ci
9477db96d56Sopenharmony_ci    def test_hamt_items_3(self):
9487db96d56Sopenharmony_ci        h = hamt()
9497db96d56Sopenharmony_ci        self.assertEqual(len(h.items()), 0)
9507db96d56Sopenharmony_ci        self.assertEqual(list(h.items()), [])
9517db96d56Sopenharmony_ci
9527db96d56Sopenharmony_ci    def test_hamt_eq_1(self):
9537db96d56Sopenharmony_ci        A = HashKey(100, 'A')
9547db96d56Sopenharmony_ci        B = HashKey(101, 'B')
9557db96d56Sopenharmony_ci        C = HashKey(100100, 'C')
9567db96d56Sopenharmony_ci        D = HashKey(100100, 'D')
9577db96d56Sopenharmony_ci        E = HashKey(120, 'E')
9587db96d56Sopenharmony_ci
9597db96d56Sopenharmony_ci        h1 = hamt()
9607db96d56Sopenharmony_ci        h1 = h1.set(A, 'a')
9617db96d56Sopenharmony_ci        h1 = h1.set(B, 'b')
9627db96d56Sopenharmony_ci        h1 = h1.set(C, 'c')
9637db96d56Sopenharmony_ci        h1 = h1.set(D, 'd')
9647db96d56Sopenharmony_ci
9657db96d56Sopenharmony_ci        h2 = hamt()
9667db96d56Sopenharmony_ci        h2 = h2.set(A, 'a')
9677db96d56Sopenharmony_ci
9687db96d56Sopenharmony_ci        self.assertFalse(h1 == h2)
9697db96d56Sopenharmony_ci        self.assertTrue(h1 != h2)
9707db96d56Sopenharmony_ci
9717db96d56Sopenharmony_ci        h2 = h2.set(B, 'b')
9727db96d56Sopenharmony_ci        self.assertFalse(h1 == h2)
9737db96d56Sopenharmony_ci        self.assertTrue(h1 != h2)
9747db96d56Sopenharmony_ci
9757db96d56Sopenharmony_ci        h2 = h2.set(C, 'c')
9767db96d56Sopenharmony_ci        self.assertFalse(h1 == h2)
9777db96d56Sopenharmony_ci        self.assertTrue(h1 != h2)
9787db96d56Sopenharmony_ci
9797db96d56Sopenharmony_ci        h2 = h2.set(D, 'd2')
9807db96d56Sopenharmony_ci        self.assertFalse(h1 == h2)
9817db96d56Sopenharmony_ci        self.assertTrue(h1 != h2)
9827db96d56Sopenharmony_ci
9837db96d56Sopenharmony_ci        h2 = h2.set(D, 'd')
9847db96d56Sopenharmony_ci        self.assertTrue(h1 == h2)
9857db96d56Sopenharmony_ci        self.assertFalse(h1 != h2)
9867db96d56Sopenharmony_ci
9877db96d56Sopenharmony_ci        h2 = h2.set(E, 'e')
9887db96d56Sopenharmony_ci        self.assertFalse(h1 == h2)
9897db96d56Sopenharmony_ci        self.assertTrue(h1 != h2)
9907db96d56Sopenharmony_ci
9917db96d56Sopenharmony_ci        h2 = h2.delete(D)
9927db96d56Sopenharmony_ci        self.assertFalse(h1 == h2)
9937db96d56Sopenharmony_ci        self.assertTrue(h1 != h2)
9947db96d56Sopenharmony_ci
9957db96d56Sopenharmony_ci        h2 = h2.set(E, 'd')
9967db96d56Sopenharmony_ci        self.assertFalse(h1 == h2)
9977db96d56Sopenharmony_ci        self.assertTrue(h1 != h2)
9987db96d56Sopenharmony_ci
9997db96d56Sopenharmony_ci    def test_hamt_eq_2(self):
10007db96d56Sopenharmony_ci        A = HashKey(100, 'A')
10017db96d56Sopenharmony_ci        Er = HashKey(100, 'Er', error_on_eq_to=A)
10027db96d56Sopenharmony_ci
10037db96d56Sopenharmony_ci        h1 = hamt()
10047db96d56Sopenharmony_ci        h1 = h1.set(A, 'a')
10057db96d56Sopenharmony_ci
10067db96d56Sopenharmony_ci        h2 = hamt()
10077db96d56Sopenharmony_ci        h2 = h2.set(Er, 'a')
10087db96d56Sopenharmony_ci
10097db96d56Sopenharmony_ci        with self.assertRaisesRegex(ValueError, 'cannot compare'):
10107db96d56Sopenharmony_ci            h1 == h2
10117db96d56Sopenharmony_ci
10127db96d56Sopenharmony_ci        with self.assertRaisesRegex(ValueError, 'cannot compare'):
10137db96d56Sopenharmony_ci            h1 != h2
10147db96d56Sopenharmony_ci
10157db96d56Sopenharmony_ci    def test_hamt_gc_1(self):
10167db96d56Sopenharmony_ci        A = HashKey(100, 'A')
10177db96d56Sopenharmony_ci
10187db96d56Sopenharmony_ci        h = hamt()
10197db96d56Sopenharmony_ci        h = h.set(0, 0)  # empty HAMT node is memoized in hamt.c
10207db96d56Sopenharmony_ci        ref = weakref.ref(h)
10217db96d56Sopenharmony_ci
10227db96d56Sopenharmony_ci        a = []
10237db96d56Sopenharmony_ci        a.append(a)
10247db96d56Sopenharmony_ci        a.append(h)
10257db96d56Sopenharmony_ci        b = []
10267db96d56Sopenharmony_ci        a.append(b)
10277db96d56Sopenharmony_ci        b.append(a)
10287db96d56Sopenharmony_ci        h = h.set(A, b)
10297db96d56Sopenharmony_ci
10307db96d56Sopenharmony_ci        del h, a, b
10317db96d56Sopenharmony_ci
10327db96d56Sopenharmony_ci        gc.collect()
10337db96d56Sopenharmony_ci        gc.collect()
10347db96d56Sopenharmony_ci        gc.collect()
10357db96d56Sopenharmony_ci
10367db96d56Sopenharmony_ci        self.assertIsNone(ref())
10377db96d56Sopenharmony_ci
10387db96d56Sopenharmony_ci    def test_hamt_gc_2(self):
10397db96d56Sopenharmony_ci        A = HashKey(100, 'A')
10407db96d56Sopenharmony_ci        B = HashKey(101, 'B')
10417db96d56Sopenharmony_ci
10427db96d56Sopenharmony_ci        h = hamt()
10437db96d56Sopenharmony_ci        h = h.set(A, 'a')
10447db96d56Sopenharmony_ci        h = h.set(A, h)
10457db96d56Sopenharmony_ci
10467db96d56Sopenharmony_ci        ref = weakref.ref(h)
10477db96d56Sopenharmony_ci        hi = h.items()
10487db96d56Sopenharmony_ci        next(hi)
10497db96d56Sopenharmony_ci
10507db96d56Sopenharmony_ci        del h, hi
10517db96d56Sopenharmony_ci
10527db96d56Sopenharmony_ci        gc.collect()
10537db96d56Sopenharmony_ci        gc.collect()
10547db96d56Sopenharmony_ci        gc.collect()
10557db96d56Sopenharmony_ci
10567db96d56Sopenharmony_ci        self.assertIsNone(ref())
10577db96d56Sopenharmony_ci
10587db96d56Sopenharmony_ci    def test_hamt_in_1(self):
10597db96d56Sopenharmony_ci        A = HashKey(100, 'A')
10607db96d56Sopenharmony_ci        AA = HashKey(100, 'A')
10617db96d56Sopenharmony_ci
10627db96d56Sopenharmony_ci        B = HashKey(101, 'B')
10637db96d56Sopenharmony_ci
10647db96d56Sopenharmony_ci        h = hamt()
10657db96d56Sopenharmony_ci        h = h.set(A, 1)
10667db96d56Sopenharmony_ci
10677db96d56Sopenharmony_ci        self.assertTrue(A in h)
10687db96d56Sopenharmony_ci        self.assertFalse(B in h)
10697db96d56Sopenharmony_ci
10707db96d56Sopenharmony_ci        with self.assertRaises(EqError):
10717db96d56Sopenharmony_ci            with HaskKeyCrasher(error_on_eq=True):
10727db96d56Sopenharmony_ci                AA in h
10737db96d56Sopenharmony_ci
10747db96d56Sopenharmony_ci        with self.assertRaises(HashingError):
10757db96d56Sopenharmony_ci            with HaskKeyCrasher(error_on_hash=True):
10767db96d56Sopenharmony_ci                AA in h
10777db96d56Sopenharmony_ci
10787db96d56Sopenharmony_ci    def test_hamt_getitem_1(self):
10797db96d56Sopenharmony_ci        A = HashKey(100, 'A')
10807db96d56Sopenharmony_ci        AA = HashKey(100, 'A')
10817db96d56Sopenharmony_ci
10827db96d56Sopenharmony_ci        B = HashKey(101, 'B')
10837db96d56Sopenharmony_ci
10847db96d56Sopenharmony_ci        h = hamt()
10857db96d56Sopenharmony_ci        h = h.set(A, 1)
10867db96d56Sopenharmony_ci
10877db96d56Sopenharmony_ci        self.assertEqual(h[A], 1)
10887db96d56Sopenharmony_ci        self.assertEqual(h[AA], 1)
10897db96d56Sopenharmony_ci
10907db96d56Sopenharmony_ci        with self.assertRaises(KeyError):
10917db96d56Sopenharmony_ci            h[B]
10927db96d56Sopenharmony_ci
10937db96d56Sopenharmony_ci        with self.assertRaises(EqError):
10947db96d56Sopenharmony_ci            with HaskKeyCrasher(error_on_eq=True):
10957db96d56Sopenharmony_ci                h[AA]
10967db96d56Sopenharmony_ci
10977db96d56Sopenharmony_ci        with self.assertRaises(HashingError):
10987db96d56Sopenharmony_ci            with HaskKeyCrasher(error_on_hash=True):
10997db96d56Sopenharmony_ci                h[AA]
11007db96d56Sopenharmony_ci
11017db96d56Sopenharmony_ci
11027db96d56Sopenharmony_ciif __name__ == "__main__":
11037db96d56Sopenharmony_ci    unittest.main()
1104