17db96d56Sopenharmony_ciimport contextlib
27db96d56Sopenharmony_ciimport collections
37db96d56Sopenharmony_cifrom collections import defaultdict
47db96d56Sopenharmony_cifrom functools import lru_cache, wraps
57db96d56Sopenharmony_ciimport inspect
67db96d56Sopenharmony_ciimport itertools
77db96d56Sopenharmony_ciimport pickle
87db96d56Sopenharmony_ciimport re
97db96d56Sopenharmony_ciimport sys
107db96d56Sopenharmony_ciimport warnings
117db96d56Sopenharmony_cifrom unittest import TestCase, main, skipUnless, skip
127db96d56Sopenharmony_cifrom unittest.mock import patch
137db96d56Sopenharmony_cifrom copy import copy, deepcopy
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_cifrom typing import Any, NoReturn, Never, assert_never
167db96d56Sopenharmony_cifrom typing import overload, get_overloads, clear_overloads
177db96d56Sopenharmony_cifrom typing import TypeVar, TypeVarTuple, Unpack, AnyStr
187db96d56Sopenharmony_cifrom typing import T, KT, VT  # Not in __all__.
197db96d56Sopenharmony_cifrom typing import Union, Optional, Literal
207db96d56Sopenharmony_cifrom typing import Tuple, List, Dict, MutableMapping
217db96d56Sopenharmony_cifrom typing import Callable
227db96d56Sopenharmony_cifrom typing import Generic, ClassVar, Final, final, Protocol
237db96d56Sopenharmony_cifrom typing import assert_type, cast, runtime_checkable
247db96d56Sopenharmony_cifrom typing import get_type_hints
257db96d56Sopenharmony_cifrom typing import get_origin, get_args
267db96d56Sopenharmony_cifrom typing import is_typeddict
277db96d56Sopenharmony_cifrom typing import reveal_type
287db96d56Sopenharmony_cifrom typing import dataclass_transform
297db96d56Sopenharmony_cifrom typing import no_type_check, no_type_check_decorator
307db96d56Sopenharmony_cifrom typing import Type
317db96d56Sopenharmony_cifrom typing import NamedTuple, NotRequired, Required, TypedDict
327db96d56Sopenharmony_cifrom typing import IO, TextIO, BinaryIO
337db96d56Sopenharmony_cifrom typing import Pattern, Match
347db96d56Sopenharmony_cifrom typing import Annotated, ForwardRef
357db96d56Sopenharmony_cifrom typing import Self, LiteralString
367db96d56Sopenharmony_cifrom typing import TypeAlias
377db96d56Sopenharmony_cifrom typing import ParamSpec, Concatenate, ParamSpecArgs, ParamSpecKwargs
387db96d56Sopenharmony_cifrom typing import TypeGuard
397db96d56Sopenharmony_ciimport abc
407db96d56Sopenharmony_ciimport textwrap
417db96d56Sopenharmony_ciimport typing
427db96d56Sopenharmony_ciimport weakref
437db96d56Sopenharmony_ciimport types
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_cifrom test.support import import_helper, captured_stderr, cpython_only
467db96d56Sopenharmony_cifrom test import mod_generics_cache
477db96d56Sopenharmony_cifrom test import _typed_dict_helper
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_cipy_typing = import_helper.import_fresh_module('typing', blocked=['_typing'])
517db96d56Sopenharmony_cic_typing = import_helper.import_fresh_module('typing', fresh=['_typing'])
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ciCANNOT_SUBCLASS_TYPE = 'Cannot subclass special typing classes'
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ciclass BaseTestCase(TestCase):
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    def assertIsSubclass(self, cls, class_or_tuple, msg=None):
597db96d56Sopenharmony_ci        if not issubclass(cls, class_or_tuple):
607db96d56Sopenharmony_ci            message = '%r is not a subclass of %r' % (cls, class_or_tuple)
617db96d56Sopenharmony_ci            if msg is not None:
627db96d56Sopenharmony_ci                message += ' : %s' % msg
637db96d56Sopenharmony_ci            raise self.failureException(message)
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci    def assertNotIsSubclass(self, cls, class_or_tuple, msg=None):
667db96d56Sopenharmony_ci        if issubclass(cls, class_or_tuple):
677db96d56Sopenharmony_ci            message = '%r is a subclass of %r' % (cls, class_or_tuple)
687db96d56Sopenharmony_ci            if msg is not None:
697db96d56Sopenharmony_ci                message += ' : %s' % msg
707db96d56Sopenharmony_ci            raise self.failureException(message)
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci    def clear_caches(self):
737db96d56Sopenharmony_ci        for f in typing._cleanups:
747db96d56Sopenharmony_ci            f()
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_cidef all_pickle_protocols(test_func):
787db96d56Sopenharmony_ci    """Runs `test_func` with various values for `proto` argument."""
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci    @wraps(test_func)
817db96d56Sopenharmony_ci    def wrapper(self):
827db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
837db96d56Sopenharmony_ci            with self.subTest(pickle_proto=proto):
847db96d56Sopenharmony_ci                test_func(self, proto=proto)
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci    return wrapper
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ciclass Employee:
907db96d56Sopenharmony_ci    pass
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ciclass Manager(Employee):
947db96d56Sopenharmony_ci    pass
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ciclass Founder(Employee):
987db96d56Sopenharmony_ci    pass
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ciclass ManagingFounder(Manager, Founder):
1027db96d56Sopenharmony_ci    pass
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ciclass AnyTests(BaseTestCase):
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci    def test_any_instance_type_error(self):
1087db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1097db96d56Sopenharmony_ci            isinstance(42, Any)
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci    def test_repr(self):
1127db96d56Sopenharmony_ci        self.assertEqual(repr(Any), 'typing.Any')
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci        class Sub(Any): pass
1157db96d56Sopenharmony_ci        self.assertEqual(
1167db96d56Sopenharmony_ci            repr(Sub),
1177db96d56Sopenharmony_ci            f"<class '{__name__}.AnyTests.test_repr.<locals>.Sub'>",
1187db96d56Sopenharmony_ci        )
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci    def test_errors(self):
1217db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1227db96d56Sopenharmony_ci            issubclass(42, Any)
1237db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1247db96d56Sopenharmony_ci            Any[int]  # Any is not a generic type.
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_ci    def test_can_subclass(self):
1277db96d56Sopenharmony_ci        class Mock(Any): pass
1287db96d56Sopenharmony_ci        self.assertTrue(issubclass(Mock, Any))
1297db96d56Sopenharmony_ci        self.assertIsInstance(Mock(), Mock)
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci        class Something: pass
1327db96d56Sopenharmony_ci        self.assertFalse(issubclass(Something, Any))
1337db96d56Sopenharmony_ci        self.assertNotIsInstance(Something(), Mock)
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci        class MockSomething(Something, Mock): pass
1367db96d56Sopenharmony_ci        self.assertTrue(issubclass(MockSomething, Any))
1377db96d56Sopenharmony_ci        ms = MockSomething()
1387db96d56Sopenharmony_ci        self.assertIsInstance(ms, MockSomething)
1397db96d56Sopenharmony_ci        self.assertIsInstance(ms, Something)
1407db96d56Sopenharmony_ci        self.assertIsInstance(ms, Mock)
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci    def test_cannot_instantiate(self):
1437db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1447db96d56Sopenharmony_ci            Any()
1457db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1467db96d56Sopenharmony_ci            type(Any)()
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci    def test_any_works_with_alias(self):
1497db96d56Sopenharmony_ci        # These expressions must simply not fail.
1507db96d56Sopenharmony_ci        typing.Match[Any]
1517db96d56Sopenharmony_ci        typing.Pattern[Any]
1527db96d56Sopenharmony_ci        typing.IO[Any]
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ciclass BottomTypeTestsMixin:
1567db96d56Sopenharmony_ci    bottom_type: ClassVar[Any]
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci    def test_equality(self):
1597db96d56Sopenharmony_ci        self.assertEqual(self.bottom_type, self.bottom_type)
1607db96d56Sopenharmony_ci        self.assertIs(self.bottom_type, self.bottom_type)
1617db96d56Sopenharmony_ci        self.assertNotEqual(self.bottom_type, None)
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci    def test_get_origin(self):
1647db96d56Sopenharmony_ci        self.assertIs(get_origin(self.bottom_type), None)
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci    def test_instance_type_error(self):
1677db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1687db96d56Sopenharmony_ci            isinstance(42, self.bottom_type)
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci    def test_subclass_type_error(self):
1717db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1727db96d56Sopenharmony_ci            issubclass(Employee, self.bottom_type)
1737db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1747db96d56Sopenharmony_ci            issubclass(NoReturn, self.bottom_type)
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci    def test_not_generic(self):
1777db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1787db96d56Sopenharmony_ci            self.bottom_type[int]
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci    def test_cannot_subclass(self):
1817db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1827db96d56Sopenharmony_ci            class A(self.bottom_type):
1837db96d56Sopenharmony_ci                pass
1847db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1857db96d56Sopenharmony_ci            class A(type(self.bottom_type)):
1867db96d56Sopenharmony_ci                pass
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci    def test_cannot_instantiate(self):
1897db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1907db96d56Sopenharmony_ci            self.bottom_type()
1917db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
1927db96d56Sopenharmony_ci            type(self.bottom_type)()
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ciclass NoReturnTests(BottomTypeTestsMixin, BaseTestCase):
1967db96d56Sopenharmony_ci    bottom_type = NoReturn
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci    def test_repr(self):
1997db96d56Sopenharmony_ci        self.assertEqual(repr(NoReturn), 'typing.NoReturn')
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci    def test_get_type_hints(self):
2027db96d56Sopenharmony_ci        def some(arg: NoReturn) -> NoReturn: ...
2037db96d56Sopenharmony_ci        def some_str(arg: 'NoReturn') -> 'typing.NoReturn': ...
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ci        expected = {'arg': NoReturn, 'return': NoReturn}
2067db96d56Sopenharmony_ci        for target in [some, some_str]:
2077db96d56Sopenharmony_ci            with self.subTest(target=target):
2087db96d56Sopenharmony_ci                self.assertEqual(gth(target), expected)
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci    def test_not_equality(self):
2117db96d56Sopenharmony_ci        self.assertNotEqual(NoReturn, Never)
2127db96d56Sopenharmony_ci        self.assertNotEqual(Never, NoReturn)
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ciclass NeverTests(BottomTypeTestsMixin, BaseTestCase):
2167db96d56Sopenharmony_ci    bottom_type = Never
2177db96d56Sopenharmony_ci
2187db96d56Sopenharmony_ci    def test_repr(self):
2197db96d56Sopenharmony_ci        self.assertEqual(repr(Never), 'typing.Never')
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci    def test_get_type_hints(self):
2227db96d56Sopenharmony_ci        def some(arg: Never) -> Never: ...
2237db96d56Sopenharmony_ci        def some_str(arg: 'Never') -> 'typing.Never': ...
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci        expected = {'arg': Never, 'return': Never}
2267db96d56Sopenharmony_ci        for target in [some, some_str]:
2277db96d56Sopenharmony_ci            with self.subTest(target=target):
2287db96d56Sopenharmony_ci                self.assertEqual(gth(target), expected)
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ciclass AssertNeverTests(BaseTestCase):
2327db96d56Sopenharmony_ci    def test_exception(self):
2337db96d56Sopenharmony_ci        with self.assertRaises(AssertionError):
2347db96d56Sopenharmony_ci            assert_never(None)
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci        value = "some value"
2377db96d56Sopenharmony_ci        with self.assertRaisesRegex(AssertionError, value):
2387db96d56Sopenharmony_ci            assert_never(value)
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci        # Make sure a huge value doesn't get printed in its entirety
2417db96d56Sopenharmony_ci        huge_value = "a" * 10000
2427db96d56Sopenharmony_ci        with self.assertRaises(AssertionError) as cm:
2437db96d56Sopenharmony_ci            assert_never(huge_value)
2447db96d56Sopenharmony_ci        self.assertLess(
2457db96d56Sopenharmony_ci            len(cm.exception.args[0]),
2467db96d56Sopenharmony_ci            typing._ASSERT_NEVER_REPR_MAX_LENGTH * 2,
2477db96d56Sopenharmony_ci        )
2487db96d56Sopenharmony_ci
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ciclass SelfTests(BaseTestCase):
2517db96d56Sopenharmony_ci    def test_equality(self):
2527db96d56Sopenharmony_ci        self.assertEqual(Self, Self)
2537db96d56Sopenharmony_ci        self.assertIs(Self, Self)
2547db96d56Sopenharmony_ci        self.assertNotEqual(Self, None)
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci    def test_basics(self):
2577db96d56Sopenharmony_ci        class Foo:
2587db96d56Sopenharmony_ci            def bar(self) -> Self: ...
2597db96d56Sopenharmony_ci        class FooStr:
2607db96d56Sopenharmony_ci            def bar(self) -> 'Self': ...
2617db96d56Sopenharmony_ci        class FooStrTyping:
2627db96d56Sopenharmony_ci            def bar(self) -> 'typing.Self': ...
2637db96d56Sopenharmony_ci
2647db96d56Sopenharmony_ci        for target in [Foo, FooStr, FooStrTyping]:
2657db96d56Sopenharmony_ci            with self.subTest(target=target):
2667db96d56Sopenharmony_ci                self.assertEqual(gth(target.bar), {'return': Self})
2677db96d56Sopenharmony_ci        self.assertIs(get_origin(Self), None)
2687db96d56Sopenharmony_ci
2697db96d56Sopenharmony_ci    def test_repr(self):
2707db96d56Sopenharmony_ci        self.assertEqual(repr(Self), 'typing.Self')
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci    def test_cannot_subscript(self):
2737db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2747db96d56Sopenharmony_ci            Self[int]
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ci    def test_cannot_subclass(self):
2777db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2787db96d56Sopenharmony_ci            class C(type(Self)):
2797db96d56Sopenharmony_ci                pass
2807db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2817db96d56Sopenharmony_ci            class C(Self):
2827db96d56Sopenharmony_ci                pass
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci    def test_cannot_init(self):
2857db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2867db96d56Sopenharmony_ci            Self()
2877db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2887db96d56Sopenharmony_ci            type(Self)()
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci    def test_no_isinstance(self):
2917db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2927db96d56Sopenharmony_ci            isinstance(1, Self)
2937db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
2947db96d56Sopenharmony_ci            issubclass(int, Self)
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci    def test_alias(self):
2977db96d56Sopenharmony_ci        # TypeAliases are not actually part of the spec
2987db96d56Sopenharmony_ci        alias_1 = Tuple[Self, Self]
2997db96d56Sopenharmony_ci        alias_2 = List[Self]
3007db96d56Sopenharmony_ci        alias_3 = ClassVar[Self]
3017db96d56Sopenharmony_ci        self.assertEqual(get_args(alias_1), (Self, Self))
3027db96d56Sopenharmony_ci        self.assertEqual(get_args(alias_2), (Self,))
3037db96d56Sopenharmony_ci        self.assertEqual(get_args(alias_3), (Self,))
3047db96d56Sopenharmony_ci
3057db96d56Sopenharmony_ci
3067db96d56Sopenharmony_ciclass LiteralStringTests(BaseTestCase):
3077db96d56Sopenharmony_ci    def test_equality(self):
3087db96d56Sopenharmony_ci        self.assertEqual(LiteralString, LiteralString)
3097db96d56Sopenharmony_ci        self.assertIs(LiteralString, LiteralString)
3107db96d56Sopenharmony_ci        self.assertNotEqual(LiteralString, None)
3117db96d56Sopenharmony_ci
3127db96d56Sopenharmony_ci    def test_basics(self):
3137db96d56Sopenharmony_ci        class Foo:
3147db96d56Sopenharmony_ci            def bar(self) -> LiteralString: ...
3157db96d56Sopenharmony_ci        class FooStr:
3167db96d56Sopenharmony_ci            def bar(self) -> 'LiteralString': ...
3177db96d56Sopenharmony_ci        class FooStrTyping:
3187db96d56Sopenharmony_ci            def bar(self) -> 'typing.LiteralString': ...
3197db96d56Sopenharmony_ci
3207db96d56Sopenharmony_ci        for target in [Foo, FooStr, FooStrTyping]:
3217db96d56Sopenharmony_ci            with self.subTest(target=target):
3227db96d56Sopenharmony_ci                self.assertEqual(gth(target.bar), {'return': LiteralString})
3237db96d56Sopenharmony_ci        self.assertIs(get_origin(LiteralString), None)
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_ci    def test_repr(self):
3267db96d56Sopenharmony_ci        self.assertEqual(repr(LiteralString), 'typing.LiteralString')
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci    def test_cannot_subscript(self):
3297db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
3307db96d56Sopenharmony_ci            LiteralString[int]
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ci    def test_cannot_subclass(self):
3337db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
3347db96d56Sopenharmony_ci            class C(type(LiteralString)):
3357db96d56Sopenharmony_ci                pass
3367db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
3377db96d56Sopenharmony_ci            class C(LiteralString):
3387db96d56Sopenharmony_ci                pass
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci    def test_cannot_init(self):
3417db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
3427db96d56Sopenharmony_ci            LiteralString()
3437db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
3447db96d56Sopenharmony_ci            type(LiteralString)()
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci    def test_no_isinstance(self):
3477db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
3487db96d56Sopenharmony_ci            isinstance(1, LiteralString)
3497db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
3507db96d56Sopenharmony_ci            issubclass(int, LiteralString)
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ci    def test_alias(self):
3537db96d56Sopenharmony_ci        alias_1 = Tuple[LiteralString, LiteralString]
3547db96d56Sopenharmony_ci        alias_2 = List[LiteralString]
3557db96d56Sopenharmony_ci        alias_3 = ClassVar[LiteralString]
3567db96d56Sopenharmony_ci        self.assertEqual(get_args(alias_1), (LiteralString, LiteralString))
3577db96d56Sopenharmony_ci        self.assertEqual(get_args(alias_2), (LiteralString,))
3587db96d56Sopenharmony_ci        self.assertEqual(get_args(alias_3), (LiteralString,))
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ciclass TypeVarTests(BaseTestCase):
3617db96d56Sopenharmony_ci    def test_basic_plain(self):
3627db96d56Sopenharmony_ci        T = TypeVar('T')
3637db96d56Sopenharmony_ci        # T equals itself.
3647db96d56Sopenharmony_ci        self.assertEqual(T, T)
3657db96d56Sopenharmony_ci        # T is an instance of TypeVar
3667db96d56Sopenharmony_ci        self.assertIsInstance(T, TypeVar)
3677db96d56Sopenharmony_ci        self.assertEqual(T.__name__, 'T')
3687db96d56Sopenharmony_ci        self.assertEqual(T.__constraints__, ())
3697db96d56Sopenharmony_ci        self.assertIs(T.__bound__, None)
3707db96d56Sopenharmony_ci        self.assertIs(T.__covariant__, False)
3717db96d56Sopenharmony_ci        self.assertIs(T.__contravariant__, False)
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ci    def test_attributes(self):
3747db96d56Sopenharmony_ci        T_bound = TypeVar('T_bound', bound=int)
3757db96d56Sopenharmony_ci        self.assertEqual(T_bound.__name__, 'T_bound')
3767db96d56Sopenharmony_ci        self.assertEqual(T_bound.__constraints__, ())
3777db96d56Sopenharmony_ci        self.assertIs(T_bound.__bound__, int)
3787db96d56Sopenharmony_ci
3797db96d56Sopenharmony_ci        T_constraints = TypeVar('T_constraints', int, str)
3807db96d56Sopenharmony_ci        self.assertEqual(T_constraints.__name__, 'T_constraints')
3817db96d56Sopenharmony_ci        self.assertEqual(T_constraints.__constraints__, (int, str))
3827db96d56Sopenharmony_ci        self.assertIs(T_constraints.__bound__, None)
3837db96d56Sopenharmony_ci
3847db96d56Sopenharmony_ci        T_co = TypeVar('T_co', covariant=True)
3857db96d56Sopenharmony_ci        self.assertEqual(T_co.__name__, 'T_co')
3867db96d56Sopenharmony_ci        self.assertIs(T_co.__covariant__, True)
3877db96d56Sopenharmony_ci        self.assertIs(T_co.__contravariant__, False)
3887db96d56Sopenharmony_ci
3897db96d56Sopenharmony_ci        T_contra = TypeVar('T_contra', contravariant=True)
3907db96d56Sopenharmony_ci        self.assertEqual(T_contra.__name__, 'T_contra')
3917db96d56Sopenharmony_ci        self.assertIs(T_contra.__covariant__, False)
3927db96d56Sopenharmony_ci        self.assertIs(T_contra.__contravariant__, True)
3937db96d56Sopenharmony_ci
3947db96d56Sopenharmony_ci    def test_typevar_instance_type_error(self):
3957db96d56Sopenharmony_ci        T = TypeVar('T')
3967db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
3977db96d56Sopenharmony_ci            isinstance(42, T)
3987db96d56Sopenharmony_ci
3997db96d56Sopenharmony_ci    def test_typevar_subclass_type_error(self):
4007db96d56Sopenharmony_ci        T = TypeVar('T')
4017db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
4027db96d56Sopenharmony_ci            issubclass(int, T)
4037db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
4047db96d56Sopenharmony_ci            issubclass(T, int)
4057db96d56Sopenharmony_ci
4067db96d56Sopenharmony_ci    def test_constrained_error(self):
4077db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
4087db96d56Sopenharmony_ci            X = TypeVar('X', int)
4097db96d56Sopenharmony_ci            X
4107db96d56Sopenharmony_ci
4117db96d56Sopenharmony_ci    def test_union_unique(self):
4127db96d56Sopenharmony_ci        X = TypeVar('X')
4137db96d56Sopenharmony_ci        Y = TypeVar('Y')
4147db96d56Sopenharmony_ci        self.assertNotEqual(X, Y)
4157db96d56Sopenharmony_ci        self.assertEqual(Union[X], X)
4167db96d56Sopenharmony_ci        self.assertNotEqual(Union[X], Union[X, Y])
4177db96d56Sopenharmony_ci        self.assertEqual(Union[X, X], X)
4187db96d56Sopenharmony_ci        self.assertNotEqual(Union[X, int], Union[X])
4197db96d56Sopenharmony_ci        self.assertNotEqual(Union[X, int], Union[int])
4207db96d56Sopenharmony_ci        self.assertEqual(Union[X, int].__args__, (X, int))
4217db96d56Sopenharmony_ci        self.assertEqual(Union[X, int].__parameters__, (X,))
4227db96d56Sopenharmony_ci        self.assertIs(Union[X, int].__origin__, Union)
4237db96d56Sopenharmony_ci
4247db96d56Sopenharmony_ci    def test_or(self):
4257db96d56Sopenharmony_ci        X = TypeVar('X')
4267db96d56Sopenharmony_ci        # use a string because str doesn't implement
4277db96d56Sopenharmony_ci        # __or__/__ror__ itself
4287db96d56Sopenharmony_ci        self.assertEqual(X | "x", Union[X, "x"])
4297db96d56Sopenharmony_ci        self.assertEqual("x" | X, Union["x", X])
4307db96d56Sopenharmony_ci        # make sure the order is correct
4317db96d56Sopenharmony_ci        self.assertEqual(get_args(X | "x"), (X, ForwardRef("x")))
4327db96d56Sopenharmony_ci        self.assertEqual(get_args("x" | X), (ForwardRef("x"), X))
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci    def test_union_constrained(self):
4357db96d56Sopenharmony_ci        A = TypeVar('A', str, bytes)
4367db96d56Sopenharmony_ci        self.assertNotEqual(Union[A, str], Union[A])
4377db96d56Sopenharmony_ci
4387db96d56Sopenharmony_ci    def test_repr(self):
4397db96d56Sopenharmony_ci        self.assertEqual(repr(T), '~T')
4407db96d56Sopenharmony_ci        self.assertEqual(repr(KT), '~KT')
4417db96d56Sopenharmony_ci        self.assertEqual(repr(VT), '~VT')
4427db96d56Sopenharmony_ci        self.assertEqual(repr(AnyStr), '~AnyStr')
4437db96d56Sopenharmony_ci        T_co = TypeVar('T_co', covariant=True)
4447db96d56Sopenharmony_ci        self.assertEqual(repr(T_co), '+T_co')
4457db96d56Sopenharmony_ci        T_contra = TypeVar('T_contra', contravariant=True)
4467db96d56Sopenharmony_ci        self.assertEqual(repr(T_contra), '-T_contra')
4477db96d56Sopenharmony_ci
4487db96d56Sopenharmony_ci    def test_no_redefinition(self):
4497db96d56Sopenharmony_ci        self.assertNotEqual(TypeVar('T'), TypeVar('T'))
4507db96d56Sopenharmony_ci        self.assertNotEqual(TypeVar('T', int, str), TypeVar('T', int, str))
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ci    def test_cannot_subclass_vars(self):
4537db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
4547db96d56Sopenharmony_ci            class V(TypeVar('T')):
4557db96d56Sopenharmony_ci                pass
4567db96d56Sopenharmony_ci
4577db96d56Sopenharmony_ci    def test_cannot_subclass_var_itself(self):
4587db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
4597db96d56Sopenharmony_ci            class V(TypeVar):
4607db96d56Sopenharmony_ci                pass
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci    def test_cannot_instantiate_vars(self):
4637db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
4647db96d56Sopenharmony_ci            TypeVar('A')()
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ci    def test_bound_errors(self):
4677db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
4687db96d56Sopenharmony_ci            TypeVar('X', bound=Union)
4697db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
4707db96d56Sopenharmony_ci            TypeVar('X', str, float, bound=Employee)
4717db96d56Sopenharmony_ci
4727db96d56Sopenharmony_ci    def test_missing__name__(self):
4737db96d56Sopenharmony_ci        # See bpo-39942
4747db96d56Sopenharmony_ci        code = ("import typing\n"
4757db96d56Sopenharmony_ci                "T = typing.TypeVar('T')\n"
4767db96d56Sopenharmony_ci                )
4777db96d56Sopenharmony_ci        exec(code, {})
4787db96d56Sopenharmony_ci
4797db96d56Sopenharmony_ci    def test_no_bivariant(self):
4807db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
4817db96d56Sopenharmony_ci            TypeVar('T', covariant=True, contravariant=True)
4827db96d56Sopenharmony_ci
4837db96d56Sopenharmony_ci    def test_var_substitution(self):
4847db96d56Sopenharmony_ci        T = TypeVar('T')
4857db96d56Sopenharmony_ci        subst = T.__typing_subst__
4867db96d56Sopenharmony_ci        self.assertIs(subst(int), int)
4877db96d56Sopenharmony_ci        self.assertEqual(subst(list[int]), list[int])
4887db96d56Sopenharmony_ci        self.assertEqual(subst(List[int]), List[int])
4897db96d56Sopenharmony_ci        self.assertEqual(subst(List), List)
4907db96d56Sopenharmony_ci        self.assertIs(subst(Any), Any)
4917db96d56Sopenharmony_ci        self.assertIs(subst(None), type(None))
4927db96d56Sopenharmony_ci        self.assertIs(subst(T), T)
4937db96d56Sopenharmony_ci        self.assertEqual(subst(int|str), int|str)
4947db96d56Sopenharmony_ci        self.assertEqual(subst(Union[int, str]), Union[int, str])
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ci    def test_bad_var_substitution(self):
4977db96d56Sopenharmony_ci        T = TypeVar('T')
4987db96d56Sopenharmony_ci        bad_args = (
4997db96d56Sopenharmony_ci            (), (int, str), Union,
5007db96d56Sopenharmony_ci            Generic, Generic[T], Protocol, Protocol[T],
5017db96d56Sopenharmony_ci            Final, Final[int], ClassVar, ClassVar[int],
5027db96d56Sopenharmony_ci        )
5037db96d56Sopenharmony_ci        for arg in bad_args:
5047db96d56Sopenharmony_ci            with self.subTest(arg=arg):
5057db96d56Sopenharmony_ci                with self.assertRaises(TypeError):
5067db96d56Sopenharmony_ci                    T.__typing_subst__(arg)
5077db96d56Sopenharmony_ci                with self.assertRaises(TypeError):
5087db96d56Sopenharmony_ci                    List[T][arg]
5097db96d56Sopenharmony_ci                with self.assertRaises(TypeError):
5107db96d56Sopenharmony_ci                    list[T][arg]
5117db96d56Sopenharmony_ci
5127db96d56Sopenharmony_ci
5137db96d56Sopenharmony_cidef template_replace(templates: list[str], replacements: dict[str, list[str]]) -> list[tuple[str]]:
5147db96d56Sopenharmony_ci    """Renders templates with possible combinations of replacements.
5157db96d56Sopenharmony_ci
5167db96d56Sopenharmony_ci    Example 1: Suppose that:
5177db96d56Sopenharmony_ci      templates = ["dog_breed are awesome", "dog_breed are cool"]
5187db96d56Sopenharmony_ci      replacements = ["dog_breed": ["Huskies", "Beagles"]]
5197db96d56Sopenharmony_ci    Then we would return:
5207db96d56Sopenharmony_ci      [
5217db96d56Sopenharmony_ci          ("Huskies are awesome", "Huskies are cool"),
5227db96d56Sopenharmony_ci          ("Beagles are awesome", "Beagles are cool")
5237db96d56Sopenharmony_ci      ]
5247db96d56Sopenharmony_ci
5257db96d56Sopenharmony_ci    Example 2: Suppose that:
5267db96d56Sopenharmony_ci      templates = ["Huskies are word1 but also word2"]
5277db96d56Sopenharmony_ci      replacements = {"word1": ["playful", "cute"],
5287db96d56Sopenharmony_ci                      "word2": ["feisty", "tiring"]}
5297db96d56Sopenharmony_ci    Then we would return:
5307db96d56Sopenharmony_ci      [
5317db96d56Sopenharmony_ci          ("Huskies are playful but also feisty"),
5327db96d56Sopenharmony_ci          ("Huskies are playful but also tiring"),
5337db96d56Sopenharmony_ci          ("Huskies are cute but also feisty"),
5347db96d56Sopenharmony_ci          ("Huskies are cute but also tiring")
5357db96d56Sopenharmony_ci      ]
5367db96d56Sopenharmony_ci
5377db96d56Sopenharmony_ci    Note that if any of the replacements do not occur in any template:
5387db96d56Sopenharmony_ci      templates = ["Huskies are word1", "Beagles!"]
5397db96d56Sopenharmony_ci      replacements = {"word1": ["playful", "cute"],
5407db96d56Sopenharmony_ci                      "word2": ["feisty", "tiring"]}
5417db96d56Sopenharmony_ci    Then we do not generate duplicates, returning:
5427db96d56Sopenharmony_ci      [
5437db96d56Sopenharmony_ci          ("Huskies are playful", "Beagles!"),
5447db96d56Sopenharmony_ci          ("Huskies are cute", "Beagles!")
5457db96d56Sopenharmony_ci      ]
5467db96d56Sopenharmony_ci    """
5477db96d56Sopenharmony_ci    # First, build a structure like:
5487db96d56Sopenharmony_ci    #   [
5497db96d56Sopenharmony_ci    #     [("word1", "playful"), ("word1", "cute")],
5507db96d56Sopenharmony_ci    #     [("word2", "feisty"), ("word2", "tiring")]
5517db96d56Sopenharmony_ci    #   ]
5527db96d56Sopenharmony_ci    replacement_combos = []
5537db96d56Sopenharmony_ci    for original, possible_replacements in replacements.items():
5547db96d56Sopenharmony_ci        original_replacement_tuples = []
5557db96d56Sopenharmony_ci        for replacement in possible_replacements:
5567db96d56Sopenharmony_ci            original_replacement_tuples.append((original, replacement))
5577db96d56Sopenharmony_ci        replacement_combos.append(original_replacement_tuples)
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ci    # Second, generate rendered templates, including possible duplicates.
5607db96d56Sopenharmony_ci    rendered_templates = []
5617db96d56Sopenharmony_ci    for replacement_combo in itertools.product(*replacement_combos):
5627db96d56Sopenharmony_ci        # replacement_combo would be e.g.
5637db96d56Sopenharmony_ci        #   [("word1", "playful"), ("word2", "feisty")]
5647db96d56Sopenharmony_ci        templates_with_replacements = []
5657db96d56Sopenharmony_ci        for template in templates:
5667db96d56Sopenharmony_ci            for original, replacement in replacement_combo:
5677db96d56Sopenharmony_ci                template = template.replace(original, replacement)
5687db96d56Sopenharmony_ci            templates_with_replacements.append(template)
5697db96d56Sopenharmony_ci        rendered_templates.append(tuple(templates_with_replacements))
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci    # Finally, remove the duplicates (but keep the order).
5727db96d56Sopenharmony_ci    rendered_templates_no_duplicates = []
5737db96d56Sopenharmony_ci    for x in rendered_templates:
5747db96d56Sopenharmony_ci        # Inefficient, but should be fine for our purposes.
5757db96d56Sopenharmony_ci        if x not in rendered_templates_no_duplicates:
5767db96d56Sopenharmony_ci            rendered_templates_no_duplicates.append(x)
5777db96d56Sopenharmony_ci
5787db96d56Sopenharmony_ci    return rendered_templates_no_duplicates
5797db96d56Sopenharmony_ci
5807db96d56Sopenharmony_ci
5817db96d56Sopenharmony_ciclass TemplateReplacementTests(BaseTestCase):
5827db96d56Sopenharmony_ci
5837db96d56Sopenharmony_ci    def test_two_templates_two_replacements_yields_correct_renders(self):
5847db96d56Sopenharmony_ci        actual = template_replace(
5857db96d56Sopenharmony_ci                templates=["Cats are word1", "Dogs are word2"],
5867db96d56Sopenharmony_ci                replacements={
5877db96d56Sopenharmony_ci                    "word1": ["small", "cute"],
5887db96d56Sopenharmony_ci                    "word2": ["big", "fluffy"],
5897db96d56Sopenharmony_ci                },
5907db96d56Sopenharmony_ci        )
5917db96d56Sopenharmony_ci        expected = [
5927db96d56Sopenharmony_ci            ("Cats are small", "Dogs are big"),
5937db96d56Sopenharmony_ci            ("Cats are small", "Dogs are fluffy"),
5947db96d56Sopenharmony_ci            ("Cats are cute", "Dogs are big"),
5957db96d56Sopenharmony_ci            ("Cats are cute", "Dogs are fluffy"),
5967db96d56Sopenharmony_ci        ]
5977db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
5987db96d56Sopenharmony_ci
5997db96d56Sopenharmony_ci    def test_no_duplicates_if_replacement_not_in_templates(self):
6007db96d56Sopenharmony_ci        actual = template_replace(
6017db96d56Sopenharmony_ci                templates=["Cats are word1", "Dogs!"],
6027db96d56Sopenharmony_ci                replacements={
6037db96d56Sopenharmony_ci                    "word1": ["small", "cute"],
6047db96d56Sopenharmony_ci                    "word2": ["big", "fluffy"],
6057db96d56Sopenharmony_ci                },
6067db96d56Sopenharmony_ci        )
6077db96d56Sopenharmony_ci        expected = [
6087db96d56Sopenharmony_ci            ("Cats are small", "Dogs!"),
6097db96d56Sopenharmony_ci            ("Cats are cute", "Dogs!"),
6107db96d56Sopenharmony_ci        ]
6117db96d56Sopenharmony_ci        self.assertEqual(actual, expected)
6127db96d56Sopenharmony_ci
6137db96d56Sopenharmony_ci
6147db96d56Sopenharmony_ciclass GenericAliasSubstitutionTests(BaseTestCase):
6157db96d56Sopenharmony_ci    """Tests for type variable substitution in generic aliases.
6167db96d56Sopenharmony_ci
6177db96d56Sopenharmony_ci    For variadic cases, these tests should be regarded as the source of truth,
6187db96d56Sopenharmony_ci    since we hadn't realised the full complexity of variadic substitution
6197db96d56Sopenharmony_ci    at the time of finalizing PEP 646. For full discussion, see
6207db96d56Sopenharmony_ci    https://github.com/python/cpython/issues/91162.
6217db96d56Sopenharmony_ci    """
6227db96d56Sopenharmony_ci
6237db96d56Sopenharmony_ci    def test_one_parameter(self):
6247db96d56Sopenharmony_ci        T = TypeVar('T')
6257db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
6267db96d56Sopenharmony_ci        Ts2 = TypeVarTuple('Ts2')
6277db96d56Sopenharmony_ci
6287db96d56Sopenharmony_ci        class C(Generic[T]): pass
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ci        generics = ['C', 'list', 'List']
6317db96d56Sopenharmony_ci        tuple_types = ['tuple', 'Tuple']
6327db96d56Sopenharmony_ci
6337db96d56Sopenharmony_ci        tests = [
6347db96d56Sopenharmony_ci            # Alias                               # Args                     # Expected result
6357db96d56Sopenharmony_ci            ('generic[T]',                        '[()]',                    'TypeError'),
6367db96d56Sopenharmony_ci            ('generic[T]',                        '[int]',                   'generic[int]'),
6377db96d56Sopenharmony_ci            ('generic[T]',                        '[int, str]',              'TypeError'),
6387db96d56Sopenharmony_ci            ('generic[T]',                        '[tuple_type[int, ...]]',  'generic[tuple_type[int, ...]]'),
6397db96d56Sopenharmony_ci            ('generic[T]',                        '[*tuple_type[int]]',      'generic[int]'),
6407db96d56Sopenharmony_ci            ('generic[T]',                        '[*tuple_type[()]]',       'TypeError'),
6417db96d56Sopenharmony_ci            ('generic[T]',                        '[*tuple_type[int, str]]', 'TypeError'),
6427db96d56Sopenharmony_ci            ('generic[T]',                        '[*tuple_type[int, ...]]', 'TypeError'),
6437db96d56Sopenharmony_ci            ('generic[T]',                        '[*Ts]',                   'TypeError'),
6447db96d56Sopenharmony_ci            ('generic[T]',                        '[T, *Ts]',                'TypeError'),
6457db96d56Sopenharmony_ci            ('generic[T]',                        '[*Ts, T]',                'TypeError'),
6467db96d56Sopenharmony_ci            # Raises TypeError because C is not variadic.
6477db96d56Sopenharmony_ci            # (If C _were_ variadic, it'd be fine.)
6487db96d56Sopenharmony_ci            ('C[T, *tuple_type[int, ...]]',       '[int]',                   'TypeError'),
6497db96d56Sopenharmony_ci            # Should definitely raise TypeError: list only takes one argument.
6507db96d56Sopenharmony_ci            ('list[T, *tuple_type[int, ...]]',    '[int]',                   'list[int, *tuple_type[int, ...]]'),
6517db96d56Sopenharmony_ci            ('List[T, *tuple_type[int, ...]]',    '[int]',                   'TypeError'),
6527db96d56Sopenharmony_ci            # Should raise, because more than one `TypeVarTuple` is not supported.
6537db96d56Sopenharmony_ci            ('generic[*Ts, *Ts2]',                '[int]',                   'TypeError'),
6547db96d56Sopenharmony_ci        ]
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci        for alias_template, args_template, expected_template in tests:
6577db96d56Sopenharmony_ci            rendered_templates = template_replace(
6587db96d56Sopenharmony_ci                    templates=[alias_template, args_template, expected_template],
6597db96d56Sopenharmony_ci                    replacements={'generic': generics, 'tuple_type': tuple_types}
6607db96d56Sopenharmony_ci            )
6617db96d56Sopenharmony_ci            for alias_str, args_str, expected_str in rendered_templates:
6627db96d56Sopenharmony_ci                with self.subTest(alias=alias_str, args=args_str, expected=expected_str):
6637db96d56Sopenharmony_ci                    if expected_str == 'TypeError':
6647db96d56Sopenharmony_ci                        with self.assertRaises(TypeError):
6657db96d56Sopenharmony_ci                            eval(alias_str + args_str)
6667db96d56Sopenharmony_ci                    else:
6677db96d56Sopenharmony_ci                        self.assertEqual(
6687db96d56Sopenharmony_ci                            eval(alias_str + args_str),
6697db96d56Sopenharmony_ci                            eval(expected_str)
6707db96d56Sopenharmony_ci                        )
6717db96d56Sopenharmony_ci
6727db96d56Sopenharmony_ci
6737db96d56Sopenharmony_ci    def test_two_parameters(self):
6747db96d56Sopenharmony_ci        T1 = TypeVar('T1')
6757db96d56Sopenharmony_ci        T2 = TypeVar('T2')
6767db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
6777db96d56Sopenharmony_ci
6787db96d56Sopenharmony_ci        class C(Generic[T1, T2]): pass
6797db96d56Sopenharmony_ci
6807db96d56Sopenharmony_ci        generics = ['C', 'dict', 'Dict']
6817db96d56Sopenharmony_ci        tuple_types = ['tuple', 'Tuple']
6827db96d56Sopenharmony_ci
6837db96d56Sopenharmony_ci        tests = [
6847db96d56Sopenharmony_ci            # Alias                                    # Args                                               # Expected result
6857db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[()]',                                              'TypeError'),
6867db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[int]',                                             'TypeError'),
6877db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[int, str]',                                        'generic[int, str]'),
6887db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[int, str, bool]',                                  'TypeError'),
6897db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int]]',                                'TypeError'),
6907db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int, str]]',                           'generic[int, str]'),
6917db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int, str, bool]]',                     'TypeError'),
6927db96d56Sopenharmony_ci
6937db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[int, *tuple_type[str]]',                           'generic[int, str]'),
6947db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int], str]',                           'generic[int, str]'),
6957db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int], *tuple_type[str]]',              'generic[int, str]'),
6967db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int, str], *tuple_type[()]]',          'generic[int, str]'),
6977db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[()], *tuple_type[int, str]]',          'generic[int, str]'),
6987db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int], *tuple_type[()]]',               'TypeError'),
6997db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[()], *tuple_type[int]]',               'TypeError'),
7007db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int, str], *tuple_type[float]]',       'TypeError'),
7017db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int], *tuple_type[str, float]]',       'TypeError'),
7027db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int, str], *tuple_type[float, bool]]', 'TypeError'),
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[tuple_type[int, ...]]',                            'TypeError'),
7057db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[tuple_type[int, ...], tuple_type[str, ...]]',      'generic[tuple_type[int, ...], tuple_type[str, ...]]'),
7067db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int, ...]]',                           'TypeError'),
7077db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[int, *tuple_type[str, ...]]',                      'TypeError'),
7087db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int, ...], str]',                      'TypeError'),
7097db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*tuple_type[int, ...], *tuple_type[str, ...]]',    'TypeError'),
7107db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*Ts]',                                             'TypeError'),
7117db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[T, *Ts]',                                          'TypeError'),
7127db96d56Sopenharmony_ci            ('generic[T1, T2]',                        '[*Ts, T]',                                          'TypeError'),
7137db96d56Sopenharmony_ci            # This one isn't technically valid - none of the things that
7147db96d56Sopenharmony_ci            # `generic` can be (defined in `generics` above) are variadic, so we
7157db96d56Sopenharmony_ci            # shouldn't really be able to do `generic[T1, *tuple_type[int, ...]]`.
7167db96d56Sopenharmony_ci            # So even if type checkers shouldn't allow it, we allow it at
7177db96d56Sopenharmony_ci            # runtime, in accordance with a general philosophy of "Keep the
7187db96d56Sopenharmony_ci            # runtime lenient so people can experiment with typing constructs".
7197db96d56Sopenharmony_ci            ('generic[T1, *tuple_type[int, ...]]',     '[str]',                                             'generic[str, *tuple_type[int, ...]]'),
7207db96d56Sopenharmony_ci        ]
7217db96d56Sopenharmony_ci
7227db96d56Sopenharmony_ci        for alias_template, args_template, expected_template in tests:
7237db96d56Sopenharmony_ci            rendered_templates = template_replace(
7247db96d56Sopenharmony_ci                    templates=[alias_template, args_template, expected_template],
7257db96d56Sopenharmony_ci                    replacements={'generic': generics, 'tuple_type': tuple_types}
7267db96d56Sopenharmony_ci            )
7277db96d56Sopenharmony_ci            for alias_str, args_str, expected_str in rendered_templates:
7287db96d56Sopenharmony_ci                with self.subTest(alias=alias_str, args=args_str, expected=expected_str):
7297db96d56Sopenharmony_ci                    if expected_str == 'TypeError':
7307db96d56Sopenharmony_ci                        with self.assertRaises(TypeError):
7317db96d56Sopenharmony_ci                            eval(alias_str + args_str)
7327db96d56Sopenharmony_ci                    else:
7337db96d56Sopenharmony_ci                        self.assertEqual(
7347db96d56Sopenharmony_ci                            eval(alias_str + args_str),
7357db96d56Sopenharmony_ci                            eval(expected_str)
7367db96d56Sopenharmony_ci                        )
7377db96d56Sopenharmony_ci
7387db96d56Sopenharmony_ci    def test_three_parameters(self):
7397db96d56Sopenharmony_ci        T1 = TypeVar('T1')
7407db96d56Sopenharmony_ci        T2 = TypeVar('T2')
7417db96d56Sopenharmony_ci        T3 = TypeVar('T3')
7427db96d56Sopenharmony_ci
7437db96d56Sopenharmony_ci        class C(Generic[T1, T2, T3]): pass
7447db96d56Sopenharmony_ci
7457db96d56Sopenharmony_ci        generics = ['C']
7467db96d56Sopenharmony_ci        tuple_types = ['tuple', 'Tuple']
7477db96d56Sopenharmony_ci
7487db96d56Sopenharmony_ci        tests = [
7497db96d56Sopenharmony_ci            # Alias                                    # Args                                               # Expected result
7507db96d56Sopenharmony_ci            ('generic[T1, bool, T2]',                  '[int, str]',                                        'generic[int, bool, str]'),
7517db96d56Sopenharmony_ci            ('generic[T1, bool, T2]',                  '[*tuple_type[int, str]]',                           'generic[int, bool, str]'),
7527db96d56Sopenharmony_ci        ]
7537db96d56Sopenharmony_ci
7547db96d56Sopenharmony_ci        for alias_template, args_template, expected_template in tests:
7557db96d56Sopenharmony_ci            rendered_templates = template_replace(
7567db96d56Sopenharmony_ci                templates=[alias_template, args_template, expected_template],
7577db96d56Sopenharmony_ci                replacements={'generic': generics, 'tuple_type': tuple_types}
7587db96d56Sopenharmony_ci            )
7597db96d56Sopenharmony_ci            for alias_str, args_str, expected_str in rendered_templates:
7607db96d56Sopenharmony_ci                with self.subTest(alias=alias_str, args=args_str, expected=expected_str):
7617db96d56Sopenharmony_ci                    if expected_str == 'TypeError':
7627db96d56Sopenharmony_ci                        with self.assertRaises(TypeError):
7637db96d56Sopenharmony_ci                            eval(alias_str + args_str)
7647db96d56Sopenharmony_ci                    else:
7657db96d56Sopenharmony_ci                        self.assertEqual(
7667db96d56Sopenharmony_ci                            eval(alias_str + args_str),
7677db96d56Sopenharmony_ci                            eval(expected_str)
7687db96d56Sopenharmony_ci                        )
7697db96d56Sopenharmony_ci
7707db96d56Sopenharmony_ci    def test_variadic_parameters(self):
7717db96d56Sopenharmony_ci        T1 = TypeVar('T1')
7727db96d56Sopenharmony_ci        T2 = TypeVar('T2')
7737db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
7747db96d56Sopenharmony_ci
7757db96d56Sopenharmony_ci        class C(Generic[*Ts]): pass
7767db96d56Sopenharmony_ci
7777db96d56Sopenharmony_ci        generics = ['C', 'tuple', 'Tuple']
7787db96d56Sopenharmony_ci        tuple_types = ['tuple', 'Tuple']
7797db96d56Sopenharmony_ci
7807db96d56Sopenharmony_ci        tests = [
7817db96d56Sopenharmony_ci            # Alias                                    # Args                                            # Expected result
7827db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[()]',                                           'generic[()]'),
7837db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[int]',                                          'generic[int]'),
7847db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[int, str]',                                     'generic[int, str]'),
7857db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[*tuple_type[int]]',                             'generic[int]'),
7867db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[*tuple_type[*Ts]]',                             'generic[*Ts]'),
7877db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[*tuple_type[int, str]]',                        'generic[int, str]'),
7887db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[str, *tuple_type[int, ...], bool]',             'generic[str, *tuple_type[int, ...], bool]'),
7897db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[tuple_type[int, ...]]',                         'generic[tuple_type[int, ...]]'),
7907db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[tuple_type[int, ...], tuple_type[str, ...]]',   'generic[tuple_type[int, ...], tuple_type[str, ...]]'),
7917db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[*tuple_type[int, ...]]',                        'generic[*tuple_type[int, ...]]'),
7927db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[*tuple_type[int, ...], *tuple_type[str, ...]]', 'TypeError'),
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[*Ts]',                                          'generic[*Ts]'),
7957db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[T, *Ts]',                                       'generic[T, *Ts]'),
7967db96d56Sopenharmony_ci            ('generic[*Ts]',                           '[*Ts, T]',                                       'generic[*Ts, T]'),
7977db96d56Sopenharmony_ci            ('generic[T, *Ts]',                        '[()]',                                           'TypeError'),
7987db96d56Sopenharmony_ci            ('generic[T, *Ts]',                        '[int]',                                          'generic[int]'),
7997db96d56Sopenharmony_ci            ('generic[T, *Ts]',                        '[int, str]',                                     'generic[int, str]'),
8007db96d56Sopenharmony_ci            ('generic[T, *Ts]',                        '[int, str, bool]',                               'generic[int, str, bool]'),
8017db96d56Sopenharmony_ci            ('generic[list[T], *Ts]',                  '[()]',                                           'TypeError'),
8027db96d56Sopenharmony_ci            ('generic[list[T], *Ts]',                  '[int]',                                          'generic[list[int]]'),
8037db96d56Sopenharmony_ci            ('generic[list[T], *Ts]',                  '[int, str]',                                     'generic[list[int], str]'),
8047db96d56Sopenharmony_ci            ('generic[list[T], *Ts]',                  '[int, str, bool]',                               'generic[list[int], str, bool]'),
8057db96d56Sopenharmony_ci
8067db96d56Sopenharmony_ci            ('generic[*Ts, T]',                        '[()]',                                           'TypeError'),
8077db96d56Sopenharmony_ci            ('generic[*Ts, T]',                        '[int]',                                          'generic[int]'),
8087db96d56Sopenharmony_ci            ('generic[*Ts, T]',                        '[int, str]',                                     'generic[int, str]'),
8097db96d56Sopenharmony_ci            ('generic[*Ts, T]',                        '[int, str, bool]',                               'generic[int, str, bool]'),
8107db96d56Sopenharmony_ci            ('generic[*Ts, list[T]]',                  '[()]',                                           'TypeError'),
8117db96d56Sopenharmony_ci            ('generic[*Ts, list[T]]',                  '[int]',                                          'generic[list[int]]'),
8127db96d56Sopenharmony_ci            ('generic[*Ts, list[T]]',                  '[int, str]',                                     'generic[int, list[str]]'),
8137db96d56Sopenharmony_ci            ('generic[*Ts, list[T]]',                  '[int, str, bool]',                               'generic[int, str, list[bool]]'),
8147db96d56Sopenharmony_ci
8157db96d56Sopenharmony_ci            ('generic[T1, T2, *Ts]',                   '[()]',                                           'TypeError'),
8167db96d56Sopenharmony_ci            ('generic[T1, T2, *Ts]',                   '[int]',                                          'TypeError'),
8177db96d56Sopenharmony_ci            ('generic[T1, T2, *Ts]',                   '[int, str]',                                     'generic[int, str]'),
8187db96d56Sopenharmony_ci            ('generic[T1, T2, *Ts]',                   '[int, str, bool]',                               'generic[int, str, bool]'),
8197db96d56Sopenharmony_ci            ('generic[T1, T2, *Ts]',                   '[int, str, bool, bytes]',                        'generic[int, str, bool, bytes]'),
8207db96d56Sopenharmony_ci
8217db96d56Sopenharmony_ci            ('generic[*Ts, T1, T2]',                   '[()]',                                           'TypeError'),
8227db96d56Sopenharmony_ci            ('generic[*Ts, T1, T2]',                   '[int]',                                          'TypeError'),
8237db96d56Sopenharmony_ci            ('generic[*Ts, T1, T2]',                   '[int, str]',                                     'generic[int, str]'),
8247db96d56Sopenharmony_ci            ('generic[*Ts, T1, T2]',                   '[int, str, bool]',                               'generic[int, str, bool]'),
8257db96d56Sopenharmony_ci            ('generic[*Ts, T1, T2]',                   '[int, str, bool, bytes]',                        'generic[int, str, bool, bytes]'),
8267db96d56Sopenharmony_ci
8277db96d56Sopenharmony_ci            ('generic[T1, *Ts, T2]',                   '[()]',                                           'TypeError'),
8287db96d56Sopenharmony_ci            ('generic[T1, *Ts, T2]',                   '[int]',                                          'TypeError'),
8297db96d56Sopenharmony_ci            ('generic[T1, *Ts, T2]',                   '[int, str]',                                     'generic[int, str]'),
8307db96d56Sopenharmony_ci            ('generic[T1, *Ts, T2]',                   '[int, str, bool]',                               'generic[int, str, bool]'),
8317db96d56Sopenharmony_ci            ('generic[T1, *Ts, T2]',                   '[int, str, bool, bytes]',                        'generic[int, str, bool, bytes]'),
8327db96d56Sopenharmony_ci
8337db96d56Sopenharmony_ci            ('generic[T, *Ts]',                        '[*tuple_type[int, ...]]',                        'generic[int, *tuple_type[int, ...]]'),
8347db96d56Sopenharmony_ci            ('generic[T, *Ts]',                        '[str, *tuple_type[int, ...]]',                   'generic[str, *tuple_type[int, ...]]'),
8357db96d56Sopenharmony_ci            ('generic[T, *Ts]',                        '[*tuple_type[int, ...], str]',                   'generic[int, *tuple_type[int, ...], str]'),
8367db96d56Sopenharmony_ci            ('generic[*Ts, T]',                        '[*tuple_type[int, ...]]',                        'generic[*tuple_type[int, ...], int]'),
8377db96d56Sopenharmony_ci            ('generic[*Ts, T]',                        '[str, *tuple_type[int, ...]]',                   'generic[str, *tuple_type[int, ...], int]'),
8387db96d56Sopenharmony_ci            ('generic[*Ts, T]',                        '[*tuple_type[int, ...], str]',                   'generic[*tuple_type[int, ...], str]'),
8397db96d56Sopenharmony_ci            ('generic[T1, *Ts, T2]',                   '[*tuple_type[int, ...]]',                        'generic[int, *tuple_type[int, ...], int]'),
8407db96d56Sopenharmony_ci            ('generic[T, str, *Ts]',                   '[*tuple_type[int, ...]]',                        'generic[int, str, *tuple_type[int, ...]]'),
8417db96d56Sopenharmony_ci            ('generic[*Ts, str, T]',                   '[*tuple_type[int, ...]]',                        'generic[*tuple_type[int, ...], str, int]'),
8427db96d56Sopenharmony_ci            ('generic[list[T], *Ts]',                  '[*tuple_type[int, ...]]',                        'generic[list[int], *tuple_type[int, ...]]'),
8437db96d56Sopenharmony_ci            ('generic[*Ts, list[T]]',                  '[*tuple_type[int, ...]]',                        'generic[*tuple_type[int, ...], list[int]]'),
8447db96d56Sopenharmony_ci
8457db96d56Sopenharmony_ci            ('generic[T, *tuple_type[int, ...]]',      '[str]',                                          'generic[str, *tuple_type[int, ...]]'),
8467db96d56Sopenharmony_ci            ('generic[T1, T2, *tuple_type[int, ...]]', '[str, bool]',                                    'generic[str, bool, *tuple_type[int, ...]]'),
8477db96d56Sopenharmony_ci            ('generic[T1, *tuple_type[int, ...], T2]', '[str, bool]',                                    'generic[str, *tuple_type[int, ...], bool]'),
8487db96d56Sopenharmony_ci            ('generic[T1, *tuple_type[int, ...], T2]', '[str, bool, float]',                             'TypeError'),
8497db96d56Sopenharmony_ci
8507db96d56Sopenharmony_ci            ('generic[T1, *tuple_type[T2, ...]]',      '[int, str]',                                     'generic[int, *tuple_type[str, ...]]'),
8517db96d56Sopenharmony_ci            ('generic[*tuple_type[T1, ...], T2]',      '[int, str]',                                     'generic[*tuple_type[int, ...], str]'),
8527db96d56Sopenharmony_ci            ('generic[T1, *tuple_type[generic[*Ts], ...]]', '[int, str, bool]',                          'generic[int, *tuple_type[generic[str, bool], ...]]'),
8537db96d56Sopenharmony_ci            ('generic[*tuple_type[generic[*Ts], ...], T1]', '[int, str, bool]',                          'generic[*tuple_type[generic[int, str], ...], bool]'),
8547db96d56Sopenharmony_ci        ]
8557db96d56Sopenharmony_ci
8567db96d56Sopenharmony_ci        for alias_template, args_template, expected_template in tests:
8577db96d56Sopenharmony_ci            rendered_templates = template_replace(
8587db96d56Sopenharmony_ci                    templates=[alias_template, args_template, expected_template],
8597db96d56Sopenharmony_ci                    replacements={'generic': generics, 'tuple_type': tuple_types}
8607db96d56Sopenharmony_ci            )
8617db96d56Sopenharmony_ci            for alias_str, args_str, expected_str in rendered_templates:
8627db96d56Sopenharmony_ci                with self.subTest(alias=alias_str, args=args_str, expected=expected_str):
8637db96d56Sopenharmony_ci                    if expected_str == 'TypeError':
8647db96d56Sopenharmony_ci                        with self.assertRaises(TypeError):
8657db96d56Sopenharmony_ci                            eval(alias_str + args_str)
8667db96d56Sopenharmony_ci                    else:
8677db96d56Sopenharmony_ci                        self.assertEqual(
8687db96d56Sopenharmony_ci                            eval(alias_str + args_str),
8697db96d56Sopenharmony_ci                            eval(expected_str)
8707db96d56Sopenharmony_ci                        )
8717db96d56Sopenharmony_ci
8727db96d56Sopenharmony_ci
8737db96d56Sopenharmony_ci
8747db96d56Sopenharmony_ciclass UnpackTests(BaseTestCase):
8757db96d56Sopenharmony_ci
8767db96d56Sopenharmony_ci    def test_accepts_single_type(self):
8777db96d56Sopenharmony_ci        (*tuple[int],)
8787db96d56Sopenharmony_ci        Unpack[Tuple[int]]
8797db96d56Sopenharmony_ci
8807db96d56Sopenharmony_ci    def test_dir(self):
8817db96d56Sopenharmony_ci        dir_items = set(dir(Unpack[Tuple[int]]))
8827db96d56Sopenharmony_ci        for required_item in [
8837db96d56Sopenharmony_ci            '__args__', '__parameters__', '__origin__',
8847db96d56Sopenharmony_ci        ]:
8857db96d56Sopenharmony_ci            with self.subTest(required_item=required_item):
8867db96d56Sopenharmony_ci                self.assertIn(required_item, dir_items)
8877db96d56Sopenharmony_ci
8887db96d56Sopenharmony_ci    def test_rejects_multiple_types(self):
8897db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
8907db96d56Sopenharmony_ci            Unpack[Tuple[int], Tuple[str]]
8917db96d56Sopenharmony_ci        # We can't do the equivalent for `*` here -
8927db96d56Sopenharmony_ci        # *(Tuple[int], Tuple[str]) is just plain tuple unpacking,
8937db96d56Sopenharmony_ci        # which is valid.
8947db96d56Sopenharmony_ci
8957db96d56Sopenharmony_ci    def test_rejects_multiple_parameterization(self):
8967db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
8977db96d56Sopenharmony_ci            (*tuple[int],)[0][tuple[int]]
8987db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
8997db96d56Sopenharmony_ci            Unpack[Tuple[int]][Tuple[int]]
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_ci    def test_cannot_be_called(self):
9027db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9037db96d56Sopenharmony_ci            Unpack()
9047db96d56Sopenharmony_ci
9057db96d56Sopenharmony_ci
9067db96d56Sopenharmony_ciclass TypeVarTupleTests(BaseTestCase):
9077db96d56Sopenharmony_ci
9087db96d56Sopenharmony_ci    def assertEndsWith(self, string, tail):
9097db96d56Sopenharmony_ci        if not string.endswith(tail):
9107db96d56Sopenharmony_ci            self.fail(f"String {string!r} does not end with {tail!r}")
9117db96d56Sopenharmony_ci
9127db96d56Sopenharmony_ci    def test_name(self):
9137db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
9147db96d56Sopenharmony_ci        self.assertEqual(Ts.__name__, 'Ts')
9157db96d56Sopenharmony_ci        Ts2 = TypeVarTuple('Ts2')
9167db96d56Sopenharmony_ci        self.assertEqual(Ts2.__name__, 'Ts2')
9177db96d56Sopenharmony_ci
9187db96d56Sopenharmony_ci    def test_instance_is_equal_to_itself(self):
9197db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
9207db96d56Sopenharmony_ci        self.assertEqual(Ts, Ts)
9217db96d56Sopenharmony_ci
9227db96d56Sopenharmony_ci    def test_different_instances_are_different(self):
9237db96d56Sopenharmony_ci        self.assertNotEqual(TypeVarTuple('Ts'), TypeVarTuple('Ts'))
9247db96d56Sopenharmony_ci
9257db96d56Sopenharmony_ci    def test_instance_isinstance_of_typevartuple(self):
9267db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
9277db96d56Sopenharmony_ci        self.assertIsInstance(Ts, TypeVarTuple)
9287db96d56Sopenharmony_ci
9297db96d56Sopenharmony_ci    def test_cannot_call_instance(self):
9307db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
9317db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
9327db96d56Sopenharmony_ci            Ts()
9337db96d56Sopenharmony_ci
9347db96d56Sopenharmony_ci    def test_unpacked_typevartuple_is_equal_to_itself(self):
9357db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
9367db96d56Sopenharmony_ci        self.assertEqual((*Ts,)[0], (*Ts,)[0])
9377db96d56Sopenharmony_ci        self.assertEqual(Unpack[Ts], Unpack[Ts])
9387db96d56Sopenharmony_ci
9397db96d56Sopenharmony_ci    def test_parameterised_tuple_is_equal_to_itself(self):
9407db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
9417db96d56Sopenharmony_ci        self.assertEqual(tuple[*Ts], tuple[*Ts])
9427db96d56Sopenharmony_ci        self.assertEqual(Tuple[Unpack[Ts]], Tuple[Unpack[Ts]])
9437db96d56Sopenharmony_ci
9447db96d56Sopenharmony_ci    def tests_tuple_arg_ordering_matters(self):
9457db96d56Sopenharmony_ci        Ts1 = TypeVarTuple('Ts1')
9467db96d56Sopenharmony_ci        Ts2 = TypeVarTuple('Ts2')
9477db96d56Sopenharmony_ci        self.assertNotEqual(
9487db96d56Sopenharmony_ci            tuple[*Ts1, *Ts2],
9497db96d56Sopenharmony_ci            tuple[*Ts2, *Ts1],
9507db96d56Sopenharmony_ci        )
9517db96d56Sopenharmony_ci        self.assertNotEqual(
9527db96d56Sopenharmony_ci            Tuple[Unpack[Ts1], Unpack[Ts2]],
9537db96d56Sopenharmony_ci            Tuple[Unpack[Ts2], Unpack[Ts1]],
9547db96d56Sopenharmony_ci        )
9557db96d56Sopenharmony_ci
9567db96d56Sopenharmony_ci    def test_tuple_args_and_parameters_are_correct(self):
9577db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
9587db96d56Sopenharmony_ci        t1 = tuple[*Ts]
9597db96d56Sopenharmony_ci        self.assertEqual(t1.__args__, (*Ts,))
9607db96d56Sopenharmony_ci        self.assertEqual(t1.__parameters__, (Ts,))
9617db96d56Sopenharmony_ci        t2 = Tuple[Unpack[Ts]]
9627db96d56Sopenharmony_ci        self.assertEqual(t2.__args__, (Unpack[Ts],))
9637db96d56Sopenharmony_ci        self.assertEqual(t2.__parameters__, (Ts,))
9647db96d56Sopenharmony_ci
9657db96d56Sopenharmony_ci    def test_var_substitution(self):
9667db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
9677db96d56Sopenharmony_ci        T = TypeVar('T')
9687db96d56Sopenharmony_ci        T2 = TypeVar('T2')
9697db96d56Sopenharmony_ci        class G1(Generic[*Ts]): pass
9707db96d56Sopenharmony_ci        class G2(Generic[Unpack[Ts]]): pass
9717db96d56Sopenharmony_ci
9727db96d56Sopenharmony_ci        for A in G1, G2, Tuple, tuple:
9737db96d56Sopenharmony_ci            B = A[*Ts]
9747db96d56Sopenharmony_ci            self.assertEqual(B[()], A[()])
9757db96d56Sopenharmony_ci            self.assertEqual(B[float], A[float])
9767db96d56Sopenharmony_ci            self.assertEqual(B[float, str], A[float, str])
9777db96d56Sopenharmony_ci
9787db96d56Sopenharmony_ci            C = A[Unpack[Ts]]
9797db96d56Sopenharmony_ci            self.assertEqual(C[()], A[()])
9807db96d56Sopenharmony_ci            self.assertEqual(C[float], A[float])
9817db96d56Sopenharmony_ci            self.assertEqual(C[float, str], A[float, str])
9827db96d56Sopenharmony_ci
9837db96d56Sopenharmony_ci            D = list[A[*Ts]]
9847db96d56Sopenharmony_ci            self.assertEqual(D[()], list[A[()]])
9857db96d56Sopenharmony_ci            self.assertEqual(D[float], list[A[float]])
9867db96d56Sopenharmony_ci            self.assertEqual(D[float, str], list[A[float, str]])
9877db96d56Sopenharmony_ci
9887db96d56Sopenharmony_ci            E = List[A[Unpack[Ts]]]
9897db96d56Sopenharmony_ci            self.assertEqual(E[()], List[A[()]])
9907db96d56Sopenharmony_ci            self.assertEqual(E[float], List[A[float]])
9917db96d56Sopenharmony_ci            self.assertEqual(E[float, str], List[A[float, str]])
9927db96d56Sopenharmony_ci
9937db96d56Sopenharmony_ci            F = A[T, *Ts, T2]
9947db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
9957db96d56Sopenharmony_ci                F[()]
9967db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
9977db96d56Sopenharmony_ci                F[float]
9987db96d56Sopenharmony_ci            self.assertEqual(F[float, str], A[float, str])
9997db96d56Sopenharmony_ci            self.assertEqual(F[float, str, int], A[float, str, int])
10007db96d56Sopenharmony_ci            self.assertEqual(F[float, str, int, bytes], A[float, str, int, bytes])
10017db96d56Sopenharmony_ci
10027db96d56Sopenharmony_ci            G = A[T, Unpack[Ts], T2]
10037db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10047db96d56Sopenharmony_ci                G[()]
10057db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10067db96d56Sopenharmony_ci                G[float]
10077db96d56Sopenharmony_ci            self.assertEqual(G[float, str], A[float, str])
10087db96d56Sopenharmony_ci            self.assertEqual(G[float, str, int], A[float, str, int])
10097db96d56Sopenharmony_ci            self.assertEqual(G[float, str, int, bytes], A[float, str, int, bytes])
10107db96d56Sopenharmony_ci
10117db96d56Sopenharmony_ci            H = tuple[list[T], A[*Ts], list[T2]]
10127db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10137db96d56Sopenharmony_ci                H[()]
10147db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10157db96d56Sopenharmony_ci                H[float]
10167db96d56Sopenharmony_ci            if A != Tuple:
10177db96d56Sopenharmony_ci                self.assertEqual(H[float, str],
10187db96d56Sopenharmony_ci                                 tuple[list[float], A[()], list[str]])
10197db96d56Sopenharmony_ci            self.assertEqual(H[float, str, int],
10207db96d56Sopenharmony_ci                             tuple[list[float], A[str], list[int]])
10217db96d56Sopenharmony_ci            self.assertEqual(H[float, str, int, bytes],
10227db96d56Sopenharmony_ci                             tuple[list[float], A[str, int], list[bytes]])
10237db96d56Sopenharmony_ci
10247db96d56Sopenharmony_ci            I = Tuple[List[T], A[Unpack[Ts]], List[T2]]
10257db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10267db96d56Sopenharmony_ci                I[()]
10277db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10287db96d56Sopenharmony_ci                I[float]
10297db96d56Sopenharmony_ci            if A != Tuple:
10307db96d56Sopenharmony_ci                self.assertEqual(I[float, str],
10317db96d56Sopenharmony_ci                                 Tuple[List[float], A[()], List[str]])
10327db96d56Sopenharmony_ci            self.assertEqual(I[float, str, int],
10337db96d56Sopenharmony_ci                             Tuple[List[float], A[str], List[int]])
10347db96d56Sopenharmony_ci            self.assertEqual(I[float, str, int, bytes],
10357db96d56Sopenharmony_ci                             Tuple[List[float], A[str, int], List[bytes]])
10367db96d56Sopenharmony_ci
10377db96d56Sopenharmony_ci    def test_bad_var_substitution(self):
10387db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
10397db96d56Sopenharmony_ci        T = TypeVar('T')
10407db96d56Sopenharmony_ci        T2 = TypeVar('T2')
10417db96d56Sopenharmony_ci        class G1(Generic[*Ts]): pass
10427db96d56Sopenharmony_ci        class G2(Generic[Unpack[Ts]]): pass
10437db96d56Sopenharmony_ci
10447db96d56Sopenharmony_ci        for A in G1, G2, Tuple, tuple:
10457db96d56Sopenharmony_ci            B = A[Ts]
10467db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10477db96d56Sopenharmony_ci                B[int, str]
10487db96d56Sopenharmony_ci
10497db96d56Sopenharmony_ci            C = A[T, T2]
10507db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10517db96d56Sopenharmony_ci                C[*Ts]
10527db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10537db96d56Sopenharmony_ci                C[Unpack[Ts]]
10547db96d56Sopenharmony_ci
10557db96d56Sopenharmony_ci            B = A[T, *Ts, str, T2]
10567db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10577db96d56Sopenharmony_ci                B[int, *Ts]
10587db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10597db96d56Sopenharmony_ci                B[int, *Ts, *Ts]
10607db96d56Sopenharmony_ci
10617db96d56Sopenharmony_ci            C = A[T, Unpack[Ts], str, T2]
10627db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10637db96d56Sopenharmony_ci                C[int, Unpack[Ts]]
10647db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
10657db96d56Sopenharmony_ci                C[int, Unpack[Ts], Unpack[Ts]]
10667db96d56Sopenharmony_ci
10677db96d56Sopenharmony_ci    def test_repr_is_correct(self):
10687db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
10697db96d56Sopenharmony_ci
10707db96d56Sopenharmony_ci        class G1(Generic[*Ts]): pass
10717db96d56Sopenharmony_ci        class G2(Generic[Unpack[Ts]]): pass
10727db96d56Sopenharmony_ci
10737db96d56Sopenharmony_ci        self.assertEqual(repr(Ts), 'Ts')
10747db96d56Sopenharmony_ci
10757db96d56Sopenharmony_ci        self.assertEqual(repr((*Ts,)[0]), '*Ts')
10767db96d56Sopenharmony_ci        self.assertEqual(repr(Unpack[Ts]), '*Ts')
10777db96d56Sopenharmony_ci
10787db96d56Sopenharmony_ci        self.assertEqual(repr(tuple[*Ts]), 'tuple[*Ts]')
10797db96d56Sopenharmony_ci        self.assertEqual(repr(Tuple[Unpack[Ts]]), 'typing.Tuple[*Ts]')
10807db96d56Sopenharmony_ci
10817db96d56Sopenharmony_ci        self.assertEqual(repr(*tuple[*Ts]), '*tuple[*Ts]')
10827db96d56Sopenharmony_ci        self.assertEqual(repr(Unpack[Tuple[Unpack[Ts]]]), '*typing.Tuple[*Ts]')
10837db96d56Sopenharmony_ci
10847db96d56Sopenharmony_ci    def test_variadic_class_repr_is_correct(self):
10857db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
10867db96d56Sopenharmony_ci        class A(Generic[*Ts]): pass
10877db96d56Sopenharmony_ci        class B(Generic[Unpack[Ts]]): pass
10887db96d56Sopenharmony_ci
10897db96d56Sopenharmony_ci        self.assertEndsWith(repr(A[()]), 'A[()]')
10907db96d56Sopenharmony_ci        self.assertEndsWith(repr(B[()]), 'B[()]')
10917db96d56Sopenharmony_ci        self.assertEndsWith(repr(A[float]), 'A[float]')
10927db96d56Sopenharmony_ci        self.assertEndsWith(repr(B[float]), 'B[float]')
10937db96d56Sopenharmony_ci        self.assertEndsWith(repr(A[float, str]), 'A[float, str]')
10947db96d56Sopenharmony_ci        self.assertEndsWith(repr(B[float, str]), 'B[float, str]')
10957db96d56Sopenharmony_ci
10967db96d56Sopenharmony_ci        self.assertEndsWith(repr(A[*tuple[int, ...]]),
10977db96d56Sopenharmony_ci                            'A[*tuple[int, ...]]')
10987db96d56Sopenharmony_ci        self.assertEndsWith(repr(B[Unpack[Tuple[int, ...]]]),
10997db96d56Sopenharmony_ci                            'B[*typing.Tuple[int, ...]]')
11007db96d56Sopenharmony_ci
11017db96d56Sopenharmony_ci        self.assertEndsWith(repr(A[float, *tuple[int, ...]]),
11027db96d56Sopenharmony_ci                            'A[float, *tuple[int, ...]]')
11037db96d56Sopenharmony_ci        self.assertEndsWith(repr(A[float, Unpack[Tuple[int, ...]]]),
11047db96d56Sopenharmony_ci                            'A[float, *typing.Tuple[int, ...]]')
11057db96d56Sopenharmony_ci
11067db96d56Sopenharmony_ci        self.assertEndsWith(repr(A[*tuple[int, ...], str]),
11077db96d56Sopenharmony_ci                            'A[*tuple[int, ...], str]')
11087db96d56Sopenharmony_ci        self.assertEndsWith(repr(B[Unpack[Tuple[int, ...]], str]),
11097db96d56Sopenharmony_ci                            'B[*typing.Tuple[int, ...], str]')
11107db96d56Sopenharmony_ci
11117db96d56Sopenharmony_ci        self.assertEndsWith(repr(A[float, *tuple[int, ...], str]),
11127db96d56Sopenharmony_ci                            'A[float, *tuple[int, ...], str]')
11137db96d56Sopenharmony_ci        self.assertEndsWith(repr(B[float, Unpack[Tuple[int, ...]], str]),
11147db96d56Sopenharmony_ci                            'B[float, *typing.Tuple[int, ...], str]')
11157db96d56Sopenharmony_ci
11167db96d56Sopenharmony_ci    def test_variadic_class_alias_repr_is_correct(self):
11177db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
11187db96d56Sopenharmony_ci        class A(Generic[Unpack[Ts]]): pass
11197db96d56Sopenharmony_ci
11207db96d56Sopenharmony_ci        B = A[*Ts]
11217db96d56Sopenharmony_ci        self.assertEndsWith(repr(B), 'A[*Ts]')
11227db96d56Sopenharmony_ci        self.assertEndsWith(repr(B[()]), 'A[()]')
11237db96d56Sopenharmony_ci        self.assertEndsWith(repr(B[float]), 'A[float]')
11247db96d56Sopenharmony_ci        self.assertEndsWith(repr(B[float, str]), 'A[float, str]')
11257db96d56Sopenharmony_ci
11267db96d56Sopenharmony_ci        C = A[Unpack[Ts]]
11277db96d56Sopenharmony_ci        self.assertEndsWith(repr(C), 'A[*Ts]')
11287db96d56Sopenharmony_ci        self.assertEndsWith(repr(C[()]), 'A[()]')
11297db96d56Sopenharmony_ci        self.assertEndsWith(repr(C[float]), 'A[float]')
11307db96d56Sopenharmony_ci        self.assertEndsWith(repr(C[float, str]), 'A[float, str]')
11317db96d56Sopenharmony_ci
11327db96d56Sopenharmony_ci        D = A[*Ts, int]
11337db96d56Sopenharmony_ci        self.assertEndsWith(repr(D), 'A[*Ts, int]')
11347db96d56Sopenharmony_ci        self.assertEndsWith(repr(D[()]), 'A[int]')
11357db96d56Sopenharmony_ci        self.assertEndsWith(repr(D[float]), 'A[float, int]')
11367db96d56Sopenharmony_ci        self.assertEndsWith(repr(D[float, str]), 'A[float, str, int]')
11377db96d56Sopenharmony_ci
11387db96d56Sopenharmony_ci        E = A[Unpack[Ts], int]
11397db96d56Sopenharmony_ci        self.assertEndsWith(repr(E), 'A[*Ts, int]')
11407db96d56Sopenharmony_ci        self.assertEndsWith(repr(E[()]), 'A[int]')
11417db96d56Sopenharmony_ci        self.assertEndsWith(repr(E[float]), 'A[float, int]')
11427db96d56Sopenharmony_ci        self.assertEndsWith(repr(E[float, str]), 'A[float, str, int]')
11437db96d56Sopenharmony_ci
11447db96d56Sopenharmony_ci        F = A[int, *Ts]
11457db96d56Sopenharmony_ci        self.assertEndsWith(repr(F), 'A[int, *Ts]')
11467db96d56Sopenharmony_ci        self.assertEndsWith(repr(F[()]), 'A[int]')
11477db96d56Sopenharmony_ci        self.assertEndsWith(repr(F[float]), 'A[int, float]')
11487db96d56Sopenharmony_ci        self.assertEndsWith(repr(F[float, str]), 'A[int, float, str]')
11497db96d56Sopenharmony_ci
11507db96d56Sopenharmony_ci        G = A[int, Unpack[Ts]]
11517db96d56Sopenharmony_ci        self.assertEndsWith(repr(G), 'A[int, *Ts]')
11527db96d56Sopenharmony_ci        self.assertEndsWith(repr(G[()]), 'A[int]')
11537db96d56Sopenharmony_ci        self.assertEndsWith(repr(G[float]), 'A[int, float]')
11547db96d56Sopenharmony_ci        self.assertEndsWith(repr(G[float, str]), 'A[int, float, str]')
11557db96d56Sopenharmony_ci
11567db96d56Sopenharmony_ci        H = A[int, *Ts, str]
11577db96d56Sopenharmony_ci        self.assertEndsWith(repr(H), 'A[int, *Ts, str]')
11587db96d56Sopenharmony_ci        self.assertEndsWith(repr(H[()]), 'A[int, str]')
11597db96d56Sopenharmony_ci        self.assertEndsWith(repr(H[float]), 'A[int, float, str]')
11607db96d56Sopenharmony_ci        self.assertEndsWith(repr(H[float, str]), 'A[int, float, str, str]')
11617db96d56Sopenharmony_ci
11627db96d56Sopenharmony_ci        I = A[int, Unpack[Ts], str]
11637db96d56Sopenharmony_ci        self.assertEndsWith(repr(I), 'A[int, *Ts, str]')
11647db96d56Sopenharmony_ci        self.assertEndsWith(repr(I[()]), 'A[int, str]')
11657db96d56Sopenharmony_ci        self.assertEndsWith(repr(I[float]), 'A[int, float, str]')
11667db96d56Sopenharmony_ci        self.assertEndsWith(repr(I[float, str]), 'A[int, float, str, str]')
11677db96d56Sopenharmony_ci
11687db96d56Sopenharmony_ci        J = A[*Ts, *tuple[str, ...]]
11697db96d56Sopenharmony_ci        self.assertEndsWith(repr(J), 'A[*Ts, *tuple[str, ...]]')
11707db96d56Sopenharmony_ci        self.assertEndsWith(repr(J[()]), 'A[*tuple[str, ...]]')
11717db96d56Sopenharmony_ci        self.assertEndsWith(repr(J[float]), 'A[float, *tuple[str, ...]]')
11727db96d56Sopenharmony_ci        self.assertEndsWith(repr(J[float, str]), 'A[float, str, *tuple[str, ...]]')
11737db96d56Sopenharmony_ci
11747db96d56Sopenharmony_ci        K = A[Unpack[Ts], Unpack[Tuple[str, ...]]]
11757db96d56Sopenharmony_ci        self.assertEndsWith(repr(K), 'A[*Ts, *typing.Tuple[str, ...]]')
11767db96d56Sopenharmony_ci        self.assertEndsWith(repr(K[()]), 'A[*typing.Tuple[str, ...]]')
11777db96d56Sopenharmony_ci        self.assertEndsWith(repr(K[float]), 'A[float, *typing.Tuple[str, ...]]')
11787db96d56Sopenharmony_ci        self.assertEndsWith(repr(K[float, str]), 'A[float, str, *typing.Tuple[str, ...]]')
11797db96d56Sopenharmony_ci
11807db96d56Sopenharmony_ci    def test_cannot_subclass_class(self):
11817db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
11827db96d56Sopenharmony_ci            class C(TypeVarTuple): pass
11837db96d56Sopenharmony_ci
11847db96d56Sopenharmony_ci    def test_cannot_subclass_instance(self):
11857db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
11867db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
11877db96d56Sopenharmony_ci            class C(Ts): pass
11887db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, CANNOT_SUBCLASS_TYPE):
11897db96d56Sopenharmony_ci            class C(type(Unpack)): pass
11907db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, CANNOT_SUBCLASS_TYPE):
11917db96d56Sopenharmony_ci            class C(type(*Ts)): pass
11927db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, CANNOT_SUBCLASS_TYPE):
11937db96d56Sopenharmony_ci            class C(type(Unpack[Ts])): pass
11947db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError,
11957db96d56Sopenharmony_ci                                    r'Cannot subclass typing\.Unpack'):
11967db96d56Sopenharmony_ci            class C(Unpack): pass
11977db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, r'Cannot subclass \*Ts'):
11987db96d56Sopenharmony_ci            class C(*Ts): pass
11997db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, r'Cannot subclass \*Ts'):
12007db96d56Sopenharmony_ci            class C(Unpack[Ts]): pass
12017db96d56Sopenharmony_ci
12027db96d56Sopenharmony_ci    def test_variadic_class_args_are_correct(self):
12037db96d56Sopenharmony_ci        T = TypeVar('T')
12047db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
12057db96d56Sopenharmony_ci        class A(Generic[*Ts]): pass
12067db96d56Sopenharmony_ci        class B(Generic[Unpack[Ts]]): pass
12077db96d56Sopenharmony_ci
12087db96d56Sopenharmony_ci        C = A[()]
12097db96d56Sopenharmony_ci        D = B[()]
12107db96d56Sopenharmony_ci        self.assertEqual(C.__args__, ())
12117db96d56Sopenharmony_ci        self.assertEqual(D.__args__, ())
12127db96d56Sopenharmony_ci
12137db96d56Sopenharmony_ci        E = A[int]
12147db96d56Sopenharmony_ci        F = B[int]
12157db96d56Sopenharmony_ci        self.assertEqual(E.__args__, (int,))
12167db96d56Sopenharmony_ci        self.assertEqual(F.__args__, (int,))
12177db96d56Sopenharmony_ci
12187db96d56Sopenharmony_ci        G = A[int, str]
12197db96d56Sopenharmony_ci        H = B[int, str]
12207db96d56Sopenharmony_ci        self.assertEqual(G.__args__, (int, str))
12217db96d56Sopenharmony_ci        self.assertEqual(H.__args__, (int, str))
12227db96d56Sopenharmony_ci
12237db96d56Sopenharmony_ci        I = A[T]
12247db96d56Sopenharmony_ci        J = B[T]
12257db96d56Sopenharmony_ci        self.assertEqual(I.__args__, (T,))
12267db96d56Sopenharmony_ci        self.assertEqual(J.__args__, (T,))
12277db96d56Sopenharmony_ci
12287db96d56Sopenharmony_ci        K = A[*Ts]
12297db96d56Sopenharmony_ci        L = B[Unpack[Ts]]
12307db96d56Sopenharmony_ci        self.assertEqual(K.__args__, (*Ts,))
12317db96d56Sopenharmony_ci        self.assertEqual(L.__args__, (Unpack[Ts],))
12327db96d56Sopenharmony_ci
12337db96d56Sopenharmony_ci        M = A[T, *Ts]
12347db96d56Sopenharmony_ci        N = B[T, Unpack[Ts]]
12357db96d56Sopenharmony_ci        self.assertEqual(M.__args__, (T, *Ts))
12367db96d56Sopenharmony_ci        self.assertEqual(N.__args__, (T, Unpack[Ts]))
12377db96d56Sopenharmony_ci
12387db96d56Sopenharmony_ci        O = A[*Ts, T]
12397db96d56Sopenharmony_ci        P = B[Unpack[Ts], T]
12407db96d56Sopenharmony_ci        self.assertEqual(O.__args__, (*Ts, T))
12417db96d56Sopenharmony_ci        self.assertEqual(P.__args__, (Unpack[Ts], T))
12427db96d56Sopenharmony_ci
12437db96d56Sopenharmony_ci    def test_variadic_class_origin_is_correct(self):
12447db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
12457db96d56Sopenharmony_ci
12467db96d56Sopenharmony_ci        class C(Generic[*Ts]): pass
12477db96d56Sopenharmony_ci        self.assertIs(C[int].__origin__, C)
12487db96d56Sopenharmony_ci        self.assertIs(C[T].__origin__, C)
12497db96d56Sopenharmony_ci        self.assertIs(C[Unpack[Ts]].__origin__, C)
12507db96d56Sopenharmony_ci
12517db96d56Sopenharmony_ci        class D(Generic[Unpack[Ts]]): pass
12527db96d56Sopenharmony_ci        self.assertIs(D[int].__origin__, D)
12537db96d56Sopenharmony_ci        self.assertIs(D[T].__origin__, D)
12547db96d56Sopenharmony_ci        self.assertIs(D[Unpack[Ts]].__origin__, D)
12557db96d56Sopenharmony_ci
12567db96d56Sopenharmony_ci    def test_get_type_hints_on_unpack_args(self):
12577db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
12587db96d56Sopenharmony_ci
12597db96d56Sopenharmony_ci        def func1(*args: *Ts): pass
12607db96d56Sopenharmony_ci        self.assertEqual(gth(func1), {'args': Unpack[Ts]})
12617db96d56Sopenharmony_ci
12627db96d56Sopenharmony_ci        def func2(*args: *tuple[int, str]): pass
12637db96d56Sopenharmony_ci        self.assertEqual(gth(func2), {'args': Unpack[tuple[int, str]]})
12647db96d56Sopenharmony_ci
12657db96d56Sopenharmony_ci        class CustomVariadic(Generic[*Ts]): pass
12667db96d56Sopenharmony_ci
12677db96d56Sopenharmony_ci        def func3(*args: *CustomVariadic[int, str]): pass
12687db96d56Sopenharmony_ci        self.assertEqual(gth(func3), {'args': Unpack[CustomVariadic[int, str]]})
12697db96d56Sopenharmony_ci
12707db96d56Sopenharmony_ci    def test_get_type_hints_on_unpack_args_string(self):
12717db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
12727db96d56Sopenharmony_ci
12737db96d56Sopenharmony_ci        def func1(*args: '*Ts'): pass
12747db96d56Sopenharmony_ci        self.assertEqual(gth(func1, localns={'Ts': Ts}),
12757db96d56Sopenharmony_ci                        {'args': Unpack[Ts]})
12767db96d56Sopenharmony_ci
12777db96d56Sopenharmony_ci        def func2(*args: '*tuple[int, str]'): pass
12787db96d56Sopenharmony_ci        self.assertEqual(gth(func2), {'args': Unpack[tuple[int, str]]})
12797db96d56Sopenharmony_ci
12807db96d56Sopenharmony_ci        class CustomVariadic(Generic[*Ts]): pass
12817db96d56Sopenharmony_ci
12827db96d56Sopenharmony_ci        def func3(*args: '*CustomVariadic[int, str]'): pass
12837db96d56Sopenharmony_ci        self.assertEqual(gth(func3, localns={'CustomVariadic': CustomVariadic}),
12847db96d56Sopenharmony_ci                         {'args': Unpack[CustomVariadic[int, str]]})
12857db96d56Sopenharmony_ci
12867db96d56Sopenharmony_ci    def test_tuple_args_are_correct(self):
12877db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
12887db96d56Sopenharmony_ci
12897db96d56Sopenharmony_ci        self.assertEqual(tuple[*Ts].__args__, (*Ts,))
12907db96d56Sopenharmony_ci        self.assertEqual(Tuple[Unpack[Ts]].__args__, (Unpack[Ts],))
12917db96d56Sopenharmony_ci
12927db96d56Sopenharmony_ci        self.assertEqual(tuple[*Ts, int].__args__, (*Ts, int))
12937db96d56Sopenharmony_ci        self.assertEqual(Tuple[Unpack[Ts], int].__args__, (Unpack[Ts], int))
12947db96d56Sopenharmony_ci
12957db96d56Sopenharmony_ci        self.assertEqual(tuple[int, *Ts].__args__, (int, *Ts))
12967db96d56Sopenharmony_ci        self.assertEqual(Tuple[int, Unpack[Ts]].__args__, (int, Unpack[Ts]))
12977db96d56Sopenharmony_ci
12987db96d56Sopenharmony_ci        self.assertEqual(tuple[int, *Ts, str].__args__,
12997db96d56Sopenharmony_ci                         (int, *Ts, str))
13007db96d56Sopenharmony_ci        self.assertEqual(Tuple[int, Unpack[Ts], str].__args__,
13017db96d56Sopenharmony_ci                         (int, Unpack[Ts], str))
13027db96d56Sopenharmony_ci
13037db96d56Sopenharmony_ci        self.assertEqual(tuple[*Ts, int].__args__, (*Ts, int))
13047db96d56Sopenharmony_ci        self.assertEqual(Tuple[Unpack[Ts]].__args__, (Unpack[Ts],))
13057db96d56Sopenharmony_ci
13067db96d56Sopenharmony_ci    def test_callable_args_are_correct(self):
13077db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
13087db96d56Sopenharmony_ci        Ts1 = TypeVarTuple('Ts1')
13097db96d56Sopenharmony_ci        Ts2 = TypeVarTuple('Ts2')
13107db96d56Sopenharmony_ci
13117db96d56Sopenharmony_ci        # TypeVarTuple in the arguments
13127db96d56Sopenharmony_ci
13137db96d56Sopenharmony_ci        a = Callable[[*Ts], None]
13147db96d56Sopenharmony_ci        b = Callable[[Unpack[Ts]], None]
13157db96d56Sopenharmony_ci        self.assertEqual(a.__args__, (*Ts, type(None)))
13167db96d56Sopenharmony_ci        self.assertEqual(b.__args__, (Unpack[Ts], type(None)))
13177db96d56Sopenharmony_ci
13187db96d56Sopenharmony_ci        c = Callable[[int, *Ts], None]
13197db96d56Sopenharmony_ci        d = Callable[[int, Unpack[Ts]], None]
13207db96d56Sopenharmony_ci        self.assertEqual(c.__args__, (int, *Ts, type(None)))
13217db96d56Sopenharmony_ci        self.assertEqual(d.__args__, (int, Unpack[Ts], type(None)))
13227db96d56Sopenharmony_ci
13237db96d56Sopenharmony_ci        e = Callable[[*Ts, int], None]
13247db96d56Sopenharmony_ci        f = Callable[[Unpack[Ts], int], None]
13257db96d56Sopenharmony_ci        self.assertEqual(e.__args__, (*Ts, int, type(None)))
13267db96d56Sopenharmony_ci        self.assertEqual(f.__args__, (Unpack[Ts], int, type(None)))
13277db96d56Sopenharmony_ci
13287db96d56Sopenharmony_ci        g = Callable[[str, *Ts, int], None]
13297db96d56Sopenharmony_ci        h = Callable[[str, Unpack[Ts], int], None]
13307db96d56Sopenharmony_ci        self.assertEqual(g.__args__, (str, *Ts, int, type(None)))
13317db96d56Sopenharmony_ci        self.assertEqual(h.__args__, (str, Unpack[Ts], int, type(None)))
13327db96d56Sopenharmony_ci
13337db96d56Sopenharmony_ci        # TypeVarTuple as the return
13347db96d56Sopenharmony_ci
13357db96d56Sopenharmony_ci        i = Callable[[None], *Ts]
13367db96d56Sopenharmony_ci        j = Callable[[None], Unpack[Ts]]
13377db96d56Sopenharmony_ci        self.assertEqual(i.__args__, (type(None), *Ts))
13387db96d56Sopenharmony_ci        self.assertEqual(j.__args__, (type(None), Unpack[Ts]))
13397db96d56Sopenharmony_ci
13407db96d56Sopenharmony_ci        k = Callable[[None], tuple[int, *Ts]]
13417db96d56Sopenharmony_ci        l = Callable[[None], Tuple[int, Unpack[Ts]]]
13427db96d56Sopenharmony_ci        self.assertEqual(k.__args__, (type(None), tuple[int, *Ts]))
13437db96d56Sopenharmony_ci        self.assertEqual(l.__args__, (type(None), Tuple[int, Unpack[Ts]]))
13447db96d56Sopenharmony_ci
13457db96d56Sopenharmony_ci        m = Callable[[None], tuple[*Ts, int]]
13467db96d56Sopenharmony_ci        n = Callable[[None], Tuple[Unpack[Ts], int]]
13477db96d56Sopenharmony_ci        self.assertEqual(m.__args__, (type(None), tuple[*Ts, int]))
13487db96d56Sopenharmony_ci        self.assertEqual(n.__args__, (type(None), Tuple[Unpack[Ts], int]))
13497db96d56Sopenharmony_ci
13507db96d56Sopenharmony_ci        o = Callable[[None], tuple[str, *Ts, int]]
13517db96d56Sopenharmony_ci        p = Callable[[None], Tuple[str, Unpack[Ts], int]]
13527db96d56Sopenharmony_ci        self.assertEqual(o.__args__, (type(None), tuple[str, *Ts, int]))
13537db96d56Sopenharmony_ci        self.assertEqual(p.__args__, (type(None), Tuple[str, Unpack[Ts], int]))
13547db96d56Sopenharmony_ci
13557db96d56Sopenharmony_ci        # TypeVarTuple in both
13567db96d56Sopenharmony_ci
13577db96d56Sopenharmony_ci        q = Callable[[*Ts], *Ts]
13587db96d56Sopenharmony_ci        r = Callable[[Unpack[Ts]], Unpack[Ts]]
13597db96d56Sopenharmony_ci        self.assertEqual(q.__args__, (*Ts, *Ts))
13607db96d56Sopenharmony_ci        self.assertEqual(r.__args__, (Unpack[Ts], Unpack[Ts]))
13617db96d56Sopenharmony_ci
13627db96d56Sopenharmony_ci        s = Callable[[*Ts1], *Ts2]
13637db96d56Sopenharmony_ci        u = Callable[[Unpack[Ts1]], Unpack[Ts2]]
13647db96d56Sopenharmony_ci        self.assertEqual(s.__args__, (*Ts1, *Ts2))
13657db96d56Sopenharmony_ci        self.assertEqual(u.__args__, (Unpack[Ts1], Unpack[Ts2]))
13667db96d56Sopenharmony_ci
13677db96d56Sopenharmony_ci    def test_variadic_class_with_duplicate_typevartuples_fails(self):
13687db96d56Sopenharmony_ci        Ts1 = TypeVarTuple('Ts1')
13697db96d56Sopenharmony_ci        Ts2 = TypeVarTuple('Ts2')
13707db96d56Sopenharmony_ci
13717db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
13727db96d56Sopenharmony_ci            class C(Generic[*Ts1, *Ts1]): pass
13737db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
13747db96d56Sopenharmony_ci            class C(Generic[Unpack[Ts1], Unpack[Ts1]]): pass
13757db96d56Sopenharmony_ci
13767db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
13777db96d56Sopenharmony_ci            class C(Generic[*Ts1, *Ts2, *Ts1]): pass
13787db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
13797db96d56Sopenharmony_ci            class C(Generic[Unpack[Ts1], Unpack[Ts2], Unpack[Ts1]]): pass
13807db96d56Sopenharmony_ci
13817db96d56Sopenharmony_ci    def test_type_concatenation_in_variadic_class_argument_list_succeeds(self):
13827db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
13837db96d56Sopenharmony_ci        class C(Generic[Unpack[Ts]]): pass
13847db96d56Sopenharmony_ci
13857db96d56Sopenharmony_ci        C[int, *Ts]
13867db96d56Sopenharmony_ci        C[int, Unpack[Ts]]
13877db96d56Sopenharmony_ci
13887db96d56Sopenharmony_ci        C[*Ts, int]
13897db96d56Sopenharmony_ci        C[Unpack[Ts], int]
13907db96d56Sopenharmony_ci
13917db96d56Sopenharmony_ci        C[int, *Ts, str]
13927db96d56Sopenharmony_ci        C[int, Unpack[Ts], str]
13937db96d56Sopenharmony_ci
13947db96d56Sopenharmony_ci        C[int, bool, *Ts, float, str]
13957db96d56Sopenharmony_ci        C[int, bool, Unpack[Ts], float, str]
13967db96d56Sopenharmony_ci
13977db96d56Sopenharmony_ci    def test_type_concatenation_in_tuple_argument_list_succeeds(self):
13987db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
13997db96d56Sopenharmony_ci
14007db96d56Sopenharmony_ci        tuple[int, *Ts]
14017db96d56Sopenharmony_ci        tuple[*Ts, int]
14027db96d56Sopenharmony_ci        tuple[int, *Ts, str]
14037db96d56Sopenharmony_ci        tuple[int, bool, *Ts, float, str]
14047db96d56Sopenharmony_ci
14057db96d56Sopenharmony_ci        Tuple[int, Unpack[Ts]]
14067db96d56Sopenharmony_ci        Tuple[Unpack[Ts], int]
14077db96d56Sopenharmony_ci        Tuple[int, Unpack[Ts], str]
14087db96d56Sopenharmony_ci        Tuple[int, bool, Unpack[Ts], float, str]
14097db96d56Sopenharmony_ci
14107db96d56Sopenharmony_ci    def test_variadic_class_definition_using_packed_typevartuple_fails(self):
14117db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
14127db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
14137db96d56Sopenharmony_ci            class C(Generic[Ts]): pass
14147db96d56Sopenharmony_ci
14157db96d56Sopenharmony_ci    def test_variadic_class_definition_using_concrete_types_fails(self):
14167db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
14177db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
14187db96d56Sopenharmony_ci            class F(Generic[*Ts, int]): pass
14197db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
14207db96d56Sopenharmony_ci            class E(Generic[Unpack[Ts], int]): pass
14217db96d56Sopenharmony_ci
14227db96d56Sopenharmony_ci    def test_variadic_class_with_2_typevars_accepts_2_or_more_args(self):
14237db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
14247db96d56Sopenharmony_ci        T1 = TypeVar('T1')
14257db96d56Sopenharmony_ci        T2 = TypeVar('T2')
14267db96d56Sopenharmony_ci
14277db96d56Sopenharmony_ci        class A(Generic[T1, T2, *Ts]): pass
14287db96d56Sopenharmony_ci        A[int, str]
14297db96d56Sopenharmony_ci        A[int, str, float]
14307db96d56Sopenharmony_ci        A[int, str, float, bool]
14317db96d56Sopenharmony_ci
14327db96d56Sopenharmony_ci        class B(Generic[T1, T2, Unpack[Ts]]): pass
14337db96d56Sopenharmony_ci        B[int, str]
14347db96d56Sopenharmony_ci        B[int, str, float]
14357db96d56Sopenharmony_ci        B[int, str, float, bool]
14367db96d56Sopenharmony_ci
14377db96d56Sopenharmony_ci        class C(Generic[T1, *Ts, T2]): pass
14387db96d56Sopenharmony_ci        C[int, str]
14397db96d56Sopenharmony_ci        C[int, str, float]
14407db96d56Sopenharmony_ci        C[int, str, float, bool]
14417db96d56Sopenharmony_ci
14427db96d56Sopenharmony_ci        class D(Generic[T1, Unpack[Ts], T2]): pass
14437db96d56Sopenharmony_ci        D[int, str]
14447db96d56Sopenharmony_ci        D[int, str, float]
14457db96d56Sopenharmony_ci        D[int, str, float, bool]
14467db96d56Sopenharmony_ci
14477db96d56Sopenharmony_ci        class E(Generic[*Ts, T1, T2]): pass
14487db96d56Sopenharmony_ci        E[int, str]
14497db96d56Sopenharmony_ci        E[int, str, float]
14507db96d56Sopenharmony_ci        E[int, str, float, bool]
14517db96d56Sopenharmony_ci
14527db96d56Sopenharmony_ci        class F(Generic[Unpack[Ts], T1, T2]): pass
14537db96d56Sopenharmony_ci        F[int, str]
14547db96d56Sopenharmony_ci        F[int, str, float]
14557db96d56Sopenharmony_ci        F[int, str, float, bool]
14567db96d56Sopenharmony_ci
14577db96d56Sopenharmony_ci    def test_variadic_args_annotations_are_correct(self):
14587db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
14597db96d56Sopenharmony_ci
14607db96d56Sopenharmony_ci        def f(*args: Unpack[Ts]): pass
14617db96d56Sopenharmony_ci        def g(*args: *Ts): pass
14627db96d56Sopenharmony_ci        self.assertEqual(f.__annotations__, {'args': Unpack[Ts]})
14637db96d56Sopenharmony_ci        self.assertEqual(g.__annotations__, {'args': (*Ts,)[0]})
14647db96d56Sopenharmony_ci
14657db96d56Sopenharmony_ci    def test_variadic_args_with_ellipsis_annotations_are_correct(self):
14667db96d56Sopenharmony_ci        def a(*args: *tuple[int, ...]): pass
14677db96d56Sopenharmony_ci        self.assertEqual(a.__annotations__,
14687db96d56Sopenharmony_ci                         {'args': (*tuple[int, ...],)[0]})
14697db96d56Sopenharmony_ci
14707db96d56Sopenharmony_ci        def b(*args: Unpack[Tuple[int, ...]]): pass
14717db96d56Sopenharmony_ci        self.assertEqual(b.__annotations__,
14727db96d56Sopenharmony_ci                         {'args': Unpack[Tuple[int, ...]]})
14737db96d56Sopenharmony_ci
14747db96d56Sopenharmony_ci    def test_concatenation_in_variadic_args_annotations_are_correct(self):
14757db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
14767db96d56Sopenharmony_ci
14777db96d56Sopenharmony_ci        # Unpacking using `*`, native `tuple` type
14787db96d56Sopenharmony_ci
14797db96d56Sopenharmony_ci        def a(*args: *tuple[int, *Ts]): pass
14807db96d56Sopenharmony_ci        self.assertEqual(
14817db96d56Sopenharmony_ci            a.__annotations__,
14827db96d56Sopenharmony_ci            {'args': (*tuple[int, *Ts],)[0]},
14837db96d56Sopenharmony_ci        )
14847db96d56Sopenharmony_ci
14857db96d56Sopenharmony_ci        def b(*args: *tuple[*Ts, int]): pass
14867db96d56Sopenharmony_ci        self.assertEqual(
14877db96d56Sopenharmony_ci            b.__annotations__,
14887db96d56Sopenharmony_ci            {'args': (*tuple[*Ts, int],)[0]},
14897db96d56Sopenharmony_ci        )
14907db96d56Sopenharmony_ci
14917db96d56Sopenharmony_ci        def c(*args: *tuple[str, *Ts, int]): pass
14927db96d56Sopenharmony_ci        self.assertEqual(
14937db96d56Sopenharmony_ci            c.__annotations__,
14947db96d56Sopenharmony_ci            {'args': (*tuple[str, *Ts, int],)[0]},
14957db96d56Sopenharmony_ci        )
14967db96d56Sopenharmony_ci
14977db96d56Sopenharmony_ci        def d(*args: *tuple[int, bool, *Ts, float, str]): pass
14987db96d56Sopenharmony_ci        self.assertEqual(
14997db96d56Sopenharmony_ci            d.__annotations__,
15007db96d56Sopenharmony_ci            {'args': (*tuple[int, bool, *Ts, float, str],)[0]},
15017db96d56Sopenharmony_ci        )
15027db96d56Sopenharmony_ci
15037db96d56Sopenharmony_ci        # Unpacking using `Unpack`, `Tuple` type from typing.py
15047db96d56Sopenharmony_ci
15057db96d56Sopenharmony_ci        def e(*args: Unpack[Tuple[int, Unpack[Ts]]]): pass
15067db96d56Sopenharmony_ci        self.assertEqual(
15077db96d56Sopenharmony_ci            e.__annotations__,
15087db96d56Sopenharmony_ci            {'args': Unpack[Tuple[int, Unpack[Ts]]]},
15097db96d56Sopenharmony_ci        )
15107db96d56Sopenharmony_ci
15117db96d56Sopenharmony_ci        def f(*args: Unpack[Tuple[Unpack[Ts], int]]): pass
15127db96d56Sopenharmony_ci        self.assertEqual(
15137db96d56Sopenharmony_ci            f.__annotations__,
15147db96d56Sopenharmony_ci            {'args': Unpack[Tuple[Unpack[Ts], int]]},
15157db96d56Sopenharmony_ci        )
15167db96d56Sopenharmony_ci
15177db96d56Sopenharmony_ci        def g(*args: Unpack[Tuple[str, Unpack[Ts], int]]): pass
15187db96d56Sopenharmony_ci        self.assertEqual(
15197db96d56Sopenharmony_ci            g.__annotations__,
15207db96d56Sopenharmony_ci            {'args': Unpack[Tuple[str, Unpack[Ts], int]]},
15217db96d56Sopenharmony_ci        )
15227db96d56Sopenharmony_ci
15237db96d56Sopenharmony_ci        def h(*args: Unpack[Tuple[int, bool, Unpack[Ts], float, str]]): pass
15247db96d56Sopenharmony_ci        self.assertEqual(
15257db96d56Sopenharmony_ci            h.__annotations__,
15267db96d56Sopenharmony_ci            {'args': Unpack[Tuple[int, bool, Unpack[Ts], float, str]]},
15277db96d56Sopenharmony_ci        )
15287db96d56Sopenharmony_ci
15297db96d56Sopenharmony_ci    def test_variadic_class_same_args_results_in_equalty(self):
15307db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
15317db96d56Sopenharmony_ci        class C(Generic[*Ts]): pass
15327db96d56Sopenharmony_ci        class D(Generic[Unpack[Ts]]): pass
15337db96d56Sopenharmony_ci
15347db96d56Sopenharmony_ci        self.assertEqual(C[int], C[int])
15357db96d56Sopenharmony_ci        self.assertEqual(D[int], D[int])
15367db96d56Sopenharmony_ci
15377db96d56Sopenharmony_ci        Ts1 = TypeVarTuple('Ts1')
15387db96d56Sopenharmony_ci        Ts2 = TypeVarTuple('Ts2')
15397db96d56Sopenharmony_ci
15407db96d56Sopenharmony_ci        self.assertEqual(
15417db96d56Sopenharmony_ci            C[*Ts1],
15427db96d56Sopenharmony_ci            C[*Ts1],
15437db96d56Sopenharmony_ci        )
15447db96d56Sopenharmony_ci        self.assertEqual(
15457db96d56Sopenharmony_ci            D[Unpack[Ts1]],
15467db96d56Sopenharmony_ci            D[Unpack[Ts1]],
15477db96d56Sopenharmony_ci        )
15487db96d56Sopenharmony_ci
15497db96d56Sopenharmony_ci        self.assertEqual(
15507db96d56Sopenharmony_ci            C[*Ts1, *Ts2],
15517db96d56Sopenharmony_ci            C[*Ts1, *Ts2],
15527db96d56Sopenharmony_ci        )
15537db96d56Sopenharmony_ci        self.assertEqual(
15547db96d56Sopenharmony_ci            D[Unpack[Ts1], Unpack[Ts2]],
15557db96d56Sopenharmony_ci            D[Unpack[Ts1], Unpack[Ts2]],
15567db96d56Sopenharmony_ci        )
15577db96d56Sopenharmony_ci
15587db96d56Sopenharmony_ci        self.assertEqual(
15597db96d56Sopenharmony_ci            C[int, *Ts1, *Ts2],
15607db96d56Sopenharmony_ci            C[int, *Ts1, *Ts2],
15617db96d56Sopenharmony_ci        )
15627db96d56Sopenharmony_ci        self.assertEqual(
15637db96d56Sopenharmony_ci            D[int, Unpack[Ts1], Unpack[Ts2]],
15647db96d56Sopenharmony_ci            D[int, Unpack[Ts1], Unpack[Ts2]],
15657db96d56Sopenharmony_ci        )
15667db96d56Sopenharmony_ci
15677db96d56Sopenharmony_ci    def test_variadic_class_arg_ordering_matters(self):
15687db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
15697db96d56Sopenharmony_ci        class C(Generic[*Ts]): pass
15707db96d56Sopenharmony_ci        class D(Generic[Unpack[Ts]]): pass
15717db96d56Sopenharmony_ci
15727db96d56Sopenharmony_ci        self.assertNotEqual(
15737db96d56Sopenharmony_ci            C[int, str],
15747db96d56Sopenharmony_ci            C[str, int],
15757db96d56Sopenharmony_ci        )
15767db96d56Sopenharmony_ci        self.assertNotEqual(
15777db96d56Sopenharmony_ci            D[int, str],
15787db96d56Sopenharmony_ci            D[str, int],
15797db96d56Sopenharmony_ci        )
15807db96d56Sopenharmony_ci
15817db96d56Sopenharmony_ci        Ts1 = TypeVarTuple('Ts1')
15827db96d56Sopenharmony_ci        Ts2 = TypeVarTuple('Ts2')
15837db96d56Sopenharmony_ci
15847db96d56Sopenharmony_ci        self.assertNotEqual(
15857db96d56Sopenharmony_ci            C[*Ts1, *Ts2],
15867db96d56Sopenharmony_ci            C[*Ts2, *Ts1],
15877db96d56Sopenharmony_ci        )
15887db96d56Sopenharmony_ci        self.assertNotEqual(
15897db96d56Sopenharmony_ci            D[Unpack[Ts1], Unpack[Ts2]],
15907db96d56Sopenharmony_ci            D[Unpack[Ts2], Unpack[Ts1]],
15917db96d56Sopenharmony_ci        )
15927db96d56Sopenharmony_ci
15937db96d56Sopenharmony_ci    def test_variadic_class_arg_typevartuple_identity_matters(self):
15947db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
15957db96d56Sopenharmony_ci        Ts1 = TypeVarTuple('Ts1')
15967db96d56Sopenharmony_ci        Ts2 = TypeVarTuple('Ts2')
15977db96d56Sopenharmony_ci
15987db96d56Sopenharmony_ci        class C(Generic[*Ts]): pass
15997db96d56Sopenharmony_ci        class D(Generic[Unpack[Ts]]): pass
16007db96d56Sopenharmony_ci
16017db96d56Sopenharmony_ci        self.assertNotEqual(C[*Ts1], C[*Ts2])
16027db96d56Sopenharmony_ci        self.assertNotEqual(D[Unpack[Ts1]], D[Unpack[Ts2]])
16037db96d56Sopenharmony_ci
16047db96d56Sopenharmony_ci
16057db96d56Sopenharmony_ciclass TypeVarTuplePicklingTests(BaseTestCase):
16067db96d56Sopenharmony_ci    # These are slightly awkward tests to run, because TypeVarTuples are only
16077db96d56Sopenharmony_ci    # picklable if defined in the global scope. We therefore need to push
16087db96d56Sopenharmony_ci    # various things defined in these tests into the global scope with `global`
16097db96d56Sopenharmony_ci    # statements at the start of each test.
16107db96d56Sopenharmony_ci
16117db96d56Sopenharmony_ci    @all_pickle_protocols
16127db96d56Sopenharmony_ci    def test_pickling_then_unpickling_results_in_same_identity(self, proto):
16137db96d56Sopenharmony_ci        global global_Ts1  # See explanation at start of class.
16147db96d56Sopenharmony_ci        global_Ts1 = TypeVarTuple('global_Ts1')
16157db96d56Sopenharmony_ci        global_Ts2 = pickle.loads(pickle.dumps(global_Ts1, proto))
16167db96d56Sopenharmony_ci        self.assertIs(global_Ts1, global_Ts2)
16177db96d56Sopenharmony_ci
16187db96d56Sopenharmony_ci    @all_pickle_protocols
16197db96d56Sopenharmony_ci    def test_pickling_then_unpickling_unpacked_results_in_same_identity(self, proto):
16207db96d56Sopenharmony_ci        global global_Ts  # See explanation at start of class.
16217db96d56Sopenharmony_ci        global_Ts = TypeVarTuple('global_Ts')
16227db96d56Sopenharmony_ci
16237db96d56Sopenharmony_ci        unpacked1 = (*global_Ts,)[0]
16247db96d56Sopenharmony_ci        unpacked2 = pickle.loads(pickle.dumps(unpacked1, proto))
16257db96d56Sopenharmony_ci        self.assertIs(unpacked1, unpacked2)
16267db96d56Sopenharmony_ci
16277db96d56Sopenharmony_ci        unpacked3 = Unpack[global_Ts]
16287db96d56Sopenharmony_ci        unpacked4 = pickle.loads(pickle.dumps(unpacked3, proto))
16297db96d56Sopenharmony_ci        self.assertIs(unpacked3, unpacked4)
16307db96d56Sopenharmony_ci
16317db96d56Sopenharmony_ci    @all_pickle_protocols
16327db96d56Sopenharmony_ci    def test_pickling_then_unpickling_tuple_with_typevartuple_equality(
16337db96d56Sopenharmony_ci            self, proto
16347db96d56Sopenharmony_ci    ):
16357db96d56Sopenharmony_ci        global global_T, global_Ts  # See explanation at start of class.
16367db96d56Sopenharmony_ci        global_T = TypeVar('global_T')
16377db96d56Sopenharmony_ci        global_Ts = TypeVarTuple('global_Ts')
16387db96d56Sopenharmony_ci
16397db96d56Sopenharmony_ci        tuples = [
16407db96d56Sopenharmony_ci            tuple[*global_Ts],
16417db96d56Sopenharmony_ci            Tuple[Unpack[global_Ts]],
16427db96d56Sopenharmony_ci
16437db96d56Sopenharmony_ci            tuple[T, *global_Ts],
16447db96d56Sopenharmony_ci            Tuple[T, Unpack[global_Ts]],
16457db96d56Sopenharmony_ci
16467db96d56Sopenharmony_ci            tuple[int, *global_Ts],
16477db96d56Sopenharmony_ci            Tuple[int, Unpack[global_Ts]],
16487db96d56Sopenharmony_ci        ]
16497db96d56Sopenharmony_ci        for t in tuples:
16507db96d56Sopenharmony_ci            t2 = pickle.loads(pickle.dumps(t, proto))
16517db96d56Sopenharmony_ci            self.assertEqual(t, t2)
16527db96d56Sopenharmony_ci
16537db96d56Sopenharmony_ci
16547db96d56Sopenharmony_ciclass UnionTests(BaseTestCase):
16557db96d56Sopenharmony_ci
16567db96d56Sopenharmony_ci    def test_basics(self):
16577db96d56Sopenharmony_ci        u = Union[int, float]
16587db96d56Sopenharmony_ci        self.assertNotEqual(u, Union)
16597db96d56Sopenharmony_ci
16607db96d56Sopenharmony_ci    def test_subclass_error(self):
16617db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
16627db96d56Sopenharmony_ci            issubclass(int, Union)
16637db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
16647db96d56Sopenharmony_ci            issubclass(Union, int)
16657db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
16667db96d56Sopenharmony_ci            issubclass(Union[int, str], int)
16677db96d56Sopenharmony_ci
16687db96d56Sopenharmony_ci    def test_union_any(self):
16697db96d56Sopenharmony_ci        u = Union[Any]
16707db96d56Sopenharmony_ci        self.assertEqual(u, Any)
16717db96d56Sopenharmony_ci        u1 = Union[int, Any]
16727db96d56Sopenharmony_ci        u2 = Union[Any, int]
16737db96d56Sopenharmony_ci        u3 = Union[Any, object]
16747db96d56Sopenharmony_ci        self.assertEqual(u1, u2)
16757db96d56Sopenharmony_ci        self.assertNotEqual(u1, Any)
16767db96d56Sopenharmony_ci        self.assertNotEqual(u2, Any)
16777db96d56Sopenharmony_ci        self.assertNotEqual(u3, Any)
16787db96d56Sopenharmony_ci
16797db96d56Sopenharmony_ci    def test_union_object(self):
16807db96d56Sopenharmony_ci        u = Union[object]
16817db96d56Sopenharmony_ci        self.assertEqual(u, object)
16827db96d56Sopenharmony_ci        u1 = Union[int, object]
16837db96d56Sopenharmony_ci        u2 = Union[object, int]
16847db96d56Sopenharmony_ci        self.assertEqual(u1, u2)
16857db96d56Sopenharmony_ci        self.assertNotEqual(u1, object)
16867db96d56Sopenharmony_ci        self.assertNotEqual(u2, object)
16877db96d56Sopenharmony_ci
16887db96d56Sopenharmony_ci    def test_unordered(self):
16897db96d56Sopenharmony_ci        u1 = Union[int, float]
16907db96d56Sopenharmony_ci        u2 = Union[float, int]
16917db96d56Sopenharmony_ci        self.assertEqual(u1, u2)
16927db96d56Sopenharmony_ci
16937db96d56Sopenharmony_ci    def test_single_class_disappears(self):
16947db96d56Sopenharmony_ci        t = Union[Employee]
16957db96d56Sopenharmony_ci        self.assertIs(t, Employee)
16967db96d56Sopenharmony_ci
16977db96d56Sopenharmony_ci    def test_base_class_kept(self):
16987db96d56Sopenharmony_ci        u = Union[Employee, Manager]
16997db96d56Sopenharmony_ci        self.assertNotEqual(u, Employee)
17007db96d56Sopenharmony_ci        self.assertIn(Employee, u.__args__)
17017db96d56Sopenharmony_ci        self.assertIn(Manager, u.__args__)
17027db96d56Sopenharmony_ci
17037db96d56Sopenharmony_ci    def test_union_union(self):
17047db96d56Sopenharmony_ci        u = Union[int, float]
17057db96d56Sopenharmony_ci        v = Union[u, Employee]
17067db96d56Sopenharmony_ci        self.assertEqual(v, Union[int, float, Employee])
17077db96d56Sopenharmony_ci
17087db96d56Sopenharmony_ci    def test_repr(self):
17097db96d56Sopenharmony_ci        self.assertEqual(repr(Union), 'typing.Union')
17107db96d56Sopenharmony_ci        u = Union[Employee, int]
17117db96d56Sopenharmony_ci        self.assertEqual(repr(u), 'typing.Union[%s.Employee, int]' % __name__)
17127db96d56Sopenharmony_ci        u = Union[int, Employee]
17137db96d56Sopenharmony_ci        self.assertEqual(repr(u), 'typing.Union[int, %s.Employee]' % __name__)
17147db96d56Sopenharmony_ci        T = TypeVar('T')
17157db96d56Sopenharmony_ci        u = Union[T, int][int]
17167db96d56Sopenharmony_ci        self.assertEqual(repr(u), repr(int))
17177db96d56Sopenharmony_ci        u = Union[List[int], int]
17187db96d56Sopenharmony_ci        self.assertEqual(repr(u), 'typing.Union[typing.List[int], int]')
17197db96d56Sopenharmony_ci        u = Union[list[int], dict[str, float]]
17207db96d56Sopenharmony_ci        self.assertEqual(repr(u), 'typing.Union[list[int], dict[str, float]]')
17217db96d56Sopenharmony_ci        u = Union[int | float]
17227db96d56Sopenharmony_ci        self.assertEqual(repr(u), 'typing.Union[int, float]')
17237db96d56Sopenharmony_ci
17247db96d56Sopenharmony_ci        u = Union[None, str]
17257db96d56Sopenharmony_ci        self.assertEqual(repr(u), 'typing.Optional[str]')
17267db96d56Sopenharmony_ci        u = Union[str, None]
17277db96d56Sopenharmony_ci        self.assertEqual(repr(u), 'typing.Optional[str]')
17287db96d56Sopenharmony_ci        u = Union[None, str, int]
17297db96d56Sopenharmony_ci        self.assertEqual(repr(u), 'typing.Union[NoneType, str, int]')
17307db96d56Sopenharmony_ci        u = Optional[str]
17317db96d56Sopenharmony_ci        self.assertEqual(repr(u), 'typing.Optional[str]')
17327db96d56Sopenharmony_ci
17337db96d56Sopenharmony_ci    def test_dir(self):
17347db96d56Sopenharmony_ci        dir_items = set(dir(Union[str, int]))
17357db96d56Sopenharmony_ci        for required_item in [
17367db96d56Sopenharmony_ci            '__args__', '__parameters__', '__origin__',
17377db96d56Sopenharmony_ci        ]:
17387db96d56Sopenharmony_ci            with self.subTest(required_item=required_item):
17397db96d56Sopenharmony_ci                self.assertIn(required_item, dir_items)
17407db96d56Sopenharmony_ci
17417db96d56Sopenharmony_ci    def test_cannot_subclass(self):
17427db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
17437db96d56Sopenharmony_ci            class C(Union):
17447db96d56Sopenharmony_ci                pass
17457db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
17467db96d56Sopenharmony_ci            class C(type(Union)):
17477db96d56Sopenharmony_ci                pass
17487db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
17497db96d56Sopenharmony_ci            class C(Union[int, str]):
17507db96d56Sopenharmony_ci                pass
17517db96d56Sopenharmony_ci
17527db96d56Sopenharmony_ci    def test_cannot_instantiate(self):
17537db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
17547db96d56Sopenharmony_ci            Union()
17557db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
17567db96d56Sopenharmony_ci            type(Union)()
17577db96d56Sopenharmony_ci        u = Union[int, float]
17587db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
17597db96d56Sopenharmony_ci            u()
17607db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
17617db96d56Sopenharmony_ci            type(u)()
17627db96d56Sopenharmony_ci
17637db96d56Sopenharmony_ci    def test_union_generalization(self):
17647db96d56Sopenharmony_ci        self.assertFalse(Union[str, typing.Iterable[int]] == str)
17657db96d56Sopenharmony_ci        self.assertFalse(Union[str, typing.Iterable[int]] == typing.Iterable[int])
17667db96d56Sopenharmony_ci        self.assertIn(str, Union[str, typing.Iterable[int]].__args__)
17677db96d56Sopenharmony_ci        self.assertIn(typing.Iterable[int], Union[str, typing.Iterable[int]].__args__)
17687db96d56Sopenharmony_ci
17697db96d56Sopenharmony_ci    def test_union_compare_other(self):
17707db96d56Sopenharmony_ci        self.assertNotEqual(Union, object)
17717db96d56Sopenharmony_ci        self.assertNotEqual(Union, Any)
17727db96d56Sopenharmony_ci        self.assertNotEqual(ClassVar, Union)
17737db96d56Sopenharmony_ci        self.assertNotEqual(Optional, Union)
17747db96d56Sopenharmony_ci        self.assertNotEqual([None], Optional)
17757db96d56Sopenharmony_ci        self.assertNotEqual(Optional, typing.Mapping)
17767db96d56Sopenharmony_ci        self.assertNotEqual(Optional[typing.MutableMapping], Union)
17777db96d56Sopenharmony_ci
17787db96d56Sopenharmony_ci    def test_optional(self):
17797db96d56Sopenharmony_ci        o = Optional[int]
17807db96d56Sopenharmony_ci        u = Union[int, None]
17817db96d56Sopenharmony_ci        self.assertEqual(o, u)
17827db96d56Sopenharmony_ci
17837db96d56Sopenharmony_ci    def test_empty(self):
17847db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
17857db96d56Sopenharmony_ci            Union[()]
17867db96d56Sopenharmony_ci
17877db96d56Sopenharmony_ci    def test_no_eval_union(self):
17887db96d56Sopenharmony_ci        u = Union[int, str]
17897db96d56Sopenharmony_ci        def f(x: u): ...
17907db96d56Sopenharmony_ci        self.assertIs(get_type_hints(f)['x'], u)
17917db96d56Sopenharmony_ci
17927db96d56Sopenharmony_ci    def test_function_repr_union(self):
17937db96d56Sopenharmony_ci        def fun() -> int: ...
17947db96d56Sopenharmony_ci        self.assertEqual(repr(Union[fun, int]), 'typing.Union[fun, int]')
17957db96d56Sopenharmony_ci
17967db96d56Sopenharmony_ci    def test_union_str_pattern(self):
17977db96d56Sopenharmony_ci        # Shouldn't crash; see http://bugs.python.org/issue25390
17987db96d56Sopenharmony_ci        A = Union[str, Pattern]
17997db96d56Sopenharmony_ci        A
18007db96d56Sopenharmony_ci
18017db96d56Sopenharmony_ci    def test_etree(self):
18027db96d56Sopenharmony_ci        # See https://github.com/python/typing/issues/229
18037db96d56Sopenharmony_ci        # (Only relevant for Python 2.)
18047db96d56Sopenharmony_ci        from xml.etree.ElementTree import Element
18057db96d56Sopenharmony_ci
18067db96d56Sopenharmony_ci        Union[Element, str]  # Shouldn't crash
18077db96d56Sopenharmony_ci
18087db96d56Sopenharmony_ci        def Elem(*args):
18097db96d56Sopenharmony_ci            return Element(*args)
18107db96d56Sopenharmony_ci
18117db96d56Sopenharmony_ci        Union[Elem, str]  # Nor should this
18127db96d56Sopenharmony_ci
18137db96d56Sopenharmony_ci    def test_union_of_literals(self):
18147db96d56Sopenharmony_ci        self.assertEqual(Union[Literal[1], Literal[2]].__args__,
18157db96d56Sopenharmony_ci                         (Literal[1], Literal[2]))
18167db96d56Sopenharmony_ci        self.assertEqual(Union[Literal[1], Literal[1]],
18177db96d56Sopenharmony_ci                         Literal[1])
18187db96d56Sopenharmony_ci
18197db96d56Sopenharmony_ci        self.assertEqual(Union[Literal[False], Literal[0]].__args__,
18207db96d56Sopenharmony_ci                         (Literal[False], Literal[0]))
18217db96d56Sopenharmony_ci        self.assertEqual(Union[Literal[True], Literal[1]].__args__,
18227db96d56Sopenharmony_ci                         (Literal[True], Literal[1]))
18237db96d56Sopenharmony_ci
18247db96d56Sopenharmony_ci        import enum
18257db96d56Sopenharmony_ci        class Ints(enum.IntEnum):
18267db96d56Sopenharmony_ci            A = 0
18277db96d56Sopenharmony_ci            B = 1
18287db96d56Sopenharmony_ci
18297db96d56Sopenharmony_ci        self.assertEqual(Union[Literal[Ints.A], Literal[Ints.A]],
18307db96d56Sopenharmony_ci                         Literal[Ints.A])
18317db96d56Sopenharmony_ci        self.assertEqual(Union[Literal[Ints.B], Literal[Ints.B]],
18327db96d56Sopenharmony_ci                         Literal[Ints.B])
18337db96d56Sopenharmony_ci
18347db96d56Sopenharmony_ci        self.assertEqual(Union[Literal[Ints.A], Literal[Ints.B]].__args__,
18357db96d56Sopenharmony_ci                         (Literal[Ints.A], Literal[Ints.B]))
18367db96d56Sopenharmony_ci
18377db96d56Sopenharmony_ci        self.assertEqual(Union[Literal[0], Literal[Ints.A], Literal[False]].__args__,
18387db96d56Sopenharmony_ci                         (Literal[0], Literal[Ints.A], Literal[False]))
18397db96d56Sopenharmony_ci        self.assertEqual(Union[Literal[1], Literal[Ints.B], Literal[True]].__args__,
18407db96d56Sopenharmony_ci                         (Literal[1], Literal[Ints.B], Literal[True]))
18417db96d56Sopenharmony_ci
18427db96d56Sopenharmony_ci
18437db96d56Sopenharmony_ciclass TupleTests(BaseTestCase):
18447db96d56Sopenharmony_ci
18457db96d56Sopenharmony_ci    def test_basics(self):
18467db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
18477db96d56Sopenharmony_ci            issubclass(Tuple, Tuple[int, str])
18487db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
18497db96d56Sopenharmony_ci            issubclass(tuple, Tuple[int, str])
18507db96d56Sopenharmony_ci
18517db96d56Sopenharmony_ci        class TP(tuple): ...
18527db96d56Sopenharmony_ci        self.assertIsSubclass(tuple, Tuple)
18537db96d56Sopenharmony_ci        self.assertIsSubclass(TP, Tuple)
18547db96d56Sopenharmony_ci
18557db96d56Sopenharmony_ci    def test_equality(self):
18567db96d56Sopenharmony_ci        self.assertEqual(Tuple[int], Tuple[int])
18577db96d56Sopenharmony_ci        self.assertEqual(Tuple[int, ...], Tuple[int, ...])
18587db96d56Sopenharmony_ci        self.assertNotEqual(Tuple[int], Tuple[int, int])
18597db96d56Sopenharmony_ci        self.assertNotEqual(Tuple[int], Tuple[int, ...])
18607db96d56Sopenharmony_ci
18617db96d56Sopenharmony_ci    def test_tuple_subclass(self):
18627db96d56Sopenharmony_ci        class MyTuple(tuple):
18637db96d56Sopenharmony_ci            pass
18647db96d56Sopenharmony_ci        self.assertIsSubclass(MyTuple, Tuple)
18657db96d56Sopenharmony_ci        self.assertIsSubclass(Tuple, Tuple)
18667db96d56Sopenharmony_ci        self.assertIsSubclass(tuple, Tuple)
18677db96d56Sopenharmony_ci
18687db96d56Sopenharmony_ci    def test_tuple_instance_type_error(self):
18697db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
18707db96d56Sopenharmony_ci            isinstance((0, 0), Tuple[int, int])
18717db96d56Sopenharmony_ci        self.assertIsInstance((0, 0), Tuple)
18727db96d56Sopenharmony_ci
18737db96d56Sopenharmony_ci    def test_repr(self):
18747db96d56Sopenharmony_ci        self.assertEqual(repr(Tuple), 'typing.Tuple')
18757db96d56Sopenharmony_ci        self.assertEqual(repr(Tuple[()]), 'typing.Tuple[()]')
18767db96d56Sopenharmony_ci        self.assertEqual(repr(Tuple[int, float]), 'typing.Tuple[int, float]')
18777db96d56Sopenharmony_ci        self.assertEqual(repr(Tuple[int, ...]), 'typing.Tuple[int, ...]')
18787db96d56Sopenharmony_ci        self.assertEqual(repr(Tuple[list[int]]), 'typing.Tuple[list[int]]')
18797db96d56Sopenharmony_ci
18807db96d56Sopenharmony_ci    def test_errors(self):
18817db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
18827db96d56Sopenharmony_ci            issubclass(42, Tuple)
18837db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
18847db96d56Sopenharmony_ci            issubclass(42, Tuple[int])
18857db96d56Sopenharmony_ci
18867db96d56Sopenharmony_ci
18877db96d56Sopenharmony_ciclass BaseCallableTests:
18887db96d56Sopenharmony_ci
18897db96d56Sopenharmony_ci    def test_self_subclass(self):
18907db96d56Sopenharmony_ci        Callable = self.Callable
18917db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
18927db96d56Sopenharmony_ci            issubclass(types.FunctionType, Callable[[int], int])
18937db96d56Sopenharmony_ci        self.assertIsSubclass(types.FunctionType, Callable)
18947db96d56Sopenharmony_ci        self.assertIsSubclass(Callable, Callable)
18957db96d56Sopenharmony_ci
18967db96d56Sopenharmony_ci    def test_eq_hash(self):
18977db96d56Sopenharmony_ci        Callable = self.Callable
18987db96d56Sopenharmony_ci        C = Callable[[int], int]
18997db96d56Sopenharmony_ci        self.assertEqual(C, Callable[[int], int])
19007db96d56Sopenharmony_ci        self.assertEqual(len({C, Callable[[int], int]}), 1)
19017db96d56Sopenharmony_ci        self.assertNotEqual(C, Callable[[int], str])
19027db96d56Sopenharmony_ci        self.assertNotEqual(C, Callable[[str], int])
19037db96d56Sopenharmony_ci        self.assertNotEqual(C, Callable[[int, int], int])
19047db96d56Sopenharmony_ci        self.assertNotEqual(C, Callable[[], int])
19057db96d56Sopenharmony_ci        self.assertNotEqual(C, Callable[..., int])
19067db96d56Sopenharmony_ci        self.assertNotEqual(C, Callable)
19077db96d56Sopenharmony_ci
19087db96d56Sopenharmony_ci    def test_dir(self):
19097db96d56Sopenharmony_ci        Callable = self.Callable
19107db96d56Sopenharmony_ci        dir_items = set(dir(Callable[..., int]))
19117db96d56Sopenharmony_ci        for required_item in [
19127db96d56Sopenharmony_ci            '__args__', '__parameters__', '__origin__',
19137db96d56Sopenharmony_ci        ]:
19147db96d56Sopenharmony_ci            with self.subTest(required_item=required_item):
19157db96d56Sopenharmony_ci                self.assertIn(required_item, dir_items)
19167db96d56Sopenharmony_ci
19177db96d56Sopenharmony_ci    def test_cannot_instantiate(self):
19187db96d56Sopenharmony_ci        Callable = self.Callable
19197db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
19207db96d56Sopenharmony_ci            Callable()
19217db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
19227db96d56Sopenharmony_ci            type(Callable)()
19237db96d56Sopenharmony_ci        c = Callable[[int], str]
19247db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
19257db96d56Sopenharmony_ci            c()
19267db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
19277db96d56Sopenharmony_ci            type(c)()
19287db96d56Sopenharmony_ci
19297db96d56Sopenharmony_ci    def test_callable_wrong_forms(self):
19307db96d56Sopenharmony_ci        Callable = self.Callable
19317db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
19327db96d56Sopenharmony_ci            Callable[int]
19337db96d56Sopenharmony_ci
19347db96d56Sopenharmony_ci    def test_callable_instance_works(self):
19357db96d56Sopenharmony_ci        Callable = self.Callable
19367db96d56Sopenharmony_ci        def f():
19377db96d56Sopenharmony_ci            pass
19387db96d56Sopenharmony_ci        self.assertIsInstance(f, Callable)
19397db96d56Sopenharmony_ci        self.assertNotIsInstance(None, Callable)
19407db96d56Sopenharmony_ci
19417db96d56Sopenharmony_ci    def test_callable_instance_type_error(self):
19427db96d56Sopenharmony_ci        Callable = self.Callable
19437db96d56Sopenharmony_ci        def f():
19447db96d56Sopenharmony_ci            pass
19457db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
19467db96d56Sopenharmony_ci            self.assertIsInstance(f, Callable[[], None])
19477db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
19487db96d56Sopenharmony_ci            self.assertIsInstance(f, Callable[[], Any])
19497db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
19507db96d56Sopenharmony_ci            self.assertNotIsInstance(None, Callable[[], None])
19517db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
19527db96d56Sopenharmony_ci            self.assertNotIsInstance(None, Callable[[], Any])
19537db96d56Sopenharmony_ci
19547db96d56Sopenharmony_ci    def test_repr(self):
19557db96d56Sopenharmony_ci        Callable = self.Callable
19567db96d56Sopenharmony_ci        fullname = f'{Callable.__module__}.Callable'
19577db96d56Sopenharmony_ci        ct0 = Callable[[], bool]
19587db96d56Sopenharmony_ci        self.assertEqual(repr(ct0), f'{fullname}[[], bool]')
19597db96d56Sopenharmony_ci        ct2 = Callable[[str, float], int]
19607db96d56Sopenharmony_ci        self.assertEqual(repr(ct2), f'{fullname}[[str, float], int]')
19617db96d56Sopenharmony_ci        ctv = Callable[..., str]
19627db96d56Sopenharmony_ci        self.assertEqual(repr(ctv), f'{fullname}[..., str]')
19637db96d56Sopenharmony_ci        ct3 = Callable[[str, float], list[int]]
19647db96d56Sopenharmony_ci        self.assertEqual(repr(ct3), f'{fullname}[[str, float], list[int]]')
19657db96d56Sopenharmony_ci
19667db96d56Sopenharmony_ci    def test_callable_with_ellipsis(self):
19677db96d56Sopenharmony_ci        Callable = self.Callable
19687db96d56Sopenharmony_ci        def foo(a: Callable[..., T]):
19697db96d56Sopenharmony_ci            pass
19707db96d56Sopenharmony_ci
19717db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(foo, globals(), locals()),
19727db96d56Sopenharmony_ci                         {'a': Callable[..., T]})
19737db96d56Sopenharmony_ci
19747db96d56Sopenharmony_ci    def test_ellipsis_in_generic(self):
19757db96d56Sopenharmony_ci        Callable = self.Callable
19767db96d56Sopenharmony_ci        # Shouldn't crash; see https://github.com/python/typing/issues/259
19777db96d56Sopenharmony_ci        typing.List[Callable[..., str]]
19787db96d56Sopenharmony_ci
19797db96d56Sopenharmony_ci    def test_or_and_ror(self):
19807db96d56Sopenharmony_ci        Callable = self.Callable
19817db96d56Sopenharmony_ci        self.assertEqual(Callable | Tuple, Union[Callable, Tuple])
19827db96d56Sopenharmony_ci        self.assertEqual(Tuple | Callable, Union[Tuple, Callable])
19837db96d56Sopenharmony_ci
19847db96d56Sopenharmony_ci    def test_basic(self):
19857db96d56Sopenharmony_ci        Callable = self.Callable
19867db96d56Sopenharmony_ci        alias = Callable[[int, str], float]
19877db96d56Sopenharmony_ci        if Callable is collections.abc.Callable:
19887db96d56Sopenharmony_ci            self.assertIsInstance(alias, types.GenericAlias)
19897db96d56Sopenharmony_ci        self.assertIs(alias.__origin__, collections.abc.Callable)
19907db96d56Sopenharmony_ci        self.assertEqual(alias.__args__, (int, str, float))
19917db96d56Sopenharmony_ci        self.assertEqual(alias.__parameters__, ())
19927db96d56Sopenharmony_ci
19937db96d56Sopenharmony_ci    def test_weakref(self):
19947db96d56Sopenharmony_ci        Callable = self.Callable
19957db96d56Sopenharmony_ci        alias = Callable[[int, str], float]
19967db96d56Sopenharmony_ci        self.assertEqual(weakref.ref(alias)(), alias)
19977db96d56Sopenharmony_ci
19987db96d56Sopenharmony_ci    def test_pickle(self):
19997db96d56Sopenharmony_ci        global T_pickle, P_pickle, TS_pickle  # needed for pickling
20007db96d56Sopenharmony_ci        Callable = self.Callable
20017db96d56Sopenharmony_ci        T_pickle = TypeVar('T_pickle')
20027db96d56Sopenharmony_ci        P_pickle = ParamSpec('P_pickle')
20037db96d56Sopenharmony_ci        TS_pickle = TypeVarTuple('TS_pickle')
20047db96d56Sopenharmony_ci
20057db96d56Sopenharmony_ci        samples = [
20067db96d56Sopenharmony_ci            Callable[[int, str], float],
20077db96d56Sopenharmony_ci            Callable[P_pickle, int],
20087db96d56Sopenharmony_ci            Callable[P_pickle, T_pickle],
20097db96d56Sopenharmony_ci            Callable[Concatenate[int, P_pickle], int],
20107db96d56Sopenharmony_ci            Callable[Concatenate[*TS_pickle, P_pickle], int],
20117db96d56Sopenharmony_ci        ]
20127db96d56Sopenharmony_ci        for alias in samples:
20137db96d56Sopenharmony_ci            for proto in range(pickle.HIGHEST_PROTOCOL + 1):
20147db96d56Sopenharmony_ci                with self.subTest(alias=alias, proto=proto):
20157db96d56Sopenharmony_ci                    s = pickle.dumps(alias, proto)
20167db96d56Sopenharmony_ci                    loaded = pickle.loads(s)
20177db96d56Sopenharmony_ci                    self.assertEqual(alias.__origin__, loaded.__origin__)
20187db96d56Sopenharmony_ci                    self.assertEqual(alias.__args__, loaded.__args__)
20197db96d56Sopenharmony_ci                    self.assertEqual(alias.__parameters__, loaded.__parameters__)
20207db96d56Sopenharmony_ci
20217db96d56Sopenharmony_ci        del T_pickle, P_pickle, TS_pickle  # cleaning up global state
20227db96d56Sopenharmony_ci
20237db96d56Sopenharmony_ci    def test_var_substitution(self):
20247db96d56Sopenharmony_ci        Callable = self.Callable
20257db96d56Sopenharmony_ci        fullname = f"{Callable.__module__}.Callable"
20267db96d56Sopenharmony_ci        C1 = Callable[[int, T], T]
20277db96d56Sopenharmony_ci        C2 = Callable[[KT, T], VT]
20287db96d56Sopenharmony_ci        C3 = Callable[..., T]
20297db96d56Sopenharmony_ci        self.assertEqual(C1[str], Callable[[int, str], str])
20307db96d56Sopenharmony_ci        self.assertEqual(C1[None], Callable[[int, type(None)], type(None)])
20317db96d56Sopenharmony_ci        self.assertEqual(C2[int, float, str], Callable[[int, float], str])
20327db96d56Sopenharmony_ci        self.assertEqual(C3[int], Callable[..., int])
20337db96d56Sopenharmony_ci        self.assertEqual(C3[NoReturn], Callable[..., NoReturn])
20347db96d56Sopenharmony_ci
20357db96d56Sopenharmony_ci        # multi chaining
20367db96d56Sopenharmony_ci        C4 = C2[int, VT, str]
20377db96d56Sopenharmony_ci        self.assertEqual(repr(C4), f"{fullname}[[int, ~VT], str]")
20387db96d56Sopenharmony_ci        self.assertEqual(repr(C4[dict]), f"{fullname}[[int, dict], str]")
20397db96d56Sopenharmony_ci        self.assertEqual(C4[dict], Callable[[int, dict], str])
20407db96d56Sopenharmony_ci
20417db96d56Sopenharmony_ci        # substitute a nested GenericAlias (both typing and the builtin
20427db96d56Sopenharmony_ci        # version)
20437db96d56Sopenharmony_ci        C5 = Callable[[typing.List[T], tuple[KT, T], VT], int]
20447db96d56Sopenharmony_ci        self.assertEqual(C5[int, str, float],
20457db96d56Sopenharmony_ci                         Callable[[typing.List[int], tuple[str, int], float], int])
20467db96d56Sopenharmony_ci
20477db96d56Sopenharmony_ci    def test_type_subst_error(self):
20487db96d56Sopenharmony_ci        Callable = self.Callable
20497db96d56Sopenharmony_ci        P = ParamSpec('P')
20507db96d56Sopenharmony_ci        T = TypeVar('T')
20517db96d56Sopenharmony_ci
20527db96d56Sopenharmony_ci        pat = "Expected a list of types, an ellipsis, ParamSpec, or Concatenate."
20537db96d56Sopenharmony_ci
20547db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, pat):
20557db96d56Sopenharmony_ci            Callable[P, T][0, int]
20567db96d56Sopenharmony_ci
20577db96d56Sopenharmony_ci    def test_type_erasure(self):
20587db96d56Sopenharmony_ci        Callable = self.Callable
20597db96d56Sopenharmony_ci        class C1(Callable):
20607db96d56Sopenharmony_ci            def __call__(self):
20617db96d56Sopenharmony_ci                return None
20627db96d56Sopenharmony_ci        a = C1[[int], T]
20637db96d56Sopenharmony_ci        self.assertIs(a().__class__, C1)
20647db96d56Sopenharmony_ci        self.assertEqual(a().__orig_class__, C1[[int], T])
20657db96d56Sopenharmony_ci
20667db96d56Sopenharmony_ci    def test_paramspec(self):
20677db96d56Sopenharmony_ci        Callable = self.Callable
20687db96d56Sopenharmony_ci        fullname = f"{Callable.__module__}.Callable"
20697db96d56Sopenharmony_ci        P = ParamSpec('P')
20707db96d56Sopenharmony_ci        P2 = ParamSpec('P2')
20717db96d56Sopenharmony_ci        C1 = Callable[P, T]
20727db96d56Sopenharmony_ci        # substitution
20737db96d56Sopenharmony_ci        self.assertEqual(C1[[int], str], Callable[[int], str])
20747db96d56Sopenharmony_ci        self.assertEqual(C1[[int, str], str], Callable[[int, str], str])
20757db96d56Sopenharmony_ci        self.assertEqual(C1[[], str], Callable[[], str])
20767db96d56Sopenharmony_ci        self.assertEqual(C1[..., str], Callable[..., str])
20777db96d56Sopenharmony_ci        self.assertEqual(C1[P2, str], Callable[P2, str])
20787db96d56Sopenharmony_ci        self.assertEqual(C1[Concatenate[int, P2], str],
20797db96d56Sopenharmony_ci                         Callable[Concatenate[int, P2], str])
20807db96d56Sopenharmony_ci        self.assertEqual(repr(C1), f"{fullname}[~P, ~T]")
20817db96d56Sopenharmony_ci        self.assertEqual(repr(C1[[int, str], str]), f"{fullname}[[int, str], str]")
20827db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
20837db96d56Sopenharmony_ci            C1[int, str]
20847db96d56Sopenharmony_ci
20857db96d56Sopenharmony_ci        C2 = Callable[P, int]
20867db96d56Sopenharmony_ci        self.assertEqual(C2[[int]], Callable[[int], int])
20877db96d56Sopenharmony_ci        self.assertEqual(C2[[int, str]], Callable[[int, str], int])
20887db96d56Sopenharmony_ci        self.assertEqual(C2[[]], Callable[[], int])
20897db96d56Sopenharmony_ci        self.assertEqual(C2[...], Callable[..., int])
20907db96d56Sopenharmony_ci        self.assertEqual(C2[P2], Callable[P2, int])
20917db96d56Sopenharmony_ci        self.assertEqual(C2[Concatenate[int, P2]],
20927db96d56Sopenharmony_ci                         Callable[Concatenate[int, P2], int])
20937db96d56Sopenharmony_ci        # special case in PEP 612 where
20947db96d56Sopenharmony_ci        # X[int, str, float] == X[[int, str, float]]
20957db96d56Sopenharmony_ci        self.assertEqual(C2[int], Callable[[int], int])
20967db96d56Sopenharmony_ci        self.assertEqual(C2[int, str], Callable[[int, str], int])
20977db96d56Sopenharmony_ci        self.assertEqual(repr(C2), f"{fullname}[~P, int]")
20987db96d56Sopenharmony_ci        self.assertEqual(repr(C2[int, str]), f"{fullname}[[int, str], int]")
20997db96d56Sopenharmony_ci
21007db96d56Sopenharmony_ci    def test_concatenate(self):
21017db96d56Sopenharmony_ci        Callable = self.Callable
21027db96d56Sopenharmony_ci        fullname = f"{Callable.__module__}.Callable"
21037db96d56Sopenharmony_ci        T = TypeVar('T')
21047db96d56Sopenharmony_ci        P = ParamSpec('P')
21057db96d56Sopenharmony_ci        P2 = ParamSpec('P2')
21067db96d56Sopenharmony_ci        C = Callable[Concatenate[int, P], T]
21077db96d56Sopenharmony_ci        self.assertEqual(repr(C),
21087db96d56Sopenharmony_ci                         f"{fullname}[typing.Concatenate[int, ~P], ~T]")
21097db96d56Sopenharmony_ci        self.assertEqual(C[P2, int], Callable[Concatenate[int, P2], int])
21107db96d56Sopenharmony_ci        self.assertEqual(C[[str, float], int], Callable[[int, str, float], int])
21117db96d56Sopenharmony_ci        self.assertEqual(C[[], int], Callable[[int], int])
21127db96d56Sopenharmony_ci        self.assertEqual(C[Concatenate[str, P2], int],
21137db96d56Sopenharmony_ci                         Callable[Concatenate[int, str, P2], int])
21147db96d56Sopenharmony_ci        self.assertEqual(C[..., int], Callable[Concatenate[int, ...], int])
21157db96d56Sopenharmony_ci
21167db96d56Sopenharmony_ci        C = Callable[Concatenate[int, P], int]
21177db96d56Sopenharmony_ci        self.assertEqual(repr(C),
21187db96d56Sopenharmony_ci                         f"{fullname}[typing.Concatenate[int, ~P], int]")
21197db96d56Sopenharmony_ci        self.assertEqual(C[P2], Callable[Concatenate[int, P2], int])
21207db96d56Sopenharmony_ci        self.assertEqual(C[[str, float]], Callable[[int, str, float], int])
21217db96d56Sopenharmony_ci        self.assertEqual(C[str, float], Callable[[int, str, float], int])
21227db96d56Sopenharmony_ci        self.assertEqual(C[[]], Callable[[int], int])
21237db96d56Sopenharmony_ci        self.assertEqual(C[Concatenate[str, P2]],
21247db96d56Sopenharmony_ci                         Callable[Concatenate[int, str, P2], int])
21257db96d56Sopenharmony_ci        self.assertEqual(C[...], Callable[Concatenate[int, ...], int])
21267db96d56Sopenharmony_ci
21277db96d56Sopenharmony_ci    def test_nested_paramspec(self):
21287db96d56Sopenharmony_ci        # Since Callable has some special treatment, we want to be sure
21297db96d56Sopenharmony_ci        # that substituion works correctly, see gh-103054
21307db96d56Sopenharmony_ci        Callable = self.Callable
21317db96d56Sopenharmony_ci        P = ParamSpec('P')
21327db96d56Sopenharmony_ci        P2 = ParamSpec('P2')
21337db96d56Sopenharmony_ci        T = TypeVar('T')
21347db96d56Sopenharmony_ci        T2 = TypeVar('T2')
21357db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
21367db96d56Sopenharmony_ci        class My(Generic[P, T]):
21377db96d56Sopenharmony_ci            pass
21387db96d56Sopenharmony_ci
21397db96d56Sopenharmony_ci        self.assertEqual(My.__parameters__, (P, T))
21407db96d56Sopenharmony_ci
21417db96d56Sopenharmony_ci        C1 = My[[int, T2], Callable[P2, T2]]
21427db96d56Sopenharmony_ci        self.assertEqual(C1.__args__, ((int, T2), Callable[P2, T2]))
21437db96d56Sopenharmony_ci        self.assertEqual(C1.__parameters__, (T2, P2))
21447db96d56Sopenharmony_ci        self.assertEqual(C1[str, [list[int], bytes]],
21457db96d56Sopenharmony_ci                         My[[int, str], Callable[[list[int], bytes], str]])
21467db96d56Sopenharmony_ci
21477db96d56Sopenharmony_ci        C2 = My[[Callable[[T2], int], list[T2]], str]
21487db96d56Sopenharmony_ci        self.assertEqual(C2.__args__, ((Callable[[T2], int], list[T2]), str))
21497db96d56Sopenharmony_ci        self.assertEqual(C2.__parameters__, (T2,))
21507db96d56Sopenharmony_ci        self.assertEqual(C2[list[str]],
21517db96d56Sopenharmony_ci                         My[[Callable[[list[str]], int], list[list[str]]], str])
21527db96d56Sopenharmony_ci
21537db96d56Sopenharmony_ci        C3 = My[[Callable[P2, T2], T2], T2]
21547db96d56Sopenharmony_ci        self.assertEqual(C3.__args__, ((Callable[P2, T2], T2), T2))
21557db96d56Sopenharmony_ci        self.assertEqual(C3.__parameters__, (P2, T2))
21567db96d56Sopenharmony_ci        self.assertEqual(C3[[], int],
21577db96d56Sopenharmony_ci                         My[[Callable[[], int], int], int])
21587db96d56Sopenharmony_ci        self.assertEqual(C3[[str, bool], int],
21597db96d56Sopenharmony_ci                         My[[Callable[[str, bool], int], int], int])
21607db96d56Sopenharmony_ci        self.assertEqual(C3[[str, bool], T][int],
21617db96d56Sopenharmony_ci                         My[[Callable[[str, bool], int], int], int])
21627db96d56Sopenharmony_ci
21637db96d56Sopenharmony_ci        C4 = My[[Callable[[int, *Ts, str], T2], T2], T2]
21647db96d56Sopenharmony_ci        self.assertEqual(C4.__args__, ((Callable[[int, *Ts, str], T2], T2), T2))
21657db96d56Sopenharmony_ci        self.assertEqual(C4.__parameters__, (Ts, T2))
21667db96d56Sopenharmony_ci        self.assertEqual(C4[bool, bytes, float],
21677db96d56Sopenharmony_ci                         My[[Callable[[int, bool, bytes, str], float], float], float])
21687db96d56Sopenharmony_ci
21697db96d56Sopenharmony_ci    def test_errors(self):
21707db96d56Sopenharmony_ci        Callable = self.Callable
21717db96d56Sopenharmony_ci        alias = Callable[[int, str], float]
21727db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "is not a generic class"):
21737db96d56Sopenharmony_ci            alias[int]
21747db96d56Sopenharmony_ci        P = ParamSpec('P')
21757db96d56Sopenharmony_ci        C1 = Callable[P, T]
21767db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "many arguments for"):
21777db96d56Sopenharmony_ci            C1[int, str, str]
21787db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "few arguments for"):
21797db96d56Sopenharmony_ci            C1[int]
21807db96d56Sopenharmony_ci
21817db96d56Sopenharmony_ciclass TypingCallableTests(BaseCallableTests, BaseTestCase):
21827db96d56Sopenharmony_ci    Callable = typing.Callable
21837db96d56Sopenharmony_ci
21847db96d56Sopenharmony_ci    def test_consistency(self):
21857db96d56Sopenharmony_ci        # bpo-42195
21867db96d56Sopenharmony_ci        # Testing collections.abc.Callable's consistency with typing.Callable
21877db96d56Sopenharmony_ci        c1 = typing.Callable[[int, str], dict]
21887db96d56Sopenharmony_ci        c2 = collections.abc.Callable[[int, str], dict]
21897db96d56Sopenharmony_ci        self.assertEqual(c1.__args__, c2.__args__)
21907db96d56Sopenharmony_ci        self.assertEqual(hash(c1.__args__), hash(c2.__args__))
21917db96d56Sopenharmony_ci
21927db96d56Sopenharmony_ci
21937db96d56Sopenharmony_ciclass CollectionsCallableTests(BaseCallableTests, BaseTestCase):
21947db96d56Sopenharmony_ci    Callable = collections.abc.Callable
21957db96d56Sopenharmony_ci
21967db96d56Sopenharmony_ci
21977db96d56Sopenharmony_ciclass LiteralTests(BaseTestCase):
21987db96d56Sopenharmony_ci    def test_basics(self):
21997db96d56Sopenharmony_ci        # All of these are allowed.
22007db96d56Sopenharmony_ci        Literal[1]
22017db96d56Sopenharmony_ci        Literal[1, 2, 3]
22027db96d56Sopenharmony_ci        Literal["x", "y", "z"]
22037db96d56Sopenharmony_ci        Literal[None]
22047db96d56Sopenharmony_ci        Literal[True]
22057db96d56Sopenharmony_ci        Literal[1, "2", False]
22067db96d56Sopenharmony_ci        Literal[Literal[1, 2], Literal[4, 5]]
22077db96d56Sopenharmony_ci        Literal[b"foo", u"bar"]
22087db96d56Sopenharmony_ci
22097db96d56Sopenharmony_ci    def test_enum(self):
22107db96d56Sopenharmony_ci        import enum
22117db96d56Sopenharmony_ci        class My(enum.Enum):
22127db96d56Sopenharmony_ci            A = 'A'
22137db96d56Sopenharmony_ci
22147db96d56Sopenharmony_ci        self.assertEqual(Literal[My.A].__args__, (My.A,))
22157db96d56Sopenharmony_ci
22167db96d56Sopenharmony_ci    def test_illegal_parameters_do_not_raise_runtime_errors(self):
22177db96d56Sopenharmony_ci        # Type checkers should reject these types, but we do not
22187db96d56Sopenharmony_ci        # raise errors at runtime to maintain maximum flexibility.
22197db96d56Sopenharmony_ci        Literal[int]
22207db96d56Sopenharmony_ci        Literal[3j + 2, ..., ()]
22217db96d56Sopenharmony_ci        Literal[{"foo": 3, "bar": 4}]
22227db96d56Sopenharmony_ci        Literal[T]
22237db96d56Sopenharmony_ci
22247db96d56Sopenharmony_ci    def test_literals_inside_other_types(self):
22257db96d56Sopenharmony_ci        List[Literal[1, 2, 3]]
22267db96d56Sopenharmony_ci        List[Literal[("foo", "bar", "baz")]]
22277db96d56Sopenharmony_ci
22287db96d56Sopenharmony_ci    def test_repr(self):
22297db96d56Sopenharmony_ci        self.assertEqual(repr(Literal[1]), "typing.Literal[1]")
22307db96d56Sopenharmony_ci        self.assertEqual(repr(Literal[1, True, "foo"]), "typing.Literal[1, True, 'foo']")
22317db96d56Sopenharmony_ci        self.assertEqual(repr(Literal[int]), "typing.Literal[int]")
22327db96d56Sopenharmony_ci        self.assertEqual(repr(Literal), "typing.Literal")
22337db96d56Sopenharmony_ci        self.assertEqual(repr(Literal[None]), "typing.Literal[None]")
22347db96d56Sopenharmony_ci        self.assertEqual(repr(Literal[1, 2, 3, 3]), "typing.Literal[1, 2, 3]")
22357db96d56Sopenharmony_ci
22367db96d56Sopenharmony_ci    def test_dir(self):
22377db96d56Sopenharmony_ci        dir_items = set(dir(Literal[1, 2, 3]))
22387db96d56Sopenharmony_ci        for required_item in [
22397db96d56Sopenharmony_ci            '__args__', '__parameters__', '__origin__',
22407db96d56Sopenharmony_ci        ]:
22417db96d56Sopenharmony_ci            with self.subTest(required_item=required_item):
22427db96d56Sopenharmony_ci                self.assertIn(required_item, dir_items)
22437db96d56Sopenharmony_ci
22447db96d56Sopenharmony_ci    def test_cannot_init(self):
22457db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
22467db96d56Sopenharmony_ci            Literal()
22477db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
22487db96d56Sopenharmony_ci            Literal[1]()
22497db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
22507db96d56Sopenharmony_ci            type(Literal)()
22517db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
22527db96d56Sopenharmony_ci            type(Literal[1])()
22537db96d56Sopenharmony_ci
22547db96d56Sopenharmony_ci    def test_no_isinstance_or_issubclass(self):
22557db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
22567db96d56Sopenharmony_ci            isinstance(1, Literal[1])
22577db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
22587db96d56Sopenharmony_ci            isinstance(int, Literal[1])
22597db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
22607db96d56Sopenharmony_ci            issubclass(1, Literal[1])
22617db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
22627db96d56Sopenharmony_ci            issubclass(int, Literal[1])
22637db96d56Sopenharmony_ci
22647db96d56Sopenharmony_ci    def test_no_subclassing(self):
22657db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
22667db96d56Sopenharmony_ci            class Foo(Literal[1]): pass
22677db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
22687db96d56Sopenharmony_ci            class Bar(Literal): pass
22697db96d56Sopenharmony_ci
22707db96d56Sopenharmony_ci    def test_no_multiple_subscripts(self):
22717db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
22727db96d56Sopenharmony_ci            Literal[1][1]
22737db96d56Sopenharmony_ci
22747db96d56Sopenharmony_ci    def test_equal(self):
22757db96d56Sopenharmony_ci        self.assertNotEqual(Literal[0], Literal[False])
22767db96d56Sopenharmony_ci        self.assertNotEqual(Literal[True], Literal[1])
22777db96d56Sopenharmony_ci        self.assertNotEqual(Literal[1], Literal[2])
22787db96d56Sopenharmony_ci        self.assertNotEqual(Literal[1, True], Literal[1])
22797db96d56Sopenharmony_ci        self.assertNotEqual(Literal[1, True], Literal[1, 1])
22807db96d56Sopenharmony_ci        self.assertNotEqual(Literal[1, 2], Literal[True, 2])
22817db96d56Sopenharmony_ci        self.assertEqual(Literal[1], Literal[1])
22827db96d56Sopenharmony_ci        self.assertEqual(Literal[1, 2], Literal[2, 1])
22837db96d56Sopenharmony_ci        self.assertEqual(Literal[1, 2, 3], Literal[1, 2, 3, 3])
22847db96d56Sopenharmony_ci
22857db96d56Sopenharmony_ci    def test_hash(self):
22867db96d56Sopenharmony_ci        self.assertEqual(hash(Literal[1]), hash(Literal[1]))
22877db96d56Sopenharmony_ci        self.assertEqual(hash(Literal[1, 2]), hash(Literal[2, 1]))
22887db96d56Sopenharmony_ci        self.assertEqual(hash(Literal[1, 2, 3]), hash(Literal[1, 2, 3, 3]))
22897db96d56Sopenharmony_ci
22907db96d56Sopenharmony_ci    def test_args(self):
22917db96d56Sopenharmony_ci        self.assertEqual(Literal[1, 2, 3].__args__, (1, 2, 3))
22927db96d56Sopenharmony_ci        self.assertEqual(Literal[1, 2, 3, 3].__args__, (1, 2, 3))
22937db96d56Sopenharmony_ci        self.assertEqual(Literal[1, Literal[2], Literal[3, 4]].__args__, (1, 2, 3, 4))
22947db96d56Sopenharmony_ci        # Mutable arguments will not be deduplicated
22957db96d56Sopenharmony_ci        self.assertEqual(Literal[[], []].__args__, ([], []))
22967db96d56Sopenharmony_ci
22977db96d56Sopenharmony_ci    def test_flatten(self):
22987db96d56Sopenharmony_ci        l1 = Literal[Literal[1], Literal[2], Literal[3]]
22997db96d56Sopenharmony_ci        l2 = Literal[Literal[1, 2], 3]
23007db96d56Sopenharmony_ci        l3 = Literal[Literal[1, 2, 3]]
23017db96d56Sopenharmony_ci        for l in l1, l2, l3:
23027db96d56Sopenharmony_ci            self.assertEqual(l, Literal[1, 2, 3])
23037db96d56Sopenharmony_ci            self.assertEqual(l.__args__, (1, 2, 3))
23047db96d56Sopenharmony_ci
23057db96d56Sopenharmony_ci    def test_does_not_flatten_enum(self):
23067db96d56Sopenharmony_ci        import enum
23077db96d56Sopenharmony_ci        class Ints(enum.IntEnum):
23087db96d56Sopenharmony_ci            A = 1
23097db96d56Sopenharmony_ci            B = 2
23107db96d56Sopenharmony_ci
23117db96d56Sopenharmony_ci        l = Literal[
23127db96d56Sopenharmony_ci            Literal[Ints.A],
23137db96d56Sopenharmony_ci            Literal[Ints.B],
23147db96d56Sopenharmony_ci            Literal[1],
23157db96d56Sopenharmony_ci            Literal[2],
23167db96d56Sopenharmony_ci        ]
23177db96d56Sopenharmony_ci        self.assertEqual(l.__args__, (Ints.A, Ints.B, 1, 2))
23187db96d56Sopenharmony_ci
23197db96d56Sopenharmony_ci
23207db96d56Sopenharmony_ciXK = TypeVar('XK', str, bytes)
23217db96d56Sopenharmony_ciXV = TypeVar('XV')
23227db96d56Sopenharmony_ci
23237db96d56Sopenharmony_ci
23247db96d56Sopenharmony_ciclass SimpleMapping(Generic[XK, XV]):
23257db96d56Sopenharmony_ci
23267db96d56Sopenharmony_ci    def __getitem__(self, key: XK) -> XV:
23277db96d56Sopenharmony_ci        ...
23287db96d56Sopenharmony_ci
23297db96d56Sopenharmony_ci    def __setitem__(self, key: XK, value: XV):
23307db96d56Sopenharmony_ci        ...
23317db96d56Sopenharmony_ci
23327db96d56Sopenharmony_ci    def get(self, key: XK, default: XV = None) -> XV:
23337db96d56Sopenharmony_ci        ...
23347db96d56Sopenharmony_ci
23357db96d56Sopenharmony_ci
23367db96d56Sopenharmony_ciclass MySimpleMapping(SimpleMapping[XK, XV]):
23377db96d56Sopenharmony_ci
23387db96d56Sopenharmony_ci    def __init__(self):
23397db96d56Sopenharmony_ci        self.store = {}
23407db96d56Sopenharmony_ci
23417db96d56Sopenharmony_ci    def __getitem__(self, key: str):
23427db96d56Sopenharmony_ci        return self.store[key]
23437db96d56Sopenharmony_ci
23447db96d56Sopenharmony_ci    def __setitem__(self, key: str, value):
23457db96d56Sopenharmony_ci        self.store[key] = value
23467db96d56Sopenharmony_ci
23477db96d56Sopenharmony_ci    def get(self, key: str, default=None):
23487db96d56Sopenharmony_ci        try:
23497db96d56Sopenharmony_ci            return self.store[key]
23507db96d56Sopenharmony_ci        except KeyError:
23517db96d56Sopenharmony_ci            return default
23527db96d56Sopenharmony_ci
23537db96d56Sopenharmony_ci
23547db96d56Sopenharmony_ciclass Coordinate(Protocol):
23557db96d56Sopenharmony_ci    x: int
23567db96d56Sopenharmony_ci    y: int
23577db96d56Sopenharmony_ci
23587db96d56Sopenharmony_ci@runtime_checkable
23597db96d56Sopenharmony_ciclass Point(Coordinate, Protocol):
23607db96d56Sopenharmony_ci    label: str
23617db96d56Sopenharmony_ci
23627db96d56Sopenharmony_ciclass MyPoint:
23637db96d56Sopenharmony_ci    x: int
23647db96d56Sopenharmony_ci    y: int
23657db96d56Sopenharmony_ci    label: str
23667db96d56Sopenharmony_ci
23677db96d56Sopenharmony_ciclass XAxis(Protocol):
23687db96d56Sopenharmony_ci    x: int
23697db96d56Sopenharmony_ci
23707db96d56Sopenharmony_ciclass YAxis(Protocol):
23717db96d56Sopenharmony_ci    y: int
23727db96d56Sopenharmony_ci
23737db96d56Sopenharmony_ci@runtime_checkable
23747db96d56Sopenharmony_ciclass Position(XAxis, YAxis, Protocol):
23757db96d56Sopenharmony_ci    pass
23767db96d56Sopenharmony_ci
23777db96d56Sopenharmony_ci@runtime_checkable
23787db96d56Sopenharmony_ciclass Proto(Protocol):
23797db96d56Sopenharmony_ci    attr: int
23807db96d56Sopenharmony_ci    def meth(self, arg: str) -> int:
23817db96d56Sopenharmony_ci        ...
23827db96d56Sopenharmony_ci
23837db96d56Sopenharmony_ciclass Concrete(Proto):
23847db96d56Sopenharmony_ci    pass
23857db96d56Sopenharmony_ci
23867db96d56Sopenharmony_ciclass Other:
23877db96d56Sopenharmony_ci    attr: int = 1
23887db96d56Sopenharmony_ci    def meth(self, arg: str) -> int:
23897db96d56Sopenharmony_ci        if arg == 'this':
23907db96d56Sopenharmony_ci            return 1
23917db96d56Sopenharmony_ci        return 0
23927db96d56Sopenharmony_ci
23937db96d56Sopenharmony_ciclass NT(NamedTuple):
23947db96d56Sopenharmony_ci    x: int
23957db96d56Sopenharmony_ci    y: int
23967db96d56Sopenharmony_ci
23977db96d56Sopenharmony_ci@runtime_checkable
23987db96d56Sopenharmony_ciclass HasCallProtocol(Protocol):
23997db96d56Sopenharmony_ci    __call__: typing.Callable
24007db96d56Sopenharmony_ci
24017db96d56Sopenharmony_ci
24027db96d56Sopenharmony_ciclass ProtocolTests(BaseTestCase):
24037db96d56Sopenharmony_ci    def test_basic_protocol(self):
24047db96d56Sopenharmony_ci        @runtime_checkable
24057db96d56Sopenharmony_ci        class P(Protocol):
24067db96d56Sopenharmony_ci            def meth(self):
24077db96d56Sopenharmony_ci                pass
24087db96d56Sopenharmony_ci
24097db96d56Sopenharmony_ci        class C: pass
24107db96d56Sopenharmony_ci
24117db96d56Sopenharmony_ci        class D:
24127db96d56Sopenharmony_ci            def meth(self):
24137db96d56Sopenharmony_ci                pass
24147db96d56Sopenharmony_ci
24157db96d56Sopenharmony_ci        def f():
24167db96d56Sopenharmony_ci            pass
24177db96d56Sopenharmony_ci
24187db96d56Sopenharmony_ci        self.assertIsSubclass(D, P)
24197db96d56Sopenharmony_ci        self.assertIsInstance(D(), P)
24207db96d56Sopenharmony_ci        self.assertNotIsSubclass(C, P)
24217db96d56Sopenharmony_ci        self.assertNotIsInstance(C(), P)
24227db96d56Sopenharmony_ci        self.assertNotIsSubclass(types.FunctionType, P)
24237db96d56Sopenharmony_ci        self.assertNotIsInstance(f, P)
24247db96d56Sopenharmony_ci
24257db96d56Sopenharmony_ci    def test_everything_implements_empty_protocol(self):
24267db96d56Sopenharmony_ci        @runtime_checkable
24277db96d56Sopenharmony_ci        class Empty(Protocol):
24287db96d56Sopenharmony_ci            pass
24297db96d56Sopenharmony_ci
24307db96d56Sopenharmony_ci        class C:
24317db96d56Sopenharmony_ci            pass
24327db96d56Sopenharmony_ci
24337db96d56Sopenharmony_ci        def f():
24347db96d56Sopenharmony_ci            pass
24357db96d56Sopenharmony_ci
24367db96d56Sopenharmony_ci        for thing in (object, type, tuple, C, types.FunctionType):
24377db96d56Sopenharmony_ci            self.assertIsSubclass(thing, Empty)
24387db96d56Sopenharmony_ci        for thing in (object(), 1, (), typing, f):
24397db96d56Sopenharmony_ci            self.assertIsInstance(thing, Empty)
24407db96d56Sopenharmony_ci
24417db96d56Sopenharmony_ci    def test_function_implements_protocol(self):
24427db96d56Sopenharmony_ci        def f():
24437db96d56Sopenharmony_ci            pass
24447db96d56Sopenharmony_ci
24457db96d56Sopenharmony_ci        self.assertIsInstance(f, HasCallProtocol)
24467db96d56Sopenharmony_ci
24477db96d56Sopenharmony_ci    def test_no_inheritance_from_nominal(self):
24487db96d56Sopenharmony_ci        class C: pass
24497db96d56Sopenharmony_ci
24507db96d56Sopenharmony_ci        class BP(Protocol): pass
24517db96d56Sopenharmony_ci
24527db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
24537db96d56Sopenharmony_ci            class P(C, Protocol):
24547db96d56Sopenharmony_ci                pass
24557db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
24567db96d56Sopenharmony_ci            class P(Protocol, C):
24577db96d56Sopenharmony_ci                pass
24587db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
24597db96d56Sopenharmony_ci            class P(BP, C, Protocol):
24607db96d56Sopenharmony_ci                pass
24617db96d56Sopenharmony_ci
24627db96d56Sopenharmony_ci        class D(BP, C): pass
24637db96d56Sopenharmony_ci
24647db96d56Sopenharmony_ci        class E(C, BP): pass
24657db96d56Sopenharmony_ci
24667db96d56Sopenharmony_ci        self.assertNotIsInstance(D(), E)
24677db96d56Sopenharmony_ci        self.assertNotIsInstance(E(), D)
24687db96d56Sopenharmony_ci
24697db96d56Sopenharmony_ci    def test_no_instantiation(self):
24707db96d56Sopenharmony_ci        class P(Protocol): pass
24717db96d56Sopenharmony_ci
24727db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
24737db96d56Sopenharmony_ci            P()
24747db96d56Sopenharmony_ci
24757db96d56Sopenharmony_ci        class C(P): pass
24767db96d56Sopenharmony_ci
24777db96d56Sopenharmony_ci        self.assertIsInstance(C(), C)
24787db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
24797db96d56Sopenharmony_ci            C(42)
24807db96d56Sopenharmony_ci
24817db96d56Sopenharmony_ci        T = TypeVar('T')
24827db96d56Sopenharmony_ci
24837db96d56Sopenharmony_ci        class PG(Protocol[T]): pass
24847db96d56Sopenharmony_ci
24857db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
24867db96d56Sopenharmony_ci            PG()
24877db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
24887db96d56Sopenharmony_ci            PG[int]()
24897db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
24907db96d56Sopenharmony_ci            PG[T]()
24917db96d56Sopenharmony_ci
24927db96d56Sopenharmony_ci        class CG(PG[T]): pass
24937db96d56Sopenharmony_ci
24947db96d56Sopenharmony_ci        self.assertIsInstance(CG[int](), CG)
24957db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
24967db96d56Sopenharmony_ci            CG[int](42)
24977db96d56Sopenharmony_ci
24987db96d56Sopenharmony_ci    def test_protocol_defining_init_does_not_get_overridden(self):
24997db96d56Sopenharmony_ci        # check that P.__init__ doesn't get clobbered
25007db96d56Sopenharmony_ci        # see https://bugs.python.org/issue44807
25017db96d56Sopenharmony_ci
25027db96d56Sopenharmony_ci        class P(Protocol):
25037db96d56Sopenharmony_ci            x: int
25047db96d56Sopenharmony_ci            def __init__(self, x: int) -> None:
25057db96d56Sopenharmony_ci                self.x = x
25067db96d56Sopenharmony_ci        class C: pass
25077db96d56Sopenharmony_ci
25087db96d56Sopenharmony_ci        c = C()
25097db96d56Sopenharmony_ci        P.__init__(c, 1)
25107db96d56Sopenharmony_ci        self.assertEqual(c.x, 1)
25117db96d56Sopenharmony_ci
25127db96d56Sopenharmony_ci    def test_concrete_class_inheriting_init_from_protocol(self):
25137db96d56Sopenharmony_ci        class P(Protocol):
25147db96d56Sopenharmony_ci            x: int
25157db96d56Sopenharmony_ci            def __init__(self, x: int) -> None:
25167db96d56Sopenharmony_ci                self.x = x
25177db96d56Sopenharmony_ci
25187db96d56Sopenharmony_ci        class C(P): pass
25197db96d56Sopenharmony_ci
25207db96d56Sopenharmony_ci        c = C(1)
25217db96d56Sopenharmony_ci        self.assertIsInstance(c, C)
25227db96d56Sopenharmony_ci        self.assertEqual(c.x, 1)
25237db96d56Sopenharmony_ci
25247db96d56Sopenharmony_ci    def test_cannot_instantiate_abstract(self):
25257db96d56Sopenharmony_ci        @runtime_checkable
25267db96d56Sopenharmony_ci        class P(Protocol):
25277db96d56Sopenharmony_ci            @abc.abstractmethod
25287db96d56Sopenharmony_ci            def ameth(self) -> int:
25297db96d56Sopenharmony_ci                raise NotImplementedError
25307db96d56Sopenharmony_ci
25317db96d56Sopenharmony_ci        class B(P):
25327db96d56Sopenharmony_ci            pass
25337db96d56Sopenharmony_ci
25347db96d56Sopenharmony_ci        class C(B):
25357db96d56Sopenharmony_ci            def ameth(self) -> int:
25367db96d56Sopenharmony_ci                return 26
25377db96d56Sopenharmony_ci
25387db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
25397db96d56Sopenharmony_ci            B()
25407db96d56Sopenharmony_ci        self.assertIsInstance(C(), P)
25417db96d56Sopenharmony_ci
25427db96d56Sopenharmony_ci    def test_subprotocols_extending(self):
25437db96d56Sopenharmony_ci        class P1(Protocol):
25447db96d56Sopenharmony_ci            def meth1(self):
25457db96d56Sopenharmony_ci                pass
25467db96d56Sopenharmony_ci
25477db96d56Sopenharmony_ci        @runtime_checkable
25487db96d56Sopenharmony_ci        class P2(P1, Protocol):
25497db96d56Sopenharmony_ci            def meth2(self):
25507db96d56Sopenharmony_ci                pass
25517db96d56Sopenharmony_ci
25527db96d56Sopenharmony_ci        class C:
25537db96d56Sopenharmony_ci            def meth1(self):
25547db96d56Sopenharmony_ci                pass
25557db96d56Sopenharmony_ci
25567db96d56Sopenharmony_ci            def meth2(self):
25577db96d56Sopenharmony_ci                pass
25587db96d56Sopenharmony_ci
25597db96d56Sopenharmony_ci        class C1:
25607db96d56Sopenharmony_ci            def meth1(self):
25617db96d56Sopenharmony_ci                pass
25627db96d56Sopenharmony_ci
25637db96d56Sopenharmony_ci        class C2:
25647db96d56Sopenharmony_ci            def meth2(self):
25657db96d56Sopenharmony_ci                pass
25667db96d56Sopenharmony_ci
25677db96d56Sopenharmony_ci        self.assertNotIsInstance(C1(), P2)
25687db96d56Sopenharmony_ci        self.assertNotIsInstance(C2(), P2)
25697db96d56Sopenharmony_ci        self.assertNotIsSubclass(C1, P2)
25707db96d56Sopenharmony_ci        self.assertNotIsSubclass(C2, P2)
25717db96d56Sopenharmony_ci        self.assertIsInstance(C(), P2)
25727db96d56Sopenharmony_ci        self.assertIsSubclass(C, P2)
25737db96d56Sopenharmony_ci
25747db96d56Sopenharmony_ci    def test_subprotocols_merging(self):
25757db96d56Sopenharmony_ci        class P1(Protocol):
25767db96d56Sopenharmony_ci            def meth1(self):
25777db96d56Sopenharmony_ci                pass
25787db96d56Sopenharmony_ci
25797db96d56Sopenharmony_ci        class P2(Protocol):
25807db96d56Sopenharmony_ci            def meth2(self):
25817db96d56Sopenharmony_ci                pass
25827db96d56Sopenharmony_ci
25837db96d56Sopenharmony_ci        @runtime_checkable
25847db96d56Sopenharmony_ci        class P(P1, P2, Protocol):
25857db96d56Sopenharmony_ci            pass
25867db96d56Sopenharmony_ci
25877db96d56Sopenharmony_ci        class C:
25887db96d56Sopenharmony_ci            def meth1(self):
25897db96d56Sopenharmony_ci                pass
25907db96d56Sopenharmony_ci
25917db96d56Sopenharmony_ci            def meth2(self):
25927db96d56Sopenharmony_ci                pass
25937db96d56Sopenharmony_ci
25947db96d56Sopenharmony_ci        class C1:
25957db96d56Sopenharmony_ci            def meth1(self):
25967db96d56Sopenharmony_ci                pass
25977db96d56Sopenharmony_ci
25987db96d56Sopenharmony_ci        class C2:
25997db96d56Sopenharmony_ci            def meth2(self):
26007db96d56Sopenharmony_ci                pass
26017db96d56Sopenharmony_ci
26027db96d56Sopenharmony_ci        self.assertNotIsInstance(C1(), P)
26037db96d56Sopenharmony_ci        self.assertNotIsInstance(C2(), P)
26047db96d56Sopenharmony_ci        self.assertNotIsSubclass(C1, P)
26057db96d56Sopenharmony_ci        self.assertNotIsSubclass(C2, P)
26067db96d56Sopenharmony_ci        self.assertIsInstance(C(), P)
26077db96d56Sopenharmony_ci        self.assertIsSubclass(C, P)
26087db96d56Sopenharmony_ci
26097db96d56Sopenharmony_ci    def test_protocols_issubclass(self):
26107db96d56Sopenharmony_ci        T = TypeVar('T')
26117db96d56Sopenharmony_ci
26127db96d56Sopenharmony_ci        @runtime_checkable
26137db96d56Sopenharmony_ci        class P(Protocol):
26147db96d56Sopenharmony_ci            def x(self): ...
26157db96d56Sopenharmony_ci
26167db96d56Sopenharmony_ci        @runtime_checkable
26177db96d56Sopenharmony_ci        class PG(Protocol[T]):
26187db96d56Sopenharmony_ci            def x(self): ...
26197db96d56Sopenharmony_ci
26207db96d56Sopenharmony_ci        class BadP(Protocol):
26217db96d56Sopenharmony_ci            def x(self): ...
26227db96d56Sopenharmony_ci
26237db96d56Sopenharmony_ci        class BadPG(Protocol[T]):
26247db96d56Sopenharmony_ci            def x(self): ...
26257db96d56Sopenharmony_ci
26267db96d56Sopenharmony_ci        class C:
26277db96d56Sopenharmony_ci            def x(self): ...
26287db96d56Sopenharmony_ci
26297db96d56Sopenharmony_ci        self.assertIsSubclass(C, P)
26307db96d56Sopenharmony_ci        self.assertIsSubclass(C, PG)
26317db96d56Sopenharmony_ci        self.assertIsSubclass(BadP, PG)
26327db96d56Sopenharmony_ci
26337db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
26347db96d56Sopenharmony_ci            issubclass(C, PG[T])
26357db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
26367db96d56Sopenharmony_ci            issubclass(C, PG[C])
26377db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
26387db96d56Sopenharmony_ci            issubclass(C, BadP)
26397db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
26407db96d56Sopenharmony_ci            issubclass(C, BadPG)
26417db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
26427db96d56Sopenharmony_ci            issubclass(P, PG[T])
26437db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
26447db96d56Sopenharmony_ci            issubclass(PG, PG[int])
26457db96d56Sopenharmony_ci
26467db96d56Sopenharmony_ci    def test_protocols_issubclass_non_callable(self):
26477db96d56Sopenharmony_ci        class C:
26487db96d56Sopenharmony_ci            x = 1
26497db96d56Sopenharmony_ci
26507db96d56Sopenharmony_ci        @runtime_checkable
26517db96d56Sopenharmony_ci        class PNonCall(Protocol):
26527db96d56Sopenharmony_ci            x = 1
26537db96d56Sopenharmony_ci
26547db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
26557db96d56Sopenharmony_ci            issubclass(C, PNonCall)
26567db96d56Sopenharmony_ci        self.assertIsInstance(C(), PNonCall)
26577db96d56Sopenharmony_ci        PNonCall.register(C)
26587db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
26597db96d56Sopenharmony_ci            issubclass(C, PNonCall)
26607db96d56Sopenharmony_ci        self.assertIsInstance(C(), PNonCall)
26617db96d56Sopenharmony_ci
26627db96d56Sopenharmony_ci        # check that non-protocol subclasses are not affected
26637db96d56Sopenharmony_ci        class D(PNonCall): ...
26647db96d56Sopenharmony_ci
26657db96d56Sopenharmony_ci        self.assertNotIsSubclass(C, D)
26667db96d56Sopenharmony_ci        self.assertNotIsInstance(C(), D)
26677db96d56Sopenharmony_ci        D.register(C)
26687db96d56Sopenharmony_ci        self.assertIsSubclass(C, D)
26697db96d56Sopenharmony_ci        self.assertIsInstance(C(), D)
26707db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
26717db96d56Sopenharmony_ci            issubclass(D, PNonCall)
26727db96d56Sopenharmony_ci
26737db96d56Sopenharmony_ci    def test_protocols_isinstance(self):
26747db96d56Sopenharmony_ci        T = TypeVar('T')
26757db96d56Sopenharmony_ci
26767db96d56Sopenharmony_ci        @runtime_checkable
26777db96d56Sopenharmony_ci        class P(Protocol):
26787db96d56Sopenharmony_ci            def meth(x): ...
26797db96d56Sopenharmony_ci
26807db96d56Sopenharmony_ci        @runtime_checkable
26817db96d56Sopenharmony_ci        class PG(Protocol[T]):
26827db96d56Sopenharmony_ci            def meth(x): ...
26837db96d56Sopenharmony_ci
26847db96d56Sopenharmony_ci        @runtime_checkable
26857db96d56Sopenharmony_ci        class WeirdProto(Protocol):
26867db96d56Sopenharmony_ci            meth = str.maketrans
26877db96d56Sopenharmony_ci
26887db96d56Sopenharmony_ci        @runtime_checkable
26897db96d56Sopenharmony_ci        class WeirdProto2(Protocol):
26907db96d56Sopenharmony_ci            meth = lambda *args, **kwargs: None
26917db96d56Sopenharmony_ci
26927db96d56Sopenharmony_ci        class CustomCallable:
26937db96d56Sopenharmony_ci            def __call__(self, *args, **kwargs):
26947db96d56Sopenharmony_ci                pass
26957db96d56Sopenharmony_ci
26967db96d56Sopenharmony_ci        @runtime_checkable
26977db96d56Sopenharmony_ci        class WeirderProto(Protocol):
26987db96d56Sopenharmony_ci            meth = CustomCallable()
26997db96d56Sopenharmony_ci
27007db96d56Sopenharmony_ci        class BadP(Protocol):
27017db96d56Sopenharmony_ci            def meth(x): ...
27027db96d56Sopenharmony_ci
27037db96d56Sopenharmony_ci        class BadPG(Protocol[T]):
27047db96d56Sopenharmony_ci            def meth(x): ...
27057db96d56Sopenharmony_ci
27067db96d56Sopenharmony_ci        class C:
27077db96d56Sopenharmony_ci            def meth(x): ...
27087db96d56Sopenharmony_ci
27097db96d56Sopenharmony_ci        class C2:
27107db96d56Sopenharmony_ci            def __init__(self):
27117db96d56Sopenharmony_ci                self.meth = lambda: None
27127db96d56Sopenharmony_ci
27137db96d56Sopenharmony_ci        for klass in C, C2:
27147db96d56Sopenharmony_ci            for proto in P, PG, WeirdProto, WeirdProto2, WeirderProto:
27157db96d56Sopenharmony_ci                with self.subTest(klass=klass.__name__, proto=proto.__name__):
27167db96d56Sopenharmony_ci                    self.assertIsInstance(klass(), proto)
27177db96d56Sopenharmony_ci
27187db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
27197db96d56Sopenharmony_ci            isinstance(C(), PG[T])
27207db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
27217db96d56Sopenharmony_ci            isinstance(C(), PG[C])
27227db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
27237db96d56Sopenharmony_ci            isinstance(C(), BadP)
27247db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
27257db96d56Sopenharmony_ci            isinstance(C(), BadPG)
27267db96d56Sopenharmony_ci
27277db96d56Sopenharmony_ci    def test_protocols_isinstance_properties_and_descriptors(self):
27287db96d56Sopenharmony_ci        class C:
27297db96d56Sopenharmony_ci            @property
27307db96d56Sopenharmony_ci            def attr(self):
27317db96d56Sopenharmony_ci                return 42
27327db96d56Sopenharmony_ci
27337db96d56Sopenharmony_ci        class CustomDescriptor:
27347db96d56Sopenharmony_ci            def __get__(self, obj, objtype=None):
27357db96d56Sopenharmony_ci                return 42
27367db96d56Sopenharmony_ci
27377db96d56Sopenharmony_ci        class D:
27387db96d56Sopenharmony_ci            attr = CustomDescriptor()
27397db96d56Sopenharmony_ci
27407db96d56Sopenharmony_ci        # Check that properties set on superclasses
27417db96d56Sopenharmony_ci        # are still found by the isinstance() logic
27427db96d56Sopenharmony_ci        class E(C): ...
27437db96d56Sopenharmony_ci        class F(D): ...
27447db96d56Sopenharmony_ci
27457db96d56Sopenharmony_ci        class Empty: ...
27467db96d56Sopenharmony_ci
27477db96d56Sopenharmony_ci        T = TypeVar('T')
27487db96d56Sopenharmony_ci
27497db96d56Sopenharmony_ci        @runtime_checkable
27507db96d56Sopenharmony_ci        class P(Protocol):
27517db96d56Sopenharmony_ci            @property
27527db96d56Sopenharmony_ci            def attr(self): ...
27537db96d56Sopenharmony_ci
27547db96d56Sopenharmony_ci        @runtime_checkable
27557db96d56Sopenharmony_ci        class P1(Protocol):
27567db96d56Sopenharmony_ci            attr: int
27577db96d56Sopenharmony_ci
27587db96d56Sopenharmony_ci        @runtime_checkable
27597db96d56Sopenharmony_ci        class PG(Protocol[T]):
27607db96d56Sopenharmony_ci            @property
27617db96d56Sopenharmony_ci            def attr(self): ...
27627db96d56Sopenharmony_ci
27637db96d56Sopenharmony_ci        @runtime_checkable
27647db96d56Sopenharmony_ci        class PG1(Protocol[T]):
27657db96d56Sopenharmony_ci            attr: T
27667db96d56Sopenharmony_ci
27677db96d56Sopenharmony_ci        for protocol_class in P, P1, PG, PG1:
27687db96d56Sopenharmony_ci            for klass in C, D, E, F:
27697db96d56Sopenharmony_ci                with self.subTest(
27707db96d56Sopenharmony_ci                    klass=klass.__name__,
27717db96d56Sopenharmony_ci                    protocol_class=protocol_class.__name__
27727db96d56Sopenharmony_ci                ):
27737db96d56Sopenharmony_ci                    self.assertIsInstance(klass(), protocol_class)
27747db96d56Sopenharmony_ci
27757db96d56Sopenharmony_ci            with self.subTest(klass="Empty", protocol_class=protocol_class.__name__):
27767db96d56Sopenharmony_ci                self.assertNotIsInstance(Empty(), protocol_class)
27777db96d56Sopenharmony_ci
27787db96d56Sopenharmony_ci        class BadP(Protocol):
27797db96d56Sopenharmony_ci            @property
27807db96d56Sopenharmony_ci            def attr(self): ...
27817db96d56Sopenharmony_ci
27827db96d56Sopenharmony_ci        class BadP1(Protocol):
27837db96d56Sopenharmony_ci            attr: int
27847db96d56Sopenharmony_ci
27857db96d56Sopenharmony_ci        class BadPG(Protocol[T]):
27867db96d56Sopenharmony_ci            @property
27877db96d56Sopenharmony_ci            def attr(self): ...
27887db96d56Sopenharmony_ci
27897db96d56Sopenharmony_ci        class BadPG1(Protocol[T]):
27907db96d56Sopenharmony_ci            attr: T
27917db96d56Sopenharmony_ci
27927db96d56Sopenharmony_ci        for obj in PG[T], PG[C], PG1[T], PG1[C], BadP, BadP1, BadPG, BadPG1:
27937db96d56Sopenharmony_ci            for klass in C, D, E, F, Empty:
27947db96d56Sopenharmony_ci                with self.subTest(klass=klass.__name__, obj=obj):
27957db96d56Sopenharmony_ci                    with self.assertRaises(TypeError):
27967db96d56Sopenharmony_ci                        isinstance(klass(), obj)
27977db96d56Sopenharmony_ci
27987db96d56Sopenharmony_ci    def test_protocols_isinstance_not_fooled_by_custom_dir(self):
27997db96d56Sopenharmony_ci        @runtime_checkable
28007db96d56Sopenharmony_ci        class HasX(Protocol):
28017db96d56Sopenharmony_ci            x: int
28027db96d56Sopenharmony_ci
28037db96d56Sopenharmony_ci        class CustomDirWithX:
28047db96d56Sopenharmony_ci            x = 10
28057db96d56Sopenharmony_ci            def __dir__(self):
28067db96d56Sopenharmony_ci                return []
28077db96d56Sopenharmony_ci
28087db96d56Sopenharmony_ci        class CustomDirWithoutX:
28097db96d56Sopenharmony_ci            def __dir__(self):
28107db96d56Sopenharmony_ci                return ["x"]
28117db96d56Sopenharmony_ci
28127db96d56Sopenharmony_ci        self.assertIsInstance(CustomDirWithX(), HasX)
28137db96d56Sopenharmony_ci        self.assertNotIsInstance(CustomDirWithoutX(), HasX)
28147db96d56Sopenharmony_ci
28157db96d56Sopenharmony_ci    def test_protocols_isinstance_py36(self):
28167db96d56Sopenharmony_ci        class APoint:
28177db96d56Sopenharmony_ci            def __init__(self, x, y, label):
28187db96d56Sopenharmony_ci                self.x = x
28197db96d56Sopenharmony_ci                self.y = y
28207db96d56Sopenharmony_ci                self.label = label
28217db96d56Sopenharmony_ci
28227db96d56Sopenharmony_ci        class BPoint:
28237db96d56Sopenharmony_ci            label = 'B'
28247db96d56Sopenharmony_ci
28257db96d56Sopenharmony_ci            def __init__(self, x, y):
28267db96d56Sopenharmony_ci                self.x = x
28277db96d56Sopenharmony_ci                self.y = y
28287db96d56Sopenharmony_ci
28297db96d56Sopenharmony_ci        class C:
28307db96d56Sopenharmony_ci            def __init__(self, attr):
28317db96d56Sopenharmony_ci                self.attr = attr
28327db96d56Sopenharmony_ci
28337db96d56Sopenharmony_ci            def meth(self, arg):
28347db96d56Sopenharmony_ci                return 0
28357db96d56Sopenharmony_ci
28367db96d56Sopenharmony_ci        class Bad: pass
28377db96d56Sopenharmony_ci
28387db96d56Sopenharmony_ci        self.assertIsInstance(APoint(1, 2, 'A'), Point)
28397db96d56Sopenharmony_ci        self.assertIsInstance(BPoint(1, 2), Point)
28407db96d56Sopenharmony_ci        self.assertNotIsInstance(MyPoint(), Point)
28417db96d56Sopenharmony_ci        self.assertIsInstance(BPoint(1, 2), Position)
28427db96d56Sopenharmony_ci        self.assertIsInstance(Other(), Proto)
28437db96d56Sopenharmony_ci        self.assertIsInstance(Concrete(), Proto)
28447db96d56Sopenharmony_ci        self.assertIsInstance(C(42), Proto)
28457db96d56Sopenharmony_ci        self.assertNotIsInstance(Bad(), Proto)
28467db96d56Sopenharmony_ci        self.assertNotIsInstance(Bad(), Point)
28477db96d56Sopenharmony_ci        self.assertNotIsInstance(Bad(), Position)
28487db96d56Sopenharmony_ci        self.assertNotIsInstance(Bad(), Concrete)
28497db96d56Sopenharmony_ci        self.assertNotIsInstance(Other(), Concrete)
28507db96d56Sopenharmony_ci        self.assertIsInstance(NT(1, 2), Position)
28517db96d56Sopenharmony_ci
28527db96d56Sopenharmony_ci    def test_protocols_isinstance_init(self):
28537db96d56Sopenharmony_ci        T = TypeVar('T')
28547db96d56Sopenharmony_ci
28557db96d56Sopenharmony_ci        @runtime_checkable
28567db96d56Sopenharmony_ci        class P(Protocol):
28577db96d56Sopenharmony_ci            x = 1
28587db96d56Sopenharmony_ci
28597db96d56Sopenharmony_ci        @runtime_checkable
28607db96d56Sopenharmony_ci        class PG(Protocol[T]):
28617db96d56Sopenharmony_ci            x = 1
28627db96d56Sopenharmony_ci
28637db96d56Sopenharmony_ci        class C:
28647db96d56Sopenharmony_ci            def __init__(self, x):
28657db96d56Sopenharmony_ci                self.x = x
28667db96d56Sopenharmony_ci
28677db96d56Sopenharmony_ci        self.assertIsInstance(C(1), P)
28687db96d56Sopenharmony_ci        self.assertIsInstance(C(1), PG)
28697db96d56Sopenharmony_ci
28707db96d56Sopenharmony_ci    def test_protocols_isinstance_monkeypatching(self):
28717db96d56Sopenharmony_ci        @runtime_checkable
28727db96d56Sopenharmony_ci        class HasX(Protocol):
28737db96d56Sopenharmony_ci            x: int
28747db96d56Sopenharmony_ci
28757db96d56Sopenharmony_ci        class Foo: ...
28767db96d56Sopenharmony_ci
28777db96d56Sopenharmony_ci        f = Foo()
28787db96d56Sopenharmony_ci        self.assertNotIsInstance(f, HasX)
28797db96d56Sopenharmony_ci        f.x = 42
28807db96d56Sopenharmony_ci        self.assertIsInstance(f, HasX)
28817db96d56Sopenharmony_ci        del f.x
28827db96d56Sopenharmony_ci        self.assertNotIsInstance(f, HasX)
28837db96d56Sopenharmony_ci
28847db96d56Sopenharmony_ci    def test_protocol_checks_after_subscript(self):
28857db96d56Sopenharmony_ci        class P(Protocol[T]): pass
28867db96d56Sopenharmony_ci        class C(P[T]): pass
28877db96d56Sopenharmony_ci        class Other1: pass
28887db96d56Sopenharmony_ci        class Other2: pass
28897db96d56Sopenharmony_ci        CA = C[Any]
28907db96d56Sopenharmony_ci
28917db96d56Sopenharmony_ci        self.assertNotIsInstance(Other1(), C)
28927db96d56Sopenharmony_ci        self.assertNotIsSubclass(Other2, C)
28937db96d56Sopenharmony_ci
28947db96d56Sopenharmony_ci        class D1(C[Any]): pass
28957db96d56Sopenharmony_ci        class D2(C[Any]): pass
28967db96d56Sopenharmony_ci        CI = C[int]
28977db96d56Sopenharmony_ci
28987db96d56Sopenharmony_ci        self.assertIsInstance(D1(), C)
28997db96d56Sopenharmony_ci        self.assertIsSubclass(D2, C)
29007db96d56Sopenharmony_ci
29017db96d56Sopenharmony_ci    def test_protocols_support_register(self):
29027db96d56Sopenharmony_ci        @runtime_checkable
29037db96d56Sopenharmony_ci        class P(Protocol):
29047db96d56Sopenharmony_ci            x = 1
29057db96d56Sopenharmony_ci
29067db96d56Sopenharmony_ci        class PM(Protocol):
29077db96d56Sopenharmony_ci            def meth(self): pass
29087db96d56Sopenharmony_ci
29097db96d56Sopenharmony_ci        class D(PM): pass
29107db96d56Sopenharmony_ci
29117db96d56Sopenharmony_ci        class C: pass
29127db96d56Sopenharmony_ci
29137db96d56Sopenharmony_ci        D.register(C)
29147db96d56Sopenharmony_ci        P.register(C)
29157db96d56Sopenharmony_ci        self.assertIsInstance(C(), P)
29167db96d56Sopenharmony_ci        self.assertIsInstance(C(), D)
29177db96d56Sopenharmony_ci
29187db96d56Sopenharmony_ci    def test_none_on_non_callable_doesnt_block_implementation(self):
29197db96d56Sopenharmony_ci        @runtime_checkable
29207db96d56Sopenharmony_ci        class P(Protocol):
29217db96d56Sopenharmony_ci            x = 1
29227db96d56Sopenharmony_ci
29237db96d56Sopenharmony_ci        class A:
29247db96d56Sopenharmony_ci            x = 1
29257db96d56Sopenharmony_ci
29267db96d56Sopenharmony_ci        class B(A):
29277db96d56Sopenharmony_ci            x = None
29287db96d56Sopenharmony_ci
29297db96d56Sopenharmony_ci        class C:
29307db96d56Sopenharmony_ci            def __init__(self):
29317db96d56Sopenharmony_ci                self.x = None
29327db96d56Sopenharmony_ci
29337db96d56Sopenharmony_ci        self.assertIsInstance(B(), P)
29347db96d56Sopenharmony_ci        self.assertIsInstance(C(), P)
29357db96d56Sopenharmony_ci
29367db96d56Sopenharmony_ci    def test_none_on_callable_blocks_implementation(self):
29377db96d56Sopenharmony_ci        @runtime_checkable
29387db96d56Sopenharmony_ci        class P(Protocol):
29397db96d56Sopenharmony_ci            def x(self): ...
29407db96d56Sopenharmony_ci
29417db96d56Sopenharmony_ci        class A:
29427db96d56Sopenharmony_ci            def x(self): ...
29437db96d56Sopenharmony_ci
29447db96d56Sopenharmony_ci        class B(A):
29457db96d56Sopenharmony_ci            x = None
29467db96d56Sopenharmony_ci
29477db96d56Sopenharmony_ci        class C:
29487db96d56Sopenharmony_ci            def __init__(self):
29497db96d56Sopenharmony_ci                self.x = None
29507db96d56Sopenharmony_ci
29517db96d56Sopenharmony_ci        self.assertNotIsInstance(B(), P)
29527db96d56Sopenharmony_ci        self.assertNotIsInstance(C(), P)
29537db96d56Sopenharmony_ci
29547db96d56Sopenharmony_ci    def test_non_protocol_subclasses(self):
29557db96d56Sopenharmony_ci        class P(Protocol):
29567db96d56Sopenharmony_ci            x = 1
29577db96d56Sopenharmony_ci
29587db96d56Sopenharmony_ci        @runtime_checkable
29597db96d56Sopenharmony_ci        class PR(Protocol):
29607db96d56Sopenharmony_ci            def meth(self): pass
29617db96d56Sopenharmony_ci
29627db96d56Sopenharmony_ci        class NonP(P):
29637db96d56Sopenharmony_ci            x = 1
29647db96d56Sopenharmony_ci
29657db96d56Sopenharmony_ci        class NonPR(PR): pass
29667db96d56Sopenharmony_ci
29677db96d56Sopenharmony_ci        class C:
29687db96d56Sopenharmony_ci            x = 1
29697db96d56Sopenharmony_ci
29707db96d56Sopenharmony_ci        class D:
29717db96d56Sopenharmony_ci            def meth(self): pass
29727db96d56Sopenharmony_ci
29737db96d56Sopenharmony_ci        self.assertNotIsInstance(C(), NonP)
29747db96d56Sopenharmony_ci        self.assertNotIsInstance(D(), NonPR)
29757db96d56Sopenharmony_ci        self.assertNotIsSubclass(C, NonP)
29767db96d56Sopenharmony_ci        self.assertNotIsSubclass(D, NonPR)
29777db96d56Sopenharmony_ci        self.assertIsInstance(NonPR(), PR)
29787db96d56Sopenharmony_ci        self.assertIsSubclass(NonPR, PR)
29797db96d56Sopenharmony_ci
29807db96d56Sopenharmony_ci    def test_custom_subclasshook(self):
29817db96d56Sopenharmony_ci        class P(Protocol):
29827db96d56Sopenharmony_ci            x = 1
29837db96d56Sopenharmony_ci
29847db96d56Sopenharmony_ci        class OKClass: pass
29857db96d56Sopenharmony_ci
29867db96d56Sopenharmony_ci        class BadClass:
29877db96d56Sopenharmony_ci            x = 1
29887db96d56Sopenharmony_ci
29897db96d56Sopenharmony_ci        class C(P):
29907db96d56Sopenharmony_ci            @classmethod
29917db96d56Sopenharmony_ci            def __subclasshook__(cls, other):
29927db96d56Sopenharmony_ci                return other.__name__.startswith("OK")
29937db96d56Sopenharmony_ci
29947db96d56Sopenharmony_ci        self.assertIsInstance(OKClass(), C)
29957db96d56Sopenharmony_ci        self.assertNotIsInstance(BadClass(), C)
29967db96d56Sopenharmony_ci        self.assertIsSubclass(OKClass, C)
29977db96d56Sopenharmony_ci        self.assertNotIsSubclass(BadClass, C)
29987db96d56Sopenharmony_ci
29997db96d56Sopenharmony_ci    def test_issubclass_fails_correctly(self):
30007db96d56Sopenharmony_ci        @runtime_checkable
30017db96d56Sopenharmony_ci        class P(Protocol):
30027db96d56Sopenharmony_ci            x = 1
30037db96d56Sopenharmony_ci
30047db96d56Sopenharmony_ci        class C: pass
30057db96d56Sopenharmony_ci
30067db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
30077db96d56Sopenharmony_ci            issubclass(C(), P)
30087db96d56Sopenharmony_ci
30097db96d56Sopenharmony_ci    def test_defining_generic_protocols(self):
30107db96d56Sopenharmony_ci        T = TypeVar('T')
30117db96d56Sopenharmony_ci        S = TypeVar('S')
30127db96d56Sopenharmony_ci
30137db96d56Sopenharmony_ci        @runtime_checkable
30147db96d56Sopenharmony_ci        class PR(Protocol[T, S]):
30157db96d56Sopenharmony_ci            def meth(self): pass
30167db96d56Sopenharmony_ci
30177db96d56Sopenharmony_ci        class P(PR[int, T], Protocol[T]):
30187db96d56Sopenharmony_ci            y = 1
30197db96d56Sopenharmony_ci
30207db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
30217db96d56Sopenharmony_ci            PR[int]
30227db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
30237db96d56Sopenharmony_ci            P[int, str]
30247db96d56Sopenharmony_ci
30257db96d56Sopenharmony_ci        class C(PR[int, T]): pass
30267db96d56Sopenharmony_ci
30277db96d56Sopenharmony_ci        self.assertIsInstance(C[str](), C)
30287db96d56Sopenharmony_ci
30297db96d56Sopenharmony_ci    def test_defining_generic_protocols_old_style(self):
30307db96d56Sopenharmony_ci        T = TypeVar('T')
30317db96d56Sopenharmony_ci        S = TypeVar('S')
30327db96d56Sopenharmony_ci
30337db96d56Sopenharmony_ci        @runtime_checkable
30347db96d56Sopenharmony_ci        class PR(Protocol, Generic[T, S]):
30357db96d56Sopenharmony_ci            def meth(self): pass
30367db96d56Sopenharmony_ci
30377db96d56Sopenharmony_ci        class P(PR[int, str], Protocol):
30387db96d56Sopenharmony_ci            y = 1
30397db96d56Sopenharmony_ci
30407db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
30417db96d56Sopenharmony_ci            issubclass(PR[int, str], PR)
30427db96d56Sopenharmony_ci        self.assertIsSubclass(P, PR)
30437db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
30447db96d56Sopenharmony_ci            PR[int]
30457db96d56Sopenharmony_ci
30467db96d56Sopenharmony_ci        class P1(Protocol, Generic[T]):
30477db96d56Sopenharmony_ci            def bar(self, x: T) -> str: ...
30487db96d56Sopenharmony_ci
30497db96d56Sopenharmony_ci        class P2(Generic[T], Protocol):
30507db96d56Sopenharmony_ci            def bar(self, x: T) -> str: ...
30517db96d56Sopenharmony_ci
30527db96d56Sopenharmony_ci        @runtime_checkable
30537db96d56Sopenharmony_ci        class PSub(P1[str], Protocol):
30547db96d56Sopenharmony_ci            x = 1
30557db96d56Sopenharmony_ci
30567db96d56Sopenharmony_ci        class Test:
30577db96d56Sopenharmony_ci            x = 1
30587db96d56Sopenharmony_ci
30597db96d56Sopenharmony_ci            def bar(self, x: str) -> str:
30607db96d56Sopenharmony_ci                return x
30617db96d56Sopenharmony_ci
30627db96d56Sopenharmony_ci        self.assertIsInstance(Test(), PSub)
30637db96d56Sopenharmony_ci
30647db96d56Sopenharmony_ci    def test_init_called(self):
30657db96d56Sopenharmony_ci        T = TypeVar('T')
30667db96d56Sopenharmony_ci
30677db96d56Sopenharmony_ci        class P(Protocol[T]): pass
30687db96d56Sopenharmony_ci
30697db96d56Sopenharmony_ci        class C(P[T]):
30707db96d56Sopenharmony_ci            def __init__(self):
30717db96d56Sopenharmony_ci                self.test = 'OK'
30727db96d56Sopenharmony_ci
30737db96d56Sopenharmony_ci        self.assertEqual(C[int]().test, 'OK')
30747db96d56Sopenharmony_ci
30757db96d56Sopenharmony_ci        class B:
30767db96d56Sopenharmony_ci            def __init__(self):
30777db96d56Sopenharmony_ci                self.test = 'OK'
30787db96d56Sopenharmony_ci
30797db96d56Sopenharmony_ci        class D1(B, P[T]):
30807db96d56Sopenharmony_ci            pass
30817db96d56Sopenharmony_ci
30827db96d56Sopenharmony_ci        self.assertEqual(D1[int]().test, 'OK')
30837db96d56Sopenharmony_ci
30847db96d56Sopenharmony_ci        class D2(P[T], B):
30857db96d56Sopenharmony_ci            pass
30867db96d56Sopenharmony_ci
30877db96d56Sopenharmony_ci        self.assertEqual(D2[int]().test, 'OK')
30887db96d56Sopenharmony_ci
30897db96d56Sopenharmony_ci    def test_new_called(self):
30907db96d56Sopenharmony_ci        T = TypeVar('T')
30917db96d56Sopenharmony_ci
30927db96d56Sopenharmony_ci        class P(Protocol[T]): pass
30937db96d56Sopenharmony_ci
30947db96d56Sopenharmony_ci        class C(P[T]):
30957db96d56Sopenharmony_ci            def __new__(cls, *args):
30967db96d56Sopenharmony_ci                self = super().__new__(cls, *args)
30977db96d56Sopenharmony_ci                self.test = 'OK'
30987db96d56Sopenharmony_ci                return self
30997db96d56Sopenharmony_ci
31007db96d56Sopenharmony_ci        self.assertEqual(C[int]().test, 'OK')
31017db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
31027db96d56Sopenharmony_ci            C[int](42)
31037db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
31047db96d56Sopenharmony_ci            C[int](a=42)
31057db96d56Sopenharmony_ci
31067db96d56Sopenharmony_ci    def test_protocols_bad_subscripts(self):
31077db96d56Sopenharmony_ci        T = TypeVar('T')
31087db96d56Sopenharmony_ci        S = TypeVar('S')
31097db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
31107db96d56Sopenharmony_ci            class P(Protocol[T, T]): pass
31117db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
31127db96d56Sopenharmony_ci            class P(Protocol[int]): pass
31137db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
31147db96d56Sopenharmony_ci            class P(Protocol[T], Protocol[S]): pass
31157db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
31167db96d56Sopenharmony_ci            class P(typing.Mapping[T, S], Protocol[T]): pass
31177db96d56Sopenharmony_ci
31187db96d56Sopenharmony_ci    def test_generic_protocols_repr(self):
31197db96d56Sopenharmony_ci        T = TypeVar('T')
31207db96d56Sopenharmony_ci        S = TypeVar('S')
31217db96d56Sopenharmony_ci
31227db96d56Sopenharmony_ci        class P(Protocol[T, S]): pass
31237db96d56Sopenharmony_ci
31247db96d56Sopenharmony_ci        self.assertTrue(repr(P[T, S]).endswith('P[~T, ~S]'))
31257db96d56Sopenharmony_ci        self.assertTrue(repr(P[int, str]).endswith('P[int, str]'))
31267db96d56Sopenharmony_ci
31277db96d56Sopenharmony_ci    def test_generic_protocols_eq(self):
31287db96d56Sopenharmony_ci        T = TypeVar('T')
31297db96d56Sopenharmony_ci        S = TypeVar('S')
31307db96d56Sopenharmony_ci
31317db96d56Sopenharmony_ci        class P(Protocol[T, S]): pass
31327db96d56Sopenharmony_ci
31337db96d56Sopenharmony_ci        self.assertEqual(P, P)
31347db96d56Sopenharmony_ci        self.assertEqual(P[int, T], P[int, T])
31357db96d56Sopenharmony_ci        self.assertEqual(P[T, T][Tuple[T, S]][int, str],
31367db96d56Sopenharmony_ci                         P[Tuple[int, str], Tuple[int, str]])
31377db96d56Sopenharmony_ci
31387db96d56Sopenharmony_ci    def test_generic_protocols_special_from_generic(self):
31397db96d56Sopenharmony_ci        T = TypeVar('T')
31407db96d56Sopenharmony_ci
31417db96d56Sopenharmony_ci        class P(Protocol[T]): pass
31427db96d56Sopenharmony_ci
31437db96d56Sopenharmony_ci        self.assertEqual(P.__parameters__, (T,))
31447db96d56Sopenharmony_ci        self.assertEqual(P[int].__parameters__, ())
31457db96d56Sopenharmony_ci        self.assertEqual(P[int].__args__, (int,))
31467db96d56Sopenharmony_ci        self.assertIs(P[int].__origin__, P)
31477db96d56Sopenharmony_ci
31487db96d56Sopenharmony_ci    def test_generic_protocols_special_from_protocol(self):
31497db96d56Sopenharmony_ci        @runtime_checkable
31507db96d56Sopenharmony_ci        class PR(Protocol):
31517db96d56Sopenharmony_ci            x = 1
31527db96d56Sopenharmony_ci
31537db96d56Sopenharmony_ci        class P(Protocol):
31547db96d56Sopenharmony_ci            def meth(self):
31557db96d56Sopenharmony_ci                pass
31567db96d56Sopenharmony_ci
31577db96d56Sopenharmony_ci        T = TypeVar('T')
31587db96d56Sopenharmony_ci
31597db96d56Sopenharmony_ci        class PG(Protocol[T]):
31607db96d56Sopenharmony_ci            x = 1
31617db96d56Sopenharmony_ci
31627db96d56Sopenharmony_ci            def meth(self):
31637db96d56Sopenharmony_ci                pass
31647db96d56Sopenharmony_ci
31657db96d56Sopenharmony_ci        self.assertTrue(P._is_protocol)
31667db96d56Sopenharmony_ci        self.assertTrue(PR._is_protocol)
31677db96d56Sopenharmony_ci        self.assertTrue(PG._is_protocol)
31687db96d56Sopenharmony_ci        self.assertFalse(P._is_runtime_protocol)
31697db96d56Sopenharmony_ci        self.assertTrue(PR._is_runtime_protocol)
31707db96d56Sopenharmony_ci        self.assertTrue(PG[int]._is_protocol)
31717db96d56Sopenharmony_ci        self.assertEqual(typing._get_protocol_attrs(P), {'meth'})
31727db96d56Sopenharmony_ci        self.assertEqual(typing._get_protocol_attrs(PR), {'x'})
31737db96d56Sopenharmony_ci        self.assertEqual(frozenset(typing._get_protocol_attrs(PG)),
31747db96d56Sopenharmony_ci                         frozenset({'x', 'meth'}))
31757db96d56Sopenharmony_ci
31767db96d56Sopenharmony_ci    def test_no_runtime_deco_on_nominal(self):
31777db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
31787db96d56Sopenharmony_ci            @runtime_checkable
31797db96d56Sopenharmony_ci            class C: pass
31807db96d56Sopenharmony_ci
31817db96d56Sopenharmony_ci        class Proto(Protocol):
31827db96d56Sopenharmony_ci            x = 1
31837db96d56Sopenharmony_ci
31847db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
31857db96d56Sopenharmony_ci            @runtime_checkable
31867db96d56Sopenharmony_ci            class Concrete(Proto):
31877db96d56Sopenharmony_ci                pass
31887db96d56Sopenharmony_ci
31897db96d56Sopenharmony_ci    def test_none_treated_correctly(self):
31907db96d56Sopenharmony_ci        @runtime_checkable
31917db96d56Sopenharmony_ci        class P(Protocol):
31927db96d56Sopenharmony_ci            x = None  # type: int
31937db96d56Sopenharmony_ci
31947db96d56Sopenharmony_ci        class B(object): pass
31957db96d56Sopenharmony_ci
31967db96d56Sopenharmony_ci        self.assertNotIsInstance(B(), P)
31977db96d56Sopenharmony_ci
31987db96d56Sopenharmony_ci        class C:
31997db96d56Sopenharmony_ci            x = 1
32007db96d56Sopenharmony_ci
32017db96d56Sopenharmony_ci        class D:
32027db96d56Sopenharmony_ci            x = None
32037db96d56Sopenharmony_ci
32047db96d56Sopenharmony_ci        self.assertIsInstance(C(), P)
32057db96d56Sopenharmony_ci        self.assertIsInstance(D(), P)
32067db96d56Sopenharmony_ci
32077db96d56Sopenharmony_ci        class CI:
32087db96d56Sopenharmony_ci            def __init__(self):
32097db96d56Sopenharmony_ci                self.x = 1
32107db96d56Sopenharmony_ci
32117db96d56Sopenharmony_ci        class DI:
32127db96d56Sopenharmony_ci            def __init__(self):
32137db96d56Sopenharmony_ci                self.x = None
32147db96d56Sopenharmony_ci
32157db96d56Sopenharmony_ci        self.assertIsInstance(CI(), P)
32167db96d56Sopenharmony_ci        self.assertIsInstance(DI(), P)
32177db96d56Sopenharmony_ci
32187db96d56Sopenharmony_ci    def test_protocols_in_unions(self):
32197db96d56Sopenharmony_ci        class P(Protocol):
32207db96d56Sopenharmony_ci            x = None  # type: int
32217db96d56Sopenharmony_ci
32227db96d56Sopenharmony_ci        Alias = typing.Union[typing.Iterable, P]
32237db96d56Sopenharmony_ci        Alias2 = typing.Union[P, typing.Iterable]
32247db96d56Sopenharmony_ci        self.assertEqual(Alias, Alias2)
32257db96d56Sopenharmony_ci
32267db96d56Sopenharmony_ci    def test_protocols_pickleable(self):
32277db96d56Sopenharmony_ci        global P, CP  # pickle wants to reference the class by name
32287db96d56Sopenharmony_ci        T = TypeVar('T')
32297db96d56Sopenharmony_ci
32307db96d56Sopenharmony_ci        @runtime_checkable
32317db96d56Sopenharmony_ci        class P(Protocol[T]):
32327db96d56Sopenharmony_ci            x = 1
32337db96d56Sopenharmony_ci
32347db96d56Sopenharmony_ci        class CP(P[int]):
32357db96d56Sopenharmony_ci            pass
32367db96d56Sopenharmony_ci
32377db96d56Sopenharmony_ci        c = CP()
32387db96d56Sopenharmony_ci        c.foo = 42
32397db96d56Sopenharmony_ci        c.bar = 'abc'
32407db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
32417db96d56Sopenharmony_ci            z = pickle.dumps(c, proto)
32427db96d56Sopenharmony_ci            x = pickle.loads(z)
32437db96d56Sopenharmony_ci            self.assertEqual(x.foo, 42)
32447db96d56Sopenharmony_ci            self.assertEqual(x.bar, 'abc')
32457db96d56Sopenharmony_ci            self.assertEqual(x.x, 1)
32467db96d56Sopenharmony_ci            self.assertEqual(x.__dict__, {'foo': 42, 'bar': 'abc'})
32477db96d56Sopenharmony_ci            s = pickle.dumps(P, proto)
32487db96d56Sopenharmony_ci            D = pickle.loads(s)
32497db96d56Sopenharmony_ci
32507db96d56Sopenharmony_ci            class E:
32517db96d56Sopenharmony_ci                x = 1
32527db96d56Sopenharmony_ci
32537db96d56Sopenharmony_ci            self.assertIsInstance(E(), D)
32547db96d56Sopenharmony_ci
32557db96d56Sopenharmony_ci    def test_supports_int(self):
32567db96d56Sopenharmony_ci        self.assertIsSubclass(int, typing.SupportsInt)
32577db96d56Sopenharmony_ci        self.assertNotIsSubclass(str, typing.SupportsInt)
32587db96d56Sopenharmony_ci
32597db96d56Sopenharmony_ci    def test_supports_float(self):
32607db96d56Sopenharmony_ci        self.assertIsSubclass(float, typing.SupportsFloat)
32617db96d56Sopenharmony_ci        self.assertNotIsSubclass(str, typing.SupportsFloat)
32627db96d56Sopenharmony_ci
32637db96d56Sopenharmony_ci    def test_supports_complex(self):
32647db96d56Sopenharmony_ci
32657db96d56Sopenharmony_ci        class C:
32667db96d56Sopenharmony_ci            def __complex__(self):
32677db96d56Sopenharmony_ci                return 0j
32687db96d56Sopenharmony_ci
32697db96d56Sopenharmony_ci        self.assertIsSubclass(complex, typing.SupportsComplex)
32707db96d56Sopenharmony_ci        self.assertIsSubclass(C, typing.SupportsComplex)
32717db96d56Sopenharmony_ci        self.assertNotIsSubclass(str, typing.SupportsComplex)
32727db96d56Sopenharmony_ci
32737db96d56Sopenharmony_ci    def test_supports_bytes(self):
32747db96d56Sopenharmony_ci
32757db96d56Sopenharmony_ci        class B:
32767db96d56Sopenharmony_ci            def __bytes__(self):
32777db96d56Sopenharmony_ci                return b''
32787db96d56Sopenharmony_ci
32797db96d56Sopenharmony_ci        self.assertIsSubclass(bytes, typing.SupportsBytes)
32807db96d56Sopenharmony_ci        self.assertIsSubclass(B, typing.SupportsBytes)
32817db96d56Sopenharmony_ci        self.assertNotIsSubclass(str, typing.SupportsBytes)
32827db96d56Sopenharmony_ci
32837db96d56Sopenharmony_ci    def test_supports_abs(self):
32847db96d56Sopenharmony_ci        self.assertIsSubclass(float, typing.SupportsAbs)
32857db96d56Sopenharmony_ci        self.assertIsSubclass(int, typing.SupportsAbs)
32867db96d56Sopenharmony_ci        self.assertNotIsSubclass(str, typing.SupportsAbs)
32877db96d56Sopenharmony_ci
32887db96d56Sopenharmony_ci    def test_supports_round(self):
32897db96d56Sopenharmony_ci        issubclass(float, typing.SupportsRound)
32907db96d56Sopenharmony_ci        self.assertIsSubclass(float, typing.SupportsRound)
32917db96d56Sopenharmony_ci        self.assertIsSubclass(int, typing.SupportsRound)
32927db96d56Sopenharmony_ci        self.assertNotIsSubclass(str, typing.SupportsRound)
32937db96d56Sopenharmony_ci
32947db96d56Sopenharmony_ci    def test_reversible(self):
32957db96d56Sopenharmony_ci        self.assertIsSubclass(list, typing.Reversible)
32967db96d56Sopenharmony_ci        self.assertNotIsSubclass(int, typing.Reversible)
32977db96d56Sopenharmony_ci
32987db96d56Sopenharmony_ci    def test_supports_index(self):
32997db96d56Sopenharmony_ci        self.assertIsSubclass(int, typing.SupportsIndex)
33007db96d56Sopenharmony_ci        self.assertNotIsSubclass(str, typing.SupportsIndex)
33017db96d56Sopenharmony_ci
33027db96d56Sopenharmony_ci    def test_bundled_protocol_instance_works(self):
33037db96d56Sopenharmony_ci        self.assertIsInstance(0, typing.SupportsAbs)
33047db96d56Sopenharmony_ci        class C1(typing.SupportsInt):
33057db96d56Sopenharmony_ci            def __int__(self) -> int:
33067db96d56Sopenharmony_ci                return 42
33077db96d56Sopenharmony_ci        class C2(C1):
33087db96d56Sopenharmony_ci            pass
33097db96d56Sopenharmony_ci        c = C2()
33107db96d56Sopenharmony_ci        self.assertIsInstance(c, C1)
33117db96d56Sopenharmony_ci
33127db96d56Sopenharmony_ci    def test_collections_protocols_allowed(self):
33137db96d56Sopenharmony_ci        @runtime_checkable
33147db96d56Sopenharmony_ci        class Custom(collections.abc.Iterable, Protocol):
33157db96d56Sopenharmony_ci            def close(self): ...
33167db96d56Sopenharmony_ci
33177db96d56Sopenharmony_ci        class A: pass
33187db96d56Sopenharmony_ci        class B:
33197db96d56Sopenharmony_ci            def __iter__(self):
33207db96d56Sopenharmony_ci                return []
33217db96d56Sopenharmony_ci            def close(self):
33227db96d56Sopenharmony_ci                return 0
33237db96d56Sopenharmony_ci
33247db96d56Sopenharmony_ci        self.assertIsSubclass(B, Custom)
33257db96d56Sopenharmony_ci        self.assertNotIsSubclass(A, Custom)
33267db96d56Sopenharmony_ci
33277db96d56Sopenharmony_ci    def test_builtin_protocol_allowlist(self):
33287db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33297db96d56Sopenharmony_ci            class CustomProtocol(TestCase, Protocol):
33307db96d56Sopenharmony_ci                pass
33317db96d56Sopenharmony_ci
33327db96d56Sopenharmony_ci        class CustomContextManager(typing.ContextManager, Protocol):
33337db96d56Sopenharmony_ci            pass
33347db96d56Sopenharmony_ci
33357db96d56Sopenharmony_ci    def test_non_runtime_protocol_isinstance_check(self):
33367db96d56Sopenharmony_ci        class P(Protocol):
33377db96d56Sopenharmony_ci            x: int
33387db96d56Sopenharmony_ci
33397db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "@runtime_checkable"):
33407db96d56Sopenharmony_ci            isinstance(1, P)
33417db96d56Sopenharmony_ci
33427db96d56Sopenharmony_ci    def test_super_call_init(self):
33437db96d56Sopenharmony_ci        class P(Protocol):
33447db96d56Sopenharmony_ci            x: int
33457db96d56Sopenharmony_ci
33467db96d56Sopenharmony_ci        class Foo(P):
33477db96d56Sopenharmony_ci            def __init__(self):
33487db96d56Sopenharmony_ci                super().__init__()
33497db96d56Sopenharmony_ci
33507db96d56Sopenharmony_ci        Foo()  # Previously triggered RecursionError
33517db96d56Sopenharmony_ci
33527db96d56Sopenharmony_ci
33537db96d56Sopenharmony_ciclass GenericTests(BaseTestCase):
33547db96d56Sopenharmony_ci
33557db96d56Sopenharmony_ci    def test_basics(self):
33567db96d56Sopenharmony_ci        X = SimpleMapping[str, Any]
33577db96d56Sopenharmony_ci        self.assertEqual(X.__parameters__, ())
33587db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33597db96d56Sopenharmony_ci            X[str]
33607db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33617db96d56Sopenharmony_ci            X[str, str]
33627db96d56Sopenharmony_ci        Y = SimpleMapping[XK, str]
33637db96d56Sopenharmony_ci        self.assertEqual(Y.__parameters__, (XK,))
33647db96d56Sopenharmony_ci        Y[str]
33657db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33667db96d56Sopenharmony_ci            Y[str, str]
33677db96d56Sopenharmony_ci        SM1 = SimpleMapping[str, int]
33687db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33697db96d56Sopenharmony_ci            issubclass(SM1, SimpleMapping)
33707db96d56Sopenharmony_ci        self.assertIsInstance(SM1(), SimpleMapping)
33717db96d56Sopenharmony_ci        T = TypeVar("T")
33727db96d56Sopenharmony_ci        self.assertEqual(List[list[T] | float].__parameters__, (T,))
33737db96d56Sopenharmony_ci
33747db96d56Sopenharmony_ci    def test_generic_errors(self):
33757db96d56Sopenharmony_ci        T = TypeVar('T')
33767db96d56Sopenharmony_ci        S = TypeVar('S')
33777db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33787db96d56Sopenharmony_ci            Generic[T][T]
33797db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33807db96d56Sopenharmony_ci            Generic[T][S]
33817db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33827db96d56Sopenharmony_ci            class C(Generic[T], Generic[T]): ...
33837db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33847db96d56Sopenharmony_ci            isinstance([], List[int])
33857db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33867db96d56Sopenharmony_ci            issubclass(list, List[int])
33877db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33887db96d56Sopenharmony_ci            class NewGeneric(Generic): ...
33897db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33907db96d56Sopenharmony_ci            class MyGeneric(Generic[T], Generic[S]): ...
33917db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33927db96d56Sopenharmony_ci            class MyGeneric(List[T], Generic[S]): ...
33937db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33947db96d56Sopenharmony_ci            Generic[()]
33957db96d56Sopenharmony_ci        class C(Generic[T]): pass
33967db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
33977db96d56Sopenharmony_ci            C[()]
33987db96d56Sopenharmony_ci
33997db96d56Sopenharmony_ci    def test_init(self):
34007db96d56Sopenharmony_ci        T = TypeVar('T')
34017db96d56Sopenharmony_ci        S = TypeVar('S')
34027db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
34037db96d56Sopenharmony_ci            Generic[T, T]
34047db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
34057db96d56Sopenharmony_ci            Generic[T, S, T]
34067db96d56Sopenharmony_ci
34077db96d56Sopenharmony_ci    def test_init_subclass(self):
34087db96d56Sopenharmony_ci        class X(typing.Generic[T]):
34097db96d56Sopenharmony_ci            def __init_subclass__(cls, **kwargs):
34107db96d56Sopenharmony_ci                super().__init_subclass__(**kwargs)
34117db96d56Sopenharmony_ci                cls.attr = 42
34127db96d56Sopenharmony_ci        class Y(X):
34137db96d56Sopenharmony_ci            pass
34147db96d56Sopenharmony_ci        self.assertEqual(Y.attr, 42)
34157db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
34167db96d56Sopenharmony_ci            X.attr
34177db96d56Sopenharmony_ci        X.attr = 1
34187db96d56Sopenharmony_ci        Y.attr = 2
34197db96d56Sopenharmony_ci        class Z(Y):
34207db96d56Sopenharmony_ci            pass
34217db96d56Sopenharmony_ci        class W(X[int]):
34227db96d56Sopenharmony_ci            pass
34237db96d56Sopenharmony_ci        self.assertEqual(Y.attr, 2)
34247db96d56Sopenharmony_ci        self.assertEqual(Z.attr, 42)
34257db96d56Sopenharmony_ci        self.assertEqual(W.attr, 42)
34267db96d56Sopenharmony_ci
34277db96d56Sopenharmony_ci    def test_repr(self):
34287db96d56Sopenharmony_ci        self.assertEqual(repr(SimpleMapping),
34297db96d56Sopenharmony_ci                         f"<class '{__name__}.SimpleMapping'>")
34307db96d56Sopenharmony_ci        self.assertEqual(repr(MySimpleMapping),
34317db96d56Sopenharmony_ci                         f"<class '{__name__}.MySimpleMapping'>")
34327db96d56Sopenharmony_ci
34337db96d56Sopenharmony_ci    def test_chain_repr(self):
34347db96d56Sopenharmony_ci        T = TypeVar('T')
34357db96d56Sopenharmony_ci        S = TypeVar('S')
34367db96d56Sopenharmony_ci
34377db96d56Sopenharmony_ci        class C(Generic[T]):
34387db96d56Sopenharmony_ci            pass
34397db96d56Sopenharmony_ci
34407db96d56Sopenharmony_ci        X = C[Tuple[S, T]]
34417db96d56Sopenharmony_ci        self.assertEqual(X, C[Tuple[S, T]])
34427db96d56Sopenharmony_ci        self.assertNotEqual(X, C[Tuple[T, S]])
34437db96d56Sopenharmony_ci
34447db96d56Sopenharmony_ci        Y = X[T, int]
34457db96d56Sopenharmony_ci        self.assertEqual(Y, X[T, int])
34467db96d56Sopenharmony_ci        self.assertNotEqual(Y, X[S, int])
34477db96d56Sopenharmony_ci        self.assertNotEqual(Y, X[T, str])
34487db96d56Sopenharmony_ci
34497db96d56Sopenharmony_ci        Z = Y[str]
34507db96d56Sopenharmony_ci        self.assertEqual(Z, Y[str])
34517db96d56Sopenharmony_ci        self.assertNotEqual(Z, Y[int])
34527db96d56Sopenharmony_ci        self.assertNotEqual(Z, Y[T])
34537db96d56Sopenharmony_ci
34547db96d56Sopenharmony_ci        self.assertTrue(str(Z).endswith(
34557db96d56Sopenharmony_ci            '.C[typing.Tuple[str, int]]'))
34567db96d56Sopenharmony_ci
34577db96d56Sopenharmony_ci    def test_new_repr(self):
34587db96d56Sopenharmony_ci        T = TypeVar('T')
34597db96d56Sopenharmony_ci        U = TypeVar('U', covariant=True)
34607db96d56Sopenharmony_ci        S = TypeVar('S')
34617db96d56Sopenharmony_ci
34627db96d56Sopenharmony_ci        self.assertEqual(repr(List), 'typing.List')
34637db96d56Sopenharmony_ci        self.assertEqual(repr(List[T]), 'typing.List[~T]')
34647db96d56Sopenharmony_ci        self.assertEqual(repr(List[U]), 'typing.List[+U]')
34657db96d56Sopenharmony_ci        self.assertEqual(repr(List[S][T][int]), 'typing.List[int]')
34667db96d56Sopenharmony_ci        self.assertEqual(repr(List[int]), 'typing.List[int]')
34677db96d56Sopenharmony_ci
34687db96d56Sopenharmony_ci    def test_new_repr_complex(self):
34697db96d56Sopenharmony_ci        T = TypeVar('T')
34707db96d56Sopenharmony_ci        TS = TypeVar('TS')
34717db96d56Sopenharmony_ci
34727db96d56Sopenharmony_ci        self.assertEqual(repr(typing.Mapping[T, TS][TS, T]), 'typing.Mapping[~TS, ~T]')
34737db96d56Sopenharmony_ci        self.assertEqual(repr(List[Tuple[T, TS]][int, T]),
34747db96d56Sopenharmony_ci                         'typing.List[typing.Tuple[int, ~T]]')
34757db96d56Sopenharmony_ci        self.assertEqual(
34767db96d56Sopenharmony_ci            repr(List[Tuple[T, T]][List[int]]),
34777db96d56Sopenharmony_ci            'typing.List[typing.Tuple[typing.List[int], typing.List[int]]]'
34787db96d56Sopenharmony_ci        )
34797db96d56Sopenharmony_ci
34807db96d56Sopenharmony_ci    def test_new_repr_bare(self):
34817db96d56Sopenharmony_ci        T = TypeVar('T')
34827db96d56Sopenharmony_ci        self.assertEqual(repr(Generic[T]), 'typing.Generic[~T]')
34837db96d56Sopenharmony_ci        self.assertEqual(repr(typing.Protocol[T]), 'typing.Protocol[~T]')
34847db96d56Sopenharmony_ci        class C(typing.Dict[Any, Any]): ...
34857db96d56Sopenharmony_ci        # this line should just work
34867db96d56Sopenharmony_ci        repr(C.__mro__)
34877db96d56Sopenharmony_ci
34887db96d56Sopenharmony_ci    def test_dict(self):
34897db96d56Sopenharmony_ci        T = TypeVar('T')
34907db96d56Sopenharmony_ci
34917db96d56Sopenharmony_ci        class B(Generic[T]):
34927db96d56Sopenharmony_ci            pass
34937db96d56Sopenharmony_ci
34947db96d56Sopenharmony_ci        b = B()
34957db96d56Sopenharmony_ci        b.foo = 42
34967db96d56Sopenharmony_ci        self.assertEqual(b.__dict__, {'foo': 42})
34977db96d56Sopenharmony_ci
34987db96d56Sopenharmony_ci        class C(B[int]):
34997db96d56Sopenharmony_ci            pass
35007db96d56Sopenharmony_ci
35017db96d56Sopenharmony_ci        c = C()
35027db96d56Sopenharmony_ci        c.bar = 'abc'
35037db96d56Sopenharmony_ci        self.assertEqual(c.__dict__, {'bar': 'abc'})
35047db96d56Sopenharmony_ci
35057db96d56Sopenharmony_ci    def test_subscripted_generics_as_proxies(self):
35067db96d56Sopenharmony_ci        T = TypeVar('T')
35077db96d56Sopenharmony_ci        class C(Generic[T]):
35087db96d56Sopenharmony_ci            x = 'def'
35097db96d56Sopenharmony_ci        self.assertEqual(C[int].x, 'def')
35107db96d56Sopenharmony_ci        self.assertEqual(C[C[int]].x, 'def')
35117db96d56Sopenharmony_ci        C[C[int]].x = 'changed'
35127db96d56Sopenharmony_ci        self.assertEqual(C.x, 'changed')
35137db96d56Sopenharmony_ci        self.assertEqual(C[str].x, 'changed')
35147db96d56Sopenharmony_ci        C[List[str]].z = 'new'
35157db96d56Sopenharmony_ci        self.assertEqual(C.z, 'new')
35167db96d56Sopenharmony_ci        self.assertEqual(C[Tuple[int]].z, 'new')
35177db96d56Sopenharmony_ci
35187db96d56Sopenharmony_ci        self.assertEqual(C().x, 'changed')
35197db96d56Sopenharmony_ci        self.assertEqual(C[Tuple[str]]().z, 'new')
35207db96d56Sopenharmony_ci
35217db96d56Sopenharmony_ci        class D(C[T]):
35227db96d56Sopenharmony_ci            pass
35237db96d56Sopenharmony_ci        self.assertEqual(D[int].x, 'changed')
35247db96d56Sopenharmony_ci        self.assertEqual(D.z, 'new')
35257db96d56Sopenharmony_ci        D.z = 'from derived z'
35267db96d56Sopenharmony_ci        D[int].x = 'from derived x'
35277db96d56Sopenharmony_ci        self.assertEqual(C.x, 'changed')
35287db96d56Sopenharmony_ci        self.assertEqual(C[int].z, 'new')
35297db96d56Sopenharmony_ci        self.assertEqual(D.x, 'from derived x')
35307db96d56Sopenharmony_ci        self.assertEqual(D[str].z, 'from derived z')
35317db96d56Sopenharmony_ci
35327db96d56Sopenharmony_ci    def test_abc_registry_kept(self):
35337db96d56Sopenharmony_ci        T = TypeVar('T')
35347db96d56Sopenharmony_ci        class C(collections.abc.Mapping, Generic[T]): ...
35357db96d56Sopenharmony_ci        C.register(int)
35367db96d56Sopenharmony_ci        self.assertIsInstance(1, C)
35377db96d56Sopenharmony_ci        C[int]
35387db96d56Sopenharmony_ci        self.assertIsInstance(1, C)
35397db96d56Sopenharmony_ci        C._abc_registry_clear()
35407db96d56Sopenharmony_ci        C._abc_caches_clear()  # To keep refleak hunting mode clean
35417db96d56Sopenharmony_ci
35427db96d56Sopenharmony_ci    def test_false_subclasses(self):
35437db96d56Sopenharmony_ci        class MyMapping(MutableMapping[str, str]): pass
35447db96d56Sopenharmony_ci        self.assertNotIsInstance({}, MyMapping)
35457db96d56Sopenharmony_ci        self.assertNotIsSubclass(dict, MyMapping)
35467db96d56Sopenharmony_ci
35477db96d56Sopenharmony_ci    def test_abc_bases(self):
35487db96d56Sopenharmony_ci        class MM(MutableMapping[str, str]):
35497db96d56Sopenharmony_ci            def __getitem__(self, k):
35507db96d56Sopenharmony_ci                return None
35517db96d56Sopenharmony_ci            def __setitem__(self, k, v):
35527db96d56Sopenharmony_ci                pass
35537db96d56Sopenharmony_ci            def __delitem__(self, k):
35547db96d56Sopenharmony_ci                pass
35557db96d56Sopenharmony_ci            def __iter__(self):
35567db96d56Sopenharmony_ci                return iter(())
35577db96d56Sopenharmony_ci            def __len__(self):
35587db96d56Sopenharmony_ci                return 0
35597db96d56Sopenharmony_ci        # this should just work
35607db96d56Sopenharmony_ci        MM().update()
35617db96d56Sopenharmony_ci        self.assertIsInstance(MM(), collections.abc.MutableMapping)
35627db96d56Sopenharmony_ci        self.assertIsInstance(MM(), MutableMapping)
35637db96d56Sopenharmony_ci        self.assertNotIsInstance(MM(), List)
35647db96d56Sopenharmony_ci        self.assertNotIsInstance({}, MM)
35657db96d56Sopenharmony_ci
35667db96d56Sopenharmony_ci    def test_multiple_bases(self):
35677db96d56Sopenharmony_ci        class MM1(MutableMapping[str, str], collections.abc.MutableMapping):
35687db96d56Sopenharmony_ci            pass
35697db96d56Sopenharmony_ci        class MM2(collections.abc.MutableMapping, MutableMapping[str, str]):
35707db96d56Sopenharmony_ci            pass
35717db96d56Sopenharmony_ci        self.assertEqual(MM2.__bases__, (collections.abc.MutableMapping, Generic))
35727db96d56Sopenharmony_ci
35737db96d56Sopenharmony_ci    def test_orig_bases(self):
35747db96d56Sopenharmony_ci        T = TypeVar('T')
35757db96d56Sopenharmony_ci        class C(typing.Dict[str, T]): ...
35767db96d56Sopenharmony_ci        self.assertEqual(C.__orig_bases__, (typing.Dict[str, T],))
35777db96d56Sopenharmony_ci
35787db96d56Sopenharmony_ci    def test_naive_runtime_checks(self):
35797db96d56Sopenharmony_ci        def naive_dict_check(obj, tp):
35807db96d56Sopenharmony_ci            # Check if a dictionary conforms to Dict type
35817db96d56Sopenharmony_ci            if len(tp.__parameters__) > 0:
35827db96d56Sopenharmony_ci                raise NotImplementedError
35837db96d56Sopenharmony_ci            if tp.__args__:
35847db96d56Sopenharmony_ci                KT, VT = tp.__args__
35857db96d56Sopenharmony_ci                return all(
35867db96d56Sopenharmony_ci                    isinstance(k, KT) and isinstance(v, VT)
35877db96d56Sopenharmony_ci                    for k, v in obj.items()
35887db96d56Sopenharmony_ci                )
35897db96d56Sopenharmony_ci        self.assertTrue(naive_dict_check({'x': 1}, typing.Dict[str, int]))
35907db96d56Sopenharmony_ci        self.assertFalse(naive_dict_check({1: 'x'}, typing.Dict[str, int]))
35917db96d56Sopenharmony_ci        with self.assertRaises(NotImplementedError):
35927db96d56Sopenharmony_ci            naive_dict_check({1: 'x'}, typing.Dict[str, T])
35937db96d56Sopenharmony_ci
35947db96d56Sopenharmony_ci        def naive_generic_check(obj, tp):
35957db96d56Sopenharmony_ci            # Check if an instance conforms to the generic class
35967db96d56Sopenharmony_ci            if not hasattr(obj, '__orig_class__'):
35977db96d56Sopenharmony_ci                raise NotImplementedError
35987db96d56Sopenharmony_ci            return obj.__orig_class__ == tp
35997db96d56Sopenharmony_ci        class Node(Generic[T]): ...
36007db96d56Sopenharmony_ci        self.assertTrue(naive_generic_check(Node[int](), Node[int]))
36017db96d56Sopenharmony_ci        self.assertFalse(naive_generic_check(Node[str](), Node[int]))
36027db96d56Sopenharmony_ci        self.assertFalse(naive_generic_check(Node[str](), List))
36037db96d56Sopenharmony_ci        with self.assertRaises(NotImplementedError):
36047db96d56Sopenharmony_ci            naive_generic_check([1, 2, 3], Node[int])
36057db96d56Sopenharmony_ci
36067db96d56Sopenharmony_ci        def naive_list_base_check(obj, tp):
36077db96d56Sopenharmony_ci            # Check if list conforms to a List subclass
36087db96d56Sopenharmony_ci            return all(isinstance(x, tp.__orig_bases__[0].__args__[0])
36097db96d56Sopenharmony_ci                       for x in obj)
36107db96d56Sopenharmony_ci        class C(List[int]): ...
36117db96d56Sopenharmony_ci        self.assertTrue(naive_list_base_check([1, 2, 3], C))
36127db96d56Sopenharmony_ci        self.assertFalse(naive_list_base_check(['a', 'b'], C))
36137db96d56Sopenharmony_ci
36147db96d56Sopenharmony_ci    def test_multi_subscr_base(self):
36157db96d56Sopenharmony_ci        T = TypeVar('T')
36167db96d56Sopenharmony_ci        U = TypeVar('U')
36177db96d56Sopenharmony_ci        V = TypeVar('V')
36187db96d56Sopenharmony_ci        class C(List[T][U][V]): ...
36197db96d56Sopenharmony_ci        class D(C, List[T][U][V]): ...
36207db96d56Sopenharmony_ci        self.assertEqual(C.__parameters__, (V,))
36217db96d56Sopenharmony_ci        self.assertEqual(D.__parameters__, (V,))
36227db96d56Sopenharmony_ci        self.assertEqual(C[int].__parameters__, ())
36237db96d56Sopenharmony_ci        self.assertEqual(D[int].__parameters__, ())
36247db96d56Sopenharmony_ci        self.assertEqual(C[int].__args__, (int,))
36257db96d56Sopenharmony_ci        self.assertEqual(D[int].__args__, (int,))
36267db96d56Sopenharmony_ci        self.assertEqual(C.__bases__, (list, Generic))
36277db96d56Sopenharmony_ci        self.assertEqual(D.__bases__, (C, list, Generic))
36287db96d56Sopenharmony_ci        self.assertEqual(C.__orig_bases__, (List[T][U][V],))
36297db96d56Sopenharmony_ci        self.assertEqual(D.__orig_bases__, (C, List[T][U][V]))
36307db96d56Sopenharmony_ci
36317db96d56Sopenharmony_ci    def test_subscript_meta(self):
36327db96d56Sopenharmony_ci        T = TypeVar('T')
36337db96d56Sopenharmony_ci        class Meta(type): ...
36347db96d56Sopenharmony_ci        self.assertEqual(Type[Meta], Type[Meta])
36357db96d56Sopenharmony_ci        self.assertEqual(Union[T, int][Meta], Union[Meta, int])
36367db96d56Sopenharmony_ci        self.assertEqual(Callable[..., Meta].__args__, (Ellipsis, Meta))
36377db96d56Sopenharmony_ci
36387db96d56Sopenharmony_ci    def test_generic_hashes(self):
36397db96d56Sopenharmony_ci        class A(Generic[T]):
36407db96d56Sopenharmony_ci            ...
36417db96d56Sopenharmony_ci
36427db96d56Sopenharmony_ci        class B(Generic[T]):
36437db96d56Sopenharmony_ci            class A(Generic[T]):
36447db96d56Sopenharmony_ci                ...
36457db96d56Sopenharmony_ci
36467db96d56Sopenharmony_ci        self.assertEqual(A, A)
36477db96d56Sopenharmony_ci        self.assertEqual(mod_generics_cache.A[str], mod_generics_cache.A[str])
36487db96d56Sopenharmony_ci        self.assertEqual(B.A, B.A)
36497db96d56Sopenharmony_ci        self.assertEqual(mod_generics_cache.B.A[B.A[str]],
36507db96d56Sopenharmony_ci                         mod_generics_cache.B.A[B.A[str]])
36517db96d56Sopenharmony_ci
36527db96d56Sopenharmony_ci        self.assertNotEqual(A, B.A)
36537db96d56Sopenharmony_ci        self.assertNotEqual(A, mod_generics_cache.A)
36547db96d56Sopenharmony_ci        self.assertNotEqual(A, mod_generics_cache.B.A)
36557db96d56Sopenharmony_ci        self.assertNotEqual(B.A, mod_generics_cache.A)
36567db96d56Sopenharmony_ci        self.assertNotEqual(B.A, mod_generics_cache.B.A)
36577db96d56Sopenharmony_ci
36587db96d56Sopenharmony_ci        self.assertNotEqual(A[str], B.A[str])
36597db96d56Sopenharmony_ci        self.assertNotEqual(A[List[Any]], B.A[List[Any]])
36607db96d56Sopenharmony_ci        self.assertNotEqual(A[str], mod_generics_cache.A[str])
36617db96d56Sopenharmony_ci        self.assertNotEqual(A[str], mod_generics_cache.B.A[str])
36627db96d56Sopenharmony_ci        self.assertNotEqual(B.A[int], mod_generics_cache.A[int])
36637db96d56Sopenharmony_ci        self.assertNotEqual(B.A[List[Any]], mod_generics_cache.B.A[List[Any]])
36647db96d56Sopenharmony_ci
36657db96d56Sopenharmony_ci        self.assertNotEqual(Tuple[A[str]], Tuple[B.A[str]])
36667db96d56Sopenharmony_ci        self.assertNotEqual(Tuple[A[List[Any]]], Tuple[B.A[List[Any]]])
36677db96d56Sopenharmony_ci        self.assertNotEqual(Union[str, A[str]], Union[str, mod_generics_cache.A[str]])
36687db96d56Sopenharmony_ci        self.assertNotEqual(Union[A[str], A[str]],
36697db96d56Sopenharmony_ci                            Union[A[str], mod_generics_cache.A[str]])
36707db96d56Sopenharmony_ci        self.assertNotEqual(typing.FrozenSet[A[str]],
36717db96d56Sopenharmony_ci                            typing.FrozenSet[mod_generics_cache.B.A[str]])
36727db96d56Sopenharmony_ci
36737db96d56Sopenharmony_ci        self.assertTrue(repr(Tuple[A[str]]).endswith('<locals>.A[str]]'))
36747db96d56Sopenharmony_ci        self.assertTrue(repr(Tuple[B.A[str]]).endswith('<locals>.B.A[str]]'))
36757db96d56Sopenharmony_ci        self.assertTrue(repr(Tuple[mod_generics_cache.A[str]])
36767db96d56Sopenharmony_ci                        .endswith('mod_generics_cache.A[str]]'))
36777db96d56Sopenharmony_ci        self.assertTrue(repr(Tuple[mod_generics_cache.B.A[str]])
36787db96d56Sopenharmony_ci                        .endswith('mod_generics_cache.B.A[str]]'))
36797db96d56Sopenharmony_ci
36807db96d56Sopenharmony_ci    def test_extended_generic_rules_eq(self):
36817db96d56Sopenharmony_ci        T = TypeVar('T')
36827db96d56Sopenharmony_ci        U = TypeVar('U')
36837db96d56Sopenharmony_ci        self.assertEqual(Tuple[T, T][int], Tuple[int, int])
36847db96d56Sopenharmony_ci        self.assertEqual(typing.Iterable[Tuple[T, T]][T], typing.Iterable[Tuple[T, T]])
36857db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
36867db96d56Sopenharmony_ci            Tuple[T, int][()]
36877db96d56Sopenharmony_ci
36887db96d56Sopenharmony_ci        self.assertEqual(Union[T, int][int], int)
36897db96d56Sopenharmony_ci        self.assertEqual(Union[T, U][int, Union[int, str]], Union[int, str])
36907db96d56Sopenharmony_ci        class Base: ...
36917db96d56Sopenharmony_ci        class Derived(Base): ...
36927db96d56Sopenharmony_ci        self.assertEqual(Union[T, Base][Union[Base, Derived]], Union[Base, Derived])
36937db96d56Sopenharmony_ci        self.assertEqual(Callable[[T], T][KT], Callable[[KT], KT])
36947db96d56Sopenharmony_ci        self.assertEqual(Callable[..., List[T]][int], Callable[..., List[int]])
36957db96d56Sopenharmony_ci
36967db96d56Sopenharmony_ci    def test_extended_generic_rules_repr(self):
36977db96d56Sopenharmony_ci        T = TypeVar('T')
36987db96d56Sopenharmony_ci        self.assertEqual(repr(Union[Tuple, Callable]).replace('typing.', ''),
36997db96d56Sopenharmony_ci                         'Union[Tuple, Callable]')
37007db96d56Sopenharmony_ci        self.assertEqual(repr(Union[Tuple, Tuple[int]]).replace('typing.', ''),
37017db96d56Sopenharmony_ci                         'Union[Tuple, Tuple[int]]')
37027db96d56Sopenharmony_ci        self.assertEqual(repr(Callable[..., Optional[T]][int]).replace('typing.', ''),
37037db96d56Sopenharmony_ci                         'Callable[..., Optional[int]]')
37047db96d56Sopenharmony_ci        self.assertEqual(repr(Callable[[], List[T]][int]).replace('typing.', ''),
37057db96d56Sopenharmony_ci                         'Callable[[], List[int]]')
37067db96d56Sopenharmony_ci
37077db96d56Sopenharmony_ci    def test_generic_forward_ref(self):
37087db96d56Sopenharmony_ci        def foobar(x: List[List['CC']]): ...
37097db96d56Sopenharmony_ci        def foobar2(x: list[list[ForwardRef('CC')]]): ...
37107db96d56Sopenharmony_ci        def foobar3(x: list[ForwardRef('CC | int')] | int): ...
37117db96d56Sopenharmony_ci        class CC: ...
37127db96d56Sopenharmony_ci        self.assertEqual(
37137db96d56Sopenharmony_ci            get_type_hints(foobar, globals(), locals()),
37147db96d56Sopenharmony_ci            {'x': List[List[CC]]}
37157db96d56Sopenharmony_ci        )
37167db96d56Sopenharmony_ci        self.assertEqual(
37177db96d56Sopenharmony_ci            get_type_hints(foobar2, globals(), locals()),
37187db96d56Sopenharmony_ci            {'x': list[list[CC]]}
37197db96d56Sopenharmony_ci        )
37207db96d56Sopenharmony_ci        self.assertEqual(
37217db96d56Sopenharmony_ci            get_type_hints(foobar3, globals(), locals()),
37227db96d56Sopenharmony_ci            {'x': list[CC | int] | int}
37237db96d56Sopenharmony_ci        )
37247db96d56Sopenharmony_ci
37257db96d56Sopenharmony_ci        T = TypeVar('T')
37267db96d56Sopenharmony_ci        AT = Tuple[T, ...]
37277db96d56Sopenharmony_ci        def barfoo(x: AT): ...
37287db96d56Sopenharmony_ci        self.assertIs(get_type_hints(barfoo, globals(), locals())['x'], AT)
37297db96d56Sopenharmony_ci        CT = Callable[..., List[T]]
37307db96d56Sopenharmony_ci        def barfoo2(x: CT): ...
37317db96d56Sopenharmony_ci        self.assertIs(get_type_hints(barfoo2, globals(), locals())['x'], CT)
37327db96d56Sopenharmony_ci
37337db96d56Sopenharmony_ci    def test_generic_pep585_forward_ref(self):
37347db96d56Sopenharmony_ci        # See https://bugs.python.org/issue41370
37357db96d56Sopenharmony_ci
37367db96d56Sopenharmony_ci        class C1:
37377db96d56Sopenharmony_ci            a: list['C1']
37387db96d56Sopenharmony_ci        self.assertEqual(
37397db96d56Sopenharmony_ci            get_type_hints(C1, globals(), locals()),
37407db96d56Sopenharmony_ci            {'a': list[C1]}
37417db96d56Sopenharmony_ci        )
37427db96d56Sopenharmony_ci
37437db96d56Sopenharmony_ci        class C2:
37447db96d56Sopenharmony_ci            a: dict['C1', list[List[list['C2']]]]
37457db96d56Sopenharmony_ci        self.assertEqual(
37467db96d56Sopenharmony_ci            get_type_hints(C2, globals(), locals()),
37477db96d56Sopenharmony_ci            {'a': dict[C1, list[List[list[C2]]]]}
37487db96d56Sopenharmony_ci        )
37497db96d56Sopenharmony_ci
37507db96d56Sopenharmony_ci        # Test stringified annotations
37517db96d56Sopenharmony_ci        scope = {}
37527db96d56Sopenharmony_ci        exec(textwrap.dedent('''
37537db96d56Sopenharmony_ci        from __future__ import annotations
37547db96d56Sopenharmony_ci        class C3:
37557db96d56Sopenharmony_ci            a: List[list["C2"]]
37567db96d56Sopenharmony_ci        '''), scope)
37577db96d56Sopenharmony_ci        C3 = scope['C3']
37587db96d56Sopenharmony_ci        self.assertEqual(C3.__annotations__['a'], "List[list['C2']]")
37597db96d56Sopenharmony_ci        self.assertEqual(
37607db96d56Sopenharmony_ci            get_type_hints(C3, globals(), locals()),
37617db96d56Sopenharmony_ci            {'a': List[list[C2]]}
37627db96d56Sopenharmony_ci        )
37637db96d56Sopenharmony_ci
37647db96d56Sopenharmony_ci        # Test recursive types
37657db96d56Sopenharmony_ci        X = list["X"]
37667db96d56Sopenharmony_ci        def f(x: X): ...
37677db96d56Sopenharmony_ci        self.assertEqual(
37687db96d56Sopenharmony_ci            get_type_hints(f, globals(), locals()),
37697db96d56Sopenharmony_ci            {'x': list[list[ForwardRef('X')]]}
37707db96d56Sopenharmony_ci        )
37717db96d56Sopenharmony_ci
37727db96d56Sopenharmony_ci    def test_extended_generic_rules_subclassing(self):
37737db96d56Sopenharmony_ci        class T1(Tuple[T, KT]): ...
37747db96d56Sopenharmony_ci        class T2(Tuple[T, ...]): ...
37757db96d56Sopenharmony_ci        class C1(typing.Container[T]):
37767db96d56Sopenharmony_ci            def __contains__(self, item):
37777db96d56Sopenharmony_ci                return False
37787db96d56Sopenharmony_ci
37797db96d56Sopenharmony_ci        self.assertEqual(T1.__parameters__, (T, KT))
37807db96d56Sopenharmony_ci        self.assertEqual(T1[int, str].__args__, (int, str))
37817db96d56Sopenharmony_ci        self.assertEqual(T1[int, T].__origin__, T1)
37827db96d56Sopenharmony_ci
37837db96d56Sopenharmony_ci        self.assertEqual(T2.__parameters__, (T,))
37847db96d56Sopenharmony_ci        # These don't work because of tuple.__class_item__
37857db96d56Sopenharmony_ci        ## with self.assertRaises(TypeError):
37867db96d56Sopenharmony_ci        ##     T1[int]
37877db96d56Sopenharmony_ci        ## with self.assertRaises(TypeError):
37887db96d56Sopenharmony_ci        ##     T2[int, str]
37897db96d56Sopenharmony_ci
37907db96d56Sopenharmony_ci        self.assertEqual(repr(C1[int]).split('.')[-1], 'C1[int]')
37917db96d56Sopenharmony_ci        self.assertEqual(C1.__parameters__, (T,))
37927db96d56Sopenharmony_ci        self.assertIsInstance(C1(), collections.abc.Container)
37937db96d56Sopenharmony_ci        self.assertIsSubclass(C1, collections.abc.Container)
37947db96d56Sopenharmony_ci        self.assertIsInstance(T1(), tuple)
37957db96d56Sopenharmony_ci        self.assertIsSubclass(T2, tuple)
37967db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
37977db96d56Sopenharmony_ci            issubclass(Tuple[int, ...], typing.Sequence)
37987db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
37997db96d56Sopenharmony_ci            issubclass(Tuple[int, ...], typing.Iterable)
38007db96d56Sopenharmony_ci
38017db96d56Sopenharmony_ci    def test_fail_with_bare_union(self):
38027db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
38037db96d56Sopenharmony_ci            List[Union]
38047db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
38057db96d56Sopenharmony_ci            Tuple[Optional]
38067db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
38077db96d56Sopenharmony_ci            ClassVar[ClassVar[int]]
38087db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
38097db96d56Sopenharmony_ci            List[ClassVar[int]]
38107db96d56Sopenharmony_ci
38117db96d56Sopenharmony_ci    def test_fail_with_bare_generic(self):
38127db96d56Sopenharmony_ci        T = TypeVar('T')
38137db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
38147db96d56Sopenharmony_ci            List[Generic]
38157db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
38167db96d56Sopenharmony_ci            Tuple[Generic[T]]
38177db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
38187db96d56Sopenharmony_ci            List[typing.Protocol]
38197db96d56Sopenharmony_ci
38207db96d56Sopenharmony_ci    def test_type_erasure_special(self):
38217db96d56Sopenharmony_ci        T = TypeVar('T')
38227db96d56Sopenharmony_ci        # this is the only test that checks type caching
38237db96d56Sopenharmony_ci        self.clear_caches()
38247db96d56Sopenharmony_ci        class MyTup(Tuple[T, T]): ...
38257db96d56Sopenharmony_ci        self.assertIs(MyTup[int]().__class__, MyTup)
38267db96d56Sopenharmony_ci        self.assertEqual(MyTup[int]().__orig_class__, MyTup[int])
38277db96d56Sopenharmony_ci        class MyDict(typing.Dict[T, T]): ...
38287db96d56Sopenharmony_ci        self.assertIs(MyDict[int]().__class__, MyDict)
38297db96d56Sopenharmony_ci        self.assertEqual(MyDict[int]().__orig_class__, MyDict[int])
38307db96d56Sopenharmony_ci        class MyDef(typing.DefaultDict[str, T]): ...
38317db96d56Sopenharmony_ci        self.assertIs(MyDef[int]().__class__, MyDef)
38327db96d56Sopenharmony_ci        self.assertEqual(MyDef[int]().__orig_class__, MyDef[int])
38337db96d56Sopenharmony_ci        class MyChain(typing.ChainMap[str, T]): ...
38347db96d56Sopenharmony_ci        self.assertIs(MyChain[int]().__class__, MyChain)
38357db96d56Sopenharmony_ci        self.assertEqual(MyChain[int]().__orig_class__, MyChain[int])
38367db96d56Sopenharmony_ci
38377db96d56Sopenharmony_ci    def test_all_repr_eq_any(self):
38387db96d56Sopenharmony_ci        objs = (getattr(typing, el) for el in typing.__all__)
38397db96d56Sopenharmony_ci        for obj in objs:
38407db96d56Sopenharmony_ci            self.assertNotEqual(repr(obj), '')
38417db96d56Sopenharmony_ci            self.assertEqual(obj, obj)
38427db96d56Sopenharmony_ci            if (getattr(obj, '__parameters__', None)
38437db96d56Sopenharmony_ci                    and not isinstance(obj, typing.TypeVar)
38447db96d56Sopenharmony_ci                    and isinstance(obj.__parameters__, tuple)
38457db96d56Sopenharmony_ci                    and len(obj.__parameters__) == 1):
38467db96d56Sopenharmony_ci                self.assertEqual(obj[Any].__args__, (Any,))
38477db96d56Sopenharmony_ci            if isinstance(obj, type):
38487db96d56Sopenharmony_ci                for base in obj.__mro__:
38497db96d56Sopenharmony_ci                    self.assertNotEqual(repr(base), '')
38507db96d56Sopenharmony_ci                    self.assertEqual(base, base)
38517db96d56Sopenharmony_ci
38527db96d56Sopenharmony_ci    def test_pickle(self):
38537db96d56Sopenharmony_ci        global C  # pickle wants to reference the class by name
38547db96d56Sopenharmony_ci        T = TypeVar('T')
38557db96d56Sopenharmony_ci
38567db96d56Sopenharmony_ci        class B(Generic[T]):
38577db96d56Sopenharmony_ci            pass
38587db96d56Sopenharmony_ci
38597db96d56Sopenharmony_ci        class C(B[int]):
38607db96d56Sopenharmony_ci            pass
38617db96d56Sopenharmony_ci
38627db96d56Sopenharmony_ci        c = C()
38637db96d56Sopenharmony_ci        c.foo = 42
38647db96d56Sopenharmony_ci        c.bar = 'abc'
38657db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
38667db96d56Sopenharmony_ci            z = pickle.dumps(c, proto)
38677db96d56Sopenharmony_ci            x = pickle.loads(z)
38687db96d56Sopenharmony_ci            self.assertEqual(x.foo, 42)
38697db96d56Sopenharmony_ci            self.assertEqual(x.bar, 'abc')
38707db96d56Sopenharmony_ci            self.assertEqual(x.__dict__, {'foo': 42, 'bar': 'abc'})
38717db96d56Sopenharmony_ci        samples = [Any, Union, Tuple, Callable, ClassVar,
38727db96d56Sopenharmony_ci                   Union[int, str], ClassVar[List], Tuple[int, ...], Tuple[()],
38737db96d56Sopenharmony_ci                   Callable[[str], bytes],
38747db96d56Sopenharmony_ci                   typing.DefaultDict, typing.FrozenSet[int]]
38757db96d56Sopenharmony_ci        for s in samples:
38767db96d56Sopenharmony_ci            for proto in range(pickle.HIGHEST_PROTOCOL + 1):
38777db96d56Sopenharmony_ci                z = pickle.dumps(s, proto)
38787db96d56Sopenharmony_ci                x = pickle.loads(z)
38797db96d56Sopenharmony_ci                self.assertEqual(s, x)
38807db96d56Sopenharmony_ci        more_samples = [List, typing.Iterable, typing.Type, List[int],
38817db96d56Sopenharmony_ci                        typing.Type[typing.Mapping], typing.AbstractSet[Tuple[int, str]]]
38827db96d56Sopenharmony_ci        for s in more_samples:
38837db96d56Sopenharmony_ci            for proto in range(pickle.HIGHEST_PROTOCOL + 1):
38847db96d56Sopenharmony_ci                z = pickle.dumps(s, proto)
38857db96d56Sopenharmony_ci                x = pickle.loads(z)
38867db96d56Sopenharmony_ci                self.assertEqual(s, x)
38877db96d56Sopenharmony_ci
38887db96d56Sopenharmony_ci    def test_copy_and_deepcopy(self):
38897db96d56Sopenharmony_ci        T = TypeVar('T')
38907db96d56Sopenharmony_ci        class Node(Generic[T]): ...
38917db96d56Sopenharmony_ci        things = [Union[T, int], Tuple[T, int], Tuple[()],
38927db96d56Sopenharmony_ci                  Callable[..., T], Callable[[int], int],
38937db96d56Sopenharmony_ci                  Tuple[Any, Any], Node[T], Node[int], Node[Any], typing.Iterable[T],
38947db96d56Sopenharmony_ci                  typing.Iterable[Any], typing.Iterable[int], typing.Dict[int, str],
38957db96d56Sopenharmony_ci                  typing.Dict[T, Any], ClassVar[int], ClassVar[List[T]], Tuple['T', 'T'],
38967db96d56Sopenharmony_ci                  Union['T', int], List['T'], typing.Mapping['T', int]]
38977db96d56Sopenharmony_ci        for t in things + [Any]:
38987db96d56Sopenharmony_ci            self.assertEqual(t, copy(t))
38997db96d56Sopenharmony_ci            self.assertEqual(t, deepcopy(t))
39007db96d56Sopenharmony_ci
39017db96d56Sopenharmony_ci    def test_immutability_by_copy_and_pickle(self):
39027db96d56Sopenharmony_ci        # Special forms like Union, Any, etc., generic aliases to containers like List,
39037db96d56Sopenharmony_ci        # Mapping, etc., and type variabcles are considered immutable by copy and pickle.
39047db96d56Sopenharmony_ci        global TP, TPB, TPV, PP  # for pickle
39057db96d56Sopenharmony_ci        TP = TypeVar('TP')
39067db96d56Sopenharmony_ci        TPB = TypeVar('TPB', bound=int)
39077db96d56Sopenharmony_ci        TPV = TypeVar('TPV', bytes, str)
39087db96d56Sopenharmony_ci        PP = ParamSpec('PP')
39097db96d56Sopenharmony_ci        for X in [TP, TPB, TPV, PP,
39107db96d56Sopenharmony_ci                  List, typing.Mapping, ClassVar, typing.Iterable,
39117db96d56Sopenharmony_ci                  Union, Any, Tuple, Callable]:
39127db96d56Sopenharmony_ci            with self.subTest(thing=X):
39137db96d56Sopenharmony_ci                self.assertIs(copy(X), X)
39147db96d56Sopenharmony_ci                self.assertIs(deepcopy(X), X)
39157db96d56Sopenharmony_ci                for proto in range(pickle.HIGHEST_PROTOCOL + 1):
39167db96d56Sopenharmony_ci                    self.assertIs(pickle.loads(pickle.dumps(X, proto)), X)
39177db96d56Sopenharmony_ci        del TP, TPB, TPV, PP
39187db96d56Sopenharmony_ci
39197db96d56Sopenharmony_ci        # Check that local type variables are copyable.
39207db96d56Sopenharmony_ci        TL = TypeVar('TL')
39217db96d56Sopenharmony_ci        TLB = TypeVar('TLB', bound=int)
39227db96d56Sopenharmony_ci        TLV = TypeVar('TLV', bytes, str)
39237db96d56Sopenharmony_ci        PL = ParamSpec('PL')
39247db96d56Sopenharmony_ci        for X in [TL, TLB, TLV, PL]:
39257db96d56Sopenharmony_ci            with self.subTest(thing=X):
39267db96d56Sopenharmony_ci                self.assertIs(copy(X), X)
39277db96d56Sopenharmony_ci                self.assertIs(deepcopy(X), X)
39287db96d56Sopenharmony_ci
39297db96d56Sopenharmony_ci    def test_copy_generic_instances(self):
39307db96d56Sopenharmony_ci        T = TypeVar('T')
39317db96d56Sopenharmony_ci        class C(Generic[T]):
39327db96d56Sopenharmony_ci            def __init__(self, attr: T) -> None:
39337db96d56Sopenharmony_ci                self.attr = attr
39347db96d56Sopenharmony_ci
39357db96d56Sopenharmony_ci        c = C(42)
39367db96d56Sopenharmony_ci        self.assertEqual(copy(c).attr, 42)
39377db96d56Sopenharmony_ci        self.assertEqual(deepcopy(c).attr, 42)
39387db96d56Sopenharmony_ci        self.assertIsNot(copy(c), c)
39397db96d56Sopenharmony_ci        self.assertIsNot(deepcopy(c), c)
39407db96d56Sopenharmony_ci        c.attr = 1
39417db96d56Sopenharmony_ci        self.assertEqual(copy(c).attr, 1)
39427db96d56Sopenharmony_ci        self.assertEqual(deepcopy(c).attr, 1)
39437db96d56Sopenharmony_ci        ci = C[int](42)
39447db96d56Sopenharmony_ci        self.assertEqual(copy(ci).attr, 42)
39457db96d56Sopenharmony_ci        self.assertEqual(deepcopy(ci).attr, 42)
39467db96d56Sopenharmony_ci        self.assertIsNot(copy(ci), ci)
39477db96d56Sopenharmony_ci        self.assertIsNot(deepcopy(ci), ci)
39487db96d56Sopenharmony_ci        ci.attr = 1
39497db96d56Sopenharmony_ci        self.assertEqual(copy(ci).attr, 1)
39507db96d56Sopenharmony_ci        self.assertEqual(deepcopy(ci).attr, 1)
39517db96d56Sopenharmony_ci        self.assertEqual(ci.__orig_class__, C[int])
39527db96d56Sopenharmony_ci
39537db96d56Sopenharmony_ci    def test_weakref_all(self):
39547db96d56Sopenharmony_ci        T = TypeVar('T')
39557db96d56Sopenharmony_ci        things = [Any, Union[T, int], Callable[..., T], Tuple[Any, Any],
39567db96d56Sopenharmony_ci                  Optional[List[int]], typing.Mapping[int, str],
39577db96d56Sopenharmony_ci                  typing.Match[bytes], typing.Iterable['whatever']]
39587db96d56Sopenharmony_ci        for t in things:
39597db96d56Sopenharmony_ci            self.assertEqual(weakref.ref(t)(), t)
39607db96d56Sopenharmony_ci
39617db96d56Sopenharmony_ci    def test_parameterized_slots(self):
39627db96d56Sopenharmony_ci        T = TypeVar('T')
39637db96d56Sopenharmony_ci        class C(Generic[T]):
39647db96d56Sopenharmony_ci            __slots__ = ('potato',)
39657db96d56Sopenharmony_ci
39667db96d56Sopenharmony_ci        c = C()
39677db96d56Sopenharmony_ci        c_int = C[int]()
39687db96d56Sopenharmony_ci
39697db96d56Sopenharmony_ci        c.potato = 0
39707db96d56Sopenharmony_ci        c_int.potato = 0
39717db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
39727db96d56Sopenharmony_ci            c.tomato = 0
39737db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
39747db96d56Sopenharmony_ci            c_int.tomato = 0
39757db96d56Sopenharmony_ci
39767db96d56Sopenharmony_ci        def foo(x: C['C']): ...
39777db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(foo, globals(), locals())['x'], C[C])
39787db96d56Sopenharmony_ci        self.assertEqual(copy(C[int]), deepcopy(C[int]))
39797db96d56Sopenharmony_ci
39807db96d56Sopenharmony_ci    def test_parameterized_slots_dict(self):
39817db96d56Sopenharmony_ci        T = TypeVar('T')
39827db96d56Sopenharmony_ci        class D(Generic[T]):
39837db96d56Sopenharmony_ci            __slots__ = {'banana': 42}
39847db96d56Sopenharmony_ci
39857db96d56Sopenharmony_ci        d = D()
39867db96d56Sopenharmony_ci        d_int = D[int]()
39877db96d56Sopenharmony_ci
39887db96d56Sopenharmony_ci        d.banana = 'yes'
39897db96d56Sopenharmony_ci        d_int.banana = 'yes'
39907db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
39917db96d56Sopenharmony_ci            d.foobar = 'no'
39927db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
39937db96d56Sopenharmony_ci            d_int.foobar = 'no'
39947db96d56Sopenharmony_ci
39957db96d56Sopenharmony_ci    def test_errors(self):
39967db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
39977db96d56Sopenharmony_ci            B = SimpleMapping[XK, Any]
39987db96d56Sopenharmony_ci
39997db96d56Sopenharmony_ci            class C(Generic[B]):
40007db96d56Sopenharmony_ci                pass
40017db96d56Sopenharmony_ci
40027db96d56Sopenharmony_ci    def test_repr_2(self):
40037db96d56Sopenharmony_ci        class C(Generic[T]):
40047db96d56Sopenharmony_ci            pass
40057db96d56Sopenharmony_ci
40067db96d56Sopenharmony_ci        self.assertEqual(C.__module__, __name__)
40077db96d56Sopenharmony_ci        self.assertEqual(C.__qualname__,
40087db96d56Sopenharmony_ci                         'GenericTests.test_repr_2.<locals>.C')
40097db96d56Sopenharmony_ci        X = C[int]
40107db96d56Sopenharmony_ci        self.assertEqual(X.__module__, __name__)
40117db96d56Sopenharmony_ci        self.assertEqual(repr(X).split('.')[-1], 'C[int]')
40127db96d56Sopenharmony_ci
40137db96d56Sopenharmony_ci        class Y(C[int]):
40147db96d56Sopenharmony_ci            pass
40157db96d56Sopenharmony_ci
40167db96d56Sopenharmony_ci        self.assertEqual(Y.__module__, __name__)
40177db96d56Sopenharmony_ci        self.assertEqual(Y.__qualname__,
40187db96d56Sopenharmony_ci                         'GenericTests.test_repr_2.<locals>.Y')
40197db96d56Sopenharmony_ci
40207db96d56Sopenharmony_ci    def test_eq_1(self):
40217db96d56Sopenharmony_ci        self.assertEqual(Generic, Generic)
40227db96d56Sopenharmony_ci        self.assertEqual(Generic[T], Generic[T])
40237db96d56Sopenharmony_ci        self.assertNotEqual(Generic[KT], Generic[VT])
40247db96d56Sopenharmony_ci
40257db96d56Sopenharmony_ci    def test_eq_2(self):
40267db96d56Sopenharmony_ci
40277db96d56Sopenharmony_ci        class A(Generic[T]):
40287db96d56Sopenharmony_ci            pass
40297db96d56Sopenharmony_ci
40307db96d56Sopenharmony_ci        class B(Generic[T]):
40317db96d56Sopenharmony_ci            pass
40327db96d56Sopenharmony_ci
40337db96d56Sopenharmony_ci        self.assertEqual(A, A)
40347db96d56Sopenharmony_ci        self.assertNotEqual(A, B)
40357db96d56Sopenharmony_ci        self.assertEqual(A[T], A[T])
40367db96d56Sopenharmony_ci        self.assertNotEqual(A[T], B[T])
40377db96d56Sopenharmony_ci
40387db96d56Sopenharmony_ci    def test_multiple_inheritance(self):
40397db96d56Sopenharmony_ci
40407db96d56Sopenharmony_ci        class A(Generic[T, VT]):
40417db96d56Sopenharmony_ci            pass
40427db96d56Sopenharmony_ci
40437db96d56Sopenharmony_ci        class B(Generic[KT, T]):
40447db96d56Sopenharmony_ci            pass
40457db96d56Sopenharmony_ci
40467db96d56Sopenharmony_ci        class C(A[T, VT], Generic[VT, T, KT], B[KT, T]):
40477db96d56Sopenharmony_ci            pass
40487db96d56Sopenharmony_ci
40497db96d56Sopenharmony_ci        self.assertEqual(C.__parameters__, (VT, T, KT))
40507db96d56Sopenharmony_ci
40517db96d56Sopenharmony_ci    def test_multiple_inheritance_special(self):
40527db96d56Sopenharmony_ci        S = TypeVar('S')
40537db96d56Sopenharmony_ci        class B(Generic[S]): ...
40547db96d56Sopenharmony_ci        class C(List[int], B): ...
40557db96d56Sopenharmony_ci        self.assertEqual(C.__mro__, (C, list, B, Generic, object))
40567db96d56Sopenharmony_ci
40577db96d56Sopenharmony_ci    def test_init_subclass_super_called(self):
40587db96d56Sopenharmony_ci        class FinalException(Exception):
40597db96d56Sopenharmony_ci            pass
40607db96d56Sopenharmony_ci
40617db96d56Sopenharmony_ci        class Final:
40627db96d56Sopenharmony_ci            def __init_subclass__(cls, **kwargs) -> None:
40637db96d56Sopenharmony_ci                for base in cls.__bases__:
40647db96d56Sopenharmony_ci                    if base is not Final and issubclass(base, Final):
40657db96d56Sopenharmony_ci                        raise FinalException(base)
40667db96d56Sopenharmony_ci                super().__init_subclass__(**kwargs)
40677db96d56Sopenharmony_ci        class Test(Generic[T], Final):
40687db96d56Sopenharmony_ci            pass
40697db96d56Sopenharmony_ci        with self.assertRaises(FinalException):
40707db96d56Sopenharmony_ci            class Subclass(Test):
40717db96d56Sopenharmony_ci                pass
40727db96d56Sopenharmony_ci        with self.assertRaises(FinalException):
40737db96d56Sopenharmony_ci            class Subclass(Test[int]):
40747db96d56Sopenharmony_ci                pass
40757db96d56Sopenharmony_ci
40767db96d56Sopenharmony_ci    def test_nested(self):
40777db96d56Sopenharmony_ci
40787db96d56Sopenharmony_ci        G = Generic
40797db96d56Sopenharmony_ci
40807db96d56Sopenharmony_ci        class Visitor(G[T]):
40817db96d56Sopenharmony_ci
40827db96d56Sopenharmony_ci            a = None
40837db96d56Sopenharmony_ci
40847db96d56Sopenharmony_ci            def set(self, a: T):
40857db96d56Sopenharmony_ci                self.a = a
40867db96d56Sopenharmony_ci
40877db96d56Sopenharmony_ci            def get(self):
40887db96d56Sopenharmony_ci                return self.a
40897db96d56Sopenharmony_ci
40907db96d56Sopenharmony_ci            def visit(self) -> T:
40917db96d56Sopenharmony_ci                return self.a
40927db96d56Sopenharmony_ci
40937db96d56Sopenharmony_ci        V = Visitor[typing.List[int]]
40947db96d56Sopenharmony_ci
40957db96d56Sopenharmony_ci        class IntListVisitor(V):
40967db96d56Sopenharmony_ci
40977db96d56Sopenharmony_ci            def append(self, x: int):
40987db96d56Sopenharmony_ci                self.a.append(x)
40997db96d56Sopenharmony_ci
41007db96d56Sopenharmony_ci        a = IntListVisitor()
41017db96d56Sopenharmony_ci        a.set([])
41027db96d56Sopenharmony_ci        a.append(1)
41037db96d56Sopenharmony_ci        a.append(42)
41047db96d56Sopenharmony_ci        self.assertEqual(a.get(), [1, 42])
41057db96d56Sopenharmony_ci
41067db96d56Sopenharmony_ci    def test_type_erasure(self):
41077db96d56Sopenharmony_ci        T = TypeVar('T')
41087db96d56Sopenharmony_ci
41097db96d56Sopenharmony_ci        class Node(Generic[T]):
41107db96d56Sopenharmony_ci            def __init__(self, label: T,
41117db96d56Sopenharmony_ci                         left: 'Node[T]' = None,
41127db96d56Sopenharmony_ci                         right: 'Node[T]' = None):
41137db96d56Sopenharmony_ci                self.label = label  # type: T
41147db96d56Sopenharmony_ci                self.left = left  # type: Optional[Node[T]]
41157db96d56Sopenharmony_ci                self.right = right  # type: Optional[Node[T]]
41167db96d56Sopenharmony_ci
41177db96d56Sopenharmony_ci        def foo(x: T):
41187db96d56Sopenharmony_ci            a = Node(x)
41197db96d56Sopenharmony_ci            b = Node[T](x)
41207db96d56Sopenharmony_ci            c = Node[Any](x)
41217db96d56Sopenharmony_ci            self.assertIs(type(a), Node)
41227db96d56Sopenharmony_ci            self.assertIs(type(b), Node)
41237db96d56Sopenharmony_ci            self.assertIs(type(c), Node)
41247db96d56Sopenharmony_ci            self.assertEqual(a.label, x)
41257db96d56Sopenharmony_ci            self.assertEqual(b.label, x)
41267db96d56Sopenharmony_ci            self.assertEqual(c.label, x)
41277db96d56Sopenharmony_ci
41287db96d56Sopenharmony_ci        foo(42)
41297db96d56Sopenharmony_ci
41307db96d56Sopenharmony_ci    def test_implicit_any(self):
41317db96d56Sopenharmony_ci        T = TypeVar('T')
41327db96d56Sopenharmony_ci
41337db96d56Sopenharmony_ci        class C(Generic[T]):
41347db96d56Sopenharmony_ci            pass
41357db96d56Sopenharmony_ci
41367db96d56Sopenharmony_ci        class D(C):
41377db96d56Sopenharmony_ci            pass
41387db96d56Sopenharmony_ci
41397db96d56Sopenharmony_ci        self.assertEqual(D.__parameters__, ())
41407db96d56Sopenharmony_ci
41417db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
41427db96d56Sopenharmony_ci            D[int]
41437db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
41447db96d56Sopenharmony_ci            D[Any]
41457db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
41467db96d56Sopenharmony_ci            D[T]
41477db96d56Sopenharmony_ci
41487db96d56Sopenharmony_ci    def test_new_with_args(self):
41497db96d56Sopenharmony_ci
41507db96d56Sopenharmony_ci        class A(Generic[T]):
41517db96d56Sopenharmony_ci            pass
41527db96d56Sopenharmony_ci
41537db96d56Sopenharmony_ci        class B:
41547db96d56Sopenharmony_ci            def __new__(cls, arg):
41557db96d56Sopenharmony_ci                # call object
41567db96d56Sopenharmony_ci                obj = super().__new__(cls)
41577db96d56Sopenharmony_ci                obj.arg = arg
41587db96d56Sopenharmony_ci                return obj
41597db96d56Sopenharmony_ci
41607db96d56Sopenharmony_ci        # mro: C, A, Generic, B, object
41617db96d56Sopenharmony_ci        class C(A, B):
41627db96d56Sopenharmony_ci            pass
41637db96d56Sopenharmony_ci
41647db96d56Sopenharmony_ci        c = C('foo')
41657db96d56Sopenharmony_ci        self.assertEqual(c.arg, 'foo')
41667db96d56Sopenharmony_ci
41677db96d56Sopenharmony_ci    def test_new_with_args2(self):
41687db96d56Sopenharmony_ci
41697db96d56Sopenharmony_ci        class A:
41707db96d56Sopenharmony_ci            def __init__(self, arg):
41717db96d56Sopenharmony_ci                self.from_a = arg
41727db96d56Sopenharmony_ci                # call object
41737db96d56Sopenharmony_ci                super().__init__()
41747db96d56Sopenharmony_ci
41757db96d56Sopenharmony_ci        # mro: C, Generic, A, object
41767db96d56Sopenharmony_ci        class C(Generic[T], A):
41777db96d56Sopenharmony_ci            def __init__(self, arg):
41787db96d56Sopenharmony_ci                self.from_c = arg
41797db96d56Sopenharmony_ci                # call Generic
41807db96d56Sopenharmony_ci                super().__init__(arg)
41817db96d56Sopenharmony_ci
41827db96d56Sopenharmony_ci        c = C('foo')
41837db96d56Sopenharmony_ci        self.assertEqual(c.from_a, 'foo')
41847db96d56Sopenharmony_ci        self.assertEqual(c.from_c, 'foo')
41857db96d56Sopenharmony_ci
41867db96d56Sopenharmony_ci    def test_new_no_args(self):
41877db96d56Sopenharmony_ci
41887db96d56Sopenharmony_ci        class A(Generic[T]):
41897db96d56Sopenharmony_ci            pass
41907db96d56Sopenharmony_ci
41917db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
41927db96d56Sopenharmony_ci            A('foo')
41937db96d56Sopenharmony_ci
41947db96d56Sopenharmony_ci        class B:
41957db96d56Sopenharmony_ci            def __new__(cls):
41967db96d56Sopenharmony_ci                # call object
41977db96d56Sopenharmony_ci                obj = super().__new__(cls)
41987db96d56Sopenharmony_ci                obj.from_b = 'b'
41997db96d56Sopenharmony_ci                return obj
42007db96d56Sopenharmony_ci
42017db96d56Sopenharmony_ci        # mro: C, A, Generic, B, object
42027db96d56Sopenharmony_ci        class C(A, B):
42037db96d56Sopenharmony_ci            def __init__(self, arg):
42047db96d56Sopenharmony_ci                self.arg = arg
42057db96d56Sopenharmony_ci
42067db96d56Sopenharmony_ci            def __new__(cls, arg):
42077db96d56Sopenharmony_ci                # call A
42087db96d56Sopenharmony_ci                obj = super().__new__(cls)
42097db96d56Sopenharmony_ci                obj.from_c = 'c'
42107db96d56Sopenharmony_ci                return obj
42117db96d56Sopenharmony_ci
42127db96d56Sopenharmony_ci        c = C('foo')
42137db96d56Sopenharmony_ci        self.assertEqual(c.arg, 'foo')
42147db96d56Sopenharmony_ci        self.assertEqual(c.from_b, 'b')
42157db96d56Sopenharmony_ci        self.assertEqual(c.from_c, 'c')
42167db96d56Sopenharmony_ci
42177db96d56Sopenharmony_ci    def test_subclass_special_form(self):
42187db96d56Sopenharmony_ci        for obj in (
42197db96d56Sopenharmony_ci            ClassVar[int],
42207db96d56Sopenharmony_ci            Final[int],
42217db96d56Sopenharmony_ci            Union[int, float],
42227db96d56Sopenharmony_ci            Optional[int],
42237db96d56Sopenharmony_ci            Literal[1, 2],
42247db96d56Sopenharmony_ci            Concatenate[int, ParamSpec("P")],
42257db96d56Sopenharmony_ci            TypeGuard[int],
42267db96d56Sopenharmony_ci        ):
42277db96d56Sopenharmony_ci            with self.subTest(msg=obj):
42287db96d56Sopenharmony_ci                with self.assertRaisesRegex(
42297db96d56Sopenharmony_ci                        TypeError, f'^{re.escape(f"Cannot subclass {obj!r}")}$'
42307db96d56Sopenharmony_ci                ):
42317db96d56Sopenharmony_ci                    class Foo(obj):
42327db96d56Sopenharmony_ci                        pass
42337db96d56Sopenharmony_ci
42347db96d56Sopenharmony_ci    def test_complex_subclasses(self):
42357db96d56Sopenharmony_ci        T_co = TypeVar("T_co", covariant=True)
42367db96d56Sopenharmony_ci
42377db96d56Sopenharmony_ci        class Base(Generic[T_co]):
42387db96d56Sopenharmony_ci            ...
42397db96d56Sopenharmony_ci
42407db96d56Sopenharmony_ci        T = TypeVar("T")
42417db96d56Sopenharmony_ci
42427db96d56Sopenharmony_ci        # see gh-94607: this fails in that bug
42437db96d56Sopenharmony_ci        class Sub(Base, Generic[T]):
42447db96d56Sopenharmony_ci            ...
42457db96d56Sopenharmony_ci
42467db96d56Sopenharmony_ci    def test_parameter_detection(self):
42477db96d56Sopenharmony_ci        self.assertEqual(List[T].__parameters__, (T,))
42487db96d56Sopenharmony_ci        self.assertEqual(List[List[T]].__parameters__, (T,))
42497db96d56Sopenharmony_ci        class A:
42507db96d56Sopenharmony_ci            __parameters__ = (T,)
42517db96d56Sopenharmony_ci        # Bare classes should be skipped
42527db96d56Sopenharmony_ci        for a in (List, list):
42537db96d56Sopenharmony_ci            for b in (A, int, TypeVar, TypeVarTuple, ParamSpec, types.GenericAlias, types.UnionType):
42547db96d56Sopenharmony_ci                with self.subTest(generic=a, sub=b):
42557db96d56Sopenharmony_ci                    with self.assertRaisesRegex(TypeError, '.* is not a generic class'):
42567db96d56Sopenharmony_ci                        a[b][str]
42577db96d56Sopenharmony_ci        # Duck-typing anything that looks like it has __parameters__.
42587db96d56Sopenharmony_ci        # These tests are optional and failure is okay.
42597db96d56Sopenharmony_ci        self.assertEqual(List[A()].__parameters__, (T,))
42607db96d56Sopenharmony_ci        # C version of GenericAlias
42617db96d56Sopenharmony_ci        self.assertEqual(list[A()].__parameters__, (T,))
42627db96d56Sopenharmony_ci
42637db96d56Sopenharmony_ci    def test_non_generic_subscript(self):
42647db96d56Sopenharmony_ci        T = TypeVar('T')
42657db96d56Sopenharmony_ci        class G(Generic[T]):
42667db96d56Sopenharmony_ci            pass
42677db96d56Sopenharmony_ci        class A:
42687db96d56Sopenharmony_ci            __parameters__ = (T,)
42697db96d56Sopenharmony_ci
42707db96d56Sopenharmony_ci        for s in (int, G, A, List, list,
42717db96d56Sopenharmony_ci                  TypeVar, TypeVarTuple, ParamSpec,
42727db96d56Sopenharmony_ci                  types.GenericAlias, types.UnionType):
42737db96d56Sopenharmony_ci
42747db96d56Sopenharmony_ci            for t in Tuple, tuple:
42757db96d56Sopenharmony_ci                with self.subTest(tuple=t, sub=s):
42767db96d56Sopenharmony_ci                    self.assertEqual(t[s, T][int], t[s, int])
42777db96d56Sopenharmony_ci                    self.assertEqual(t[T, s][int], t[int, s])
42787db96d56Sopenharmony_ci                    a = t[s]
42797db96d56Sopenharmony_ci                    with self.assertRaises(TypeError):
42807db96d56Sopenharmony_ci                        a[int]
42817db96d56Sopenharmony_ci
42827db96d56Sopenharmony_ci            for c in Callable, collections.abc.Callable:
42837db96d56Sopenharmony_ci                with self.subTest(callable=c, sub=s):
42847db96d56Sopenharmony_ci                    self.assertEqual(c[[s], T][int], c[[s], int])
42857db96d56Sopenharmony_ci                    self.assertEqual(c[[T], s][int], c[[int], s])
42867db96d56Sopenharmony_ci                    a = c[[s], s]
42877db96d56Sopenharmony_ci                    with self.assertRaises(TypeError):
42887db96d56Sopenharmony_ci                        a[int]
42897db96d56Sopenharmony_ci
42907db96d56Sopenharmony_ci
42917db96d56Sopenharmony_ciclass ClassVarTests(BaseTestCase):
42927db96d56Sopenharmony_ci
42937db96d56Sopenharmony_ci    def test_basics(self):
42947db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
42957db96d56Sopenharmony_ci            ClassVar[int, str]
42967db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
42977db96d56Sopenharmony_ci            ClassVar[int][str]
42987db96d56Sopenharmony_ci
42997db96d56Sopenharmony_ci    def test_repr(self):
43007db96d56Sopenharmony_ci        self.assertEqual(repr(ClassVar), 'typing.ClassVar')
43017db96d56Sopenharmony_ci        cv = ClassVar[int]
43027db96d56Sopenharmony_ci        self.assertEqual(repr(cv), 'typing.ClassVar[int]')
43037db96d56Sopenharmony_ci        cv = ClassVar[Employee]
43047db96d56Sopenharmony_ci        self.assertEqual(repr(cv), 'typing.ClassVar[%s.Employee]' % __name__)
43057db96d56Sopenharmony_ci
43067db96d56Sopenharmony_ci    def test_cannot_subclass(self):
43077db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43087db96d56Sopenharmony_ci            class C(type(ClassVar)):
43097db96d56Sopenharmony_ci                pass
43107db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43117db96d56Sopenharmony_ci            class C(type(ClassVar[int])):
43127db96d56Sopenharmony_ci                pass
43137db96d56Sopenharmony_ci
43147db96d56Sopenharmony_ci    def test_cannot_init(self):
43157db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43167db96d56Sopenharmony_ci            ClassVar()
43177db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43187db96d56Sopenharmony_ci            type(ClassVar)()
43197db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43207db96d56Sopenharmony_ci            type(ClassVar[Optional[int]])()
43217db96d56Sopenharmony_ci
43227db96d56Sopenharmony_ci    def test_no_isinstance(self):
43237db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43247db96d56Sopenharmony_ci            isinstance(1, ClassVar[int])
43257db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43267db96d56Sopenharmony_ci            issubclass(int, ClassVar)
43277db96d56Sopenharmony_ci
43287db96d56Sopenharmony_ciclass FinalTests(BaseTestCase):
43297db96d56Sopenharmony_ci
43307db96d56Sopenharmony_ci    def test_basics(self):
43317db96d56Sopenharmony_ci        Final[int]  # OK
43327db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43337db96d56Sopenharmony_ci            Final[int, str]
43347db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43357db96d56Sopenharmony_ci            Final[int][str]
43367db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43377db96d56Sopenharmony_ci            Optional[Final[int]]
43387db96d56Sopenharmony_ci
43397db96d56Sopenharmony_ci    def test_repr(self):
43407db96d56Sopenharmony_ci        self.assertEqual(repr(Final), 'typing.Final')
43417db96d56Sopenharmony_ci        cv = Final[int]
43427db96d56Sopenharmony_ci        self.assertEqual(repr(cv), 'typing.Final[int]')
43437db96d56Sopenharmony_ci        cv = Final[Employee]
43447db96d56Sopenharmony_ci        self.assertEqual(repr(cv), 'typing.Final[%s.Employee]' % __name__)
43457db96d56Sopenharmony_ci        cv = Final[tuple[int]]
43467db96d56Sopenharmony_ci        self.assertEqual(repr(cv), 'typing.Final[tuple[int]]')
43477db96d56Sopenharmony_ci
43487db96d56Sopenharmony_ci    def test_cannot_subclass(self):
43497db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43507db96d56Sopenharmony_ci            class C(type(Final)):
43517db96d56Sopenharmony_ci                pass
43527db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43537db96d56Sopenharmony_ci            class C(type(Final[int])):
43547db96d56Sopenharmony_ci                pass
43557db96d56Sopenharmony_ci
43567db96d56Sopenharmony_ci    def test_cannot_init(self):
43577db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43587db96d56Sopenharmony_ci            Final()
43597db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43607db96d56Sopenharmony_ci            type(Final)()
43617db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43627db96d56Sopenharmony_ci            type(Final[Optional[int]])()
43637db96d56Sopenharmony_ci
43647db96d56Sopenharmony_ci    def test_no_isinstance(self):
43657db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43667db96d56Sopenharmony_ci            isinstance(1, Final[int])
43677db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
43687db96d56Sopenharmony_ci            issubclass(int, Final)
43697db96d56Sopenharmony_ci
43707db96d56Sopenharmony_ci
43717db96d56Sopenharmony_ciclass FinalDecoratorTests(BaseTestCase):
43727db96d56Sopenharmony_ci    def test_final_unmodified(self):
43737db96d56Sopenharmony_ci        def func(x): ...
43747db96d56Sopenharmony_ci        self.assertIs(func, final(func))
43757db96d56Sopenharmony_ci
43767db96d56Sopenharmony_ci    def test_dunder_final(self):
43777db96d56Sopenharmony_ci        @final
43787db96d56Sopenharmony_ci        def func(): ...
43797db96d56Sopenharmony_ci        @final
43807db96d56Sopenharmony_ci        class Cls: ...
43817db96d56Sopenharmony_ci        self.assertIs(True, func.__final__)
43827db96d56Sopenharmony_ci        self.assertIs(True, Cls.__final__)
43837db96d56Sopenharmony_ci
43847db96d56Sopenharmony_ci        class Wrapper:
43857db96d56Sopenharmony_ci            __slots__ = ("func",)
43867db96d56Sopenharmony_ci            def __init__(self, func):
43877db96d56Sopenharmony_ci                self.func = func
43887db96d56Sopenharmony_ci            def __call__(self, *args, **kwargs):
43897db96d56Sopenharmony_ci                return self.func(*args, **kwargs)
43907db96d56Sopenharmony_ci
43917db96d56Sopenharmony_ci        # Check that no error is thrown if the attribute
43927db96d56Sopenharmony_ci        # is not writable.
43937db96d56Sopenharmony_ci        @final
43947db96d56Sopenharmony_ci        @Wrapper
43957db96d56Sopenharmony_ci        def wrapped(): ...
43967db96d56Sopenharmony_ci        self.assertIsInstance(wrapped, Wrapper)
43977db96d56Sopenharmony_ci        self.assertIs(False, hasattr(wrapped, "__final__"))
43987db96d56Sopenharmony_ci
43997db96d56Sopenharmony_ci        class Meta(type):
44007db96d56Sopenharmony_ci            @property
44017db96d56Sopenharmony_ci            def __final__(self): return "can't set me"
44027db96d56Sopenharmony_ci        @final
44037db96d56Sopenharmony_ci        class WithMeta(metaclass=Meta): ...
44047db96d56Sopenharmony_ci        self.assertEqual(WithMeta.__final__, "can't set me")
44057db96d56Sopenharmony_ci
44067db96d56Sopenharmony_ci        # Builtin classes throw TypeError if you try to set an
44077db96d56Sopenharmony_ci        # attribute.
44087db96d56Sopenharmony_ci        final(int)
44097db96d56Sopenharmony_ci        self.assertIs(False, hasattr(int, "__final__"))
44107db96d56Sopenharmony_ci
44117db96d56Sopenharmony_ci        # Make sure it works with common builtin decorators
44127db96d56Sopenharmony_ci        class Methods:
44137db96d56Sopenharmony_ci            @final
44147db96d56Sopenharmony_ci            @classmethod
44157db96d56Sopenharmony_ci            def clsmethod(cls): ...
44167db96d56Sopenharmony_ci
44177db96d56Sopenharmony_ci            @final
44187db96d56Sopenharmony_ci            @staticmethod
44197db96d56Sopenharmony_ci            def stmethod(): ...
44207db96d56Sopenharmony_ci
44217db96d56Sopenharmony_ci            # The other order doesn't work because property objects
44227db96d56Sopenharmony_ci            # don't allow attribute assignment.
44237db96d56Sopenharmony_ci            @property
44247db96d56Sopenharmony_ci            @final
44257db96d56Sopenharmony_ci            def prop(self): ...
44267db96d56Sopenharmony_ci
44277db96d56Sopenharmony_ci            @final
44287db96d56Sopenharmony_ci            @lru_cache()
44297db96d56Sopenharmony_ci            def cached(self): ...
44307db96d56Sopenharmony_ci
44317db96d56Sopenharmony_ci        # Use getattr_static because the descriptor returns the
44327db96d56Sopenharmony_ci        # underlying function, which doesn't have __final__.
44337db96d56Sopenharmony_ci        self.assertIs(
44347db96d56Sopenharmony_ci            True,
44357db96d56Sopenharmony_ci            inspect.getattr_static(Methods, "clsmethod").__final__
44367db96d56Sopenharmony_ci        )
44377db96d56Sopenharmony_ci        self.assertIs(
44387db96d56Sopenharmony_ci            True,
44397db96d56Sopenharmony_ci            inspect.getattr_static(Methods, "stmethod").__final__
44407db96d56Sopenharmony_ci        )
44417db96d56Sopenharmony_ci        self.assertIs(True, Methods.prop.fget.__final__)
44427db96d56Sopenharmony_ci        self.assertIs(True, Methods.cached.__final__)
44437db96d56Sopenharmony_ci
44447db96d56Sopenharmony_ci
44457db96d56Sopenharmony_ciclass CastTests(BaseTestCase):
44467db96d56Sopenharmony_ci
44477db96d56Sopenharmony_ci    def test_basics(self):
44487db96d56Sopenharmony_ci        self.assertEqual(cast(int, 42), 42)
44497db96d56Sopenharmony_ci        self.assertEqual(cast(float, 42), 42)
44507db96d56Sopenharmony_ci        self.assertIs(type(cast(float, 42)), int)
44517db96d56Sopenharmony_ci        self.assertEqual(cast(Any, 42), 42)
44527db96d56Sopenharmony_ci        self.assertEqual(cast(list, 42), 42)
44537db96d56Sopenharmony_ci        self.assertEqual(cast(Union[str, float], 42), 42)
44547db96d56Sopenharmony_ci        self.assertEqual(cast(AnyStr, 42), 42)
44557db96d56Sopenharmony_ci        self.assertEqual(cast(None, 42), 42)
44567db96d56Sopenharmony_ci
44577db96d56Sopenharmony_ci    def test_errors(self):
44587db96d56Sopenharmony_ci        # Bogus calls are not expected to fail.
44597db96d56Sopenharmony_ci        cast(42, 42)
44607db96d56Sopenharmony_ci        cast('hello', 42)
44617db96d56Sopenharmony_ci
44627db96d56Sopenharmony_ci
44637db96d56Sopenharmony_ciclass AssertTypeTests(BaseTestCase):
44647db96d56Sopenharmony_ci
44657db96d56Sopenharmony_ci    def test_basics(self):
44667db96d56Sopenharmony_ci        arg = 42
44677db96d56Sopenharmony_ci        self.assertIs(assert_type(arg, int), arg)
44687db96d56Sopenharmony_ci        self.assertIs(assert_type(arg, str | float), arg)
44697db96d56Sopenharmony_ci        self.assertIs(assert_type(arg, AnyStr), arg)
44707db96d56Sopenharmony_ci        self.assertIs(assert_type(arg, None), arg)
44717db96d56Sopenharmony_ci
44727db96d56Sopenharmony_ci    def test_errors(self):
44737db96d56Sopenharmony_ci        # Bogus calls are not expected to fail.
44747db96d56Sopenharmony_ci        arg = 42
44757db96d56Sopenharmony_ci        self.assertIs(assert_type(arg, 42), arg)
44767db96d56Sopenharmony_ci        self.assertIs(assert_type(arg, 'hello'), arg)
44777db96d56Sopenharmony_ci
44787db96d56Sopenharmony_ci
44797db96d56Sopenharmony_ci# We need this to make sure that `@no_type_check` respects `__module__` attr:
44807db96d56Sopenharmony_cifrom test import ann_module8
44817db96d56Sopenharmony_ci
44827db96d56Sopenharmony_ci@no_type_check
44837db96d56Sopenharmony_ciclass NoTypeCheck_Outer:
44847db96d56Sopenharmony_ci    Inner = ann_module8.NoTypeCheck_Outer.Inner
44857db96d56Sopenharmony_ci
44867db96d56Sopenharmony_ci@no_type_check
44877db96d56Sopenharmony_ciclass NoTypeCheck_WithFunction:
44887db96d56Sopenharmony_ci    NoTypeCheck_function = ann_module8.NoTypeCheck_function
44897db96d56Sopenharmony_ci
44907db96d56Sopenharmony_ci
44917db96d56Sopenharmony_ciclass ForwardRefTests(BaseTestCase):
44927db96d56Sopenharmony_ci
44937db96d56Sopenharmony_ci    def test_basics(self):
44947db96d56Sopenharmony_ci
44957db96d56Sopenharmony_ci        class Node(Generic[T]):
44967db96d56Sopenharmony_ci
44977db96d56Sopenharmony_ci            def __init__(self, label: T):
44987db96d56Sopenharmony_ci                self.label = label
44997db96d56Sopenharmony_ci                self.left = self.right = None
45007db96d56Sopenharmony_ci
45017db96d56Sopenharmony_ci            def add_both(self,
45027db96d56Sopenharmony_ci                         left: 'Optional[Node[T]]',
45037db96d56Sopenharmony_ci                         right: 'Node[T]' = None,
45047db96d56Sopenharmony_ci                         stuff: int = None,
45057db96d56Sopenharmony_ci                         blah=None):
45067db96d56Sopenharmony_ci                self.left = left
45077db96d56Sopenharmony_ci                self.right = right
45087db96d56Sopenharmony_ci
45097db96d56Sopenharmony_ci            def add_left(self, node: Optional['Node[T]']):
45107db96d56Sopenharmony_ci                self.add_both(node, None)
45117db96d56Sopenharmony_ci
45127db96d56Sopenharmony_ci            def add_right(self, node: 'Node[T]' = None):
45137db96d56Sopenharmony_ci                self.add_both(None, node)
45147db96d56Sopenharmony_ci
45157db96d56Sopenharmony_ci        t = Node[int]
45167db96d56Sopenharmony_ci        both_hints = get_type_hints(t.add_both, globals(), locals())
45177db96d56Sopenharmony_ci        self.assertEqual(both_hints['left'], Optional[Node[T]])
45187db96d56Sopenharmony_ci        self.assertEqual(both_hints['right'], Node[T])
45197db96d56Sopenharmony_ci        self.assertEqual(both_hints['stuff'], int)
45207db96d56Sopenharmony_ci        self.assertNotIn('blah', both_hints)
45217db96d56Sopenharmony_ci
45227db96d56Sopenharmony_ci        left_hints = get_type_hints(t.add_left, globals(), locals())
45237db96d56Sopenharmony_ci        self.assertEqual(left_hints['node'], Optional[Node[T]])
45247db96d56Sopenharmony_ci
45257db96d56Sopenharmony_ci        right_hints = get_type_hints(t.add_right, globals(), locals())
45267db96d56Sopenharmony_ci        self.assertEqual(right_hints['node'], Node[T])
45277db96d56Sopenharmony_ci
45287db96d56Sopenharmony_ci    def test_forwardref_instance_type_error(self):
45297db96d56Sopenharmony_ci        fr = typing.ForwardRef('int')
45307db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
45317db96d56Sopenharmony_ci            isinstance(42, fr)
45327db96d56Sopenharmony_ci
45337db96d56Sopenharmony_ci    def test_forwardref_subclass_type_error(self):
45347db96d56Sopenharmony_ci        fr = typing.ForwardRef('int')
45357db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
45367db96d56Sopenharmony_ci            issubclass(int, fr)
45377db96d56Sopenharmony_ci
45387db96d56Sopenharmony_ci    def test_forwardref_only_str_arg(self):
45397db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
45407db96d56Sopenharmony_ci            typing.ForwardRef(1)  # only `str` type is allowed
45417db96d56Sopenharmony_ci
45427db96d56Sopenharmony_ci    def test_forward_equality(self):
45437db96d56Sopenharmony_ci        fr = typing.ForwardRef('int')
45447db96d56Sopenharmony_ci        self.assertEqual(fr, typing.ForwardRef('int'))
45457db96d56Sopenharmony_ci        self.assertNotEqual(List['int'], List[int])
45467db96d56Sopenharmony_ci        self.assertNotEqual(fr, typing.ForwardRef('int', module=__name__))
45477db96d56Sopenharmony_ci        frm = typing.ForwardRef('int', module=__name__)
45487db96d56Sopenharmony_ci        self.assertEqual(frm, typing.ForwardRef('int', module=__name__))
45497db96d56Sopenharmony_ci        self.assertNotEqual(frm, typing.ForwardRef('int', module='__other_name__'))
45507db96d56Sopenharmony_ci
45517db96d56Sopenharmony_ci    def test_forward_equality_gth(self):
45527db96d56Sopenharmony_ci        c1 = typing.ForwardRef('C')
45537db96d56Sopenharmony_ci        c1_gth = typing.ForwardRef('C')
45547db96d56Sopenharmony_ci        c2 = typing.ForwardRef('C')
45557db96d56Sopenharmony_ci        c2_gth = typing.ForwardRef('C')
45567db96d56Sopenharmony_ci
45577db96d56Sopenharmony_ci        class C:
45587db96d56Sopenharmony_ci            pass
45597db96d56Sopenharmony_ci        def foo(a: c1_gth, b: c2_gth):
45607db96d56Sopenharmony_ci            pass
45617db96d56Sopenharmony_ci
45627db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(foo, globals(), locals()), {'a': C, 'b': C})
45637db96d56Sopenharmony_ci        self.assertEqual(c1, c2)
45647db96d56Sopenharmony_ci        self.assertEqual(c1, c1_gth)
45657db96d56Sopenharmony_ci        self.assertEqual(c1_gth, c2_gth)
45667db96d56Sopenharmony_ci        self.assertEqual(List[c1], List[c1_gth])
45677db96d56Sopenharmony_ci        self.assertNotEqual(List[c1], List[C])
45687db96d56Sopenharmony_ci        self.assertNotEqual(List[c1_gth], List[C])
45697db96d56Sopenharmony_ci        self.assertEqual(Union[c1, c1_gth], Union[c1])
45707db96d56Sopenharmony_ci        self.assertEqual(Union[c1, c1_gth, int], Union[c1, int])
45717db96d56Sopenharmony_ci
45727db96d56Sopenharmony_ci    def test_forward_equality_hash(self):
45737db96d56Sopenharmony_ci        c1 = typing.ForwardRef('int')
45747db96d56Sopenharmony_ci        c1_gth = typing.ForwardRef('int')
45757db96d56Sopenharmony_ci        c2 = typing.ForwardRef('int')
45767db96d56Sopenharmony_ci        c2_gth = typing.ForwardRef('int')
45777db96d56Sopenharmony_ci
45787db96d56Sopenharmony_ci        def foo(a: c1_gth, b: c2_gth):
45797db96d56Sopenharmony_ci            pass
45807db96d56Sopenharmony_ci        get_type_hints(foo, globals(), locals())
45817db96d56Sopenharmony_ci
45827db96d56Sopenharmony_ci        self.assertEqual(hash(c1), hash(c2))
45837db96d56Sopenharmony_ci        self.assertEqual(hash(c1_gth), hash(c2_gth))
45847db96d56Sopenharmony_ci        self.assertEqual(hash(c1), hash(c1_gth))
45857db96d56Sopenharmony_ci
45867db96d56Sopenharmony_ci        c3 = typing.ForwardRef('int', module=__name__)
45877db96d56Sopenharmony_ci        c4 = typing.ForwardRef('int', module='__other_name__')
45887db96d56Sopenharmony_ci
45897db96d56Sopenharmony_ci        self.assertNotEqual(hash(c3), hash(c1))
45907db96d56Sopenharmony_ci        self.assertNotEqual(hash(c3), hash(c1_gth))
45917db96d56Sopenharmony_ci        self.assertNotEqual(hash(c3), hash(c4))
45927db96d56Sopenharmony_ci        self.assertEqual(hash(c3), hash(typing.ForwardRef('int', module=__name__)))
45937db96d56Sopenharmony_ci
45947db96d56Sopenharmony_ci    def test_forward_equality_namespace(self):
45957db96d56Sopenharmony_ci        class A:
45967db96d56Sopenharmony_ci            pass
45977db96d56Sopenharmony_ci        def namespace1():
45987db96d56Sopenharmony_ci            a = typing.ForwardRef('A')
45997db96d56Sopenharmony_ci            def fun(x: a):
46007db96d56Sopenharmony_ci                pass
46017db96d56Sopenharmony_ci            get_type_hints(fun, globals(), locals())
46027db96d56Sopenharmony_ci            return a
46037db96d56Sopenharmony_ci
46047db96d56Sopenharmony_ci        def namespace2():
46057db96d56Sopenharmony_ci            a = typing.ForwardRef('A')
46067db96d56Sopenharmony_ci
46077db96d56Sopenharmony_ci            class A:
46087db96d56Sopenharmony_ci                pass
46097db96d56Sopenharmony_ci            def fun(x: a):
46107db96d56Sopenharmony_ci                pass
46117db96d56Sopenharmony_ci
46127db96d56Sopenharmony_ci            get_type_hints(fun, globals(), locals())
46137db96d56Sopenharmony_ci            return a
46147db96d56Sopenharmony_ci
46157db96d56Sopenharmony_ci        self.assertEqual(namespace1(), namespace1())
46167db96d56Sopenharmony_ci        self.assertNotEqual(namespace1(), namespace2())
46177db96d56Sopenharmony_ci
46187db96d56Sopenharmony_ci    def test_forward_repr(self):
46197db96d56Sopenharmony_ci        self.assertEqual(repr(List['int']), "typing.List[ForwardRef('int')]")
46207db96d56Sopenharmony_ci        self.assertEqual(repr(List[ForwardRef('int', module='mod')]),
46217db96d56Sopenharmony_ci                         "typing.List[ForwardRef('int', module='mod')]")
46227db96d56Sopenharmony_ci
46237db96d56Sopenharmony_ci    def test_union_forward(self):
46247db96d56Sopenharmony_ci
46257db96d56Sopenharmony_ci        def foo(a: Union['T']):
46267db96d56Sopenharmony_ci            pass
46277db96d56Sopenharmony_ci
46287db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(foo, globals(), locals()),
46297db96d56Sopenharmony_ci                         {'a': Union[T]})
46307db96d56Sopenharmony_ci
46317db96d56Sopenharmony_ci        def foo(a: tuple[ForwardRef('T')] | int):
46327db96d56Sopenharmony_ci            pass
46337db96d56Sopenharmony_ci
46347db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(foo, globals(), locals()),
46357db96d56Sopenharmony_ci                         {'a': tuple[T] | int})
46367db96d56Sopenharmony_ci
46377db96d56Sopenharmony_ci    def test_tuple_forward(self):
46387db96d56Sopenharmony_ci
46397db96d56Sopenharmony_ci        def foo(a: Tuple['T']):
46407db96d56Sopenharmony_ci            pass
46417db96d56Sopenharmony_ci
46427db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(foo, globals(), locals()),
46437db96d56Sopenharmony_ci                         {'a': Tuple[T]})
46447db96d56Sopenharmony_ci
46457db96d56Sopenharmony_ci        def foo(a: tuple[ForwardRef('T')]):
46467db96d56Sopenharmony_ci            pass
46477db96d56Sopenharmony_ci
46487db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(foo, globals(), locals()),
46497db96d56Sopenharmony_ci                         {'a': tuple[T]})
46507db96d56Sopenharmony_ci
46517db96d56Sopenharmony_ci    def test_double_forward(self):
46527db96d56Sopenharmony_ci        def foo(a: 'List[\'int\']'):
46537db96d56Sopenharmony_ci            pass
46547db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(foo, globals(), locals()),
46557db96d56Sopenharmony_ci                         {'a': List[int]})
46567db96d56Sopenharmony_ci
46577db96d56Sopenharmony_ci    def test_forward_recursion_actually(self):
46587db96d56Sopenharmony_ci        def namespace1():
46597db96d56Sopenharmony_ci            a = typing.ForwardRef('A')
46607db96d56Sopenharmony_ci            A = a
46617db96d56Sopenharmony_ci            def fun(x: a): pass
46627db96d56Sopenharmony_ci
46637db96d56Sopenharmony_ci            ret = get_type_hints(fun, globals(), locals())
46647db96d56Sopenharmony_ci            return a
46657db96d56Sopenharmony_ci
46667db96d56Sopenharmony_ci        def namespace2():
46677db96d56Sopenharmony_ci            a = typing.ForwardRef('A')
46687db96d56Sopenharmony_ci            A = a
46697db96d56Sopenharmony_ci            def fun(x: a): pass
46707db96d56Sopenharmony_ci
46717db96d56Sopenharmony_ci            ret = get_type_hints(fun, globals(), locals())
46727db96d56Sopenharmony_ci            return a
46737db96d56Sopenharmony_ci
46747db96d56Sopenharmony_ci        def cmp(o1, o2):
46757db96d56Sopenharmony_ci            return o1 == o2
46767db96d56Sopenharmony_ci
46777db96d56Sopenharmony_ci        r1 = namespace1()
46787db96d56Sopenharmony_ci        r2 = namespace2()
46797db96d56Sopenharmony_ci        self.assertIsNot(r1, r2)
46807db96d56Sopenharmony_ci        self.assertRaises(RecursionError, cmp, r1, r2)
46817db96d56Sopenharmony_ci
46827db96d56Sopenharmony_ci    def test_union_forward_recursion(self):
46837db96d56Sopenharmony_ci        ValueList = List['Value']
46847db96d56Sopenharmony_ci        Value = Union[str, ValueList]
46857db96d56Sopenharmony_ci
46867db96d56Sopenharmony_ci        class C:
46877db96d56Sopenharmony_ci            foo: List[Value]
46887db96d56Sopenharmony_ci        class D:
46897db96d56Sopenharmony_ci            foo: Union[Value, ValueList]
46907db96d56Sopenharmony_ci        class E:
46917db96d56Sopenharmony_ci            foo: Union[List[Value], ValueList]
46927db96d56Sopenharmony_ci        class F:
46937db96d56Sopenharmony_ci            foo: Union[Value, List[Value], ValueList]
46947db96d56Sopenharmony_ci
46957db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(C, globals(), locals()), get_type_hints(C, globals(), locals()))
46967db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(C, globals(), locals()),
46977db96d56Sopenharmony_ci                         {'foo': List[Union[str, List[Union[str, List['Value']]]]]})
46987db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(D, globals(), locals()),
46997db96d56Sopenharmony_ci                         {'foo': Union[str, List[Union[str, List['Value']]]]})
47007db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(E, globals(), locals()),
47017db96d56Sopenharmony_ci                         {'foo': Union[
47027db96d56Sopenharmony_ci                             List[Union[str, List[Union[str, List['Value']]]]],
47037db96d56Sopenharmony_ci                             List[Union[str, List['Value']]]
47047db96d56Sopenharmony_ci                         ]
47057db96d56Sopenharmony_ci                          })
47067db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(F, globals(), locals()),
47077db96d56Sopenharmony_ci                         {'foo': Union[
47087db96d56Sopenharmony_ci                             str,
47097db96d56Sopenharmony_ci                             List[Union[str, List['Value']]],
47107db96d56Sopenharmony_ci                             List[Union[str, List[Union[str, List['Value']]]]]
47117db96d56Sopenharmony_ci                         ]
47127db96d56Sopenharmony_ci                          })
47137db96d56Sopenharmony_ci
47147db96d56Sopenharmony_ci    def test_callable_forward(self):
47157db96d56Sopenharmony_ci
47167db96d56Sopenharmony_ci        def foo(a: Callable[['T'], 'T']):
47177db96d56Sopenharmony_ci            pass
47187db96d56Sopenharmony_ci
47197db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(foo, globals(), locals()),
47207db96d56Sopenharmony_ci                         {'a': Callable[[T], T]})
47217db96d56Sopenharmony_ci
47227db96d56Sopenharmony_ci    def test_callable_with_ellipsis_forward(self):
47237db96d56Sopenharmony_ci
47247db96d56Sopenharmony_ci        def foo(a: 'Callable[..., T]'):
47257db96d56Sopenharmony_ci            pass
47267db96d56Sopenharmony_ci
47277db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(foo, globals(), locals()),
47287db96d56Sopenharmony_ci                         {'a': Callable[..., T]})
47297db96d56Sopenharmony_ci
47307db96d56Sopenharmony_ci    def test_special_forms_forward(self):
47317db96d56Sopenharmony_ci
47327db96d56Sopenharmony_ci        class C:
47337db96d56Sopenharmony_ci            a: Annotated['ClassVar[int]', (3, 5)] = 4
47347db96d56Sopenharmony_ci            b: Annotated['Final[int]', "const"] = 4
47357db96d56Sopenharmony_ci            x: 'ClassVar' = 4
47367db96d56Sopenharmony_ci            y: 'Final' = 4
47377db96d56Sopenharmony_ci
47387db96d56Sopenharmony_ci        class CF:
47397db96d56Sopenharmony_ci            b: List['Final[int]'] = 4
47407db96d56Sopenharmony_ci
47417db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(C, globals())['a'], ClassVar[int])
47427db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(C, globals())['b'], Final[int])
47437db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(C, globals())['x'], ClassVar)
47447db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(C, globals())['y'], Final)
47457db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
47467db96d56Sopenharmony_ci            get_type_hints(CF, globals()),
47477db96d56Sopenharmony_ci
47487db96d56Sopenharmony_ci    def test_syntax_error(self):
47497db96d56Sopenharmony_ci
47507db96d56Sopenharmony_ci        with self.assertRaises(SyntaxError):
47517db96d56Sopenharmony_ci            Generic['/T']
47527db96d56Sopenharmony_ci
47537db96d56Sopenharmony_ci    def test_delayed_syntax_error(self):
47547db96d56Sopenharmony_ci
47557db96d56Sopenharmony_ci        def foo(a: 'Node[T'):
47567db96d56Sopenharmony_ci            pass
47577db96d56Sopenharmony_ci
47587db96d56Sopenharmony_ci        with self.assertRaises(SyntaxError):
47597db96d56Sopenharmony_ci            get_type_hints(foo)
47607db96d56Sopenharmony_ci
47617db96d56Sopenharmony_ci    def test_name_error(self):
47627db96d56Sopenharmony_ci
47637db96d56Sopenharmony_ci        def foo(a: 'Noode[T]'):
47647db96d56Sopenharmony_ci            pass
47657db96d56Sopenharmony_ci
47667db96d56Sopenharmony_ci        with self.assertRaises(NameError):
47677db96d56Sopenharmony_ci            get_type_hints(foo, locals())
47687db96d56Sopenharmony_ci
47697db96d56Sopenharmony_ci    def test_no_type_check(self):
47707db96d56Sopenharmony_ci
47717db96d56Sopenharmony_ci        @no_type_check
47727db96d56Sopenharmony_ci        def foo(a: 'whatevers') -> {}:
47737db96d56Sopenharmony_ci            pass
47747db96d56Sopenharmony_ci
47757db96d56Sopenharmony_ci        th = get_type_hints(foo)
47767db96d56Sopenharmony_ci        self.assertEqual(th, {})
47777db96d56Sopenharmony_ci
47787db96d56Sopenharmony_ci    def test_no_type_check_class(self):
47797db96d56Sopenharmony_ci
47807db96d56Sopenharmony_ci        @no_type_check
47817db96d56Sopenharmony_ci        class C:
47827db96d56Sopenharmony_ci            def foo(a: 'whatevers') -> {}:
47837db96d56Sopenharmony_ci                pass
47847db96d56Sopenharmony_ci
47857db96d56Sopenharmony_ci        cth = get_type_hints(C.foo)
47867db96d56Sopenharmony_ci        self.assertEqual(cth, {})
47877db96d56Sopenharmony_ci        ith = get_type_hints(C().foo)
47887db96d56Sopenharmony_ci        self.assertEqual(ith, {})
47897db96d56Sopenharmony_ci
47907db96d56Sopenharmony_ci    def test_no_type_check_no_bases(self):
47917db96d56Sopenharmony_ci        class C:
47927db96d56Sopenharmony_ci            def meth(self, x: int): ...
47937db96d56Sopenharmony_ci        @no_type_check
47947db96d56Sopenharmony_ci        class D(C):
47957db96d56Sopenharmony_ci            c = C
47967db96d56Sopenharmony_ci
47977db96d56Sopenharmony_ci        # verify that @no_type_check never affects bases
47987db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(C.meth), {'x': int})
47997db96d56Sopenharmony_ci
48007db96d56Sopenharmony_ci        # and never child classes:
48017db96d56Sopenharmony_ci        class Child(D):
48027db96d56Sopenharmony_ci            def foo(self, x: int): ...
48037db96d56Sopenharmony_ci
48047db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(Child.foo), {'x': int})
48057db96d56Sopenharmony_ci
48067db96d56Sopenharmony_ci    def test_no_type_check_nested_types(self):
48077db96d56Sopenharmony_ci        # See https://bugs.python.org/issue46571
48087db96d56Sopenharmony_ci        class Other:
48097db96d56Sopenharmony_ci            o: int
48107db96d56Sopenharmony_ci        class B:  # Has the same `__name__`` as `A.B` and different `__qualname__`
48117db96d56Sopenharmony_ci            o: int
48127db96d56Sopenharmony_ci        @no_type_check
48137db96d56Sopenharmony_ci        class A:
48147db96d56Sopenharmony_ci            a: int
48157db96d56Sopenharmony_ci            class B:
48167db96d56Sopenharmony_ci                b: int
48177db96d56Sopenharmony_ci                class C:
48187db96d56Sopenharmony_ci                    c: int
48197db96d56Sopenharmony_ci            class D:
48207db96d56Sopenharmony_ci                d: int
48217db96d56Sopenharmony_ci
48227db96d56Sopenharmony_ci            Other = Other
48237db96d56Sopenharmony_ci
48247db96d56Sopenharmony_ci        for klass in [A, A.B, A.B.C, A.D]:
48257db96d56Sopenharmony_ci            with self.subTest(klass=klass):
48267db96d56Sopenharmony_ci                self.assertTrue(klass.__no_type_check__)
48277db96d56Sopenharmony_ci                self.assertEqual(get_type_hints(klass), {})
48287db96d56Sopenharmony_ci
48297db96d56Sopenharmony_ci        for not_modified in [Other, B]:
48307db96d56Sopenharmony_ci            with self.subTest(not_modified=not_modified):
48317db96d56Sopenharmony_ci                with self.assertRaises(AttributeError):
48327db96d56Sopenharmony_ci                    not_modified.__no_type_check__
48337db96d56Sopenharmony_ci                self.assertNotEqual(get_type_hints(not_modified), {})
48347db96d56Sopenharmony_ci
48357db96d56Sopenharmony_ci    def test_no_type_check_class_and_static_methods(self):
48367db96d56Sopenharmony_ci        @no_type_check
48377db96d56Sopenharmony_ci        class Some:
48387db96d56Sopenharmony_ci            @staticmethod
48397db96d56Sopenharmony_ci            def st(x: int) -> int: ...
48407db96d56Sopenharmony_ci            @classmethod
48417db96d56Sopenharmony_ci            def cl(cls, y: int) -> int: ...
48427db96d56Sopenharmony_ci
48437db96d56Sopenharmony_ci        self.assertTrue(Some.st.__no_type_check__)
48447db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(Some.st), {})
48457db96d56Sopenharmony_ci        self.assertTrue(Some.cl.__no_type_check__)
48467db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(Some.cl), {})
48477db96d56Sopenharmony_ci
48487db96d56Sopenharmony_ci    def test_no_type_check_other_module(self):
48497db96d56Sopenharmony_ci        self.assertTrue(NoTypeCheck_Outer.__no_type_check__)
48507db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
48517db96d56Sopenharmony_ci            ann_module8.NoTypeCheck_Outer.__no_type_check__
48527db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
48537db96d56Sopenharmony_ci            ann_module8.NoTypeCheck_Outer.Inner.__no_type_check__
48547db96d56Sopenharmony_ci
48557db96d56Sopenharmony_ci        self.assertTrue(NoTypeCheck_WithFunction.__no_type_check__)
48567db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
48577db96d56Sopenharmony_ci            ann_module8.NoTypeCheck_function.__no_type_check__
48587db96d56Sopenharmony_ci
48597db96d56Sopenharmony_ci    def test_no_type_check_foreign_functions(self):
48607db96d56Sopenharmony_ci        # We should not modify this function:
48617db96d56Sopenharmony_ci        def some(*args: int) -> int:
48627db96d56Sopenharmony_ci            ...
48637db96d56Sopenharmony_ci
48647db96d56Sopenharmony_ci        @no_type_check
48657db96d56Sopenharmony_ci        class A:
48667db96d56Sopenharmony_ci            some_alias = some
48677db96d56Sopenharmony_ci            some_class = classmethod(some)
48687db96d56Sopenharmony_ci            some_static = staticmethod(some)
48697db96d56Sopenharmony_ci
48707db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
48717db96d56Sopenharmony_ci            some.__no_type_check__
48727db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(some), {'args': int, 'return': int})
48737db96d56Sopenharmony_ci
48747db96d56Sopenharmony_ci    def test_no_type_check_lambda(self):
48757db96d56Sopenharmony_ci        @no_type_check
48767db96d56Sopenharmony_ci        class A:
48777db96d56Sopenharmony_ci            # Corner case: `lambda` is both an assignment and a function:
48787db96d56Sopenharmony_ci            bar: Callable[[int], int] = lambda arg: arg
48797db96d56Sopenharmony_ci
48807db96d56Sopenharmony_ci        self.assertTrue(A.bar.__no_type_check__)
48817db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(A.bar), {})
48827db96d56Sopenharmony_ci
48837db96d56Sopenharmony_ci    def test_no_type_check_TypeError(self):
48847db96d56Sopenharmony_ci        # This simply should not fail with
48857db96d56Sopenharmony_ci        # `TypeError: can't set attributes of built-in/extension type 'dict'`
48867db96d56Sopenharmony_ci        no_type_check(dict)
48877db96d56Sopenharmony_ci
48887db96d56Sopenharmony_ci    def test_no_type_check_forward_ref_as_string(self):
48897db96d56Sopenharmony_ci        class C:
48907db96d56Sopenharmony_ci            foo: typing.ClassVar[int] = 7
48917db96d56Sopenharmony_ci        class D:
48927db96d56Sopenharmony_ci            foo: ClassVar[int] = 7
48937db96d56Sopenharmony_ci        class E:
48947db96d56Sopenharmony_ci            foo: 'typing.ClassVar[int]' = 7
48957db96d56Sopenharmony_ci        class F:
48967db96d56Sopenharmony_ci            foo: 'ClassVar[int]' = 7
48977db96d56Sopenharmony_ci
48987db96d56Sopenharmony_ci        expected_result = {'foo': typing.ClassVar[int]}
48997db96d56Sopenharmony_ci        for clazz in [C, D, E, F]:
49007db96d56Sopenharmony_ci            self.assertEqual(get_type_hints(clazz), expected_result)
49017db96d56Sopenharmony_ci
49027db96d56Sopenharmony_ci    def test_nested_classvar_fails_forward_ref_check(self):
49037db96d56Sopenharmony_ci        class E:
49047db96d56Sopenharmony_ci            foo: 'typing.ClassVar[typing.ClassVar[int]]' = 7
49057db96d56Sopenharmony_ci        class F:
49067db96d56Sopenharmony_ci            foo: ClassVar['ClassVar[int]'] = 7
49077db96d56Sopenharmony_ci
49087db96d56Sopenharmony_ci        for clazz in [E, F]:
49097db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
49107db96d56Sopenharmony_ci                get_type_hints(clazz)
49117db96d56Sopenharmony_ci
49127db96d56Sopenharmony_ci    def test_meta_no_type_check(self):
49137db96d56Sopenharmony_ci
49147db96d56Sopenharmony_ci        @no_type_check_decorator
49157db96d56Sopenharmony_ci        def magic_decorator(func):
49167db96d56Sopenharmony_ci            return func
49177db96d56Sopenharmony_ci
49187db96d56Sopenharmony_ci        self.assertEqual(magic_decorator.__name__, 'magic_decorator')
49197db96d56Sopenharmony_ci
49207db96d56Sopenharmony_ci        @magic_decorator
49217db96d56Sopenharmony_ci        def foo(a: 'whatevers') -> {}:
49227db96d56Sopenharmony_ci            pass
49237db96d56Sopenharmony_ci
49247db96d56Sopenharmony_ci        @magic_decorator
49257db96d56Sopenharmony_ci        class C:
49267db96d56Sopenharmony_ci            def foo(a: 'whatevers') -> {}:
49277db96d56Sopenharmony_ci                pass
49287db96d56Sopenharmony_ci
49297db96d56Sopenharmony_ci        self.assertEqual(foo.__name__, 'foo')
49307db96d56Sopenharmony_ci        th = get_type_hints(foo)
49317db96d56Sopenharmony_ci        self.assertEqual(th, {})
49327db96d56Sopenharmony_ci        cth = get_type_hints(C.foo)
49337db96d56Sopenharmony_ci        self.assertEqual(cth, {})
49347db96d56Sopenharmony_ci        ith = get_type_hints(C().foo)
49357db96d56Sopenharmony_ci        self.assertEqual(ith, {})
49367db96d56Sopenharmony_ci
49377db96d56Sopenharmony_ci    def test_default_globals(self):
49387db96d56Sopenharmony_ci        code = ("class C:\n"
49397db96d56Sopenharmony_ci                "    def foo(self, a: 'C') -> 'D': pass\n"
49407db96d56Sopenharmony_ci                "class D:\n"
49417db96d56Sopenharmony_ci                "    def bar(self, b: 'D') -> C: pass\n"
49427db96d56Sopenharmony_ci                )
49437db96d56Sopenharmony_ci        ns = {}
49447db96d56Sopenharmony_ci        exec(code, ns)
49457db96d56Sopenharmony_ci        hints = get_type_hints(ns['C'].foo)
49467db96d56Sopenharmony_ci        self.assertEqual(hints, {'a': ns['C'], 'return': ns['D']})
49477db96d56Sopenharmony_ci
49487db96d56Sopenharmony_ci    def test_final_forward_ref(self):
49497db96d56Sopenharmony_ci        self.assertEqual(gth(Loop, globals())['attr'], Final[Loop])
49507db96d56Sopenharmony_ci        self.assertNotEqual(gth(Loop, globals())['attr'], Final[int])
49517db96d56Sopenharmony_ci        self.assertNotEqual(gth(Loop, globals())['attr'], Final)
49527db96d56Sopenharmony_ci
49537db96d56Sopenharmony_ci    def test_or(self):
49547db96d56Sopenharmony_ci        X = ForwardRef('X')
49557db96d56Sopenharmony_ci        # __or__/__ror__ itself
49567db96d56Sopenharmony_ci        self.assertEqual(X | "x", Union[X, "x"])
49577db96d56Sopenharmony_ci        self.assertEqual("x" | X, Union["x", X])
49587db96d56Sopenharmony_ci
49597db96d56Sopenharmony_ci
49607db96d56Sopenharmony_ci@lru_cache()
49617db96d56Sopenharmony_cidef cached_func(x, y):
49627db96d56Sopenharmony_ci    return 3 * x + y
49637db96d56Sopenharmony_ci
49647db96d56Sopenharmony_ci
49657db96d56Sopenharmony_ciclass MethodHolder:
49667db96d56Sopenharmony_ci    @classmethod
49677db96d56Sopenharmony_ci    def clsmethod(cls): ...
49687db96d56Sopenharmony_ci    @staticmethod
49697db96d56Sopenharmony_ci    def stmethod(): ...
49707db96d56Sopenharmony_ci    def method(self): ...
49717db96d56Sopenharmony_ci
49727db96d56Sopenharmony_ci
49737db96d56Sopenharmony_ciclass OverloadTests(BaseTestCase):
49747db96d56Sopenharmony_ci
49757db96d56Sopenharmony_ci    def test_overload_fails(self):
49767db96d56Sopenharmony_ci        with self.assertRaises(NotImplementedError):
49777db96d56Sopenharmony_ci
49787db96d56Sopenharmony_ci            @overload
49797db96d56Sopenharmony_ci            def blah():
49807db96d56Sopenharmony_ci                pass
49817db96d56Sopenharmony_ci
49827db96d56Sopenharmony_ci            blah()
49837db96d56Sopenharmony_ci
49847db96d56Sopenharmony_ci    def test_overload_succeeds(self):
49857db96d56Sopenharmony_ci        @overload
49867db96d56Sopenharmony_ci        def blah():
49877db96d56Sopenharmony_ci            pass
49887db96d56Sopenharmony_ci
49897db96d56Sopenharmony_ci        def blah():
49907db96d56Sopenharmony_ci            pass
49917db96d56Sopenharmony_ci
49927db96d56Sopenharmony_ci        blah()
49937db96d56Sopenharmony_ci
49947db96d56Sopenharmony_ci    @cpython_only  # gh-98713
49957db96d56Sopenharmony_ci    def test_overload_on_compiled_functions(self):
49967db96d56Sopenharmony_ci        with patch("typing._overload_registry",
49977db96d56Sopenharmony_ci                   defaultdict(lambda: defaultdict(dict))):
49987db96d56Sopenharmony_ci            # The registry starts out empty:
49997db96d56Sopenharmony_ci            self.assertEqual(typing._overload_registry, {})
50007db96d56Sopenharmony_ci
50017db96d56Sopenharmony_ci            # This should just not fail:
50027db96d56Sopenharmony_ci            overload(sum)
50037db96d56Sopenharmony_ci            overload(print)
50047db96d56Sopenharmony_ci
50057db96d56Sopenharmony_ci            # No overloads are recorded (but, it still has a side-effect):
50067db96d56Sopenharmony_ci            self.assertEqual(typing.get_overloads(sum), [])
50077db96d56Sopenharmony_ci            self.assertEqual(typing.get_overloads(print), [])
50087db96d56Sopenharmony_ci
50097db96d56Sopenharmony_ci    def set_up_overloads(self):
50107db96d56Sopenharmony_ci        def blah():
50117db96d56Sopenharmony_ci            pass
50127db96d56Sopenharmony_ci
50137db96d56Sopenharmony_ci        overload1 = blah
50147db96d56Sopenharmony_ci        overload(blah)
50157db96d56Sopenharmony_ci
50167db96d56Sopenharmony_ci        def blah():
50177db96d56Sopenharmony_ci            pass
50187db96d56Sopenharmony_ci
50197db96d56Sopenharmony_ci        overload2 = blah
50207db96d56Sopenharmony_ci        overload(blah)
50217db96d56Sopenharmony_ci
50227db96d56Sopenharmony_ci        def blah():
50237db96d56Sopenharmony_ci            pass
50247db96d56Sopenharmony_ci
50257db96d56Sopenharmony_ci        return blah, [overload1, overload2]
50267db96d56Sopenharmony_ci
50277db96d56Sopenharmony_ci    # Make sure we don't clear the global overload registry
50287db96d56Sopenharmony_ci    @patch("typing._overload_registry",
50297db96d56Sopenharmony_ci        defaultdict(lambda: defaultdict(dict)))
50307db96d56Sopenharmony_ci    def test_overload_registry(self):
50317db96d56Sopenharmony_ci        # The registry starts out empty
50327db96d56Sopenharmony_ci        self.assertEqual(typing._overload_registry, {})
50337db96d56Sopenharmony_ci
50347db96d56Sopenharmony_ci        impl, overloads = self.set_up_overloads()
50357db96d56Sopenharmony_ci        self.assertNotEqual(typing._overload_registry, {})
50367db96d56Sopenharmony_ci        self.assertEqual(list(get_overloads(impl)), overloads)
50377db96d56Sopenharmony_ci
50387db96d56Sopenharmony_ci        def some_other_func(): pass
50397db96d56Sopenharmony_ci        overload(some_other_func)
50407db96d56Sopenharmony_ci        other_overload = some_other_func
50417db96d56Sopenharmony_ci        def some_other_func(): pass
50427db96d56Sopenharmony_ci        self.assertEqual(list(get_overloads(some_other_func)), [other_overload])
50437db96d56Sopenharmony_ci        # Unrelated function still has no overloads:
50447db96d56Sopenharmony_ci        def not_overloaded(): pass
50457db96d56Sopenharmony_ci        self.assertEqual(list(get_overloads(not_overloaded)), [])
50467db96d56Sopenharmony_ci
50477db96d56Sopenharmony_ci        # Make sure that after we clear all overloads, the registry is
50487db96d56Sopenharmony_ci        # completely empty.
50497db96d56Sopenharmony_ci        clear_overloads()
50507db96d56Sopenharmony_ci        self.assertEqual(typing._overload_registry, {})
50517db96d56Sopenharmony_ci        self.assertEqual(get_overloads(impl), [])
50527db96d56Sopenharmony_ci
50537db96d56Sopenharmony_ci        # Querying a function with no overloads shouldn't change the registry.
50547db96d56Sopenharmony_ci        def the_only_one(): pass
50557db96d56Sopenharmony_ci        self.assertEqual(get_overloads(the_only_one), [])
50567db96d56Sopenharmony_ci        self.assertEqual(typing._overload_registry, {})
50577db96d56Sopenharmony_ci
50587db96d56Sopenharmony_ci    def test_overload_registry_repeated(self):
50597db96d56Sopenharmony_ci        for _ in range(2):
50607db96d56Sopenharmony_ci            impl, overloads = self.set_up_overloads()
50617db96d56Sopenharmony_ci
50627db96d56Sopenharmony_ci            self.assertEqual(list(get_overloads(impl)), overloads)
50637db96d56Sopenharmony_ci
50647db96d56Sopenharmony_ci
50657db96d56Sopenharmony_ci# Definitions needed for features introduced in Python 3.6
50667db96d56Sopenharmony_ci
50677db96d56Sopenharmony_cifrom test import ann_module, ann_module2, ann_module3, ann_module5, ann_module6
50687db96d56Sopenharmony_ci
50697db96d56Sopenharmony_ciT_a = TypeVar('T_a')
50707db96d56Sopenharmony_ci
50717db96d56Sopenharmony_ciclass AwaitableWrapper(typing.Awaitable[T_a]):
50727db96d56Sopenharmony_ci
50737db96d56Sopenharmony_ci    def __init__(self, value):
50747db96d56Sopenharmony_ci        self.value = value
50757db96d56Sopenharmony_ci
50767db96d56Sopenharmony_ci    def __await__(self) -> typing.Iterator[T_a]:
50777db96d56Sopenharmony_ci        yield
50787db96d56Sopenharmony_ci        return self.value
50797db96d56Sopenharmony_ci
50807db96d56Sopenharmony_ciclass AsyncIteratorWrapper(typing.AsyncIterator[T_a]):
50817db96d56Sopenharmony_ci
50827db96d56Sopenharmony_ci    def __init__(self, value: typing.Iterable[T_a]):
50837db96d56Sopenharmony_ci        self.value = value
50847db96d56Sopenharmony_ci
50857db96d56Sopenharmony_ci    def __aiter__(self) -> typing.AsyncIterator[T_a]:
50867db96d56Sopenharmony_ci        return self
50877db96d56Sopenharmony_ci
50887db96d56Sopenharmony_ci    async def __anext__(self) -> T_a:
50897db96d56Sopenharmony_ci        data = await self.value
50907db96d56Sopenharmony_ci        if data:
50917db96d56Sopenharmony_ci            return data
50927db96d56Sopenharmony_ci        else:
50937db96d56Sopenharmony_ci            raise StopAsyncIteration
50947db96d56Sopenharmony_ci
50957db96d56Sopenharmony_ciclass ACM:
50967db96d56Sopenharmony_ci    async def __aenter__(self) -> int:
50977db96d56Sopenharmony_ci        return 42
50987db96d56Sopenharmony_ci    async def __aexit__(self, etype, eval, tb):
50997db96d56Sopenharmony_ci        return None
51007db96d56Sopenharmony_ci
51017db96d56Sopenharmony_ciclass A:
51027db96d56Sopenharmony_ci    y: float
51037db96d56Sopenharmony_ciclass B(A):
51047db96d56Sopenharmony_ci    x: ClassVar[Optional['B']] = None
51057db96d56Sopenharmony_ci    y: int
51067db96d56Sopenharmony_ci    b: int
51077db96d56Sopenharmony_ciclass CSub(B):
51087db96d56Sopenharmony_ci    z: ClassVar['CSub'] = B()
51097db96d56Sopenharmony_ciclass G(Generic[T]):
51107db96d56Sopenharmony_ci    lst: ClassVar[List[T]] = []
51117db96d56Sopenharmony_ci
51127db96d56Sopenharmony_ciclass Loop:
51137db96d56Sopenharmony_ci    attr: Final['Loop']
51147db96d56Sopenharmony_ci
51157db96d56Sopenharmony_ciclass NoneAndForward:
51167db96d56Sopenharmony_ci    parent: 'NoneAndForward'
51177db96d56Sopenharmony_ci    meaning: None
51187db96d56Sopenharmony_ci
51197db96d56Sopenharmony_ciclass CoolEmployee(NamedTuple):
51207db96d56Sopenharmony_ci    name: str
51217db96d56Sopenharmony_ci    cool: int
51227db96d56Sopenharmony_ci
51237db96d56Sopenharmony_ciclass CoolEmployeeWithDefault(NamedTuple):
51247db96d56Sopenharmony_ci    name: str
51257db96d56Sopenharmony_ci    cool: int = 0
51267db96d56Sopenharmony_ci
51277db96d56Sopenharmony_ciclass XMeth(NamedTuple):
51287db96d56Sopenharmony_ci    x: int
51297db96d56Sopenharmony_ci    def double(self):
51307db96d56Sopenharmony_ci        return 2 * self.x
51317db96d56Sopenharmony_ci
51327db96d56Sopenharmony_ciclass XRepr(NamedTuple):
51337db96d56Sopenharmony_ci    x: int
51347db96d56Sopenharmony_ci    y: int = 1
51357db96d56Sopenharmony_ci    def __str__(self):
51367db96d56Sopenharmony_ci        return f'{self.x} -> {self.y}'
51377db96d56Sopenharmony_ci    def __add__(self, other):
51387db96d56Sopenharmony_ci        return 0
51397db96d56Sopenharmony_ci
51407db96d56Sopenharmony_ciLabel = TypedDict('Label', [('label', str)])
51417db96d56Sopenharmony_ci
51427db96d56Sopenharmony_ciclass Point2D(TypedDict):
51437db96d56Sopenharmony_ci    x: int
51447db96d56Sopenharmony_ci    y: int
51457db96d56Sopenharmony_ci
51467db96d56Sopenharmony_ciclass Point2DGeneric(Generic[T], TypedDict):
51477db96d56Sopenharmony_ci    a: T
51487db96d56Sopenharmony_ci    b: T
51497db96d56Sopenharmony_ci
51507db96d56Sopenharmony_ciclass Bar(_typed_dict_helper.Foo, total=False):
51517db96d56Sopenharmony_ci    b: int
51527db96d56Sopenharmony_ci
51537db96d56Sopenharmony_ciclass BarGeneric(_typed_dict_helper.FooGeneric[T], total=False):
51547db96d56Sopenharmony_ci    b: int
51557db96d56Sopenharmony_ci
51567db96d56Sopenharmony_ciclass LabelPoint2D(Point2D, Label): ...
51577db96d56Sopenharmony_ci
51587db96d56Sopenharmony_ciclass Options(TypedDict, total=False):
51597db96d56Sopenharmony_ci    log_level: int
51607db96d56Sopenharmony_ci    log_path: str
51617db96d56Sopenharmony_ci
51627db96d56Sopenharmony_ciclass TotalMovie(TypedDict):
51637db96d56Sopenharmony_ci    title: str
51647db96d56Sopenharmony_ci    year: NotRequired[int]
51657db96d56Sopenharmony_ci
51667db96d56Sopenharmony_ciclass NontotalMovie(TypedDict, total=False):
51677db96d56Sopenharmony_ci    title: Required[str]
51687db96d56Sopenharmony_ci    year: int
51697db96d56Sopenharmony_ci
51707db96d56Sopenharmony_ciclass ParentNontotalMovie(TypedDict, total=False):
51717db96d56Sopenharmony_ci    title: Required[str]
51727db96d56Sopenharmony_ci
51737db96d56Sopenharmony_ciclass ChildTotalMovie(ParentNontotalMovie):
51747db96d56Sopenharmony_ci    year: NotRequired[int]
51757db96d56Sopenharmony_ci
51767db96d56Sopenharmony_ciclass ParentDeeplyAnnotatedMovie(TypedDict):
51777db96d56Sopenharmony_ci    title: Annotated[Annotated[Required[str], "foobar"], "another level"]
51787db96d56Sopenharmony_ci
51797db96d56Sopenharmony_ciclass ChildDeeplyAnnotatedMovie(ParentDeeplyAnnotatedMovie):
51807db96d56Sopenharmony_ci    year: NotRequired[Annotated[int, 2000]]
51817db96d56Sopenharmony_ci
51827db96d56Sopenharmony_ciclass AnnotatedMovie(TypedDict):
51837db96d56Sopenharmony_ci    title: Annotated[Required[str], "foobar"]
51847db96d56Sopenharmony_ci    year: NotRequired[Annotated[int, 2000]]
51857db96d56Sopenharmony_ci
51867db96d56Sopenharmony_ciclass DeeplyAnnotatedMovie(TypedDict):
51877db96d56Sopenharmony_ci    title: Annotated[Annotated[Required[str], "foobar"], "another level"]
51887db96d56Sopenharmony_ci    year: NotRequired[Annotated[int, 2000]]
51897db96d56Sopenharmony_ci
51907db96d56Sopenharmony_ciclass WeirdlyQuotedMovie(TypedDict):
51917db96d56Sopenharmony_ci    title: Annotated['Annotated[Required[str], "foobar"]', "another level"]
51927db96d56Sopenharmony_ci    year: NotRequired['Annotated[int, 2000]']
51937db96d56Sopenharmony_ci
51947db96d56Sopenharmony_ciclass HasForeignBaseClass(mod_generics_cache.A):
51957db96d56Sopenharmony_ci    some_xrepr: 'XRepr'
51967db96d56Sopenharmony_ci    other_a: 'mod_generics_cache.A'
51977db96d56Sopenharmony_ci
51987db96d56Sopenharmony_ciasync def g_with(am: typing.AsyncContextManager[int]):
51997db96d56Sopenharmony_ci    x: int
52007db96d56Sopenharmony_ci    async with am as x:
52017db96d56Sopenharmony_ci        return x
52027db96d56Sopenharmony_ci
52037db96d56Sopenharmony_citry:
52047db96d56Sopenharmony_ci    g_with(ACM()).send(None)
52057db96d56Sopenharmony_ciexcept StopIteration as e:
52067db96d56Sopenharmony_ci    assert e.args[0] == 42
52077db96d56Sopenharmony_ci
52087db96d56Sopenharmony_cigth = get_type_hints
52097db96d56Sopenharmony_ci
52107db96d56Sopenharmony_ciclass ForRefExample:
52117db96d56Sopenharmony_ci    @ann_module.dec
52127db96d56Sopenharmony_ci    def func(self: 'ForRefExample'):
52137db96d56Sopenharmony_ci        pass
52147db96d56Sopenharmony_ci
52157db96d56Sopenharmony_ci    @ann_module.dec
52167db96d56Sopenharmony_ci    @ann_module.dec
52177db96d56Sopenharmony_ci    def nested(self: 'ForRefExample'):
52187db96d56Sopenharmony_ci        pass
52197db96d56Sopenharmony_ci
52207db96d56Sopenharmony_ci
52217db96d56Sopenharmony_ciclass GetTypeHintTests(BaseTestCase):
52227db96d56Sopenharmony_ci    def test_get_type_hints_from_various_objects(self):
52237db96d56Sopenharmony_ci        # For invalid objects should fail with TypeError (not AttributeError etc).
52247db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
52257db96d56Sopenharmony_ci            gth(123)
52267db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
52277db96d56Sopenharmony_ci            gth('abc')
52287db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
52297db96d56Sopenharmony_ci            gth(None)
52307db96d56Sopenharmony_ci
52317db96d56Sopenharmony_ci    def test_get_type_hints_modules(self):
52327db96d56Sopenharmony_ci        ann_module_type_hints = {1: 2, 'f': Tuple[int, int], 'x': int, 'y': str, 'u': int | float}
52337db96d56Sopenharmony_ci        self.assertEqual(gth(ann_module), ann_module_type_hints)
52347db96d56Sopenharmony_ci        self.assertEqual(gth(ann_module2), {})
52357db96d56Sopenharmony_ci        self.assertEqual(gth(ann_module3), {})
52367db96d56Sopenharmony_ci
52377db96d56Sopenharmony_ci    @skip("known bug")
52387db96d56Sopenharmony_ci    def test_get_type_hints_modules_forwardref(self):
52397db96d56Sopenharmony_ci        # FIXME: This currently exposes a bug in typing. Cached forward references
52407db96d56Sopenharmony_ci        # don't account for the case where there are multiple types of the same
52417db96d56Sopenharmony_ci        # name coming from different modules in the same program.
52427db96d56Sopenharmony_ci        mgc_hints = {'default_a': Optional[mod_generics_cache.A],
52437db96d56Sopenharmony_ci                     'default_b': Optional[mod_generics_cache.B]}
52447db96d56Sopenharmony_ci        self.assertEqual(gth(mod_generics_cache), mgc_hints)
52457db96d56Sopenharmony_ci
52467db96d56Sopenharmony_ci    def test_get_type_hints_classes(self):
52477db96d56Sopenharmony_ci        self.assertEqual(gth(ann_module.C),  # gth will find the right globalns
52487db96d56Sopenharmony_ci                         {'y': Optional[ann_module.C]})
52497db96d56Sopenharmony_ci        self.assertIsInstance(gth(ann_module.j_class), dict)
52507db96d56Sopenharmony_ci        self.assertEqual(gth(ann_module.M), {'123': 123, 'o': type})
52517db96d56Sopenharmony_ci        self.assertEqual(gth(ann_module.D),
52527db96d56Sopenharmony_ci                         {'j': str, 'k': str, 'y': Optional[ann_module.C]})
52537db96d56Sopenharmony_ci        self.assertEqual(gth(ann_module.Y), {'z': int})
52547db96d56Sopenharmony_ci        self.assertEqual(gth(ann_module.h_class),
52557db96d56Sopenharmony_ci                         {'y': Optional[ann_module.C]})
52567db96d56Sopenharmony_ci        self.assertEqual(gth(ann_module.S), {'x': str, 'y': str})
52577db96d56Sopenharmony_ci        self.assertEqual(gth(ann_module.foo), {'x': int})
52587db96d56Sopenharmony_ci        self.assertEqual(gth(NoneAndForward),
52597db96d56Sopenharmony_ci                         {'parent': NoneAndForward, 'meaning': type(None)})
52607db96d56Sopenharmony_ci        self.assertEqual(gth(HasForeignBaseClass),
52617db96d56Sopenharmony_ci                         {'some_xrepr': XRepr, 'other_a': mod_generics_cache.A,
52627db96d56Sopenharmony_ci                          'some_b': mod_generics_cache.B})
52637db96d56Sopenharmony_ci        self.assertEqual(gth(XRepr.__new__),
52647db96d56Sopenharmony_ci                         {'x': int, 'y': int})
52657db96d56Sopenharmony_ci        self.assertEqual(gth(mod_generics_cache.B),
52667db96d56Sopenharmony_ci                         {'my_inner_a1': mod_generics_cache.B.A,
52677db96d56Sopenharmony_ci                          'my_inner_a2': mod_generics_cache.B.A,
52687db96d56Sopenharmony_ci                          'my_outer_a': mod_generics_cache.A})
52697db96d56Sopenharmony_ci
52707db96d56Sopenharmony_ci    def test_get_type_hints_classes_no_implicit_optional(self):
52717db96d56Sopenharmony_ci        class WithNoneDefault:
52727db96d56Sopenharmony_ci            field: int = None  # most type-checkers won't be happy with it
52737db96d56Sopenharmony_ci
52747db96d56Sopenharmony_ci        self.assertEqual(gth(WithNoneDefault), {'field': int})
52757db96d56Sopenharmony_ci
52767db96d56Sopenharmony_ci    def test_respect_no_type_check(self):
52777db96d56Sopenharmony_ci        @no_type_check
52787db96d56Sopenharmony_ci        class NoTpCheck:
52797db96d56Sopenharmony_ci            class Inn:
52807db96d56Sopenharmony_ci                def __init__(self, x: 'not a type'): ...
52817db96d56Sopenharmony_ci        self.assertTrue(NoTpCheck.__no_type_check__)
52827db96d56Sopenharmony_ci        self.assertTrue(NoTpCheck.Inn.__init__.__no_type_check__)
52837db96d56Sopenharmony_ci        self.assertEqual(gth(ann_module2.NTC.meth), {})
52847db96d56Sopenharmony_ci        class ABase(Generic[T]):
52857db96d56Sopenharmony_ci            def meth(x: int): ...
52867db96d56Sopenharmony_ci        @no_type_check
52877db96d56Sopenharmony_ci        class Der(ABase): ...
52887db96d56Sopenharmony_ci        self.assertEqual(gth(ABase.meth), {'x': int})
52897db96d56Sopenharmony_ci
52907db96d56Sopenharmony_ci    def test_get_type_hints_for_builtins(self):
52917db96d56Sopenharmony_ci        # Should not fail for built-in classes and functions.
52927db96d56Sopenharmony_ci        self.assertEqual(gth(int), {})
52937db96d56Sopenharmony_ci        self.assertEqual(gth(type), {})
52947db96d56Sopenharmony_ci        self.assertEqual(gth(dir), {})
52957db96d56Sopenharmony_ci        self.assertEqual(gth(len), {})
52967db96d56Sopenharmony_ci        self.assertEqual(gth(object.__str__), {})
52977db96d56Sopenharmony_ci        self.assertEqual(gth(object().__str__), {})
52987db96d56Sopenharmony_ci        self.assertEqual(gth(str.join), {})
52997db96d56Sopenharmony_ci
53007db96d56Sopenharmony_ci    def test_previous_behavior(self):
53017db96d56Sopenharmony_ci        def testf(x, y): ...
53027db96d56Sopenharmony_ci        testf.__annotations__['x'] = 'int'
53037db96d56Sopenharmony_ci        self.assertEqual(gth(testf), {'x': int})
53047db96d56Sopenharmony_ci        def testg(x: None): ...
53057db96d56Sopenharmony_ci        self.assertEqual(gth(testg), {'x': type(None)})
53067db96d56Sopenharmony_ci
53077db96d56Sopenharmony_ci    def test_get_type_hints_for_object_with_annotations(self):
53087db96d56Sopenharmony_ci        class A: ...
53097db96d56Sopenharmony_ci        class B: ...
53107db96d56Sopenharmony_ci        b = B()
53117db96d56Sopenharmony_ci        b.__annotations__ = {'x': 'A'}
53127db96d56Sopenharmony_ci        self.assertEqual(gth(b, locals()), {'x': A})
53137db96d56Sopenharmony_ci
53147db96d56Sopenharmony_ci    def test_get_type_hints_ClassVar(self):
53157db96d56Sopenharmony_ci        self.assertEqual(gth(ann_module2.CV, ann_module2.__dict__),
53167db96d56Sopenharmony_ci                         {'var': typing.ClassVar[ann_module2.CV]})
53177db96d56Sopenharmony_ci        self.assertEqual(gth(B, globals()),
53187db96d56Sopenharmony_ci                         {'y': int, 'x': ClassVar[Optional[B]], 'b': int})
53197db96d56Sopenharmony_ci        self.assertEqual(gth(CSub, globals()),
53207db96d56Sopenharmony_ci                         {'z': ClassVar[CSub], 'y': int, 'b': int,
53217db96d56Sopenharmony_ci                          'x': ClassVar[Optional[B]]})
53227db96d56Sopenharmony_ci        self.assertEqual(gth(G), {'lst': ClassVar[List[T]]})
53237db96d56Sopenharmony_ci
53247db96d56Sopenharmony_ci    def test_get_type_hints_wrapped_decoratored_func(self):
53257db96d56Sopenharmony_ci        expects = {'self': ForRefExample}
53267db96d56Sopenharmony_ci        self.assertEqual(gth(ForRefExample.func), expects)
53277db96d56Sopenharmony_ci        self.assertEqual(gth(ForRefExample.nested), expects)
53287db96d56Sopenharmony_ci
53297db96d56Sopenharmony_ci    def test_get_type_hints_annotated(self):
53307db96d56Sopenharmony_ci        def foobar(x: List['X']): ...
53317db96d56Sopenharmony_ci        X = Annotated[int, (1, 10)]
53327db96d56Sopenharmony_ci        self.assertEqual(
53337db96d56Sopenharmony_ci            get_type_hints(foobar, globals(), locals()),
53347db96d56Sopenharmony_ci            {'x': List[int]}
53357db96d56Sopenharmony_ci        )
53367db96d56Sopenharmony_ci        self.assertEqual(
53377db96d56Sopenharmony_ci            get_type_hints(foobar, globals(), locals(), include_extras=True),
53387db96d56Sopenharmony_ci            {'x': List[Annotated[int, (1, 10)]]}
53397db96d56Sopenharmony_ci        )
53407db96d56Sopenharmony_ci
53417db96d56Sopenharmony_ci        def foobar(x: list[ForwardRef('X')]): ...
53427db96d56Sopenharmony_ci        X = Annotated[int, (1, 10)]
53437db96d56Sopenharmony_ci        self.assertEqual(
53447db96d56Sopenharmony_ci            get_type_hints(foobar, globals(), locals()),
53457db96d56Sopenharmony_ci            {'x': list[int]}
53467db96d56Sopenharmony_ci        )
53477db96d56Sopenharmony_ci        self.assertEqual(
53487db96d56Sopenharmony_ci            get_type_hints(foobar, globals(), locals(), include_extras=True),
53497db96d56Sopenharmony_ci            {'x': list[Annotated[int, (1, 10)]]}
53507db96d56Sopenharmony_ci        )
53517db96d56Sopenharmony_ci
53527db96d56Sopenharmony_ci        BA = Tuple[Annotated[T, (1, 0)], ...]
53537db96d56Sopenharmony_ci        def barfoo(x: BA): ...
53547db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(barfoo, globals(), locals())['x'], Tuple[T, ...])
53557db96d56Sopenharmony_ci        self.assertEqual(
53567db96d56Sopenharmony_ci            get_type_hints(barfoo, globals(), locals(), include_extras=True)['x'],
53577db96d56Sopenharmony_ci            BA
53587db96d56Sopenharmony_ci        )
53597db96d56Sopenharmony_ci
53607db96d56Sopenharmony_ci        BA = tuple[Annotated[T, (1, 0)], ...]
53617db96d56Sopenharmony_ci        def barfoo(x: BA): ...
53627db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(barfoo, globals(), locals())['x'], tuple[T, ...])
53637db96d56Sopenharmony_ci        self.assertEqual(
53647db96d56Sopenharmony_ci            get_type_hints(barfoo, globals(), locals(), include_extras=True)['x'],
53657db96d56Sopenharmony_ci            BA
53667db96d56Sopenharmony_ci        )
53677db96d56Sopenharmony_ci
53687db96d56Sopenharmony_ci        def barfoo2(x: typing.Callable[..., Annotated[List[T], "const"]],
53697db96d56Sopenharmony_ci                    y: typing.Union[int, Annotated[T, "mutable"]]): ...
53707db96d56Sopenharmony_ci        self.assertEqual(
53717db96d56Sopenharmony_ci            get_type_hints(barfoo2, globals(), locals()),
53727db96d56Sopenharmony_ci            {'x': typing.Callable[..., List[T]], 'y': typing.Union[int, T]}
53737db96d56Sopenharmony_ci        )
53747db96d56Sopenharmony_ci
53757db96d56Sopenharmony_ci        BA2 = typing.Callable[..., List[T]]
53767db96d56Sopenharmony_ci        def barfoo3(x: BA2): ...
53777db96d56Sopenharmony_ci        self.assertIs(
53787db96d56Sopenharmony_ci            get_type_hints(barfoo3, globals(), locals(), include_extras=True)["x"],
53797db96d56Sopenharmony_ci            BA2
53807db96d56Sopenharmony_ci        )
53817db96d56Sopenharmony_ci        BA3 = typing.Annotated[int | float, "const"]
53827db96d56Sopenharmony_ci        def barfoo4(x: BA3): ...
53837db96d56Sopenharmony_ci        self.assertEqual(
53847db96d56Sopenharmony_ci            get_type_hints(barfoo4, globals(), locals()),
53857db96d56Sopenharmony_ci            {"x": int | float}
53867db96d56Sopenharmony_ci        )
53877db96d56Sopenharmony_ci        self.assertEqual(
53887db96d56Sopenharmony_ci            get_type_hints(barfoo4, globals(), locals(), include_extras=True),
53897db96d56Sopenharmony_ci            {"x": typing.Annotated[int | float, "const"]}
53907db96d56Sopenharmony_ci        )
53917db96d56Sopenharmony_ci
53927db96d56Sopenharmony_ci    def test_get_type_hints_annotated_in_union(self):  # bpo-46603
53937db96d56Sopenharmony_ci        def with_union(x: int | list[Annotated[str, 'meta']]): ...
53947db96d56Sopenharmony_ci
53957db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(with_union), {'x': int | list[str]})
53967db96d56Sopenharmony_ci        self.assertEqual(
53977db96d56Sopenharmony_ci            get_type_hints(with_union, include_extras=True),
53987db96d56Sopenharmony_ci            {'x': int | list[Annotated[str, 'meta']]},
53997db96d56Sopenharmony_ci        )
54007db96d56Sopenharmony_ci
54017db96d56Sopenharmony_ci    def test_get_type_hints_annotated_refs(self):
54027db96d56Sopenharmony_ci
54037db96d56Sopenharmony_ci        Const = Annotated[T, "Const"]
54047db96d56Sopenharmony_ci
54057db96d56Sopenharmony_ci        class MySet(Generic[T]):
54067db96d56Sopenharmony_ci
54077db96d56Sopenharmony_ci            def __ior__(self, other: "Const[MySet[T]]") -> "MySet[T]":
54087db96d56Sopenharmony_ci                ...
54097db96d56Sopenharmony_ci
54107db96d56Sopenharmony_ci            def __iand__(self, other: Const["MySet[T]"]) -> "MySet[T]":
54117db96d56Sopenharmony_ci                ...
54127db96d56Sopenharmony_ci
54137db96d56Sopenharmony_ci        self.assertEqual(
54147db96d56Sopenharmony_ci            get_type_hints(MySet.__iand__, globals(), locals()),
54157db96d56Sopenharmony_ci            {'other': MySet[T], 'return': MySet[T]}
54167db96d56Sopenharmony_ci        )
54177db96d56Sopenharmony_ci
54187db96d56Sopenharmony_ci        self.assertEqual(
54197db96d56Sopenharmony_ci            get_type_hints(MySet.__iand__, globals(), locals(), include_extras=True),
54207db96d56Sopenharmony_ci            {'other': Const[MySet[T]], 'return': MySet[T]}
54217db96d56Sopenharmony_ci        )
54227db96d56Sopenharmony_ci
54237db96d56Sopenharmony_ci        self.assertEqual(
54247db96d56Sopenharmony_ci            get_type_hints(MySet.__ior__, globals(), locals()),
54257db96d56Sopenharmony_ci            {'other': MySet[T], 'return': MySet[T]}
54267db96d56Sopenharmony_ci        )
54277db96d56Sopenharmony_ci
54287db96d56Sopenharmony_ci    def test_get_type_hints_annotated_with_none_default(self):
54297db96d56Sopenharmony_ci        # See: https://bugs.python.org/issue46195
54307db96d56Sopenharmony_ci        def annotated_with_none_default(x: Annotated[int, 'data'] = None): ...
54317db96d56Sopenharmony_ci        self.assertEqual(
54327db96d56Sopenharmony_ci            get_type_hints(annotated_with_none_default),
54337db96d56Sopenharmony_ci            {'x': int},
54347db96d56Sopenharmony_ci        )
54357db96d56Sopenharmony_ci        self.assertEqual(
54367db96d56Sopenharmony_ci            get_type_hints(annotated_with_none_default, include_extras=True),
54377db96d56Sopenharmony_ci            {'x': Annotated[int, 'data']},
54387db96d56Sopenharmony_ci        )
54397db96d56Sopenharmony_ci
54407db96d56Sopenharmony_ci    def test_get_type_hints_classes_str_annotations(self):
54417db96d56Sopenharmony_ci        class Foo:
54427db96d56Sopenharmony_ci            y = str
54437db96d56Sopenharmony_ci            x: 'y'
54447db96d56Sopenharmony_ci        # This previously raised an error under PEP 563.
54457db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(Foo), {'x': str})
54467db96d56Sopenharmony_ci
54477db96d56Sopenharmony_ci    def test_get_type_hints_bad_module(self):
54487db96d56Sopenharmony_ci        # bpo-41515
54497db96d56Sopenharmony_ci        class BadModule:
54507db96d56Sopenharmony_ci            pass
54517db96d56Sopenharmony_ci        BadModule.__module__ = 'bad' # Something not in sys.modules
54527db96d56Sopenharmony_ci        self.assertNotIn('bad', sys.modules)
54537db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(BadModule), {})
54547db96d56Sopenharmony_ci
54557db96d56Sopenharmony_ci    def test_get_type_hints_annotated_bad_module(self):
54567db96d56Sopenharmony_ci        # See https://bugs.python.org/issue44468
54577db96d56Sopenharmony_ci        class BadBase:
54587db96d56Sopenharmony_ci            foo: tuple
54597db96d56Sopenharmony_ci        class BadType(BadBase):
54607db96d56Sopenharmony_ci            bar: list
54617db96d56Sopenharmony_ci        BadType.__module__ = BadBase.__module__ = 'bad'
54627db96d56Sopenharmony_ci        self.assertNotIn('bad', sys.modules)
54637db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(BadType), {'foo': tuple, 'bar': list})
54647db96d56Sopenharmony_ci
54657db96d56Sopenharmony_ci    def test_forward_ref_and_final(self):
54667db96d56Sopenharmony_ci        # https://bugs.python.org/issue45166
54677db96d56Sopenharmony_ci        hints = get_type_hints(ann_module5)
54687db96d56Sopenharmony_ci        self.assertEqual(hints, {'name': Final[str]})
54697db96d56Sopenharmony_ci
54707db96d56Sopenharmony_ci        hints = get_type_hints(ann_module5.MyClass)
54717db96d56Sopenharmony_ci        self.assertEqual(hints, {'value': Final})
54727db96d56Sopenharmony_ci
54737db96d56Sopenharmony_ci    def test_top_level_class_var(self):
54747db96d56Sopenharmony_ci        # https://bugs.python.org/issue45166
54757db96d56Sopenharmony_ci        with self.assertRaisesRegex(
54767db96d56Sopenharmony_ci            TypeError,
54777db96d56Sopenharmony_ci            r'typing.ClassVar\[int\] is not valid as type argument',
54787db96d56Sopenharmony_ci        ):
54797db96d56Sopenharmony_ci            get_type_hints(ann_module6)
54807db96d56Sopenharmony_ci
54817db96d56Sopenharmony_ci    def test_get_type_hints_typeddict(self):
54827db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(TotalMovie), {'title': str, 'year': int})
54837db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(TotalMovie, include_extras=True), {
54847db96d56Sopenharmony_ci            'title': str,
54857db96d56Sopenharmony_ci            'year': NotRequired[int],
54867db96d56Sopenharmony_ci        })
54877db96d56Sopenharmony_ci
54887db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(AnnotatedMovie), {'title': str, 'year': int})
54897db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(AnnotatedMovie, include_extras=True), {
54907db96d56Sopenharmony_ci            'title': Annotated[Required[str], "foobar"],
54917db96d56Sopenharmony_ci            'year': NotRequired[Annotated[int, 2000]],
54927db96d56Sopenharmony_ci        })
54937db96d56Sopenharmony_ci
54947db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(DeeplyAnnotatedMovie), {'title': str, 'year': int})
54957db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(DeeplyAnnotatedMovie, include_extras=True), {
54967db96d56Sopenharmony_ci            'title': Annotated[Required[str], "foobar", "another level"],
54977db96d56Sopenharmony_ci            'year': NotRequired[Annotated[int, 2000]],
54987db96d56Sopenharmony_ci        })
54997db96d56Sopenharmony_ci
55007db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(WeirdlyQuotedMovie), {'title': str, 'year': int})
55017db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(WeirdlyQuotedMovie, include_extras=True), {
55027db96d56Sopenharmony_ci            'title': Annotated[Required[str], "foobar", "another level"],
55037db96d56Sopenharmony_ci            'year': NotRequired[Annotated[int, 2000]],
55047db96d56Sopenharmony_ci        })
55057db96d56Sopenharmony_ci
55067db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(_typed_dict_helper.VeryAnnotated), {'a': int})
55077db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(_typed_dict_helper.VeryAnnotated, include_extras=True), {
55087db96d56Sopenharmony_ci            'a': Annotated[Required[int], "a", "b", "c"]
55097db96d56Sopenharmony_ci        })
55107db96d56Sopenharmony_ci
55117db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(ChildTotalMovie), {"title": str, "year": int})
55127db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(ChildTotalMovie, include_extras=True), {
55137db96d56Sopenharmony_ci            "title": Required[str], "year": NotRequired[int]
55147db96d56Sopenharmony_ci        })
55157db96d56Sopenharmony_ci
55167db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(ChildDeeplyAnnotatedMovie), {"title": str, "year": int})
55177db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(ChildDeeplyAnnotatedMovie, include_extras=True), {
55187db96d56Sopenharmony_ci            "title": Annotated[Required[str], "foobar", "another level"],
55197db96d56Sopenharmony_ci            "year": NotRequired[Annotated[int, 2000]]
55207db96d56Sopenharmony_ci        })
55217db96d56Sopenharmony_ci
55227db96d56Sopenharmony_ci    def test_get_type_hints_collections_abc_callable(self):
55237db96d56Sopenharmony_ci        # https://github.com/python/cpython/issues/91621
55247db96d56Sopenharmony_ci        P = ParamSpec('P')
55257db96d56Sopenharmony_ci        def f(x: collections.abc.Callable[[int], int]): ...
55267db96d56Sopenharmony_ci        def g(x: collections.abc.Callable[..., int]): ...
55277db96d56Sopenharmony_ci        def h(x: collections.abc.Callable[P, int]): ...
55287db96d56Sopenharmony_ci
55297db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(f), {'x': collections.abc.Callable[[int], int]})
55307db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(g), {'x': collections.abc.Callable[..., int]})
55317db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(h), {'x': collections.abc.Callable[P, int]})
55327db96d56Sopenharmony_ci
55337db96d56Sopenharmony_ci
55347db96d56Sopenharmony_ciclass GetUtilitiesTestCase(TestCase):
55357db96d56Sopenharmony_ci    def test_get_origin(self):
55367db96d56Sopenharmony_ci        T = TypeVar('T')
55377db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
55387db96d56Sopenharmony_ci        P = ParamSpec('P')
55397db96d56Sopenharmony_ci        class C(Generic[T]): pass
55407db96d56Sopenharmony_ci        self.assertIs(get_origin(C[int]), C)
55417db96d56Sopenharmony_ci        self.assertIs(get_origin(C[T]), C)
55427db96d56Sopenharmony_ci        self.assertIs(get_origin(int), None)
55437db96d56Sopenharmony_ci        self.assertIs(get_origin(ClassVar[int]), ClassVar)
55447db96d56Sopenharmony_ci        self.assertIs(get_origin(Union[int, str]), Union)
55457db96d56Sopenharmony_ci        self.assertIs(get_origin(Literal[42, 43]), Literal)
55467db96d56Sopenharmony_ci        self.assertIs(get_origin(Final[List[int]]), Final)
55477db96d56Sopenharmony_ci        self.assertIs(get_origin(Generic), Generic)
55487db96d56Sopenharmony_ci        self.assertIs(get_origin(Generic[T]), Generic)
55497db96d56Sopenharmony_ci        self.assertIs(get_origin(List[Tuple[T, T]][int]), list)
55507db96d56Sopenharmony_ci        self.assertIs(get_origin(Annotated[T, 'thing']), Annotated)
55517db96d56Sopenharmony_ci        self.assertIs(get_origin(List), list)
55527db96d56Sopenharmony_ci        self.assertIs(get_origin(Tuple), tuple)
55537db96d56Sopenharmony_ci        self.assertIs(get_origin(Callable), collections.abc.Callable)
55547db96d56Sopenharmony_ci        self.assertIs(get_origin(list[int]), list)
55557db96d56Sopenharmony_ci        self.assertIs(get_origin(list), None)
55567db96d56Sopenharmony_ci        self.assertIs(get_origin(list | str), types.UnionType)
55577db96d56Sopenharmony_ci        self.assertIs(get_origin(P.args), P)
55587db96d56Sopenharmony_ci        self.assertIs(get_origin(P.kwargs), P)
55597db96d56Sopenharmony_ci        self.assertIs(get_origin(Required[int]), Required)
55607db96d56Sopenharmony_ci        self.assertIs(get_origin(NotRequired[int]), NotRequired)
55617db96d56Sopenharmony_ci        self.assertIs(get_origin((*Ts,)[0]), Unpack)
55627db96d56Sopenharmony_ci        self.assertIs(get_origin(Unpack[Ts]), Unpack)
55637db96d56Sopenharmony_ci        self.assertIs(get_origin((*tuple[*Ts],)[0]), tuple)
55647db96d56Sopenharmony_ci        self.assertIs(get_origin(Unpack[Tuple[Unpack[Ts]]]), Unpack)
55657db96d56Sopenharmony_ci
55667db96d56Sopenharmony_ci    def test_get_args(self):
55677db96d56Sopenharmony_ci        T = TypeVar('T')
55687db96d56Sopenharmony_ci        class C(Generic[T]): pass
55697db96d56Sopenharmony_ci        self.assertEqual(get_args(C[int]), (int,))
55707db96d56Sopenharmony_ci        self.assertEqual(get_args(C[T]), (T,))
55717db96d56Sopenharmony_ci        self.assertEqual(get_args(int), ())
55727db96d56Sopenharmony_ci        self.assertEqual(get_args(ClassVar[int]), (int,))
55737db96d56Sopenharmony_ci        self.assertEqual(get_args(Union[int, str]), (int, str))
55747db96d56Sopenharmony_ci        self.assertEqual(get_args(Literal[42, 43]), (42, 43))
55757db96d56Sopenharmony_ci        self.assertEqual(get_args(Final[List[int]]), (List[int],))
55767db96d56Sopenharmony_ci        self.assertEqual(get_args(Union[int, Tuple[T, int]][str]),
55777db96d56Sopenharmony_ci                         (int, Tuple[str, int]))
55787db96d56Sopenharmony_ci        self.assertEqual(get_args(typing.Dict[int, Tuple[T, T]][Optional[int]]),
55797db96d56Sopenharmony_ci                         (int, Tuple[Optional[int], Optional[int]]))
55807db96d56Sopenharmony_ci        self.assertEqual(get_args(Callable[[], T][int]), ([], int))
55817db96d56Sopenharmony_ci        self.assertEqual(get_args(Callable[..., int]), (..., int))
55827db96d56Sopenharmony_ci        self.assertEqual(get_args(Union[int, Callable[[Tuple[T, ...]], str]]),
55837db96d56Sopenharmony_ci                         (int, Callable[[Tuple[T, ...]], str]))
55847db96d56Sopenharmony_ci        self.assertEqual(get_args(Tuple[int, ...]), (int, ...))
55857db96d56Sopenharmony_ci        self.assertEqual(get_args(Tuple[()]), ())
55867db96d56Sopenharmony_ci        self.assertEqual(get_args(Annotated[T, 'one', 2, ['three']]), (T, 'one', 2, ['three']))
55877db96d56Sopenharmony_ci        self.assertEqual(get_args(List), ())
55887db96d56Sopenharmony_ci        self.assertEqual(get_args(Tuple), ())
55897db96d56Sopenharmony_ci        self.assertEqual(get_args(Callable), ())
55907db96d56Sopenharmony_ci        self.assertEqual(get_args(list[int]), (int,))
55917db96d56Sopenharmony_ci        self.assertEqual(get_args(list), ())
55927db96d56Sopenharmony_ci        self.assertEqual(get_args(collections.abc.Callable[[int], str]), ([int], str))
55937db96d56Sopenharmony_ci        self.assertEqual(get_args(collections.abc.Callable[..., str]), (..., str))
55947db96d56Sopenharmony_ci        self.assertEqual(get_args(collections.abc.Callable[[], str]), ([], str))
55957db96d56Sopenharmony_ci        self.assertEqual(get_args(collections.abc.Callable[[int], str]),
55967db96d56Sopenharmony_ci                         get_args(Callable[[int], str]))
55977db96d56Sopenharmony_ci        P = ParamSpec('P')
55987db96d56Sopenharmony_ci        self.assertEqual(get_args(Callable[P, int]), (P, int))
55997db96d56Sopenharmony_ci        self.assertEqual(get_args(Callable[Concatenate[int, P], int]),
56007db96d56Sopenharmony_ci                         (Concatenate[int, P], int))
56017db96d56Sopenharmony_ci        self.assertEqual(get_args(list | str), (list, str))
56027db96d56Sopenharmony_ci        self.assertEqual(get_args(Required[int]), (int,))
56037db96d56Sopenharmony_ci        self.assertEqual(get_args(NotRequired[int]), (int,))
56047db96d56Sopenharmony_ci        self.assertEqual(get_args(TypeAlias), ())
56057db96d56Sopenharmony_ci        self.assertEqual(get_args(TypeGuard[int]), (int,))
56067db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
56077db96d56Sopenharmony_ci        self.assertEqual(get_args(Ts), ())
56087db96d56Sopenharmony_ci        self.assertEqual(get_args((*Ts,)[0]), (Ts,))
56097db96d56Sopenharmony_ci        self.assertEqual(get_args(Unpack[Ts]), (Ts,))
56107db96d56Sopenharmony_ci        self.assertEqual(get_args(tuple[*Ts]), (*Ts,))
56117db96d56Sopenharmony_ci        self.assertEqual(get_args(tuple[Unpack[Ts]]), (Unpack[Ts],))
56127db96d56Sopenharmony_ci        self.assertEqual(get_args((*tuple[*Ts],)[0]), (*Ts,))
56137db96d56Sopenharmony_ci        self.assertEqual(get_args(Unpack[tuple[Unpack[Ts]]]), (tuple[Unpack[Ts]],))
56147db96d56Sopenharmony_ci
56157db96d56Sopenharmony_ci
56167db96d56Sopenharmony_ciclass CollectionsAbcTests(BaseTestCase):
56177db96d56Sopenharmony_ci
56187db96d56Sopenharmony_ci    def test_hashable(self):
56197db96d56Sopenharmony_ci        self.assertIsInstance(42, typing.Hashable)
56207db96d56Sopenharmony_ci        self.assertNotIsInstance([], typing.Hashable)
56217db96d56Sopenharmony_ci
56227db96d56Sopenharmony_ci    def test_iterable(self):
56237db96d56Sopenharmony_ci        self.assertIsInstance([], typing.Iterable)
56247db96d56Sopenharmony_ci        # Due to ABC caching, the second time takes a separate code
56257db96d56Sopenharmony_ci        # path and could fail.  So call this a few times.
56267db96d56Sopenharmony_ci        self.assertIsInstance([], typing.Iterable)
56277db96d56Sopenharmony_ci        self.assertIsInstance([], typing.Iterable)
56287db96d56Sopenharmony_ci        self.assertNotIsInstance(42, typing.Iterable)
56297db96d56Sopenharmony_ci        # Just in case, also test issubclass() a few times.
56307db96d56Sopenharmony_ci        self.assertIsSubclass(list, typing.Iterable)
56317db96d56Sopenharmony_ci        self.assertIsSubclass(list, typing.Iterable)
56327db96d56Sopenharmony_ci
56337db96d56Sopenharmony_ci    def test_iterator(self):
56347db96d56Sopenharmony_ci        it = iter([])
56357db96d56Sopenharmony_ci        self.assertIsInstance(it, typing.Iterator)
56367db96d56Sopenharmony_ci        self.assertNotIsInstance(42, typing.Iterator)
56377db96d56Sopenharmony_ci
56387db96d56Sopenharmony_ci    def test_awaitable(self):
56397db96d56Sopenharmony_ci        ns = {}
56407db96d56Sopenharmony_ci        exec(
56417db96d56Sopenharmony_ci            "async def foo() -> typing.Awaitable[int]:\n"
56427db96d56Sopenharmony_ci            "    return await AwaitableWrapper(42)\n",
56437db96d56Sopenharmony_ci            globals(), ns)
56447db96d56Sopenharmony_ci        foo = ns['foo']
56457db96d56Sopenharmony_ci        g = foo()
56467db96d56Sopenharmony_ci        self.assertIsInstance(g, typing.Awaitable)
56477db96d56Sopenharmony_ci        self.assertNotIsInstance(foo, typing.Awaitable)
56487db96d56Sopenharmony_ci        g.send(None)  # Run foo() till completion, to avoid warning.
56497db96d56Sopenharmony_ci
56507db96d56Sopenharmony_ci    def test_coroutine(self):
56517db96d56Sopenharmony_ci        ns = {}
56527db96d56Sopenharmony_ci        exec(
56537db96d56Sopenharmony_ci            "async def foo():\n"
56547db96d56Sopenharmony_ci            "    return\n",
56557db96d56Sopenharmony_ci            globals(), ns)
56567db96d56Sopenharmony_ci        foo = ns['foo']
56577db96d56Sopenharmony_ci        g = foo()
56587db96d56Sopenharmony_ci        self.assertIsInstance(g, typing.Coroutine)
56597db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
56607db96d56Sopenharmony_ci            isinstance(g, typing.Coroutine[int])
56617db96d56Sopenharmony_ci        self.assertNotIsInstance(foo, typing.Coroutine)
56627db96d56Sopenharmony_ci        try:
56637db96d56Sopenharmony_ci            g.send(None)
56647db96d56Sopenharmony_ci        except StopIteration:
56657db96d56Sopenharmony_ci            pass
56667db96d56Sopenharmony_ci
56677db96d56Sopenharmony_ci    def test_async_iterable(self):
56687db96d56Sopenharmony_ci        base_it = range(10)  # type: Iterator[int]
56697db96d56Sopenharmony_ci        it = AsyncIteratorWrapper(base_it)
56707db96d56Sopenharmony_ci        self.assertIsInstance(it, typing.AsyncIterable)
56717db96d56Sopenharmony_ci        self.assertIsInstance(it, typing.AsyncIterable)
56727db96d56Sopenharmony_ci        self.assertNotIsInstance(42, typing.AsyncIterable)
56737db96d56Sopenharmony_ci
56747db96d56Sopenharmony_ci    def test_async_iterator(self):
56757db96d56Sopenharmony_ci        base_it = range(10)  # type: Iterator[int]
56767db96d56Sopenharmony_ci        it = AsyncIteratorWrapper(base_it)
56777db96d56Sopenharmony_ci        self.assertIsInstance(it, typing.AsyncIterator)
56787db96d56Sopenharmony_ci        self.assertNotIsInstance(42, typing.AsyncIterator)
56797db96d56Sopenharmony_ci
56807db96d56Sopenharmony_ci    def test_sized(self):
56817db96d56Sopenharmony_ci        self.assertIsInstance([], typing.Sized)
56827db96d56Sopenharmony_ci        self.assertNotIsInstance(42, typing.Sized)
56837db96d56Sopenharmony_ci
56847db96d56Sopenharmony_ci    def test_container(self):
56857db96d56Sopenharmony_ci        self.assertIsInstance([], typing.Container)
56867db96d56Sopenharmony_ci        self.assertNotIsInstance(42, typing.Container)
56877db96d56Sopenharmony_ci
56887db96d56Sopenharmony_ci    def test_collection(self):
56897db96d56Sopenharmony_ci        self.assertIsInstance(tuple(), typing.Collection)
56907db96d56Sopenharmony_ci        self.assertIsInstance(frozenset(), typing.Collection)
56917db96d56Sopenharmony_ci        self.assertIsSubclass(dict, typing.Collection)
56927db96d56Sopenharmony_ci        self.assertNotIsInstance(42, typing.Collection)
56937db96d56Sopenharmony_ci
56947db96d56Sopenharmony_ci    def test_abstractset(self):
56957db96d56Sopenharmony_ci        self.assertIsInstance(set(), typing.AbstractSet)
56967db96d56Sopenharmony_ci        self.assertNotIsInstance(42, typing.AbstractSet)
56977db96d56Sopenharmony_ci
56987db96d56Sopenharmony_ci    def test_mutableset(self):
56997db96d56Sopenharmony_ci        self.assertIsInstance(set(), typing.MutableSet)
57007db96d56Sopenharmony_ci        self.assertNotIsInstance(frozenset(), typing.MutableSet)
57017db96d56Sopenharmony_ci
57027db96d56Sopenharmony_ci    def test_mapping(self):
57037db96d56Sopenharmony_ci        self.assertIsInstance({}, typing.Mapping)
57047db96d56Sopenharmony_ci        self.assertNotIsInstance(42, typing.Mapping)
57057db96d56Sopenharmony_ci
57067db96d56Sopenharmony_ci    def test_mutablemapping(self):
57077db96d56Sopenharmony_ci        self.assertIsInstance({}, typing.MutableMapping)
57087db96d56Sopenharmony_ci        self.assertNotIsInstance(42, typing.MutableMapping)
57097db96d56Sopenharmony_ci
57107db96d56Sopenharmony_ci    def test_sequence(self):
57117db96d56Sopenharmony_ci        self.assertIsInstance([], typing.Sequence)
57127db96d56Sopenharmony_ci        self.assertNotIsInstance(42, typing.Sequence)
57137db96d56Sopenharmony_ci
57147db96d56Sopenharmony_ci    def test_mutablesequence(self):
57157db96d56Sopenharmony_ci        self.assertIsInstance([], typing.MutableSequence)
57167db96d56Sopenharmony_ci        self.assertNotIsInstance((), typing.MutableSequence)
57177db96d56Sopenharmony_ci
57187db96d56Sopenharmony_ci    def test_bytestring(self):
57197db96d56Sopenharmony_ci        self.assertIsInstance(b'', typing.ByteString)
57207db96d56Sopenharmony_ci        self.assertIsInstance(bytearray(b''), typing.ByteString)
57217db96d56Sopenharmony_ci
57227db96d56Sopenharmony_ci    def test_list(self):
57237db96d56Sopenharmony_ci        self.assertIsSubclass(list, typing.List)
57247db96d56Sopenharmony_ci
57257db96d56Sopenharmony_ci    def test_deque(self):
57267db96d56Sopenharmony_ci        self.assertIsSubclass(collections.deque, typing.Deque)
57277db96d56Sopenharmony_ci        class MyDeque(typing.Deque[int]): ...
57287db96d56Sopenharmony_ci        self.assertIsInstance(MyDeque(), collections.deque)
57297db96d56Sopenharmony_ci
57307db96d56Sopenharmony_ci    def test_counter(self):
57317db96d56Sopenharmony_ci        self.assertIsSubclass(collections.Counter, typing.Counter)
57327db96d56Sopenharmony_ci
57337db96d56Sopenharmony_ci    def test_set(self):
57347db96d56Sopenharmony_ci        self.assertIsSubclass(set, typing.Set)
57357db96d56Sopenharmony_ci        self.assertNotIsSubclass(frozenset, typing.Set)
57367db96d56Sopenharmony_ci
57377db96d56Sopenharmony_ci    def test_frozenset(self):
57387db96d56Sopenharmony_ci        self.assertIsSubclass(frozenset, typing.FrozenSet)
57397db96d56Sopenharmony_ci        self.assertNotIsSubclass(set, typing.FrozenSet)
57407db96d56Sopenharmony_ci
57417db96d56Sopenharmony_ci    def test_dict(self):
57427db96d56Sopenharmony_ci        self.assertIsSubclass(dict, typing.Dict)
57437db96d56Sopenharmony_ci
57447db96d56Sopenharmony_ci    def test_dict_subscribe(self):
57457db96d56Sopenharmony_ci        K = TypeVar('K')
57467db96d56Sopenharmony_ci        V = TypeVar('V')
57477db96d56Sopenharmony_ci        self.assertEqual(Dict[K, V][str, int], Dict[str, int])
57487db96d56Sopenharmony_ci        self.assertEqual(Dict[K, int][str], Dict[str, int])
57497db96d56Sopenharmony_ci        self.assertEqual(Dict[str, V][int], Dict[str, int])
57507db96d56Sopenharmony_ci        self.assertEqual(Dict[K, List[V]][str, int], Dict[str, List[int]])
57517db96d56Sopenharmony_ci        self.assertEqual(Dict[K, List[int]][str], Dict[str, List[int]])
57527db96d56Sopenharmony_ci        self.assertEqual(Dict[K, list[V]][str, int], Dict[str, list[int]])
57537db96d56Sopenharmony_ci        self.assertEqual(Dict[K, list[int]][str], Dict[str, list[int]])
57547db96d56Sopenharmony_ci
57557db96d56Sopenharmony_ci    def test_no_list_instantiation(self):
57567db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
57577db96d56Sopenharmony_ci            typing.List()
57587db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
57597db96d56Sopenharmony_ci            typing.List[T]()
57607db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
57617db96d56Sopenharmony_ci            typing.List[int]()
57627db96d56Sopenharmony_ci
57637db96d56Sopenharmony_ci    def test_list_subclass(self):
57647db96d56Sopenharmony_ci
57657db96d56Sopenharmony_ci        class MyList(typing.List[int]):
57667db96d56Sopenharmony_ci            pass
57677db96d56Sopenharmony_ci
57687db96d56Sopenharmony_ci        a = MyList()
57697db96d56Sopenharmony_ci        self.assertIsInstance(a, MyList)
57707db96d56Sopenharmony_ci        self.assertIsInstance(a, typing.Sequence)
57717db96d56Sopenharmony_ci
57727db96d56Sopenharmony_ci        self.assertIsSubclass(MyList, list)
57737db96d56Sopenharmony_ci        self.assertNotIsSubclass(list, MyList)
57747db96d56Sopenharmony_ci
57757db96d56Sopenharmony_ci    def test_no_dict_instantiation(self):
57767db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
57777db96d56Sopenharmony_ci            typing.Dict()
57787db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
57797db96d56Sopenharmony_ci            typing.Dict[KT, VT]()
57807db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
57817db96d56Sopenharmony_ci            typing.Dict[str, int]()
57827db96d56Sopenharmony_ci
57837db96d56Sopenharmony_ci    def test_dict_subclass(self):
57847db96d56Sopenharmony_ci
57857db96d56Sopenharmony_ci        class MyDict(typing.Dict[str, int]):
57867db96d56Sopenharmony_ci            pass
57877db96d56Sopenharmony_ci
57887db96d56Sopenharmony_ci        d = MyDict()
57897db96d56Sopenharmony_ci        self.assertIsInstance(d, MyDict)
57907db96d56Sopenharmony_ci        self.assertIsInstance(d, typing.MutableMapping)
57917db96d56Sopenharmony_ci
57927db96d56Sopenharmony_ci        self.assertIsSubclass(MyDict, dict)
57937db96d56Sopenharmony_ci        self.assertNotIsSubclass(dict, MyDict)
57947db96d56Sopenharmony_ci
57957db96d56Sopenharmony_ci    def test_defaultdict_instantiation(self):
57967db96d56Sopenharmony_ci        self.assertIs(type(typing.DefaultDict()), collections.defaultdict)
57977db96d56Sopenharmony_ci        self.assertIs(type(typing.DefaultDict[KT, VT]()), collections.defaultdict)
57987db96d56Sopenharmony_ci        self.assertIs(type(typing.DefaultDict[str, int]()), collections.defaultdict)
57997db96d56Sopenharmony_ci
58007db96d56Sopenharmony_ci    def test_defaultdict_subclass(self):
58017db96d56Sopenharmony_ci
58027db96d56Sopenharmony_ci        class MyDefDict(typing.DefaultDict[str, int]):
58037db96d56Sopenharmony_ci            pass
58047db96d56Sopenharmony_ci
58057db96d56Sopenharmony_ci        dd = MyDefDict()
58067db96d56Sopenharmony_ci        self.assertIsInstance(dd, MyDefDict)
58077db96d56Sopenharmony_ci
58087db96d56Sopenharmony_ci        self.assertIsSubclass(MyDefDict, collections.defaultdict)
58097db96d56Sopenharmony_ci        self.assertNotIsSubclass(collections.defaultdict, MyDefDict)
58107db96d56Sopenharmony_ci
58117db96d56Sopenharmony_ci    def test_ordereddict_instantiation(self):
58127db96d56Sopenharmony_ci        self.assertIs(type(typing.OrderedDict()), collections.OrderedDict)
58137db96d56Sopenharmony_ci        self.assertIs(type(typing.OrderedDict[KT, VT]()), collections.OrderedDict)
58147db96d56Sopenharmony_ci        self.assertIs(type(typing.OrderedDict[str, int]()), collections.OrderedDict)
58157db96d56Sopenharmony_ci
58167db96d56Sopenharmony_ci    def test_ordereddict_subclass(self):
58177db96d56Sopenharmony_ci
58187db96d56Sopenharmony_ci        class MyOrdDict(typing.OrderedDict[str, int]):
58197db96d56Sopenharmony_ci            pass
58207db96d56Sopenharmony_ci
58217db96d56Sopenharmony_ci        od = MyOrdDict()
58227db96d56Sopenharmony_ci        self.assertIsInstance(od, MyOrdDict)
58237db96d56Sopenharmony_ci
58247db96d56Sopenharmony_ci        self.assertIsSubclass(MyOrdDict, collections.OrderedDict)
58257db96d56Sopenharmony_ci        self.assertNotIsSubclass(collections.OrderedDict, MyOrdDict)
58267db96d56Sopenharmony_ci
58277db96d56Sopenharmony_ci    def test_chainmap_instantiation(self):
58287db96d56Sopenharmony_ci        self.assertIs(type(typing.ChainMap()), collections.ChainMap)
58297db96d56Sopenharmony_ci        self.assertIs(type(typing.ChainMap[KT, VT]()), collections.ChainMap)
58307db96d56Sopenharmony_ci        self.assertIs(type(typing.ChainMap[str, int]()), collections.ChainMap)
58317db96d56Sopenharmony_ci        class CM(typing.ChainMap[KT, VT]): ...
58327db96d56Sopenharmony_ci        self.assertIs(type(CM[int, str]()), CM)
58337db96d56Sopenharmony_ci
58347db96d56Sopenharmony_ci    def test_chainmap_subclass(self):
58357db96d56Sopenharmony_ci
58367db96d56Sopenharmony_ci        class MyChainMap(typing.ChainMap[str, int]):
58377db96d56Sopenharmony_ci            pass
58387db96d56Sopenharmony_ci
58397db96d56Sopenharmony_ci        cm = MyChainMap()
58407db96d56Sopenharmony_ci        self.assertIsInstance(cm, MyChainMap)
58417db96d56Sopenharmony_ci
58427db96d56Sopenharmony_ci        self.assertIsSubclass(MyChainMap, collections.ChainMap)
58437db96d56Sopenharmony_ci        self.assertNotIsSubclass(collections.ChainMap, MyChainMap)
58447db96d56Sopenharmony_ci
58457db96d56Sopenharmony_ci    def test_deque_instantiation(self):
58467db96d56Sopenharmony_ci        self.assertIs(type(typing.Deque()), collections.deque)
58477db96d56Sopenharmony_ci        self.assertIs(type(typing.Deque[T]()), collections.deque)
58487db96d56Sopenharmony_ci        self.assertIs(type(typing.Deque[int]()), collections.deque)
58497db96d56Sopenharmony_ci        class D(typing.Deque[T]): ...
58507db96d56Sopenharmony_ci        self.assertIs(type(D[int]()), D)
58517db96d56Sopenharmony_ci
58527db96d56Sopenharmony_ci    def test_counter_instantiation(self):
58537db96d56Sopenharmony_ci        self.assertIs(type(typing.Counter()), collections.Counter)
58547db96d56Sopenharmony_ci        self.assertIs(type(typing.Counter[T]()), collections.Counter)
58557db96d56Sopenharmony_ci        self.assertIs(type(typing.Counter[int]()), collections.Counter)
58567db96d56Sopenharmony_ci        class C(typing.Counter[T]): ...
58577db96d56Sopenharmony_ci        self.assertIs(type(C[int]()), C)
58587db96d56Sopenharmony_ci
58597db96d56Sopenharmony_ci    def test_counter_subclass_instantiation(self):
58607db96d56Sopenharmony_ci
58617db96d56Sopenharmony_ci        class MyCounter(typing.Counter[int]):
58627db96d56Sopenharmony_ci            pass
58637db96d56Sopenharmony_ci
58647db96d56Sopenharmony_ci        d = MyCounter()
58657db96d56Sopenharmony_ci        self.assertIsInstance(d, MyCounter)
58667db96d56Sopenharmony_ci        self.assertIsInstance(d, typing.Counter)
58677db96d56Sopenharmony_ci        self.assertIsInstance(d, collections.Counter)
58687db96d56Sopenharmony_ci
58697db96d56Sopenharmony_ci    def test_no_set_instantiation(self):
58707db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
58717db96d56Sopenharmony_ci            typing.Set()
58727db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
58737db96d56Sopenharmony_ci            typing.Set[T]()
58747db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
58757db96d56Sopenharmony_ci            typing.Set[int]()
58767db96d56Sopenharmony_ci
58777db96d56Sopenharmony_ci    def test_set_subclass_instantiation(self):
58787db96d56Sopenharmony_ci
58797db96d56Sopenharmony_ci        class MySet(typing.Set[int]):
58807db96d56Sopenharmony_ci            pass
58817db96d56Sopenharmony_ci
58827db96d56Sopenharmony_ci        d = MySet()
58837db96d56Sopenharmony_ci        self.assertIsInstance(d, MySet)
58847db96d56Sopenharmony_ci
58857db96d56Sopenharmony_ci    def test_no_frozenset_instantiation(self):
58867db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
58877db96d56Sopenharmony_ci            typing.FrozenSet()
58887db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
58897db96d56Sopenharmony_ci            typing.FrozenSet[T]()
58907db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
58917db96d56Sopenharmony_ci            typing.FrozenSet[int]()
58927db96d56Sopenharmony_ci
58937db96d56Sopenharmony_ci    def test_frozenset_subclass_instantiation(self):
58947db96d56Sopenharmony_ci
58957db96d56Sopenharmony_ci        class MyFrozenSet(typing.FrozenSet[int]):
58967db96d56Sopenharmony_ci            pass
58977db96d56Sopenharmony_ci
58987db96d56Sopenharmony_ci        d = MyFrozenSet()
58997db96d56Sopenharmony_ci        self.assertIsInstance(d, MyFrozenSet)
59007db96d56Sopenharmony_ci
59017db96d56Sopenharmony_ci    def test_no_tuple_instantiation(self):
59027db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
59037db96d56Sopenharmony_ci            Tuple()
59047db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
59057db96d56Sopenharmony_ci            Tuple[T]()
59067db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
59077db96d56Sopenharmony_ci            Tuple[int]()
59087db96d56Sopenharmony_ci
59097db96d56Sopenharmony_ci    def test_generator(self):
59107db96d56Sopenharmony_ci        def foo():
59117db96d56Sopenharmony_ci            yield 42
59127db96d56Sopenharmony_ci        g = foo()
59137db96d56Sopenharmony_ci        self.assertIsSubclass(type(g), typing.Generator)
59147db96d56Sopenharmony_ci
59157db96d56Sopenharmony_ci    def test_no_generator_instantiation(self):
59167db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
59177db96d56Sopenharmony_ci            typing.Generator()
59187db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
59197db96d56Sopenharmony_ci            typing.Generator[T, T, T]()
59207db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
59217db96d56Sopenharmony_ci            typing.Generator[int, int, int]()
59227db96d56Sopenharmony_ci
59237db96d56Sopenharmony_ci    def test_async_generator(self):
59247db96d56Sopenharmony_ci        ns = {}
59257db96d56Sopenharmony_ci        exec("async def f():\n"
59267db96d56Sopenharmony_ci             "    yield 42\n", globals(), ns)
59277db96d56Sopenharmony_ci        g = ns['f']()
59287db96d56Sopenharmony_ci        self.assertIsSubclass(type(g), typing.AsyncGenerator)
59297db96d56Sopenharmony_ci
59307db96d56Sopenharmony_ci    def test_no_async_generator_instantiation(self):
59317db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
59327db96d56Sopenharmony_ci            typing.AsyncGenerator()
59337db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
59347db96d56Sopenharmony_ci            typing.AsyncGenerator[T, T]()
59357db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
59367db96d56Sopenharmony_ci            typing.AsyncGenerator[int, int]()
59377db96d56Sopenharmony_ci
59387db96d56Sopenharmony_ci    def test_subclassing(self):
59397db96d56Sopenharmony_ci
59407db96d56Sopenharmony_ci        class MMA(typing.MutableMapping):
59417db96d56Sopenharmony_ci            pass
59427db96d56Sopenharmony_ci
59437db96d56Sopenharmony_ci        with self.assertRaises(TypeError):  # It's abstract
59447db96d56Sopenharmony_ci            MMA()
59457db96d56Sopenharmony_ci
59467db96d56Sopenharmony_ci        class MMC(MMA):
59477db96d56Sopenharmony_ci            def __getitem__(self, k):
59487db96d56Sopenharmony_ci                return None
59497db96d56Sopenharmony_ci            def __setitem__(self, k, v):
59507db96d56Sopenharmony_ci                pass
59517db96d56Sopenharmony_ci            def __delitem__(self, k):
59527db96d56Sopenharmony_ci                pass
59537db96d56Sopenharmony_ci            def __iter__(self):
59547db96d56Sopenharmony_ci                return iter(())
59557db96d56Sopenharmony_ci            def __len__(self):
59567db96d56Sopenharmony_ci                return 0
59577db96d56Sopenharmony_ci
59587db96d56Sopenharmony_ci        self.assertEqual(len(MMC()), 0)
59597db96d56Sopenharmony_ci        self.assertTrue(callable(MMC.update))
59607db96d56Sopenharmony_ci        self.assertIsInstance(MMC(), typing.Mapping)
59617db96d56Sopenharmony_ci
59627db96d56Sopenharmony_ci        class MMB(typing.MutableMapping[KT, VT]):
59637db96d56Sopenharmony_ci            def __getitem__(self, k):
59647db96d56Sopenharmony_ci                return None
59657db96d56Sopenharmony_ci            def __setitem__(self, k, v):
59667db96d56Sopenharmony_ci                pass
59677db96d56Sopenharmony_ci            def __delitem__(self, k):
59687db96d56Sopenharmony_ci                pass
59697db96d56Sopenharmony_ci            def __iter__(self):
59707db96d56Sopenharmony_ci                return iter(())
59717db96d56Sopenharmony_ci            def __len__(self):
59727db96d56Sopenharmony_ci                return 0
59737db96d56Sopenharmony_ci
59747db96d56Sopenharmony_ci        self.assertEqual(len(MMB()), 0)
59757db96d56Sopenharmony_ci        self.assertEqual(len(MMB[str, str]()), 0)
59767db96d56Sopenharmony_ci        self.assertEqual(len(MMB[KT, VT]()), 0)
59777db96d56Sopenharmony_ci
59787db96d56Sopenharmony_ci        self.assertNotIsSubclass(dict, MMA)
59797db96d56Sopenharmony_ci        self.assertNotIsSubclass(dict, MMB)
59807db96d56Sopenharmony_ci
59817db96d56Sopenharmony_ci        self.assertIsSubclass(MMA, typing.Mapping)
59827db96d56Sopenharmony_ci        self.assertIsSubclass(MMB, typing.Mapping)
59837db96d56Sopenharmony_ci        self.assertIsSubclass(MMC, typing.Mapping)
59847db96d56Sopenharmony_ci
59857db96d56Sopenharmony_ci        self.assertIsInstance(MMB[KT, VT](), typing.Mapping)
59867db96d56Sopenharmony_ci        self.assertIsInstance(MMB[KT, VT](), collections.abc.Mapping)
59877db96d56Sopenharmony_ci
59887db96d56Sopenharmony_ci        self.assertIsSubclass(MMA, collections.abc.Mapping)
59897db96d56Sopenharmony_ci        self.assertIsSubclass(MMB, collections.abc.Mapping)
59907db96d56Sopenharmony_ci        self.assertIsSubclass(MMC, collections.abc.Mapping)
59917db96d56Sopenharmony_ci
59927db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
59937db96d56Sopenharmony_ci            issubclass(MMB[str, str], typing.Mapping)
59947db96d56Sopenharmony_ci        self.assertIsSubclass(MMC, MMA)
59957db96d56Sopenharmony_ci
59967db96d56Sopenharmony_ci        class I(typing.Iterable): ...
59977db96d56Sopenharmony_ci        self.assertNotIsSubclass(list, I)
59987db96d56Sopenharmony_ci
59997db96d56Sopenharmony_ci        class G(typing.Generator[int, int, int]): ...
60007db96d56Sopenharmony_ci        def g(): yield 0
60017db96d56Sopenharmony_ci        self.assertIsSubclass(G, typing.Generator)
60027db96d56Sopenharmony_ci        self.assertIsSubclass(G, typing.Iterable)
60037db96d56Sopenharmony_ci        self.assertIsSubclass(G, collections.abc.Generator)
60047db96d56Sopenharmony_ci        self.assertIsSubclass(G, collections.abc.Iterable)
60057db96d56Sopenharmony_ci        self.assertNotIsSubclass(type(g), G)
60067db96d56Sopenharmony_ci
60077db96d56Sopenharmony_ci    def test_subclassing_async_generator(self):
60087db96d56Sopenharmony_ci        class G(typing.AsyncGenerator[int, int]):
60097db96d56Sopenharmony_ci            def asend(self, value):
60107db96d56Sopenharmony_ci                pass
60117db96d56Sopenharmony_ci            def athrow(self, typ, val=None, tb=None):
60127db96d56Sopenharmony_ci                pass
60137db96d56Sopenharmony_ci
60147db96d56Sopenharmony_ci        ns = {}
60157db96d56Sopenharmony_ci        exec('async def g(): yield 0', globals(), ns)
60167db96d56Sopenharmony_ci        g = ns['g']
60177db96d56Sopenharmony_ci        self.assertIsSubclass(G, typing.AsyncGenerator)
60187db96d56Sopenharmony_ci        self.assertIsSubclass(G, typing.AsyncIterable)
60197db96d56Sopenharmony_ci        self.assertIsSubclass(G, collections.abc.AsyncGenerator)
60207db96d56Sopenharmony_ci        self.assertIsSubclass(G, collections.abc.AsyncIterable)
60217db96d56Sopenharmony_ci        self.assertNotIsSubclass(type(g), G)
60227db96d56Sopenharmony_ci
60237db96d56Sopenharmony_ci        instance = G()
60247db96d56Sopenharmony_ci        self.assertIsInstance(instance, typing.AsyncGenerator)
60257db96d56Sopenharmony_ci        self.assertIsInstance(instance, typing.AsyncIterable)
60267db96d56Sopenharmony_ci        self.assertIsInstance(instance, collections.abc.AsyncGenerator)
60277db96d56Sopenharmony_ci        self.assertIsInstance(instance, collections.abc.AsyncIterable)
60287db96d56Sopenharmony_ci        self.assertNotIsInstance(type(g), G)
60297db96d56Sopenharmony_ci        self.assertNotIsInstance(g, G)
60307db96d56Sopenharmony_ci
60317db96d56Sopenharmony_ci    def test_subclassing_subclasshook(self):
60327db96d56Sopenharmony_ci
60337db96d56Sopenharmony_ci        class Base(typing.Iterable):
60347db96d56Sopenharmony_ci            @classmethod
60357db96d56Sopenharmony_ci            def __subclasshook__(cls, other):
60367db96d56Sopenharmony_ci                if other.__name__ == 'Foo':
60377db96d56Sopenharmony_ci                    return True
60387db96d56Sopenharmony_ci                else:
60397db96d56Sopenharmony_ci                    return False
60407db96d56Sopenharmony_ci
60417db96d56Sopenharmony_ci        class C(Base): ...
60427db96d56Sopenharmony_ci        class Foo: ...
60437db96d56Sopenharmony_ci        class Bar: ...
60447db96d56Sopenharmony_ci        self.assertIsSubclass(Foo, Base)
60457db96d56Sopenharmony_ci        self.assertIsSubclass(Foo, C)
60467db96d56Sopenharmony_ci        self.assertNotIsSubclass(Bar, C)
60477db96d56Sopenharmony_ci
60487db96d56Sopenharmony_ci    def test_subclassing_register(self):
60497db96d56Sopenharmony_ci
60507db96d56Sopenharmony_ci        class A(typing.Container): ...
60517db96d56Sopenharmony_ci        class B(A): ...
60527db96d56Sopenharmony_ci
60537db96d56Sopenharmony_ci        class C: ...
60547db96d56Sopenharmony_ci        A.register(C)
60557db96d56Sopenharmony_ci        self.assertIsSubclass(C, A)
60567db96d56Sopenharmony_ci        self.assertNotIsSubclass(C, B)
60577db96d56Sopenharmony_ci
60587db96d56Sopenharmony_ci        class D: ...
60597db96d56Sopenharmony_ci        B.register(D)
60607db96d56Sopenharmony_ci        self.assertIsSubclass(D, A)
60617db96d56Sopenharmony_ci        self.assertIsSubclass(D, B)
60627db96d56Sopenharmony_ci
60637db96d56Sopenharmony_ci        class M(): ...
60647db96d56Sopenharmony_ci        collections.abc.MutableMapping.register(M)
60657db96d56Sopenharmony_ci        self.assertIsSubclass(M, typing.Mapping)
60667db96d56Sopenharmony_ci
60677db96d56Sopenharmony_ci    def test_collections_as_base(self):
60687db96d56Sopenharmony_ci
60697db96d56Sopenharmony_ci        class M(collections.abc.Mapping): ...
60707db96d56Sopenharmony_ci        self.assertIsSubclass(M, typing.Mapping)
60717db96d56Sopenharmony_ci        self.assertIsSubclass(M, typing.Iterable)
60727db96d56Sopenharmony_ci
60737db96d56Sopenharmony_ci        class S(collections.abc.MutableSequence): ...
60747db96d56Sopenharmony_ci        self.assertIsSubclass(S, typing.MutableSequence)
60757db96d56Sopenharmony_ci        self.assertIsSubclass(S, typing.Iterable)
60767db96d56Sopenharmony_ci
60777db96d56Sopenharmony_ci        class I(collections.abc.Iterable): ...
60787db96d56Sopenharmony_ci        self.assertIsSubclass(I, typing.Iterable)
60797db96d56Sopenharmony_ci
60807db96d56Sopenharmony_ci        class A(collections.abc.Mapping, metaclass=abc.ABCMeta): ...
60817db96d56Sopenharmony_ci        class B: ...
60827db96d56Sopenharmony_ci        A.register(B)
60837db96d56Sopenharmony_ci        self.assertIsSubclass(B, typing.Mapping)
60847db96d56Sopenharmony_ci
60857db96d56Sopenharmony_ci    def test_or_and_ror(self):
60867db96d56Sopenharmony_ci        self.assertEqual(typing.Sized | typing.Awaitable, Union[typing.Sized, typing.Awaitable])
60877db96d56Sopenharmony_ci        self.assertEqual(typing.Coroutine | typing.Hashable, Union[typing.Coroutine, typing.Hashable])
60887db96d56Sopenharmony_ci
60897db96d56Sopenharmony_ci
60907db96d56Sopenharmony_ciclass OtherABCTests(BaseTestCase):
60917db96d56Sopenharmony_ci
60927db96d56Sopenharmony_ci    def test_contextmanager(self):
60937db96d56Sopenharmony_ci        @contextlib.contextmanager
60947db96d56Sopenharmony_ci        def manager():
60957db96d56Sopenharmony_ci            yield 42
60967db96d56Sopenharmony_ci
60977db96d56Sopenharmony_ci        cm = manager()
60987db96d56Sopenharmony_ci        self.assertIsInstance(cm, typing.ContextManager)
60997db96d56Sopenharmony_ci        self.assertNotIsInstance(42, typing.ContextManager)
61007db96d56Sopenharmony_ci
61017db96d56Sopenharmony_ci    def test_async_contextmanager(self):
61027db96d56Sopenharmony_ci        class NotACM:
61037db96d56Sopenharmony_ci            pass
61047db96d56Sopenharmony_ci        self.assertIsInstance(ACM(), typing.AsyncContextManager)
61057db96d56Sopenharmony_ci        self.assertNotIsInstance(NotACM(), typing.AsyncContextManager)
61067db96d56Sopenharmony_ci        @contextlib.contextmanager
61077db96d56Sopenharmony_ci        def manager():
61087db96d56Sopenharmony_ci            yield 42
61097db96d56Sopenharmony_ci
61107db96d56Sopenharmony_ci        cm = manager()
61117db96d56Sopenharmony_ci        self.assertNotIsInstance(cm, typing.AsyncContextManager)
61127db96d56Sopenharmony_ci        self.assertEqual(typing.AsyncContextManager[int].__args__, (int,))
61137db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
61147db96d56Sopenharmony_ci            isinstance(42, typing.AsyncContextManager[int])
61157db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
61167db96d56Sopenharmony_ci            typing.AsyncContextManager[int, str]
61177db96d56Sopenharmony_ci
61187db96d56Sopenharmony_ci
61197db96d56Sopenharmony_ciclass TypeTests(BaseTestCase):
61207db96d56Sopenharmony_ci
61217db96d56Sopenharmony_ci    def test_type_basic(self):
61227db96d56Sopenharmony_ci
61237db96d56Sopenharmony_ci        class User: pass
61247db96d56Sopenharmony_ci        class BasicUser(User): pass
61257db96d56Sopenharmony_ci        class ProUser(User): pass
61267db96d56Sopenharmony_ci
61277db96d56Sopenharmony_ci        def new_user(user_class: Type[User]) -> User:
61287db96d56Sopenharmony_ci            return user_class()
61297db96d56Sopenharmony_ci
61307db96d56Sopenharmony_ci        new_user(BasicUser)
61317db96d56Sopenharmony_ci
61327db96d56Sopenharmony_ci    def test_type_typevar(self):
61337db96d56Sopenharmony_ci
61347db96d56Sopenharmony_ci        class User: pass
61357db96d56Sopenharmony_ci        class BasicUser(User): pass
61367db96d56Sopenharmony_ci        class ProUser(User): pass
61377db96d56Sopenharmony_ci
61387db96d56Sopenharmony_ci        U = TypeVar('U', bound=User)
61397db96d56Sopenharmony_ci
61407db96d56Sopenharmony_ci        def new_user(user_class: Type[U]) -> U:
61417db96d56Sopenharmony_ci            return user_class()
61427db96d56Sopenharmony_ci
61437db96d56Sopenharmony_ci        new_user(BasicUser)
61447db96d56Sopenharmony_ci
61457db96d56Sopenharmony_ci    def test_type_optional(self):
61467db96d56Sopenharmony_ci        A = Optional[Type[BaseException]]
61477db96d56Sopenharmony_ci
61487db96d56Sopenharmony_ci        def foo(a: A) -> Optional[BaseException]:
61497db96d56Sopenharmony_ci            if a is None:
61507db96d56Sopenharmony_ci                return None
61517db96d56Sopenharmony_ci            else:
61527db96d56Sopenharmony_ci                return a()
61537db96d56Sopenharmony_ci
61547db96d56Sopenharmony_ci        self.assertIsInstance(foo(KeyboardInterrupt), KeyboardInterrupt)
61557db96d56Sopenharmony_ci        self.assertIsNone(foo(None))
61567db96d56Sopenharmony_ci
61577db96d56Sopenharmony_ci
61587db96d56Sopenharmony_ciclass TestModules(TestCase):
61597db96d56Sopenharmony_ci    func_names = ['_idfunc']
61607db96d56Sopenharmony_ci
61617db96d56Sopenharmony_ci    def test_py_functions(self):
61627db96d56Sopenharmony_ci        for fname in self.func_names:
61637db96d56Sopenharmony_ci            self.assertEqual(getattr(py_typing, fname).__module__, 'typing')
61647db96d56Sopenharmony_ci
61657db96d56Sopenharmony_ci    @skipUnless(c_typing, 'requires _typing')
61667db96d56Sopenharmony_ci    def test_c_functions(self):
61677db96d56Sopenharmony_ci        for fname in self.func_names:
61687db96d56Sopenharmony_ci            self.assertEqual(getattr(c_typing, fname).__module__, '_typing')
61697db96d56Sopenharmony_ci
61707db96d56Sopenharmony_ci
61717db96d56Sopenharmony_ciclass NewTypeTests:
61727db96d56Sopenharmony_ci    def cleanup(self):
61737db96d56Sopenharmony_ci        for f in self.module._cleanups:
61747db96d56Sopenharmony_ci            f()
61757db96d56Sopenharmony_ci
61767db96d56Sopenharmony_ci    @classmethod
61777db96d56Sopenharmony_ci    def setUpClass(cls):
61787db96d56Sopenharmony_ci        sys.modules['typing'] = cls.module
61797db96d56Sopenharmony_ci        global UserId
61807db96d56Sopenharmony_ci        UserId = cls.module.NewType('UserId', int)
61817db96d56Sopenharmony_ci        cls.UserName = cls.module.NewType(cls.__qualname__ + '.UserName', str)
61827db96d56Sopenharmony_ci
61837db96d56Sopenharmony_ci    @classmethod
61847db96d56Sopenharmony_ci    def tearDownClass(cls):
61857db96d56Sopenharmony_ci        global UserId
61867db96d56Sopenharmony_ci        del UserId
61877db96d56Sopenharmony_ci        del cls.UserName
61887db96d56Sopenharmony_ci        sys.modules['typing'] = typing
61897db96d56Sopenharmony_ci
61907db96d56Sopenharmony_ci    def tearDown(self):
61917db96d56Sopenharmony_ci        self.cleanup()
61927db96d56Sopenharmony_ci
61937db96d56Sopenharmony_ci    def test_basic(self):
61947db96d56Sopenharmony_ci        self.assertIsInstance(UserId(5), int)
61957db96d56Sopenharmony_ci        self.assertIsInstance(self.UserName('Joe'), str)
61967db96d56Sopenharmony_ci        self.assertEqual(UserId(5) + 1, 6)
61977db96d56Sopenharmony_ci
61987db96d56Sopenharmony_ci    def test_errors(self):
61997db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
62007db96d56Sopenharmony_ci            issubclass(UserId, int)
62017db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
62027db96d56Sopenharmony_ci            class D(UserId):
62037db96d56Sopenharmony_ci                pass
62047db96d56Sopenharmony_ci
62057db96d56Sopenharmony_ci    def test_or(self):
62067db96d56Sopenharmony_ci        for cls in (int, self.UserName):
62077db96d56Sopenharmony_ci            with self.subTest(cls=cls):
62087db96d56Sopenharmony_ci                self.assertEqual(UserId | cls, self.module.Union[UserId, cls])
62097db96d56Sopenharmony_ci                self.assertEqual(cls | UserId, self.module.Union[cls, UserId])
62107db96d56Sopenharmony_ci
62117db96d56Sopenharmony_ci                self.assertEqual(self.module.get_args(UserId | cls), (UserId, cls))
62127db96d56Sopenharmony_ci                self.assertEqual(self.module.get_args(cls | UserId), (cls, UserId))
62137db96d56Sopenharmony_ci
62147db96d56Sopenharmony_ci    def test_special_attrs(self):
62157db96d56Sopenharmony_ci        self.assertEqual(UserId.__name__, 'UserId')
62167db96d56Sopenharmony_ci        self.assertEqual(UserId.__qualname__, 'UserId')
62177db96d56Sopenharmony_ci        self.assertEqual(UserId.__module__, __name__)
62187db96d56Sopenharmony_ci        self.assertEqual(UserId.__supertype__, int)
62197db96d56Sopenharmony_ci
62207db96d56Sopenharmony_ci        UserName = self.UserName
62217db96d56Sopenharmony_ci        self.assertEqual(UserName.__name__, 'UserName')
62227db96d56Sopenharmony_ci        self.assertEqual(UserName.__qualname__,
62237db96d56Sopenharmony_ci                         self.__class__.__qualname__ + '.UserName')
62247db96d56Sopenharmony_ci        self.assertEqual(UserName.__module__, __name__)
62257db96d56Sopenharmony_ci        self.assertEqual(UserName.__supertype__, str)
62267db96d56Sopenharmony_ci
62277db96d56Sopenharmony_ci    def test_repr(self):
62287db96d56Sopenharmony_ci        self.assertEqual(repr(UserId), f'{__name__}.UserId')
62297db96d56Sopenharmony_ci        self.assertEqual(repr(self.UserName),
62307db96d56Sopenharmony_ci                         f'{__name__}.{self.__class__.__qualname__}.UserName')
62317db96d56Sopenharmony_ci
62327db96d56Sopenharmony_ci    def test_pickle(self):
62337db96d56Sopenharmony_ci        UserAge = self.module.NewType('UserAge', float)
62347db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
62357db96d56Sopenharmony_ci            with self.subTest(proto=proto):
62367db96d56Sopenharmony_ci                pickled = pickle.dumps(UserId, proto)
62377db96d56Sopenharmony_ci                loaded = pickle.loads(pickled)
62387db96d56Sopenharmony_ci                self.assertIs(loaded, UserId)
62397db96d56Sopenharmony_ci
62407db96d56Sopenharmony_ci                pickled = pickle.dumps(self.UserName, proto)
62417db96d56Sopenharmony_ci                loaded = pickle.loads(pickled)
62427db96d56Sopenharmony_ci                self.assertIs(loaded, self.UserName)
62437db96d56Sopenharmony_ci
62447db96d56Sopenharmony_ci                with self.assertRaises(pickle.PicklingError):
62457db96d56Sopenharmony_ci                    pickle.dumps(UserAge, proto)
62467db96d56Sopenharmony_ci
62477db96d56Sopenharmony_ci    def test_missing__name__(self):
62487db96d56Sopenharmony_ci        code = ("import typing\n"
62497db96d56Sopenharmony_ci                "NT = typing.NewType('NT', int)\n"
62507db96d56Sopenharmony_ci                )
62517db96d56Sopenharmony_ci        exec(code, {})
62527db96d56Sopenharmony_ci
62537db96d56Sopenharmony_ci    def test_error_message_when_subclassing(self):
62547db96d56Sopenharmony_ci        with self.assertRaisesRegex(
62557db96d56Sopenharmony_ci            TypeError,
62567db96d56Sopenharmony_ci            re.escape(
62577db96d56Sopenharmony_ci                "Cannot subclass an instance of NewType. Perhaps you were looking for: "
62587db96d56Sopenharmony_ci                "`ProUserId = NewType('ProUserId', UserId)`"
62597db96d56Sopenharmony_ci            )
62607db96d56Sopenharmony_ci        ):
62617db96d56Sopenharmony_ci            class ProUserId(UserId):
62627db96d56Sopenharmony_ci                ...
62637db96d56Sopenharmony_ci
62647db96d56Sopenharmony_ci
62657db96d56Sopenharmony_ciclass NewTypePythonTests(NewTypeTests, BaseTestCase):
62667db96d56Sopenharmony_ci    module = py_typing
62677db96d56Sopenharmony_ci
62687db96d56Sopenharmony_ci
62697db96d56Sopenharmony_ci@skipUnless(c_typing, 'requires _typing')
62707db96d56Sopenharmony_ciclass NewTypeCTests(NewTypeTests, BaseTestCase):
62717db96d56Sopenharmony_ci    module = c_typing
62727db96d56Sopenharmony_ci
62737db96d56Sopenharmony_ci
62747db96d56Sopenharmony_ciclass NamedTupleTests(BaseTestCase):
62757db96d56Sopenharmony_ci    class NestedEmployee(NamedTuple):
62767db96d56Sopenharmony_ci        name: str
62777db96d56Sopenharmony_ci        cool: int
62787db96d56Sopenharmony_ci
62797db96d56Sopenharmony_ci    def test_basics(self):
62807db96d56Sopenharmony_ci        Emp = NamedTuple('Emp', [('name', str), ('id', int)])
62817db96d56Sopenharmony_ci        self.assertIsSubclass(Emp, tuple)
62827db96d56Sopenharmony_ci        joe = Emp('Joe', 42)
62837db96d56Sopenharmony_ci        jim = Emp(name='Jim', id=1)
62847db96d56Sopenharmony_ci        self.assertIsInstance(joe, Emp)
62857db96d56Sopenharmony_ci        self.assertIsInstance(joe, tuple)
62867db96d56Sopenharmony_ci        self.assertEqual(joe.name, 'Joe')
62877db96d56Sopenharmony_ci        self.assertEqual(joe.id, 42)
62887db96d56Sopenharmony_ci        self.assertEqual(jim.name, 'Jim')
62897db96d56Sopenharmony_ci        self.assertEqual(jim.id, 1)
62907db96d56Sopenharmony_ci        self.assertEqual(Emp.__name__, 'Emp')
62917db96d56Sopenharmony_ci        self.assertEqual(Emp._fields, ('name', 'id'))
62927db96d56Sopenharmony_ci        self.assertEqual(Emp.__annotations__,
62937db96d56Sopenharmony_ci                         collections.OrderedDict([('name', str), ('id', int)]))
62947db96d56Sopenharmony_ci
62957db96d56Sopenharmony_ci    def test_annotation_usage(self):
62967db96d56Sopenharmony_ci        tim = CoolEmployee('Tim', 9000)
62977db96d56Sopenharmony_ci        self.assertIsInstance(tim, CoolEmployee)
62987db96d56Sopenharmony_ci        self.assertIsInstance(tim, tuple)
62997db96d56Sopenharmony_ci        self.assertEqual(tim.name, 'Tim')
63007db96d56Sopenharmony_ci        self.assertEqual(tim.cool, 9000)
63017db96d56Sopenharmony_ci        self.assertEqual(CoolEmployee.__name__, 'CoolEmployee')
63027db96d56Sopenharmony_ci        self.assertEqual(CoolEmployee._fields, ('name', 'cool'))
63037db96d56Sopenharmony_ci        self.assertEqual(CoolEmployee.__annotations__,
63047db96d56Sopenharmony_ci                         collections.OrderedDict(name=str, cool=int))
63057db96d56Sopenharmony_ci
63067db96d56Sopenharmony_ci    def test_annotation_usage_with_default(self):
63077db96d56Sopenharmony_ci        jelle = CoolEmployeeWithDefault('Jelle')
63087db96d56Sopenharmony_ci        self.assertIsInstance(jelle, CoolEmployeeWithDefault)
63097db96d56Sopenharmony_ci        self.assertIsInstance(jelle, tuple)
63107db96d56Sopenharmony_ci        self.assertEqual(jelle.name, 'Jelle')
63117db96d56Sopenharmony_ci        self.assertEqual(jelle.cool, 0)
63127db96d56Sopenharmony_ci        cooler_employee = CoolEmployeeWithDefault('Sjoerd', 1)
63137db96d56Sopenharmony_ci        self.assertEqual(cooler_employee.cool, 1)
63147db96d56Sopenharmony_ci
63157db96d56Sopenharmony_ci        self.assertEqual(CoolEmployeeWithDefault.__name__, 'CoolEmployeeWithDefault')
63167db96d56Sopenharmony_ci        self.assertEqual(CoolEmployeeWithDefault._fields, ('name', 'cool'))
63177db96d56Sopenharmony_ci        self.assertEqual(CoolEmployeeWithDefault.__annotations__,
63187db96d56Sopenharmony_ci                         dict(name=str, cool=int))
63197db96d56Sopenharmony_ci        self.assertEqual(CoolEmployeeWithDefault._field_defaults, dict(cool=0))
63207db96d56Sopenharmony_ci
63217db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
63227db96d56Sopenharmony_ci            class NonDefaultAfterDefault(NamedTuple):
63237db96d56Sopenharmony_ci                x: int = 3
63247db96d56Sopenharmony_ci                y: int
63257db96d56Sopenharmony_ci
63267db96d56Sopenharmony_ci    def test_annotation_usage_with_methods(self):
63277db96d56Sopenharmony_ci        self.assertEqual(XMeth(1).double(), 2)
63287db96d56Sopenharmony_ci        self.assertEqual(XMeth(42).x, XMeth(42)[0])
63297db96d56Sopenharmony_ci        self.assertEqual(str(XRepr(42)), '42 -> 1')
63307db96d56Sopenharmony_ci        self.assertEqual(XRepr(1, 2) + XRepr(3), 0)
63317db96d56Sopenharmony_ci
63327db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
63337db96d56Sopenharmony_ci            class XMethBad(NamedTuple):
63347db96d56Sopenharmony_ci                x: int
63357db96d56Sopenharmony_ci                def _fields(self):
63367db96d56Sopenharmony_ci                    return 'no chance for this'
63377db96d56Sopenharmony_ci
63387db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
63397db96d56Sopenharmony_ci            class XMethBad2(NamedTuple):
63407db96d56Sopenharmony_ci                x: int
63417db96d56Sopenharmony_ci                def _source(self):
63427db96d56Sopenharmony_ci                    return 'no chance for this as well'
63437db96d56Sopenharmony_ci
63447db96d56Sopenharmony_ci    def test_multiple_inheritance(self):
63457db96d56Sopenharmony_ci        class A:
63467db96d56Sopenharmony_ci            pass
63477db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
63487db96d56Sopenharmony_ci            class X(NamedTuple, A):
63497db96d56Sopenharmony_ci                x: int
63507db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
63517db96d56Sopenharmony_ci            class X(NamedTuple, tuple):
63527db96d56Sopenharmony_ci                x: int
63537db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
63547db96d56Sopenharmony_ci            class X(NamedTuple, NamedTuple):
63557db96d56Sopenharmony_ci                x: int
63567db96d56Sopenharmony_ci        class A(NamedTuple):
63577db96d56Sopenharmony_ci            x: int
63587db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
63597db96d56Sopenharmony_ci            class X(NamedTuple, A):
63607db96d56Sopenharmony_ci                y: str
63617db96d56Sopenharmony_ci
63627db96d56Sopenharmony_ci    def test_generic(self):
63637db96d56Sopenharmony_ci        class X(NamedTuple, Generic[T]):
63647db96d56Sopenharmony_ci            x: T
63657db96d56Sopenharmony_ci        self.assertEqual(X.__bases__, (tuple, Generic))
63667db96d56Sopenharmony_ci        self.assertEqual(X.__orig_bases__, (NamedTuple, Generic[T]))
63677db96d56Sopenharmony_ci        self.assertEqual(X.__mro__, (X, tuple, Generic, object))
63687db96d56Sopenharmony_ci
63697db96d56Sopenharmony_ci        class Y(Generic[T], NamedTuple):
63707db96d56Sopenharmony_ci            x: T
63717db96d56Sopenharmony_ci        self.assertEqual(Y.__bases__, (Generic, tuple))
63727db96d56Sopenharmony_ci        self.assertEqual(Y.__orig_bases__, (Generic[T], NamedTuple))
63737db96d56Sopenharmony_ci        self.assertEqual(Y.__mro__, (Y, Generic, tuple, object))
63747db96d56Sopenharmony_ci
63757db96d56Sopenharmony_ci        for G in X, Y:
63767db96d56Sopenharmony_ci            with self.subTest(type=G):
63777db96d56Sopenharmony_ci                self.assertEqual(G.__parameters__, (T,))
63787db96d56Sopenharmony_ci                A = G[int]
63797db96d56Sopenharmony_ci                self.assertIs(A.__origin__, G)
63807db96d56Sopenharmony_ci                self.assertEqual(A.__args__, (int,))
63817db96d56Sopenharmony_ci                self.assertEqual(A.__parameters__, ())
63827db96d56Sopenharmony_ci
63837db96d56Sopenharmony_ci                a = A(3)
63847db96d56Sopenharmony_ci                self.assertIs(type(a), G)
63857db96d56Sopenharmony_ci                self.assertEqual(a.x, 3)
63867db96d56Sopenharmony_ci
63877db96d56Sopenharmony_ci                with self.assertRaises(TypeError):
63887db96d56Sopenharmony_ci                    G[int, str]
63897db96d56Sopenharmony_ci
63907db96d56Sopenharmony_ci    def test_non_generic_subscript(self):
63917db96d56Sopenharmony_ci        # For backward compatibility, subscription works
63927db96d56Sopenharmony_ci        # on arbitrary NamedTuple types.
63937db96d56Sopenharmony_ci        class Group(NamedTuple):
63947db96d56Sopenharmony_ci            key: T
63957db96d56Sopenharmony_ci            group: list[T]
63967db96d56Sopenharmony_ci        A = Group[int]
63977db96d56Sopenharmony_ci        self.assertEqual(A.__origin__, Group)
63987db96d56Sopenharmony_ci        self.assertEqual(A.__parameters__, ())
63997db96d56Sopenharmony_ci        self.assertEqual(A.__args__, (int,))
64007db96d56Sopenharmony_ci        a = A(1, [2])
64017db96d56Sopenharmony_ci        self.assertIs(type(a), Group)
64027db96d56Sopenharmony_ci        self.assertEqual(a, (1, [2]))
64037db96d56Sopenharmony_ci
64047db96d56Sopenharmony_ci    def test_namedtuple_keyword_usage(self):
64057db96d56Sopenharmony_ci        LocalEmployee = NamedTuple("LocalEmployee", name=str, age=int)
64067db96d56Sopenharmony_ci        nick = LocalEmployee('Nick', 25)
64077db96d56Sopenharmony_ci        self.assertIsInstance(nick, tuple)
64087db96d56Sopenharmony_ci        self.assertEqual(nick.name, 'Nick')
64097db96d56Sopenharmony_ci        self.assertEqual(LocalEmployee.__name__, 'LocalEmployee')
64107db96d56Sopenharmony_ci        self.assertEqual(LocalEmployee._fields, ('name', 'age'))
64117db96d56Sopenharmony_ci        self.assertEqual(LocalEmployee.__annotations__, dict(name=str, age=int))
64127db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
64137db96d56Sopenharmony_ci            NamedTuple('Name', [('x', int)], y=str)
64147db96d56Sopenharmony_ci
64157db96d56Sopenharmony_ci    def test_namedtuple_special_keyword_names(self):
64167db96d56Sopenharmony_ci        NT = NamedTuple("NT", cls=type, self=object, typename=str, fields=list)
64177db96d56Sopenharmony_ci        self.assertEqual(NT.__name__, 'NT')
64187db96d56Sopenharmony_ci        self.assertEqual(NT._fields, ('cls', 'self', 'typename', 'fields'))
64197db96d56Sopenharmony_ci        a = NT(cls=str, self=42, typename='foo', fields=[('bar', tuple)])
64207db96d56Sopenharmony_ci        self.assertEqual(a.cls, str)
64217db96d56Sopenharmony_ci        self.assertEqual(a.self, 42)
64227db96d56Sopenharmony_ci        self.assertEqual(a.typename, 'foo')
64237db96d56Sopenharmony_ci        self.assertEqual(a.fields, [('bar', tuple)])
64247db96d56Sopenharmony_ci
64257db96d56Sopenharmony_ci    def test_empty_namedtuple(self):
64267db96d56Sopenharmony_ci        NT = NamedTuple('NT')
64277db96d56Sopenharmony_ci
64287db96d56Sopenharmony_ci        class CNT(NamedTuple):
64297db96d56Sopenharmony_ci            pass  # empty body
64307db96d56Sopenharmony_ci
64317db96d56Sopenharmony_ci        for struct in [NT, CNT]:
64327db96d56Sopenharmony_ci            with self.subTest(struct=struct):
64337db96d56Sopenharmony_ci                self.assertEqual(struct._fields, ())
64347db96d56Sopenharmony_ci                self.assertEqual(struct._field_defaults, {})
64357db96d56Sopenharmony_ci                self.assertEqual(struct.__annotations__, {})
64367db96d56Sopenharmony_ci                self.assertIsInstance(struct(), struct)
64377db96d56Sopenharmony_ci
64387db96d56Sopenharmony_ci    def test_namedtuple_errors(self):
64397db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
64407db96d56Sopenharmony_ci            NamedTuple.__new__()
64417db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
64427db96d56Sopenharmony_ci            NamedTuple()
64437db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
64447db96d56Sopenharmony_ci            NamedTuple('Emp', [('name', str)], None)
64457db96d56Sopenharmony_ci        with self.assertRaises(ValueError):
64467db96d56Sopenharmony_ci            NamedTuple('Emp', [('_name', str)])
64477db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
64487db96d56Sopenharmony_ci            NamedTuple(typename='Emp', name=str, id=int)
64497db96d56Sopenharmony_ci
64507db96d56Sopenharmony_ci    def test_copy_and_pickle(self):
64517db96d56Sopenharmony_ci        global Emp  # pickle wants to reference the class by name
64527db96d56Sopenharmony_ci        Emp = NamedTuple('Emp', [('name', str), ('cool', int)])
64537db96d56Sopenharmony_ci        for cls in Emp, CoolEmployee, self.NestedEmployee:
64547db96d56Sopenharmony_ci            with self.subTest(cls=cls):
64557db96d56Sopenharmony_ci                jane = cls('jane', 37)
64567db96d56Sopenharmony_ci                for proto in range(pickle.HIGHEST_PROTOCOL + 1):
64577db96d56Sopenharmony_ci                    z = pickle.dumps(jane, proto)
64587db96d56Sopenharmony_ci                    jane2 = pickle.loads(z)
64597db96d56Sopenharmony_ci                    self.assertEqual(jane2, jane)
64607db96d56Sopenharmony_ci                    self.assertIsInstance(jane2, cls)
64617db96d56Sopenharmony_ci
64627db96d56Sopenharmony_ci                jane2 = copy(jane)
64637db96d56Sopenharmony_ci                self.assertEqual(jane2, jane)
64647db96d56Sopenharmony_ci                self.assertIsInstance(jane2, cls)
64657db96d56Sopenharmony_ci
64667db96d56Sopenharmony_ci                jane2 = deepcopy(jane)
64677db96d56Sopenharmony_ci                self.assertEqual(jane2, jane)
64687db96d56Sopenharmony_ci                self.assertIsInstance(jane2, cls)
64697db96d56Sopenharmony_ci
64707db96d56Sopenharmony_ci
64717db96d56Sopenharmony_ciclass TypedDictTests(BaseTestCase):
64727db96d56Sopenharmony_ci    def test_basics_functional_syntax(self):
64737db96d56Sopenharmony_ci        Emp = TypedDict('Emp', {'name': str, 'id': int})
64747db96d56Sopenharmony_ci        self.assertIsSubclass(Emp, dict)
64757db96d56Sopenharmony_ci        self.assertIsSubclass(Emp, typing.MutableMapping)
64767db96d56Sopenharmony_ci        self.assertNotIsSubclass(Emp, collections.abc.Sequence)
64777db96d56Sopenharmony_ci        jim = Emp(name='Jim', id=1)
64787db96d56Sopenharmony_ci        self.assertIs(type(jim), dict)
64797db96d56Sopenharmony_ci        self.assertEqual(jim['name'], 'Jim')
64807db96d56Sopenharmony_ci        self.assertEqual(jim['id'], 1)
64817db96d56Sopenharmony_ci        self.assertEqual(Emp.__name__, 'Emp')
64827db96d56Sopenharmony_ci        self.assertEqual(Emp.__module__, __name__)
64837db96d56Sopenharmony_ci        self.assertEqual(Emp.__bases__, (dict,))
64847db96d56Sopenharmony_ci        self.assertEqual(Emp.__annotations__, {'name': str, 'id': int})
64857db96d56Sopenharmony_ci        self.assertEqual(Emp.__total__, True)
64867db96d56Sopenharmony_ci        self.assertEqual(Emp.__required_keys__, {'name', 'id'})
64877db96d56Sopenharmony_ci        self.assertIsInstance(Emp.__required_keys__, frozenset)
64887db96d56Sopenharmony_ci        self.assertEqual(Emp.__optional_keys__, set())
64897db96d56Sopenharmony_ci        self.assertIsInstance(Emp.__optional_keys__, frozenset)
64907db96d56Sopenharmony_ci
64917db96d56Sopenharmony_ci    def test_basics_keywords_syntax(self):
64927db96d56Sopenharmony_ci        with self.assertWarns(DeprecationWarning):
64937db96d56Sopenharmony_ci            Emp = TypedDict('Emp', name=str, id=int)
64947db96d56Sopenharmony_ci        self.assertIsSubclass(Emp, dict)
64957db96d56Sopenharmony_ci        self.assertIsSubclass(Emp, typing.MutableMapping)
64967db96d56Sopenharmony_ci        self.assertNotIsSubclass(Emp, collections.abc.Sequence)
64977db96d56Sopenharmony_ci        jim = Emp(name='Jim', id=1)
64987db96d56Sopenharmony_ci        self.assertIs(type(jim), dict)
64997db96d56Sopenharmony_ci        self.assertEqual(jim['name'], 'Jim')
65007db96d56Sopenharmony_ci        self.assertEqual(jim['id'], 1)
65017db96d56Sopenharmony_ci        self.assertEqual(Emp.__name__, 'Emp')
65027db96d56Sopenharmony_ci        self.assertEqual(Emp.__module__, __name__)
65037db96d56Sopenharmony_ci        self.assertEqual(Emp.__bases__, (dict,))
65047db96d56Sopenharmony_ci        self.assertEqual(Emp.__annotations__, {'name': str, 'id': int})
65057db96d56Sopenharmony_ci        self.assertEqual(Emp.__total__, True)
65067db96d56Sopenharmony_ci
65077db96d56Sopenharmony_ci    def test_typeddict_special_keyword_names(self):
65087db96d56Sopenharmony_ci        with self.assertWarns(DeprecationWarning):
65097db96d56Sopenharmony_ci            TD = TypedDict("TD", cls=type, self=object, typename=str, _typename=int, fields=list, _fields=dict)
65107db96d56Sopenharmony_ci        self.assertEqual(TD.__name__, 'TD')
65117db96d56Sopenharmony_ci        self.assertEqual(TD.__annotations__, {'cls': type, 'self': object, 'typename': str, '_typename': int, 'fields': list, '_fields': dict})
65127db96d56Sopenharmony_ci        a = TD(cls=str, self=42, typename='foo', _typename=53, fields=[('bar', tuple)], _fields={'baz', set})
65137db96d56Sopenharmony_ci        self.assertEqual(a['cls'], str)
65147db96d56Sopenharmony_ci        self.assertEqual(a['self'], 42)
65157db96d56Sopenharmony_ci        self.assertEqual(a['typename'], 'foo')
65167db96d56Sopenharmony_ci        self.assertEqual(a['_typename'], 53)
65177db96d56Sopenharmony_ci        self.assertEqual(a['fields'], [('bar', tuple)])
65187db96d56Sopenharmony_ci        self.assertEqual(a['_fields'], {'baz', set})
65197db96d56Sopenharmony_ci
65207db96d56Sopenharmony_ci    def test_typeddict_create_errors(self):
65217db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
65227db96d56Sopenharmony_ci            TypedDict.__new__()
65237db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
65247db96d56Sopenharmony_ci            TypedDict()
65257db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
65267db96d56Sopenharmony_ci            TypedDict('Emp', [('name', str)], None)
65277db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
65287db96d56Sopenharmony_ci            TypedDict(_typename='Emp', name=str, id=int)
65297db96d56Sopenharmony_ci
65307db96d56Sopenharmony_ci    def test_typeddict_errors(self):
65317db96d56Sopenharmony_ci        Emp = TypedDict('Emp', {'name': str, 'id': int})
65327db96d56Sopenharmony_ci        self.assertEqual(TypedDict.__module__, 'typing')
65337db96d56Sopenharmony_ci        jim = Emp(name='Jim', id=1)
65347db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
65357db96d56Sopenharmony_ci            isinstance({}, Emp)
65367db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
65377db96d56Sopenharmony_ci            isinstance(jim, Emp)
65387db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
65397db96d56Sopenharmony_ci            issubclass(dict, Emp)
65407db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
65417db96d56Sopenharmony_ci            TypedDict('Hi', [('x', int)], y=int)
65427db96d56Sopenharmony_ci
65437db96d56Sopenharmony_ci    def test_py36_class_syntax_usage(self):
65447db96d56Sopenharmony_ci        self.assertEqual(LabelPoint2D.__name__, 'LabelPoint2D')
65457db96d56Sopenharmony_ci        self.assertEqual(LabelPoint2D.__module__, __name__)
65467db96d56Sopenharmony_ci        self.assertEqual(LabelPoint2D.__annotations__, {'x': int, 'y': int, 'label': str})
65477db96d56Sopenharmony_ci        self.assertEqual(LabelPoint2D.__bases__, (dict,))
65487db96d56Sopenharmony_ci        self.assertEqual(LabelPoint2D.__total__, True)
65497db96d56Sopenharmony_ci        self.assertNotIsSubclass(LabelPoint2D, typing.Sequence)
65507db96d56Sopenharmony_ci        not_origin = Point2D(x=0, y=1)
65517db96d56Sopenharmony_ci        self.assertEqual(not_origin['x'], 0)
65527db96d56Sopenharmony_ci        self.assertEqual(not_origin['y'], 1)
65537db96d56Sopenharmony_ci        other = LabelPoint2D(x=0, y=1, label='hi')
65547db96d56Sopenharmony_ci        self.assertEqual(other['label'], 'hi')
65557db96d56Sopenharmony_ci
65567db96d56Sopenharmony_ci    def test_pickle(self):
65577db96d56Sopenharmony_ci        global EmpD  # pickle wants to reference the class by name
65587db96d56Sopenharmony_ci        EmpD = TypedDict('EmpD', {'name': str, 'id': int})
65597db96d56Sopenharmony_ci        jane = EmpD({'name': 'jane', 'id': 37})
65607db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
65617db96d56Sopenharmony_ci            z = pickle.dumps(jane, proto)
65627db96d56Sopenharmony_ci            jane2 = pickle.loads(z)
65637db96d56Sopenharmony_ci            self.assertEqual(jane2, jane)
65647db96d56Sopenharmony_ci            self.assertEqual(jane2, {'name': 'jane', 'id': 37})
65657db96d56Sopenharmony_ci            ZZ = pickle.dumps(EmpD, proto)
65667db96d56Sopenharmony_ci            EmpDnew = pickle.loads(ZZ)
65677db96d56Sopenharmony_ci            self.assertEqual(EmpDnew({'name': 'jane', 'id': 37}), jane)
65687db96d56Sopenharmony_ci
65697db96d56Sopenharmony_ci    def test_pickle_generic(self):
65707db96d56Sopenharmony_ci        point = Point2DGeneric(a=5.0, b=3.0)
65717db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
65727db96d56Sopenharmony_ci            z = pickle.dumps(point, proto)
65737db96d56Sopenharmony_ci            point2 = pickle.loads(z)
65747db96d56Sopenharmony_ci            self.assertEqual(point2, point)
65757db96d56Sopenharmony_ci            self.assertEqual(point2, {'a': 5.0, 'b': 3.0})
65767db96d56Sopenharmony_ci            ZZ = pickle.dumps(Point2DGeneric, proto)
65777db96d56Sopenharmony_ci            Point2DGenericNew = pickle.loads(ZZ)
65787db96d56Sopenharmony_ci            self.assertEqual(Point2DGenericNew({'a': 5.0, 'b': 3.0}), point)
65797db96d56Sopenharmony_ci
65807db96d56Sopenharmony_ci    def test_optional(self):
65817db96d56Sopenharmony_ci        EmpD = TypedDict('EmpD', {'name': str, 'id': int})
65827db96d56Sopenharmony_ci
65837db96d56Sopenharmony_ci        self.assertEqual(typing.Optional[EmpD], typing.Union[None, EmpD])
65847db96d56Sopenharmony_ci        self.assertNotEqual(typing.List[EmpD], typing.Tuple[EmpD])
65857db96d56Sopenharmony_ci
65867db96d56Sopenharmony_ci    def test_total(self):
65877db96d56Sopenharmony_ci        D = TypedDict('D', {'x': int}, total=False)
65887db96d56Sopenharmony_ci        self.assertEqual(D(), {})
65897db96d56Sopenharmony_ci        self.assertEqual(D(x=1), {'x': 1})
65907db96d56Sopenharmony_ci        self.assertEqual(D.__total__, False)
65917db96d56Sopenharmony_ci        self.assertEqual(D.__required_keys__, frozenset())
65927db96d56Sopenharmony_ci        self.assertIsInstance(D.__required_keys__, frozenset)
65937db96d56Sopenharmony_ci        self.assertEqual(D.__optional_keys__, {'x'})
65947db96d56Sopenharmony_ci        self.assertIsInstance(D.__optional_keys__, frozenset)
65957db96d56Sopenharmony_ci
65967db96d56Sopenharmony_ci        self.assertEqual(Options(), {})
65977db96d56Sopenharmony_ci        self.assertEqual(Options(log_level=2), {'log_level': 2})
65987db96d56Sopenharmony_ci        self.assertEqual(Options.__total__, False)
65997db96d56Sopenharmony_ci        self.assertEqual(Options.__required_keys__, frozenset())
66007db96d56Sopenharmony_ci        self.assertEqual(Options.__optional_keys__, {'log_level', 'log_path'})
66017db96d56Sopenharmony_ci
66027db96d56Sopenharmony_ci    def test_optional_keys(self):
66037db96d56Sopenharmony_ci        class Point2Dor3D(Point2D, total=False):
66047db96d56Sopenharmony_ci            z: int
66057db96d56Sopenharmony_ci
66067db96d56Sopenharmony_ci        self.assertEqual(Point2Dor3D.__required_keys__, frozenset(['x', 'y']))
66077db96d56Sopenharmony_ci        self.assertIsInstance(Point2Dor3D.__required_keys__, frozenset)
66087db96d56Sopenharmony_ci        self.assertEqual(Point2Dor3D.__optional_keys__, frozenset(['z']))
66097db96d56Sopenharmony_ci        self.assertIsInstance(Point2Dor3D.__optional_keys__, frozenset)
66107db96d56Sopenharmony_ci
66117db96d56Sopenharmony_ci    def test_keys_inheritance(self):
66127db96d56Sopenharmony_ci        class BaseAnimal(TypedDict):
66137db96d56Sopenharmony_ci            name: str
66147db96d56Sopenharmony_ci
66157db96d56Sopenharmony_ci        class Animal(BaseAnimal, total=False):
66167db96d56Sopenharmony_ci            voice: str
66177db96d56Sopenharmony_ci            tail: bool
66187db96d56Sopenharmony_ci
66197db96d56Sopenharmony_ci        class Cat(Animal):
66207db96d56Sopenharmony_ci            fur_color: str
66217db96d56Sopenharmony_ci
66227db96d56Sopenharmony_ci        self.assertEqual(BaseAnimal.__required_keys__, frozenset(['name']))
66237db96d56Sopenharmony_ci        self.assertEqual(BaseAnimal.__optional_keys__, frozenset([]))
66247db96d56Sopenharmony_ci        self.assertEqual(BaseAnimal.__annotations__, {'name': str})
66257db96d56Sopenharmony_ci
66267db96d56Sopenharmony_ci        self.assertEqual(Animal.__required_keys__, frozenset(['name']))
66277db96d56Sopenharmony_ci        self.assertEqual(Animal.__optional_keys__, frozenset(['tail', 'voice']))
66287db96d56Sopenharmony_ci        self.assertEqual(Animal.__annotations__, {
66297db96d56Sopenharmony_ci            'name': str,
66307db96d56Sopenharmony_ci            'tail': bool,
66317db96d56Sopenharmony_ci            'voice': str,
66327db96d56Sopenharmony_ci        })
66337db96d56Sopenharmony_ci
66347db96d56Sopenharmony_ci        self.assertEqual(Cat.__required_keys__, frozenset(['name', 'fur_color']))
66357db96d56Sopenharmony_ci        self.assertEqual(Cat.__optional_keys__, frozenset(['tail', 'voice']))
66367db96d56Sopenharmony_ci        self.assertEqual(Cat.__annotations__, {
66377db96d56Sopenharmony_ci            'fur_color': str,
66387db96d56Sopenharmony_ci            'name': str,
66397db96d56Sopenharmony_ci            'tail': bool,
66407db96d56Sopenharmony_ci            'voice': str,
66417db96d56Sopenharmony_ci        })
66427db96d56Sopenharmony_ci
66437db96d56Sopenharmony_ci    def test_required_notrequired_keys(self):
66447db96d56Sopenharmony_ci        self.assertEqual(NontotalMovie.__required_keys__,
66457db96d56Sopenharmony_ci                         frozenset({"title"}))
66467db96d56Sopenharmony_ci        self.assertEqual(NontotalMovie.__optional_keys__,
66477db96d56Sopenharmony_ci                         frozenset({"year"}))
66487db96d56Sopenharmony_ci
66497db96d56Sopenharmony_ci        self.assertEqual(TotalMovie.__required_keys__,
66507db96d56Sopenharmony_ci                         frozenset({"title"}))
66517db96d56Sopenharmony_ci        self.assertEqual(TotalMovie.__optional_keys__,
66527db96d56Sopenharmony_ci                         frozenset({"year"}))
66537db96d56Sopenharmony_ci
66547db96d56Sopenharmony_ci        self.assertEqual(_typed_dict_helper.VeryAnnotated.__required_keys__,
66557db96d56Sopenharmony_ci                         frozenset())
66567db96d56Sopenharmony_ci        self.assertEqual(_typed_dict_helper.VeryAnnotated.__optional_keys__,
66577db96d56Sopenharmony_ci                         frozenset({"a"}))
66587db96d56Sopenharmony_ci
66597db96d56Sopenharmony_ci        self.assertEqual(AnnotatedMovie.__required_keys__,
66607db96d56Sopenharmony_ci                         frozenset({"title"}))
66617db96d56Sopenharmony_ci        self.assertEqual(AnnotatedMovie.__optional_keys__,
66627db96d56Sopenharmony_ci                         frozenset({"year"}))
66637db96d56Sopenharmony_ci
66647db96d56Sopenharmony_ci        self.assertEqual(WeirdlyQuotedMovie.__required_keys__,
66657db96d56Sopenharmony_ci                         frozenset({"title"}))
66667db96d56Sopenharmony_ci        self.assertEqual(WeirdlyQuotedMovie.__optional_keys__,
66677db96d56Sopenharmony_ci                         frozenset({"year"}))
66687db96d56Sopenharmony_ci
66697db96d56Sopenharmony_ci        self.assertEqual(ChildTotalMovie.__required_keys__,
66707db96d56Sopenharmony_ci                         frozenset({"title"}))
66717db96d56Sopenharmony_ci        self.assertEqual(ChildTotalMovie.__optional_keys__,
66727db96d56Sopenharmony_ci                         frozenset({"year"}))
66737db96d56Sopenharmony_ci
66747db96d56Sopenharmony_ci        self.assertEqual(ChildDeeplyAnnotatedMovie.__required_keys__,
66757db96d56Sopenharmony_ci                         frozenset({"title"}))
66767db96d56Sopenharmony_ci        self.assertEqual(ChildDeeplyAnnotatedMovie.__optional_keys__,
66777db96d56Sopenharmony_ci                         frozenset({"year"}))
66787db96d56Sopenharmony_ci
66797db96d56Sopenharmony_ci    def test_multiple_inheritance(self):
66807db96d56Sopenharmony_ci        class One(TypedDict):
66817db96d56Sopenharmony_ci            one: int
66827db96d56Sopenharmony_ci        class Two(TypedDict):
66837db96d56Sopenharmony_ci            two: str
66847db96d56Sopenharmony_ci        class Untotal(TypedDict, total=False):
66857db96d56Sopenharmony_ci            untotal: str
66867db96d56Sopenharmony_ci        Inline = TypedDict('Inline', {'inline': bool})
66877db96d56Sopenharmony_ci        class Regular:
66887db96d56Sopenharmony_ci            pass
66897db96d56Sopenharmony_ci
66907db96d56Sopenharmony_ci        class Child(One, Two):
66917db96d56Sopenharmony_ci            child: bool
66927db96d56Sopenharmony_ci        self.assertEqual(
66937db96d56Sopenharmony_ci            Child.__required_keys__,
66947db96d56Sopenharmony_ci            frozenset(['one', 'two', 'child']),
66957db96d56Sopenharmony_ci        )
66967db96d56Sopenharmony_ci        self.assertEqual(
66977db96d56Sopenharmony_ci            Child.__optional_keys__,
66987db96d56Sopenharmony_ci            frozenset([]),
66997db96d56Sopenharmony_ci        )
67007db96d56Sopenharmony_ci        self.assertEqual(
67017db96d56Sopenharmony_ci            Child.__annotations__,
67027db96d56Sopenharmony_ci            {'one': int, 'two': str, 'child': bool},
67037db96d56Sopenharmony_ci        )
67047db96d56Sopenharmony_ci
67057db96d56Sopenharmony_ci        class ChildWithOptional(One, Untotal):
67067db96d56Sopenharmony_ci            child: bool
67077db96d56Sopenharmony_ci        self.assertEqual(
67087db96d56Sopenharmony_ci            ChildWithOptional.__required_keys__,
67097db96d56Sopenharmony_ci            frozenset(['one', 'child']),
67107db96d56Sopenharmony_ci        )
67117db96d56Sopenharmony_ci        self.assertEqual(
67127db96d56Sopenharmony_ci            ChildWithOptional.__optional_keys__,
67137db96d56Sopenharmony_ci            frozenset(['untotal']),
67147db96d56Sopenharmony_ci        )
67157db96d56Sopenharmony_ci        self.assertEqual(
67167db96d56Sopenharmony_ci            ChildWithOptional.__annotations__,
67177db96d56Sopenharmony_ci            {'one': int, 'untotal': str, 'child': bool},
67187db96d56Sopenharmony_ci        )
67197db96d56Sopenharmony_ci
67207db96d56Sopenharmony_ci        class ChildWithTotalFalse(One, Untotal, total=False):
67217db96d56Sopenharmony_ci            child: bool
67227db96d56Sopenharmony_ci        self.assertEqual(
67237db96d56Sopenharmony_ci            ChildWithTotalFalse.__required_keys__,
67247db96d56Sopenharmony_ci            frozenset(['one']),
67257db96d56Sopenharmony_ci        )
67267db96d56Sopenharmony_ci        self.assertEqual(
67277db96d56Sopenharmony_ci            ChildWithTotalFalse.__optional_keys__,
67287db96d56Sopenharmony_ci            frozenset(['untotal', 'child']),
67297db96d56Sopenharmony_ci        )
67307db96d56Sopenharmony_ci        self.assertEqual(
67317db96d56Sopenharmony_ci            ChildWithTotalFalse.__annotations__,
67327db96d56Sopenharmony_ci            {'one': int, 'untotal': str, 'child': bool},
67337db96d56Sopenharmony_ci        )
67347db96d56Sopenharmony_ci
67357db96d56Sopenharmony_ci        class ChildWithInlineAndOptional(Untotal, Inline):
67367db96d56Sopenharmony_ci            child: bool
67377db96d56Sopenharmony_ci        self.assertEqual(
67387db96d56Sopenharmony_ci            ChildWithInlineAndOptional.__required_keys__,
67397db96d56Sopenharmony_ci            frozenset(['inline', 'child']),
67407db96d56Sopenharmony_ci        )
67417db96d56Sopenharmony_ci        self.assertEqual(
67427db96d56Sopenharmony_ci            ChildWithInlineAndOptional.__optional_keys__,
67437db96d56Sopenharmony_ci            frozenset(['untotal']),
67447db96d56Sopenharmony_ci        )
67457db96d56Sopenharmony_ci        self.assertEqual(
67467db96d56Sopenharmony_ci            ChildWithInlineAndOptional.__annotations__,
67477db96d56Sopenharmony_ci            {'inline': bool, 'untotal': str, 'child': bool},
67487db96d56Sopenharmony_ci        )
67497db96d56Sopenharmony_ci
67507db96d56Sopenharmony_ci        wrong_bases = [
67517db96d56Sopenharmony_ci            (One, Regular),
67527db96d56Sopenharmony_ci            (Regular, One),
67537db96d56Sopenharmony_ci            (One, Two, Regular),
67547db96d56Sopenharmony_ci            (Inline, Regular),
67557db96d56Sopenharmony_ci            (Untotal, Regular),
67567db96d56Sopenharmony_ci        ]
67577db96d56Sopenharmony_ci        for bases in wrong_bases:
67587db96d56Sopenharmony_ci            with self.subTest(bases=bases):
67597db96d56Sopenharmony_ci                with self.assertRaisesRegex(
67607db96d56Sopenharmony_ci                    TypeError,
67617db96d56Sopenharmony_ci                    'cannot inherit from both a TypedDict type and a non-TypedDict',
67627db96d56Sopenharmony_ci                ):
67637db96d56Sopenharmony_ci                    class Wrong(*bases):
67647db96d56Sopenharmony_ci                        pass
67657db96d56Sopenharmony_ci
67667db96d56Sopenharmony_ci    def test_is_typeddict(self):
67677db96d56Sopenharmony_ci        self.assertIs(is_typeddict(Point2D), True)
67687db96d56Sopenharmony_ci        self.assertIs(is_typeddict(Union[str, int]), False)
67697db96d56Sopenharmony_ci        # classes, not instances
67707db96d56Sopenharmony_ci        self.assertIs(is_typeddict(Point2D()), False)
67717db96d56Sopenharmony_ci        call_based = TypedDict('call_based', {'a': int})
67727db96d56Sopenharmony_ci        self.assertIs(is_typeddict(call_based), True)
67737db96d56Sopenharmony_ci        self.assertIs(is_typeddict(call_based()), False)
67747db96d56Sopenharmony_ci
67757db96d56Sopenharmony_ci        T = TypeVar("T")
67767db96d56Sopenharmony_ci        class BarGeneric(TypedDict, Generic[T]):
67777db96d56Sopenharmony_ci            a: T
67787db96d56Sopenharmony_ci        self.assertIs(is_typeddict(BarGeneric), True)
67797db96d56Sopenharmony_ci        self.assertIs(is_typeddict(BarGeneric[int]), False)
67807db96d56Sopenharmony_ci        self.assertIs(is_typeddict(BarGeneric()), False)
67817db96d56Sopenharmony_ci
67827db96d56Sopenharmony_ci        # The TypedDict constructor is not itself a TypedDict
67837db96d56Sopenharmony_ci        self.assertIs(is_typeddict(TypedDict), False)
67847db96d56Sopenharmony_ci
67857db96d56Sopenharmony_ci    def test_get_type_hints(self):
67867db96d56Sopenharmony_ci        self.assertEqual(
67877db96d56Sopenharmony_ci            get_type_hints(Bar),
67887db96d56Sopenharmony_ci            {'a': typing.Optional[int], 'b': int}
67897db96d56Sopenharmony_ci        )
67907db96d56Sopenharmony_ci
67917db96d56Sopenharmony_ci    def test_get_type_hints_generic(self):
67927db96d56Sopenharmony_ci        self.assertEqual(
67937db96d56Sopenharmony_ci            get_type_hints(BarGeneric),
67947db96d56Sopenharmony_ci            {'a': typing.Optional[T], 'b': int}
67957db96d56Sopenharmony_ci        )
67967db96d56Sopenharmony_ci
67977db96d56Sopenharmony_ci        class FooBarGeneric(BarGeneric[int]):
67987db96d56Sopenharmony_ci            c: str
67997db96d56Sopenharmony_ci
68007db96d56Sopenharmony_ci        self.assertEqual(
68017db96d56Sopenharmony_ci            get_type_hints(FooBarGeneric),
68027db96d56Sopenharmony_ci            {'a': typing.Optional[T], 'b': int, 'c': str}
68037db96d56Sopenharmony_ci        )
68047db96d56Sopenharmony_ci
68057db96d56Sopenharmony_ci    def test_generic_inheritance(self):
68067db96d56Sopenharmony_ci        class A(TypedDict, Generic[T]):
68077db96d56Sopenharmony_ci            a: T
68087db96d56Sopenharmony_ci
68097db96d56Sopenharmony_ci        self.assertEqual(A.__bases__, (Generic, dict))
68107db96d56Sopenharmony_ci        self.assertEqual(A.__orig_bases__, (TypedDict, Generic[T]))
68117db96d56Sopenharmony_ci        self.assertEqual(A.__mro__, (A, Generic, dict, object))
68127db96d56Sopenharmony_ci        self.assertEqual(A.__parameters__, (T,))
68137db96d56Sopenharmony_ci        self.assertEqual(A[str].__parameters__, ())
68147db96d56Sopenharmony_ci        self.assertEqual(A[str].__args__, (str,))
68157db96d56Sopenharmony_ci
68167db96d56Sopenharmony_ci        class A2(Generic[T], TypedDict):
68177db96d56Sopenharmony_ci            a: T
68187db96d56Sopenharmony_ci
68197db96d56Sopenharmony_ci        self.assertEqual(A2.__bases__, (Generic, dict))
68207db96d56Sopenharmony_ci        self.assertEqual(A2.__orig_bases__, (Generic[T], TypedDict))
68217db96d56Sopenharmony_ci        self.assertEqual(A2.__mro__, (A2, Generic, dict, object))
68227db96d56Sopenharmony_ci        self.assertEqual(A2.__parameters__, (T,))
68237db96d56Sopenharmony_ci        self.assertEqual(A2[str].__parameters__, ())
68247db96d56Sopenharmony_ci        self.assertEqual(A2[str].__args__, (str,))
68257db96d56Sopenharmony_ci
68267db96d56Sopenharmony_ci        class B(A[KT], total=False):
68277db96d56Sopenharmony_ci            b: KT
68287db96d56Sopenharmony_ci
68297db96d56Sopenharmony_ci        self.assertEqual(B.__bases__, (Generic, dict))
68307db96d56Sopenharmony_ci        self.assertEqual(B.__orig_bases__, (A[KT],))
68317db96d56Sopenharmony_ci        self.assertEqual(B.__mro__, (B, Generic, dict, object))
68327db96d56Sopenharmony_ci        self.assertEqual(B.__parameters__, (KT,))
68337db96d56Sopenharmony_ci        self.assertEqual(B.__total__, False)
68347db96d56Sopenharmony_ci        self.assertEqual(B.__optional_keys__, frozenset(['b']))
68357db96d56Sopenharmony_ci        self.assertEqual(B.__required_keys__, frozenset(['a']))
68367db96d56Sopenharmony_ci
68377db96d56Sopenharmony_ci        self.assertEqual(B[str].__parameters__, ())
68387db96d56Sopenharmony_ci        self.assertEqual(B[str].__args__, (str,))
68397db96d56Sopenharmony_ci        self.assertEqual(B[str].__origin__, B)
68407db96d56Sopenharmony_ci
68417db96d56Sopenharmony_ci        class C(B[int]):
68427db96d56Sopenharmony_ci            c: int
68437db96d56Sopenharmony_ci
68447db96d56Sopenharmony_ci        self.assertEqual(C.__bases__, (Generic, dict))
68457db96d56Sopenharmony_ci        self.assertEqual(C.__orig_bases__, (B[int],))
68467db96d56Sopenharmony_ci        self.assertEqual(C.__mro__, (C, Generic, dict, object))
68477db96d56Sopenharmony_ci        self.assertEqual(C.__parameters__, ())
68487db96d56Sopenharmony_ci        self.assertEqual(C.__total__, True)
68497db96d56Sopenharmony_ci        self.assertEqual(C.__optional_keys__, frozenset(['b']))
68507db96d56Sopenharmony_ci        self.assertEqual(C.__required_keys__, frozenset(['a', 'c']))
68517db96d56Sopenharmony_ci        self.assertEqual(C.__annotations__, {
68527db96d56Sopenharmony_ci            'a': T,
68537db96d56Sopenharmony_ci            'b': KT,
68547db96d56Sopenharmony_ci            'c': int,
68557db96d56Sopenharmony_ci        })
68567db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
68577db96d56Sopenharmony_ci            C[str]
68587db96d56Sopenharmony_ci
68597db96d56Sopenharmony_ci
68607db96d56Sopenharmony_ci        class Point3D(Point2DGeneric[T], Generic[T, KT]):
68617db96d56Sopenharmony_ci            c: KT
68627db96d56Sopenharmony_ci
68637db96d56Sopenharmony_ci        self.assertEqual(Point3D.__bases__, (Generic, dict))
68647db96d56Sopenharmony_ci        self.assertEqual(Point3D.__orig_bases__, (Point2DGeneric[T], Generic[T, KT]))
68657db96d56Sopenharmony_ci        self.assertEqual(Point3D.__mro__, (Point3D, Generic, dict, object))
68667db96d56Sopenharmony_ci        self.assertEqual(Point3D.__parameters__, (T, KT))
68677db96d56Sopenharmony_ci        self.assertEqual(Point3D.__total__, True)
68687db96d56Sopenharmony_ci        self.assertEqual(Point3D.__optional_keys__, frozenset())
68697db96d56Sopenharmony_ci        self.assertEqual(Point3D.__required_keys__, frozenset(['a', 'b', 'c']))
68707db96d56Sopenharmony_ci        self.assertEqual(Point3D.__annotations__, {
68717db96d56Sopenharmony_ci            'a': T,
68727db96d56Sopenharmony_ci            'b': T,
68737db96d56Sopenharmony_ci            'c': KT,
68747db96d56Sopenharmony_ci        })
68757db96d56Sopenharmony_ci        self.assertEqual(Point3D[int, str].__origin__, Point3D)
68767db96d56Sopenharmony_ci
68777db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
68787db96d56Sopenharmony_ci            Point3D[int]
68797db96d56Sopenharmony_ci
68807db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
68817db96d56Sopenharmony_ci            class Point3D(Point2DGeneric[T], Generic[KT]):
68827db96d56Sopenharmony_ci                c: KT
68837db96d56Sopenharmony_ci
68847db96d56Sopenharmony_ci    def test_implicit_any_inheritance(self):
68857db96d56Sopenharmony_ci        class A(TypedDict, Generic[T]):
68867db96d56Sopenharmony_ci            a: T
68877db96d56Sopenharmony_ci
68887db96d56Sopenharmony_ci        class B(A[KT], total=False):
68897db96d56Sopenharmony_ci            b: KT
68907db96d56Sopenharmony_ci
68917db96d56Sopenharmony_ci        class WithImplicitAny(B):
68927db96d56Sopenharmony_ci            c: int
68937db96d56Sopenharmony_ci
68947db96d56Sopenharmony_ci        self.assertEqual(WithImplicitAny.__bases__, (Generic, dict,))
68957db96d56Sopenharmony_ci        self.assertEqual(WithImplicitAny.__mro__, (WithImplicitAny, Generic, dict, object))
68967db96d56Sopenharmony_ci        # Consistent with GenericTests.test_implicit_any
68977db96d56Sopenharmony_ci        self.assertEqual(WithImplicitAny.__parameters__, ())
68987db96d56Sopenharmony_ci        self.assertEqual(WithImplicitAny.__total__, True)
68997db96d56Sopenharmony_ci        self.assertEqual(WithImplicitAny.__optional_keys__, frozenset(['b']))
69007db96d56Sopenharmony_ci        self.assertEqual(WithImplicitAny.__required_keys__, frozenset(['a', 'c']))
69017db96d56Sopenharmony_ci        self.assertEqual(WithImplicitAny.__annotations__, {
69027db96d56Sopenharmony_ci            'a': T,
69037db96d56Sopenharmony_ci            'b': KT,
69047db96d56Sopenharmony_ci            'c': int,
69057db96d56Sopenharmony_ci        })
69067db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69077db96d56Sopenharmony_ci            WithImplicitAny[str]
69087db96d56Sopenharmony_ci
69097db96d56Sopenharmony_ci    def test_non_generic_subscript(self):
69107db96d56Sopenharmony_ci        # For backward compatibility, subscription works
69117db96d56Sopenharmony_ci        # on arbitrary TypedDict types.
69127db96d56Sopenharmony_ci        class TD(TypedDict):
69137db96d56Sopenharmony_ci            a: T
69147db96d56Sopenharmony_ci        A = TD[int]
69157db96d56Sopenharmony_ci        self.assertEqual(A.__origin__, TD)
69167db96d56Sopenharmony_ci        self.assertEqual(A.__parameters__, ())
69177db96d56Sopenharmony_ci        self.assertEqual(A.__args__, (int,))
69187db96d56Sopenharmony_ci        a = A(a = 1)
69197db96d56Sopenharmony_ci        self.assertIs(type(a), dict)
69207db96d56Sopenharmony_ci        self.assertEqual(a, {'a': 1})
69217db96d56Sopenharmony_ci
69227db96d56Sopenharmony_ci
69237db96d56Sopenharmony_ciclass RequiredTests(BaseTestCase):
69247db96d56Sopenharmony_ci
69257db96d56Sopenharmony_ci    def test_basics(self):
69267db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69277db96d56Sopenharmony_ci            Required[NotRequired]
69287db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69297db96d56Sopenharmony_ci            Required[int, str]
69307db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69317db96d56Sopenharmony_ci            Required[int][str]
69327db96d56Sopenharmony_ci
69337db96d56Sopenharmony_ci    def test_repr(self):
69347db96d56Sopenharmony_ci        self.assertEqual(repr(Required), 'typing.Required')
69357db96d56Sopenharmony_ci        cv = Required[int]
69367db96d56Sopenharmony_ci        self.assertEqual(repr(cv), 'typing.Required[int]')
69377db96d56Sopenharmony_ci        cv = Required[Employee]
69387db96d56Sopenharmony_ci        self.assertEqual(repr(cv), f'typing.Required[{__name__}.Employee]')
69397db96d56Sopenharmony_ci
69407db96d56Sopenharmony_ci    def test_cannot_subclass(self):
69417db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69427db96d56Sopenharmony_ci            class C(type(Required)):
69437db96d56Sopenharmony_ci                pass
69447db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69457db96d56Sopenharmony_ci            class C(type(Required[int])):
69467db96d56Sopenharmony_ci                pass
69477db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69487db96d56Sopenharmony_ci            class C(Required):
69497db96d56Sopenharmony_ci                pass
69507db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69517db96d56Sopenharmony_ci            class C(Required[int]):
69527db96d56Sopenharmony_ci                pass
69537db96d56Sopenharmony_ci
69547db96d56Sopenharmony_ci    def test_cannot_init(self):
69557db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69567db96d56Sopenharmony_ci            Required()
69577db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69587db96d56Sopenharmony_ci            type(Required)()
69597db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69607db96d56Sopenharmony_ci            type(Required[Optional[int]])()
69617db96d56Sopenharmony_ci
69627db96d56Sopenharmony_ci    def test_no_isinstance(self):
69637db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69647db96d56Sopenharmony_ci            isinstance(1, Required[int])
69657db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69667db96d56Sopenharmony_ci            issubclass(int, Required)
69677db96d56Sopenharmony_ci
69687db96d56Sopenharmony_ci
69697db96d56Sopenharmony_ciclass NotRequiredTests(BaseTestCase):
69707db96d56Sopenharmony_ci
69717db96d56Sopenharmony_ci    def test_basics(self):
69727db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69737db96d56Sopenharmony_ci            NotRequired[Required]
69747db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69757db96d56Sopenharmony_ci            NotRequired[int, str]
69767db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69777db96d56Sopenharmony_ci            NotRequired[int][str]
69787db96d56Sopenharmony_ci
69797db96d56Sopenharmony_ci    def test_repr(self):
69807db96d56Sopenharmony_ci        self.assertEqual(repr(NotRequired), 'typing.NotRequired')
69817db96d56Sopenharmony_ci        cv = NotRequired[int]
69827db96d56Sopenharmony_ci        self.assertEqual(repr(cv), 'typing.NotRequired[int]')
69837db96d56Sopenharmony_ci        cv = NotRequired[Employee]
69847db96d56Sopenharmony_ci        self.assertEqual(repr(cv), f'typing.NotRequired[{__name__}.Employee]')
69857db96d56Sopenharmony_ci
69867db96d56Sopenharmony_ci    def test_cannot_subclass(self):
69877db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69887db96d56Sopenharmony_ci            class C(type(NotRequired)):
69897db96d56Sopenharmony_ci                pass
69907db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69917db96d56Sopenharmony_ci            class C(type(NotRequired[int])):
69927db96d56Sopenharmony_ci                pass
69937db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69947db96d56Sopenharmony_ci            class C(NotRequired):
69957db96d56Sopenharmony_ci                pass
69967db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
69977db96d56Sopenharmony_ci            class C(NotRequired[int]):
69987db96d56Sopenharmony_ci                pass
69997db96d56Sopenharmony_ci
70007db96d56Sopenharmony_ci    def test_cannot_init(self):
70017db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
70027db96d56Sopenharmony_ci            NotRequired()
70037db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
70047db96d56Sopenharmony_ci            type(NotRequired)()
70057db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
70067db96d56Sopenharmony_ci            type(NotRequired[Optional[int]])()
70077db96d56Sopenharmony_ci
70087db96d56Sopenharmony_ci    def test_no_isinstance(self):
70097db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
70107db96d56Sopenharmony_ci            isinstance(1, NotRequired[int])
70117db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
70127db96d56Sopenharmony_ci            issubclass(int, NotRequired)
70137db96d56Sopenharmony_ci
70147db96d56Sopenharmony_ci
70157db96d56Sopenharmony_ciclass IOTests(BaseTestCase):
70167db96d56Sopenharmony_ci
70177db96d56Sopenharmony_ci    def test_io(self):
70187db96d56Sopenharmony_ci
70197db96d56Sopenharmony_ci        def stuff(a: IO) -> AnyStr:
70207db96d56Sopenharmony_ci            return a.readline()
70217db96d56Sopenharmony_ci
70227db96d56Sopenharmony_ci        a = stuff.__annotations__['a']
70237db96d56Sopenharmony_ci        self.assertEqual(a.__parameters__, (AnyStr,))
70247db96d56Sopenharmony_ci
70257db96d56Sopenharmony_ci    def test_textio(self):
70267db96d56Sopenharmony_ci
70277db96d56Sopenharmony_ci        def stuff(a: TextIO) -> str:
70287db96d56Sopenharmony_ci            return a.readline()
70297db96d56Sopenharmony_ci
70307db96d56Sopenharmony_ci        a = stuff.__annotations__['a']
70317db96d56Sopenharmony_ci        self.assertEqual(a.__parameters__, ())
70327db96d56Sopenharmony_ci
70337db96d56Sopenharmony_ci    def test_binaryio(self):
70347db96d56Sopenharmony_ci
70357db96d56Sopenharmony_ci        def stuff(a: BinaryIO) -> bytes:
70367db96d56Sopenharmony_ci            return a.readline()
70377db96d56Sopenharmony_ci
70387db96d56Sopenharmony_ci        a = stuff.__annotations__['a']
70397db96d56Sopenharmony_ci        self.assertEqual(a.__parameters__, ())
70407db96d56Sopenharmony_ci
70417db96d56Sopenharmony_ci    def test_io_submodule(self):
70427db96d56Sopenharmony_ci        with warnings.catch_warnings(record=True) as w:
70437db96d56Sopenharmony_ci            warnings.filterwarnings("default", category=DeprecationWarning)
70447db96d56Sopenharmony_ci            from typing.io import IO, TextIO, BinaryIO, __all__, __name__
70457db96d56Sopenharmony_ci            self.assertIs(IO, typing.IO)
70467db96d56Sopenharmony_ci            self.assertIs(TextIO, typing.TextIO)
70477db96d56Sopenharmony_ci            self.assertIs(BinaryIO, typing.BinaryIO)
70487db96d56Sopenharmony_ci            self.assertEqual(set(__all__), set(['IO', 'TextIO', 'BinaryIO']))
70497db96d56Sopenharmony_ci            self.assertEqual(__name__, 'typing.io')
70507db96d56Sopenharmony_ci            self.assertEqual(len(w), 1)
70517db96d56Sopenharmony_ci
70527db96d56Sopenharmony_ci
70537db96d56Sopenharmony_ciclass RETests(BaseTestCase):
70547db96d56Sopenharmony_ci    # Much of this is really testing _TypeAlias.
70557db96d56Sopenharmony_ci
70567db96d56Sopenharmony_ci    def test_basics(self):
70577db96d56Sopenharmony_ci        pat = re.compile('[a-z]+', re.I)
70587db96d56Sopenharmony_ci        self.assertIsSubclass(pat.__class__, Pattern)
70597db96d56Sopenharmony_ci        self.assertIsSubclass(type(pat), Pattern)
70607db96d56Sopenharmony_ci        self.assertIsInstance(pat, Pattern)
70617db96d56Sopenharmony_ci
70627db96d56Sopenharmony_ci        mat = pat.search('12345abcde.....')
70637db96d56Sopenharmony_ci        self.assertIsSubclass(mat.__class__, Match)
70647db96d56Sopenharmony_ci        self.assertIsSubclass(type(mat), Match)
70657db96d56Sopenharmony_ci        self.assertIsInstance(mat, Match)
70667db96d56Sopenharmony_ci
70677db96d56Sopenharmony_ci        # these should just work
70687db96d56Sopenharmony_ci        Pattern[Union[str, bytes]]
70697db96d56Sopenharmony_ci        Match[Union[bytes, str]]
70707db96d56Sopenharmony_ci
70717db96d56Sopenharmony_ci    def test_alias_equality(self):
70727db96d56Sopenharmony_ci        self.assertEqual(Pattern[str], Pattern[str])
70737db96d56Sopenharmony_ci        self.assertNotEqual(Pattern[str], Pattern[bytes])
70747db96d56Sopenharmony_ci        self.assertNotEqual(Pattern[str], Match[str])
70757db96d56Sopenharmony_ci        self.assertNotEqual(Pattern[str], str)
70767db96d56Sopenharmony_ci
70777db96d56Sopenharmony_ci    def test_errors(self):
70787db96d56Sopenharmony_ci        m = Match[Union[str, bytes]]
70797db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
70807db96d56Sopenharmony_ci            m[str]
70817db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
70827db96d56Sopenharmony_ci            # We don't support isinstance().
70837db96d56Sopenharmony_ci            isinstance(42, Pattern[str])
70847db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
70857db96d56Sopenharmony_ci            # We don't support issubclass().
70867db96d56Sopenharmony_ci            issubclass(Pattern[bytes], Pattern[str])
70877db96d56Sopenharmony_ci
70887db96d56Sopenharmony_ci    def test_repr(self):
70897db96d56Sopenharmony_ci        self.assertEqual(repr(Pattern), 'typing.Pattern')
70907db96d56Sopenharmony_ci        self.assertEqual(repr(Pattern[str]), 'typing.Pattern[str]')
70917db96d56Sopenharmony_ci        self.assertEqual(repr(Pattern[bytes]), 'typing.Pattern[bytes]')
70927db96d56Sopenharmony_ci        self.assertEqual(repr(Match), 'typing.Match')
70937db96d56Sopenharmony_ci        self.assertEqual(repr(Match[str]), 'typing.Match[str]')
70947db96d56Sopenharmony_ci        self.assertEqual(repr(Match[bytes]), 'typing.Match[bytes]')
70957db96d56Sopenharmony_ci
70967db96d56Sopenharmony_ci    def test_re_submodule(self):
70977db96d56Sopenharmony_ci        with warnings.catch_warnings(record=True) as w:
70987db96d56Sopenharmony_ci            warnings.filterwarnings("default", category=DeprecationWarning)
70997db96d56Sopenharmony_ci            from typing.re import Match, Pattern, __all__, __name__
71007db96d56Sopenharmony_ci            self.assertIs(Match, typing.Match)
71017db96d56Sopenharmony_ci            self.assertIs(Pattern, typing.Pattern)
71027db96d56Sopenharmony_ci            self.assertEqual(set(__all__), set(['Match', 'Pattern']))
71037db96d56Sopenharmony_ci            self.assertEqual(__name__, 'typing.re')
71047db96d56Sopenharmony_ci            self.assertEqual(len(w), 1)
71057db96d56Sopenharmony_ci
71067db96d56Sopenharmony_ci    def test_cannot_subclass(self):
71077db96d56Sopenharmony_ci        with self.assertRaises(TypeError) as ex:
71087db96d56Sopenharmony_ci
71097db96d56Sopenharmony_ci            class A(typing.Match):
71107db96d56Sopenharmony_ci                pass
71117db96d56Sopenharmony_ci
71127db96d56Sopenharmony_ci        self.assertEqual(str(ex.exception),
71137db96d56Sopenharmony_ci                         "type 're.Match' is not an acceptable base type")
71147db96d56Sopenharmony_ci
71157db96d56Sopenharmony_ci
71167db96d56Sopenharmony_ciclass AnnotatedTests(BaseTestCase):
71177db96d56Sopenharmony_ci
71187db96d56Sopenharmony_ci    def test_new(self):
71197db96d56Sopenharmony_ci        with self.assertRaisesRegex(
71207db96d56Sopenharmony_ci            TypeError,
71217db96d56Sopenharmony_ci            'Type Annotated cannot be instantiated',
71227db96d56Sopenharmony_ci        ):
71237db96d56Sopenharmony_ci            Annotated()
71247db96d56Sopenharmony_ci
71257db96d56Sopenharmony_ci    def test_repr(self):
71267db96d56Sopenharmony_ci        self.assertEqual(
71277db96d56Sopenharmony_ci            repr(Annotated[int, 4, 5]),
71287db96d56Sopenharmony_ci            "typing.Annotated[int, 4, 5]"
71297db96d56Sopenharmony_ci        )
71307db96d56Sopenharmony_ci        self.assertEqual(
71317db96d56Sopenharmony_ci            repr(Annotated[List[int], 4, 5]),
71327db96d56Sopenharmony_ci            "typing.Annotated[typing.List[int], 4, 5]"
71337db96d56Sopenharmony_ci        )
71347db96d56Sopenharmony_ci
71357db96d56Sopenharmony_ci    def test_dir(self):
71367db96d56Sopenharmony_ci        dir_items = set(dir(Annotated[int, 4]))
71377db96d56Sopenharmony_ci        for required_item in [
71387db96d56Sopenharmony_ci            '__args__', '__parameters__', '__origin__',
71397db96d56Sopenharmony_ci            '__metadata__',
71407db96d56Sopenharmony_ci        ]:
71417db96d56Sopenharmony_ci            with self.subTest(required_item=required_item):
71427db96d56Sopenharmony_ci                self.assertIn(required_item, dir_items)
71437db96d56Sopenharmony_ci
71447db96d56Sopenharmony_ci    def test_flatten(self):
71457db96d56Sopenharmony_ci        A = Annotated[Annotated[int, 4], 5]
71467db96d56Sopenharmony_ci        self.assertEqual(A, Annotated[int, 4, 5])
71477db96d56Sopenharmony_ci        self.assertEqual(A.__metadata__, (4, 5))
71487db96d56Sopenharmony_ci        self.assertEqual(A.__origin__, int)
71497db96d56Sopenharmony_ci
71507db96d56Sopenharmony_ci    def test_specialize(self):
71517db96d56Sopenharmony_ci        L = Annotated[List[T], "my decoration"]
71527db96d56Sopenharmony_ci        LI = Annotated[List[int], "my decoration"]
71537db96d56Sopenharmony_ci        self.assertEqual(L[int], Annotated[List[int], "my decoration"])
71547db96d56Sopenharmony_ci        self.assertEqual(L[int].__metadata__, ("my decoration",))
71557db96d56Sopenharmony_ci        self.assertEqual(L[int].__origin__, List[int])
71567db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
71577db96d56Sopenharmony_ci            LI[int]
71587db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
71597db96d56Sopenharmony_ci            L[int, float]
71607db96d56Sopenharmony_ci
71617db96d56Sopenharmony_ci    def test_hash_eq(self):
71627db96d56Sopenharmony_ci        self.assertEqual(len({Annotated[int, 4, 5], Annotated[int, 4, 5]}), 1)
71637db96d56Sopenharmony_ci        self.assertNotEqual(Annotated[int, 4, 5], Annotated[int, 5, 4])
71647db96d56Sopenharmony_ci        self.assertNotEqual(Annotated[int, 4, 5], Annotated[str, 4, 5])
71657db96d56Sopenharmony_ci        self.assertNotEqual(Annotated[int, 4], Annotated[int, 4, 4])
71667db96d56Sopenharmony_ci        self.assertEqual(
71677db96d56Sopenharmony_ci            {Annotated[int, 4, 5], Annotated[int, 4, 5], Annotated[T, 4, 5]},
71687db96d56Sopenharmony_ci            {Annotated[int, 4, 5], Annotated[T, 4, 5]}
71697db96d56Sopenharmony_ci        )
71707db96d56Sopenharmony_ci
71717db96d56Sopenharmony_ci    def test_instantiate(self):
71727db96d56Sopenharmony_ci        class C:
71737db96d56Sopenharmony_ci            classvar = 4
71747db96d56Sopenharmony_ci
71757db96d56Sopenharmony_ci            def __init__(self, x):
71767db96d56Sopenharmony_ci                self.x = x
71777db96d56Sopenharmony_ci
71787db96d56Sopenharmony_ci            def __eq__(self, other):
71797db96d56Sopenharmony_ci                if not isinstance(other, C):
71807db96d56Sopenharmony_ci                    return NotImplemented
71817db96d56Sopenharmony_ci                return other.x == self.x
71827db96d56Sopenharmony_ci
71837db96d56Sopenharmony_ci        A = Annotated[C, "a decoration"]
71847db96d56Sopenharmony_ci        a = A(5)
71857db96d56Sopenharmony_ci        c = C(5)
71867db96d56Sopenharmony_ci        self.assertEqual(a, c)
71877db96d56Sopenharmony_ci        self.assertEqual(a.x, c.x)
71887db96d56Sopenharmony_ci        self.assertEqual(a.classvar, c.classvar)
71897db96d56Sopenharmony_ci
71907db96d56Sopenharmony_ci    def test_instantiate_generic(self):
71917db96d56Sopenharmony_ci        MyCount = Annotated[typing.Counter[T], "my decoration"]
71927db96d56Sopenharmony_ci        self.assertEqual(MyCount([4, 4, 5]), {4: 2, 5: 1})
71937db96d56Sopenharmony_ci        self.assertEqual(MyCount[int]([4, 4, 5]), {4: 2, 5: 1})
71947db96d56Sopenharmony_ci
71957db96d56Sopenharmony_ci    def test_cannot_instantiate_forward(self):
71967db96d56Sopenharmony_ci        A = Annotated["int", (5, 6)]
71977db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
71987db96d56Sopenharmony_ci            A(5)
71997db96d56Sopenharmony_ci
72007db96d56Sopenharmony_ci    def test_cannot_instantiate_type_var(self):
72017db96d56Sopenharmony_ci        A = Annotated[T, (5, 6)]
72027db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
72037db96d56Sopenharmony_ci            A(5)
72047db96d56Sopenharmony_ci
72057db96d56Sopenharmony_ci    def test_cannot_getattr_typevar(self):
72067db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
72077db96d56Sopenharmony_ci            Annotated[T, (5, 7)].x
72087db96d56Sopenharmony_ci
72097db96d56Sopenharmony_ci    def test_attr_passthrough(self):
72107db96d56Sopenharmony_ci        class C:
72117db96d56Sopenharmony_ci            classvar = 4
72127db96d56Sopenharmony_ci
72137db96d56Sopenharmony_ci        A = Annotated[C, "a decoration"]
72147db96d56Sopenharmony_ci        self.assertEqual(A.classvar, 4)
72157db96d56Sopenharmony_ci        A.x = 5
72167db96d56Sopenharmony_ci        self.assertEqual(C.x, 5)
72177db96d56Sopenharmony_ci
72187db96d56Sopenharmony_ci    def test_special_form_containment(self):
72197db96d56Sopenharmony_ci        class C:
72207db96d56Sopenharmony_ci            classvar: Annotated[ClassVar[int], "a decoration"] = 4
72217db96d56Sopenharmony_ci            const: Annotated[Final[int], "Const"] = 4
72227db96d56Sopenharmony_ci
72237db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(C, globals())['classvar'], ClassVar[int])
72247db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(C, globals())['const'], Final[int])
72257db96d56Sopenharmony_ci
72267db96d56Sopenharmony_ci    def test_cannot_subclass(self):
72277db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "Cannot subclass .*Annotated"):
72287db96d56Sopenharmony_ci            class C(Annotated):
72297db96d56Sopenharmony_ci                pass
72307db96d56Sopenharmony_ci
72317db96d56Sopenharmony_ci    def test_cannot_check_instance(self):
72327db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
72337db96d56Sopenharmony_ci            isinstance(5, Annotated[int, "positive"])
72347db96d56Sopenharmony_ci
72357db96d56Sopenharmony_ci    def test_cannot_check_subclass(self):
72367db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
72377db96d56Sopenharmony_ci            issubclass(int, Annotated[int, "positive"])
72387db96d56Sopenharmony_ci
72397db96d56Sopenharmony_ci    def test_too_few_type_args(self):
72407db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, 'at least two arguments'):
72417db96d56Sopenharmony_ci            Annotated[int]
72427db96d56Sopenharmony_ci
72437db96d56Sopenharmony_ci    def test_pickle(self):
72447db96d56Sopenharmony_ci        samples = [typing.Any, typing.Union[int, str],
72457db96d56Sopenharmony_ci                   typing.Optional[str], Tuple[int, ...],
72467db96d56Sopenharmony_ci                   typing.Callable[[str], bytes]]
72477db96d56Sopenharmony_ci
72487db96d56Sopenharmony_ci        for t in samples:
72497db96d56Sopenharmony_ci            x = Annotated[t, "a"]
72507db96d56Sopenharmony_ci
72517db96d56Sopenharmony_ci            for prot in range(pickle.HIGHEST_PROTOCOL + 1):
72527db96d56Sopenharmony_ci                with self.subTest(protocol=prot, type=t):
72537db96d56Sopenharmony_ci                    pickled = pickle.dumps(x, prot)
72547db96d56Sopenharmony_ci                    restored = pickle.loads(pickled)
72557db96d56Sopenharmony_ci                    self.assertEqual(x, restored)
72567db96d56Sopenharmony_ci
72577db96d56Sopenharmony_ci        global _Annotated_test_G
72587db96d56Sopenharmony_ci
72597db96d56Sopenharmony_ci        class _Annotated_test_G(Generic[T]):
72607db96d56Sopenharmony_ci            x = 1
72617db96d56Sopenharmony_ci
72627db96d56Sopenharmony_ci        G = Annotated[_Annotated_test_G[int], "A decoration"]
72637db96d56Sopenharmony_ci        G.foo = 42
72647db96d56Sopenharmony_ci        G.bar = 'abc'
72657db96d56Sopenharmony_ci
72667db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
72677db96d56Sopenharmony_ci            z = pickle.dumps(G, proto)
72687db96d56Sopenharmony_ci            x = pickle.loads(z)
72697db96d56Sopenharmony_ci            self.assertEqual(x.foo, 42)
72707db96d56Sopenharmony_ci            self.assertEqual(x.bar, 'abc')
72717db96d56Sopenharmony_ci            self.assertEqual(x.x, 1)
72727db96d56Sopenharmony_ci
72737db96d56Sopenharmony_ci    def test_subst(self):
72747db96d56Sopenharmony_ci        dec = "a decoration"
72757db96d56Sopenharmony_ci        dec2 = "another decoration"
72767db96d56Sopenharmony_ci
72777db96d56Sopenharmony_ci        S = Annotated[T, dec2]
72787db96d56Sopenharmony_ci        self.assertEqual(S[int], Annotated[int, dec2])
72797db96d56Sopenharmony_ci
72807db96d56Sopenharmony_ci        self.assertEqual(S[Annotated[int, dec]], Annotated[int, dec, dec2])
72817db96d56Sopenharmony_ci        L = Annotated[List[T], dec]
72827db96d56Sopenharmony_ci
72837db96d56Sopenharmony_ci        self.assertEqual(L[int], Annotated[List[int], dec])
72847db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
72857db96d56Sopenharmony_ci            L[int, int]
72867db96d56Sopenharmony_ci
72877db96d56Sopenharmony_ci        self.assertEqual(S[L[int]], Annotated[List[int], dec, dec2])
72887db96d56Sopenharmony_ci
72897db96d56Sopenharmony_ci        D = Annotated[typing.Dict[KT, VT], dec]
72907db96d56Sopenharmony_ci        self.assertEqual(D[str, int], Annotated[typing.Dict[str, int], dec])
72917db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
72927db96d56Sopenharmony_ci            D[int]
72937db96d56Sopenharmony_ci
72947db96d56Sopenharmony_ci        It = Annotated[int, dec]
72957db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
72967db96d56Sopenharmony_ci            It[None]
72977db96d56Sopenharmony_ci
72987db96d56Sopenharmony_ci        LI = L[int]
72997db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
73007db96d56Sopenharmony_ci            LI[None]
73017db96d56Sopenharmony_ci
73027db96d56Sopenharmony_ci    def test_typevar_subst(self):
73037db96d56Sopenharmony_ci        dec = "a decoration"
73047db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
73057db96d56Sopenharmony_ci        T = TypeVar('T')
73067db96d56Sopenharmony_ci        T1 = TypeVar('T1')
73077db96d56Sopenharmony_ci        T2 = TypeVar('T2')
73087db96d56Sopenharmony_ci
73097db96d56Sopenharmony_ci        A = Annotated[tuple[*Ts], dec]
73107db96d56Sopenharmony_ci        self.assertEqual(A[int], Annotated[tuple[int], dec])
73117db96d56Sopenharmony_ci        self.assertEqual(A[str, int], Annotated[tuple[str, int], dec])
73127db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
73137db96d56Sopenharmony_ci            Annotated[*Ts, dec]
73147db96d56Sopenharmony_ci
73157db96d56Sopenharmony_ci        B = Annotated[Tuple[Unpack[Ts]], dec]
73167db96d56Sopenharmony_ci        self.assertEqual(B[int], Annotated[Tuple[int], dec])
73177db96d56Sopenharmony_ci        self.assertEqual(B[str, int], Annotated[Tuple[str, int], dec])
73187db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
73197db96d56Sopenharmony_ci            Annotated[Unpack[Ts], dec]
73207db96d56Sopenharmony_ci
73217db96d56Sopenharmony_ci        C = Annotated[tuple[T, *Ts], dec]
73227db96d56Sopenharmony_ci        self.assertEqual(C[int], Annotated[tuple[int], dec])
73237db96d56Sopenharmony_ci        self.assertEqual(C[int, str], Annotated[tuple[int, str], dec])
73247db96d56Sopenharmony_ci        self.assertEqual(
73257db96d56Sopenharmony_ci            C[int, str, float],
73267db96d56Sopenharmony_ci            Annotated[tuple[int, str, float], dec]
73277db96d56Sopenharmony_ci        )
73287db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
73297db96d56Sopenharmony_ci            C[()]
73307db96d56Sopenharmony_ci
73317db96d56Sopenharmony_ci        D = Annotated[Tuple[T, Unpack[Ts]], dec]
73327db96d56Sopenharmony_ci        self.assertEqual(D[int], Annotated[Tuple[int], dec])
73337db96d56Sopenharmony_ci        self.assertEqual(D[int, str], Annotated[Tuple[int, str], dec])
73347db96d56Sopenharmony_ci        self.assertEqual(
73357db96d56Sopenharmony_ci            D[int, str, float],
73367db96d56Sopenharmony_ci            Annotated[Tuple[int, str, float], dec]
73377db96d56Sopenharmony_ci        )
73387db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
73397db96d56Sopenharmony_ci            D[()]
73407db96d56Sopenharmony_ci
73417db96d56Sopenharmony_ci        E = Annotated[tuple[*Ts, T], dec]
73427db96d56Sopenharmony_ci        self.assertEqual(E[int], Annotated[tuple[int], dec])
73437db96d56Sopenharmony_ci        self.assertEqual(E[int, str], Annotated[tuple[int, str], dec])
73447db96d56Sopenharmony_ci        self.assertEqual(
73457db96d56Sopenharmony_ci            E[int, str, float],
73467db96d56Sopenharmony_ci            Annotated[tuple[int, str, float], dec]
73477db96d56Sopenharmony_ci        )
73487db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
73497db96d56Sopenharmony_ci            E[()]
73507db96d56Sopenharmony_ci
73517db96d56Sopenharmony_ci        F = Annotated[Tuple[Unpack[Ts], T], dec]
73527db96d56Sopenharmony_ci        self.assertEqual(F[int], Annotated[Tuple[int], dec])
73537db96d56Sopenharmony_ci        self.assertEqual(F[int, str], Annotated[Tuple[int, str], dec])
73547db96d56Sopenharmony_ci        self.assertEqual(
73557db96d56Sopenharmony_ci            F[int, str, float],
73567db96d56Sopenharmony_ci            Annotated[Tuple[int, str, float], dec]
73577db96d56Sopenharmony_ci        )
73587db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
73597db96d56Sopenharmony_ci            F[()]
73607db96d56Sopenharmony_ci
73617db96d56Sopenharmony_ci        G = Annotated[tuple[T1, *Ts, T2], dec]
73627db96d56Sopenharmony_ci        self.assertEqual(G[int, str], Annotated[tuple[int, str], dec])
73637db96d56Sopenharmony_ci        self.assertEqual(
73647db96d56Sopenharmony_ci            G[int, str, float],
73657db96d56Sopenharmony_ci            Annotated[tuple[int, str, float], dec]
73667db96d56Sopenharmony_ci        )
73677db96d56Sopenharmony_ci        self.assertEqual(
73687db96d56Sopenharmony_ci            G[int, str, bool, float],
73697db96d56Sopenharmony_ci            Annotated[tuple[int, str, bool, float], dec]
73707db96d56Sopenharmony_ci        )
73717db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
73727db96d56Sopenharmony_ci            G[int]
73737db96d56Sopenharmony_ci
73747db96d56Sopenharmony_ci        H = Annotated[Tuple[T1, Unpack[Ts], T2], dec]
73757db96d56Sopenharmony_ci        self.assertEqual(H[int, str], Annotated[Tuple[int, str], dec])
73767db96d56Sopenharmony_ci        self.assertEqual(
73777db96d56Sopenharmony_ci            H[int, str, float],
73787db96d56Sopenharmony_ci            Annotated[Tuple[int, str, float], dec]
73797db96d56Sopenharmony_ci        )
73807db96d56Sopenharmony_ci        self.assertEqual(
73817db96d56Sopenharmony_ci            H[int, str, bool, float],
73827db96d56Sopenharmony_ci            Annotated[Tuple[int, str, bool, float], dec]
73837db96d56Sopenharmony_ci        )
73847db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
73857db96d56Sopenharmony_ci            H[int]
73867db96d56Sopenharmony_ci
73877db96d56Sopenharmony_ci        # Now let's try creating an alias from an alias.
73887db96d56Sopenharmony_ci
73897db96d56Sopenharmony_ci        Ts2 = TypeVarTuple('Ts2')
73907db96d56Sopenharmony_ci        T3 = TypeVar('T3')
73917db96d56Sopenharmony_ci        T4 = TypeVar('T4')
73927db96d56Sopenharmony_ci
73937db96d56Sopenharmony_ci        # G is Annotated[tuple[T1, *Ts, T2], dec].
73947db96d56Sopenharmony_ci        I = G[T3, *Ts2, T4]
73957db96d56Sopenharmony_ci        J = G[T3, Unpack[Ts2], T4]
73967db96d56Sopenharmony_ci
73977db96d56Sopenharmony_ci        for x, y in [
73987db96d56Sopenharmony_ci            (I,                  Annotated[tuple[T3, *Ts2, T4], dec]),
73997db96d56Sopenharmony_ci            (J,                  Annotated[tuple[T3, Unpack[Ts2], T4], dec]),
74007db96d56Sopenharmony_ci            (I[int, str],        Annotated[tuple[int, str], dec]),
74017db96d56Sopenharmony_ci            (J[int, str],        Annotated[tuple[int, str], dec]),
74027db96d56Sopenharmony_ci            (I[int, str, float], Annotated[tuple[int, str, float], dec]),
74037db96d56Sopenharmony_ci            (J[int, str, float], Annotated[tuple[int, str, float], dec]),
74047db96d56Sopenharmony_ci            (I[int, str, bool, float],
74057db96d56Sopenharmony_ci                                 Annotated[tuple[int, str, bool, float], dec]),
74067db96d56Sopenharmony_ci            (J[int, str, bool, float],
74077db96d56Sopenharmony_ci                                 Annotated[tuple[int, str, bool, float], dec]),
74087db96d56Sopenharmony_ci        ]:
74097db96d56Sopenharmony_ci            self.assertEqual(x, y)
74107db96d56Sopenharmony_ci
74117db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
74127db96d56Sopenharmony_ci            I[int]
74137db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
74147db96d56Sopenharmony_ci            J[int]
74157db96d56Sopenharmony_ci
74167db96d56Sopenharmony_ci    def test_annotated_in_other_types(self):
74177db96d56Sopenharmony_ci        X = List[Annotated[T, 5]]
74187db96d56Sopenharmony_ci        self.assertEqual(X[int], List[Annotated[int, 5]])
74197db96d56Sopenharmony_ci
74207db96d56Sopenharmony_ci    def test_annotated_mro(self):
74217db96d56Sopenharmony_ci        class X(Annotated[int, (1, 10)]): ...
74227db96d56Sopenharmony_ci        self.assertEqual(X.__mro__, (X, int, object),
74237db96d56Sopenharmony_ci                         "Annotated should be transparent.")
74247db96d56Sopenharmony_ci
74257db96d56Sopenharmony_ci
74267db96d56Sopenharmony_ciclass TypeAliasTests(BaseTestCase):
74277db96d56Sopenharmony_ci    def test_canonical_usage_with_variable_annotation(self):
74287db96d56Sopenharmony_ci        Alias: TypeAlias = Employee
74297db96d56Sopenharmony_ci
74307db96d56Sopenharmony_ci    def test_canonical_usage_with_type_comment(self):
74317db96d56Sopenharmony_ci        Alias = Employee  # type: TypeAlias
74327db96d56Sopenharmony_ci
74337db96d56Sopenharmony_ci    def test_cannot_instantiate(self):
74347db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
74357db96d56Sopenharmony_ci            TypeAlias()
74367db96d56Sopenharmony_ci
74377db96d56Sopenharmony_ci    def test_no_isinstance(self):
74387db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
74397db96d56Sopenharmony_ci            isinstance(42, TypeAlias)
74407db96d56Sopenharmony_ci
74417db96d56Sopenharmony_ci    def test_stringized_usage(self):
74427db96d56Sopenharmony_ci        class A:
74437db96d56Sopenharmony_ci            a: "TypeAlias"
74447db96d56Sopenharmony_ci        self.assertEqual(get_type_hints(A), {'a': TypeAlias})
74457db96d56Sopenharmony_ci
74467db96d56Sopenharmony_ci    def test_no_issubclass(self):
74477db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
74487db96d56Sopenharmony_ci            issubclass(Employee, TypeAlias)
74497db96d56Sopenharmony_ci
74507db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
74517db96d56Sopenharmony_ci            issubclass(TypeAlias, Employee)
74527db96d56Sopenharmony_ci
74537db96d56Sopenharmony_ci    def test_cannot_subclass(self):
74547db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
74557db96d56Sopenharmony_ci            class C(TypeAlias):
74567db96d56Sopenharmony_ci                pass
74577db96d56Sopenharmony_ci
74587db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
74597db96d56Sopenharmony_ci            class C(type(TypeAlias)):
74607db96d56Sopenharmony_ci                pass
74617db96d56Sopenharmony_ci
74627db96d56Sopenharmony_ci    def test_repr(self):
74637db96d56Sopenharmony_ci        self.assertEqual(repr(TypeAlias), 'typing.TypeAlias')
74647db96d56Sopenharmony_ci
74657db96d56Sopenharmony_ci    def test_cannot_subscript(self):
74667db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
74677db96d56Sopenharmony_ci            TypeAlias[int]
74687db96d56Sopenharmony_ci
74697db96d56Sopenharmony_ci
74707db96d56Sopenharmony_ciclass ParamSpecTests(BaseTestCase):
74717db96d56Sopenharmony_ci
74727db96d56Sopenharmony_ci    def test_basic_plain(self):
74737db96d56Sopenharmony_ci        P = ParamSpec('P')
74747db96d56Sopenharmony_ci        self.assertEqual(P, P)
74757db96d56Sopenharmony_ci        self.assertIsInstance(P, ParamSpec)
74767db96d56Sopenharmony_ci        self.assertEqual(P.__name__, 'P')
74777db96d56Sopenharmony_ci
74787db96d56Sopenharmony_ci    def test_valid_uses(self):
74797db96d56Sopenharmony_ci        P = ParamSpec('P')
74807db96d56Sopenharmony_ci        T = TypeVar('T')
74817db96d56Sopenharmony_ci        C1 = Callable[P, int]
74827db96d56Sopenharmony_ci        self.assertEqual(C1.__args__, (P, int))
74837db96d56Sopenharmony_ci        self.assertEqual(C1.__parameters__, (P,))
74847db96d56Sopenharmony_ci        C2 = Callable[P, T]
74857db96d56Sopenharmony_ci        self.assertEqual(C2.__args__, (P, T))
74867db96d56Sopenharmony_ci        self.assertEqual(C2.__parameters__, (P, T))
74877db96d56Sopenharmony_ci        # Test collections.abc.Callable too.
74887db96d56Sopenharmony_ci        C3 = collections.abc.Callable[P, int]
74897db96d56Sopenharmony_ci        self.assertEqual(C3.__args__, (P, int))
74907db96d56Sopenharmony_ci        self.assertEqual(C3.__parameters__, (P,))
74917db96d56Sopenharmony_ci        C4 = collections.abc.Callable[P, T]
74927db96d56Sopenharmony_ci        self.assertEqual(C4.__args__, (P, T))
74937db96d56Sopenharmony_ci        self.assertEqual(C4.__parameters__, (P, T))
74947db96d56Sopenharmony_ci
74957db96d56Sopenharmony_ci    def test_args_kwargs(self):
74967db96d56Sopenharmony_ci        P = ParamSpec('P')
74977db96d56Sopenharmony_ci        P_2 = ParamSpec('P_2')
74987db96d56Sopenharmony_ci        self.assertIn('args', dir(P))
74997db96d56Sopenharmony_ci        self.assertIn('kwargs', dir(P))
75007db96d56Sopenharmony_ci        self.assertIsInstance(P.args, ParamSpecArgs)
75017db96d56Sopenharmony_ci        self.assertIsInstance(P.kwargs, ParamSpecKwargs)
75027db96d56Sopenharmony_ci        self.assertIs(P.args.__origin__, P)
75037db96d56Sopenharmony_ci        self.assertIs(P.kwargs.__origin__, P)
75047db96d56Sopenharmony_ci        self.assertEqual(P.args, P.args)
75057db96d56Sopenharmony_ci        self.assertEqual(P.kwargs, P.kwargs)
75067db96d56Sopenharmony_ci        self.assertNotEqual(P.args, P_2.args)
75077db96d56Sopenharmony_ci        self.assertNotEqual(P.kwargs, P_2.kwargs)
75087db96d56Sopenharmony_ci        self.assertNotEqual(P.args, P.kwargs)
75097db96d56Sopenharmony_ci        self.assertNotEqual(P.kwargs, P.args)
75107db96d56Sopenharmony_ci        self.assertNotEqual(P.args, P_2.kwargs)
75117db96d56Sopenharmony_ci        self.assertEqual(repr(P.args), "P.args")
75127db96d56Sopenharmony_ci        self.assertEqual(repr(P.kwargs), "P.kwargs")
75137db96d56Sopenharmony_ci
75147db96d56Sopenharmony_ci    def test_stringized(self):
75157db96d56Sopenharmony_ci        P = ParamSpec('P')
75167db96d56Sopenharmony_ci        class C(Generic[P]):
75177db96d56Sopenharmony_ci            func: Callable["P", int]
75187db96d56Sopenharmony_ci            def foo(self, *args: "P.args", **kwargs: "P.kwargs"):
75197db96d56Sopenharmony_ci                pass
75207db96d56Sopenharmony_ci
75217db96d56Sopenharmony_ci        self.assertEqual(gth(C, globals(), locals()), {"func": Callable[P, int]})
75227db96d56Sopenharmony_ci        self.assertEqual(
75237db96d56Sopenharmony_ci            gth(C.foo, globals(), locals()), {"args": P.args, "kwargs": P.kwargs}
75247db96d56Sopenharmony_ci        )
75257db96d56Sopenharmony_ci
75267db96d56Sopenharmony_ci    def test_user_generics(self):
75277db96d56Sopenharmony_ci        T = TypeVar("T")
75287db96d56Sopenharmony_ci        P = ParamSpec("P")
75297db96d56Sopenharmony_ci        P_2 = ParamSpec("P_2")
75307db96d56Sopenharmony_ci
75317db96d56Sopenharmony_ci        class X(Generic[T, P]):
75327db96d56Sopenharmony_ci            f: Callable[P, int]
75337db96d56Sopenharmony_ci            x: T
75347db96d56Sopenharmony_ci        G1 = X[int, P_2]
75357db96d56Sopenharmony_ci        self.assertEqual(G1.__args__, (int, P_2))
75367db96d56Sopenharmony_ci        self.assertEqual(G1.__parameters__, (P_2,))
75377db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "few arguments for"):
75387db96d56Sopenharmony_ci            X[int]
75397db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "many arguments for"):
75407db96d56Sopenharmony_ci            X[int, P_2, str]
75417db96d56Sopenharmony_ci
75427db96d56Sopenharmony_ci        G2 = X[int, Concatenate[int, P_2]]
75437db96d56Sopenharmony_ci        self.assertEqual(G2.__args__, (int, Concatenate[int, P_2]))
75447db96d56Sopenharmony_ci        self.assertEqual(G2.__parameters__, (P_2,))
75457db96d56Sopenharmony_ci
75467db96d56Sopenharmony_ci        G3 = X[int, [int, bool]]
75477db96d56Sopenharmony_ci        self.assertEqual(G3.__args__, (int, (int, bool)))
75487db96d56Sopenharmony_ci        self.assertEqual(G3.__parameters__, ())
75497db96d56Sopenharmony_ci
75507db96d56Sopenharmony_ci        G4 = X[int, ...]
75517db96d56Sopenharmony_ci        self.assertEqual(G4.__args__, (int, Ellipsis))
75527db96d56Sopenharmony_ci        self.assertEqual(G4.__parameters__, ())
75537db96d56Sopenharmony_ci
75547db96d56Sopenharmony_ci        class Z(Generic[P]):
75557db96d56Sopenharmony_ci            f: Callable[P, int]
75567db96d56Sopenharmony_ci
75577db96d56Sopenharmony_ci        G5 = Z[[int, str, bool]]
75587db96d56Sopenharmony_ci        self.assertEqual(G5.__args__, ((int, str, bool),))
75597db96d56Sopenharmony_ci        self.assertEqual(G5.__parameters__, ())
75607db96d56Sopenharmony_ci
75617db96d56Sopenharmony_ci        G6 = Z[int, str, bool]
75627db96d56Sopenharmony_ci        self.assertEqual(G6.__args__, ((int, str, bool),))
75637db96d56Sopenharmony_ci        self.assertEqual(G6.__parameters__, ())
75647db96d56Sopenharmony_ci
75657db96d56Sopenharmony_ci        # G5 and G6 should be equivalent according to the PEP
75667db96d56Sopenharmony_ci        self.assertEqual(G5.__args__, G6.__args__)
75677db96d56Sopenharmony_ci        self.assertEqual(G5.__origin__, G6.__origin__)
75687db96d56Sopenharmony_ci        self.assertEqual(G5.__parameters__, G6.__parameters__)
75697db96d56Sopenharmony_ci        self.assertEqual(G5, G6)
75707db96d56Sopenharmony_ci
75717db96d56Sopenharmony_ci        G7 = Z[int]
75727db96d56Sopenharmony_ci        self.assertEqual(G7.__args__, ((int,),))
75737db96d56Sopenharmony_ci        self.assertEqual(G7.__parameters__, ())
75747db96d56Sopenharmony_ci
75757db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "many arguments for"):
75767db96d56Sopenharmony_ci            Z[[int, str], bool]
75777db96d56Sopenharmony_ci        with self.assertRaisesRegex(TypeError, "many arguments for"):
75787db96d56Sopenharmony_ci            Z[P_2, bool]
75797db96d56Sopenharmony_ci
75807db96d56Sopenharmony_ci    def test_multiple_paramspecs_in_user_generics(self):
75817db96d56Sopenharmony_ci        P = ParamSpec("P")
75827db96d56Sopenharmony_ci        P2 = ParamSpec("P2")
75837db96d56Sopenharmony_ci
75847db96d56Sopenharmony_ci        class X(Generic[P, P2]):
75857db96d56Sopenharmony_ci            f: Callable[P, int]
75867db96d56Sopenharmony_ci            g: Callable[P2, str]
75877db96d56Sopenharmony_ci
75887db96d56Sopenharmony_ci        G1 = X[[int, str], [bytes]]
75897db96d56Sopenharmony_ci        G2 = X[[int], [str, bytes]]
75907db96d56Sopenharmony_ci        self.assertNotEqual(G1, G2)
75917db96d56Sopenharmony_ci        self.assertEqual(G1.__args__, ((int, str), (bytes,)))
75927db96d56Sopenharmony_ci        self.assertEqual(G2.__args__, ((int,), (str, bytes)))
75937db96d56Sopenharmony_ci
75947db96d56Sopenharmony_ci    def test_typevartuple_and_paramspecs_in_user_generics(self):
75957db96d56Sopenharmony_ci        Ts = TypeVarTuple("Ts")
75967db96d56Sopenharmony_ci        P = ParamSpec("P")
75977db96d56Sopenharmony_ci
75987db96d56Sopenharmony_ci        class X(Generic[*Ts, P]):
75997db96d56Sopenharmony_ci            f: Callable[P, int]
76007db96d56Sopenharmony_ci            g: Tuple[*Ts]
76017db96d56Sopenharmony_ci
76027db96d56Sopenharmony_ci        G1 = X[int, [bytes]]
76037db96d56Sopenharmony_ci        self.assertEqual(G1.__args__, (int, (bytes,)))
76047db96d56Sopenharmony_ci        G2 = X[int, str, [bytes]]
76057db96d56Sopenharmony_ci        self.assertEqual(G2.__args__, (int, str, (bytes,)))
76067db96d56Sopenharmony_ci        G3 = X[[bytes]]
76077db96d56Sopenharmony_ci        self.assertEqual(G3.__args__, ((bytes,),))
76087db96d56Sopenharmony_ci        G4 = X[[]]
76097db96d56Sopenharmony_ci        self.assertEqual(G4.__args__, ((),))
76107db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
76117db96d56Sopenharmony_ci            X[()]
76127db96d56Sopenharmony_ci
76137db96d56Sopenharmony_ci        class Y(Generic[P, *Ts]):
76147db96d56Sopenharmony_ci            f: Callable[P, int]
76157db96d56Sopenharmony_ci            g: Tuple[*Ts]
76167db96d56Sopenharmony_ci
76177db96d56Sopenharmony_ci        G1 = Y[[bytes], int]
76187db96d56Sopenharmony_ci        self.assertEqual(G1.__args__, ((bytes,), int))
76197db96d56Sopenharmony_ci        G2 = Y[[bytes], int, str]
76207db96d56Sopenharmony_ci        self.assertEqual(G2.__args__, ((bytes,), int, str))
76217db96d56Sopenharmony_ci        G3 = Y[[bytes]]
76227db96d56Sopenharmony_ci        self.assertEqual(G3.__args__, ((bytes,),))
76237db96d56Sopenharmony_ci        G4 = Y[[]]
76247db96d56Sopenharmony_ci        self.assertEqual(G4.__args__, ((),))
76257db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
76267db96d56Sopenharmony_ci            Y[()]
76277db96d56Sopenharmony_ci
76287db96d56Sopenharmony_ci    def test_typevartuple_and_paramspecs_in_generic_aliases(self):
76297db96d56Sopenharmony_ci        P = ParamSpec('P')
76307db96d56Sopenharmony_ci        T = TypeVar('T')
76317db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
76327db96d56Sopenharmony_ci
76337db96d56Sopenharmony_ci        for C in Callable, collections.abc.Callable:
76347db96d56Sopenharmony_ci            with self.subTest(generic=C):
76357db96d56Sopenharmony_ci                A = C[P, Tuple[*Ts]]
76367db96d56Sopenharmony_ci                B = A[[int, str], bytes, float]
76377db96d56Sopenharmony_ci                self.assertEqual(B.__args__, (int, str, Tuple[bytes, float]))
76387db96d56Sopenharmony_ci
76397db96d56Sopenharmony_ci        class X(Generic[T, P]):
76407db96d56Sopenharmony_ci            pass
76417db96d56Sopenharmony_ci
76427db96d56Sopenharmony_ci        A = X[Tuple[*Ts], P]
76437db96d56Sopenharmony_ci        B = A[bytes, float, [int, str]]
76447db96d56Sopenharmony_ci        self.assertEqual(B.__args__, (Tuple[bytes, float], (int, str,)))
76457db96d56Sopenharmony_ci
76467db96d56Sopenharmony_ci        class Y(Generic[P, T]):
76477db96d56Sopenharmony_ci            pass
76487db96d56Sopenharmony_ci
76497db96d56Sopenharmony_ci        A = Y[P, Tuple[*Ts]]
76507db96d56Sopenharmony_ci        B = A[[int, str], bytes, float]
76517db96d56Sopenharmony_ci        self.assertEqual(B.__args__, ((int, str,), Tuple[bytes, float]))
76527db96d56Sopenharmony_ci
76537db96d56Sopenharmony_ci    def test_var_substitution(self):
76547db96d56Sopenharmony_ci        P = ParamSpec("P")
76557db96d56Sopenharmony_ci        subst = P.__typing_subst__
76567db96d56Sopenharmony_ci        self.assertEqual(subst((int, str)), (int, str))
76577db96d56Sopenharmony_ci        self.assertEqual(subst([int, str]), (int, str))
76587db96d56Sopenharmony_ci        self.assertEqual(subst([None]), (type(None),))
76597db96d56Sopenharmony_ci        self.assertIs(subst(...), ...)
76607db96d56Sopenharmony_ci        self.assertIs(subst(P), P)
76617db96d56Sopenharmony_ci        self.assertEqual(subst(Concatenate[int, P]), Concatenate[int, P])
76627db96d56Sopenharmony_ci
76637db96d56Sopenharmony_ci    def test_bad_var_substitution(self):
76647db96d56Sopenharmony_ci        T = TypeVar('T')
76657db96d56Sopenharmony_ci        P = ParamSpec('P')
76667db96d56Sopenharmony_ci        bad_args = (42, int, None, T, int|str, Union[int, str])
76677db96d56Sopenharmony_ci        for arg in bad_args:
76687db96d56Sopenharmony_ci            with self.subTest(arg=arg):
76697db96d56Sopenharmony_ci                with self.assertRaises(TypeError):
76707db96d56Sopenharmony_ci                    P.__typing_subst__(arg)
76717db96d56Sopenharmony_ci                with self.assertRaises(TypeError):
76727db96d56Sopenharmony_ci                    typing.Callable[P, T][arg, str]
76737db96d56Sopenharmony_ci                with self.assertRaises(TypeError):
76747db96d56Sopenharmony_ci                    collections.abc.Callable[P, T][arg, str]
76757db96d56Sopenharmony_ci
76767db96d56Sopenharmony_ci    def test_type_var_subst_for_other_type_vars(self):
76777db96d56Sopenharmony_ci        T = TypeVar('T')
76787db96d56Sopenharmony_ci        T2 = TypeVar('T2')
76797db96d56Sopenharmony_ci        P = ParamSpec('P')
76807db96d56Sopenharmony_ci        P2 = ParamSpec('P2')
76817db96d56Sopenharmony_ci        Ts = TypeVarTuple('Ts')
76827db96d56Sopenharmony_ci
76837db96d56Sopenharmony_ci        class Base(Generic[P]):
76847db96d56Sopenharmony_ci            pass
76857db96d56Sopenharmony_ci
76867db96d56Sopenharmony_ci        A1 = Base[T]
76877db96d56Sopenharmony_ci        self.assertEqual(A1.__parameters__, (T,))
76887db96d56Sopenharmony_ci        self.assertEqual(A1.__args__, ((T,),))
76897db96d56Sopenharmony_ci        self.assertEqual(A1[int], Base[int])
76907db96d56Sopenharmony_ci
76917db96d56Sopenharmony_ci        A2 = Base[[T]]
76927db96d56Sopenharmony_ci        self.assertEqual(A2.__parameters__, (T,))
76937db96d56Sopenharmony_ci        self.assertEqual(A2.__args__, ((T,),))
76947db96d56Sopenharmony_ci        self.assertEqual(A2[int], Base[int])
76957db96d56Sopenharmony_ci
76967db96d56Sopenharmony_ci        A3 = Base[[int, T]]
76977db96d56Sopenharmony_ci        self.assertEqual(A3.__parameters__, (T,))
76987db96d56Sopenharmony_ci        self.assertEqual(A3.__args__, ((int, T),))
76997db96d56Sopenharmony_ci        self.assertEqual(A3[str], Base[[int, str]])
77007db96d56Sopenharmony_ci
77017db96d56Sopenharmony_ci        A4 = Base[[T, int, T2]]
77027db96d56Sopenharmony_ci        self.assertEqual(A4.__parameters__, (T, T2))
77037db96d56Sopenharmony_ci        self.assertEqual(A4.__args__, ((T, int, T2),))
77047db96d56Sopenharmony_ci        self.assertEqual(A4[str, bool], Base[[str, int, bool]])
77057db96d56Sopenharmony_ci
77067db96d56Sopenharmony_ci        A5 = Base[[*Ts, int]]
77077db96d56Sopenharmony_ci        self.assertEqual(A5.__parameters__, (Ts,))
77087db96d56Sopenharmony_ci        self.assertEqual(A5.__args__, ((*Ts, int),))
77097db96d56Sopenharmony_ci        self.assertEqual(A5[str, bool], Base[[str, bool, int]])
77107db96d56Sopenharmony_ci
77117db96d56Sopenharmony_ci        A5_2 = Base[[int, *Ts]]
77127db96d56Sopenharmony_ci        self.assertEqual(A5_2.__parameters__, (Ts,))
77137db96d56Sopenharmony_ci        self.assertEqual(A5_2.__args__, ((int, *Ts),))
77147db96d56Sopenharmony_ci        self.assertEqual(A5_2[str, bool], Base[[int, str, bool]])
77157db96d56Sopenharmony_ci
77167db96d56Sopenharmony_ci        A6 = Base[[T, *Ts]]
77177db96d56Sopenharmony_ci        self.assertEqual(A6.__parameters__, (T, Ts))
77187db96d56Sopenharmony_ci        self.assertEqual(A6.__args__, ((T, *Ts),))
77197db96d56Sopenharmony_ci        self.assertEqual(A6[int, str, bool], Base[[int, str, bool]])
77207db96d56Sopenharmony_ci
77217db96d56Sopenharmony_ci        A7 = Base[[T, T]]
77227db96d56Sopenharmony_ci        self.assertEqual(A7.__parameters__, (T,))
77237db96d56Sopenharmony_ci        self.assertEqual(A7.__args__, ((T, T),))
77247db96d56Sopenharmony_ci        self.assertEqual(A7[int], Base[[int, int]])
77257db96d56Sopenharmony_ci
77267db96d56Sopenharmony_ci        A8 = Base[[T, list[T]]]
77277db96d56Sopenharmony_ci        self.assertEqual(A8.__parameters__, (T,))
77287db96d56Sopenharmony_ci        self.assertEqual(A8.__args__, ((T, list[T]),))
77297db96d56Sopenharmony_ci        self.assertEqual(A8[int], Base[[int, list[int]]])
77307db96d56Sopenharmony_ci
77317db96d56Sopenharmony_ci        A9 = Base[[Tuple[*Ts], *Ts]]
77327db96d56Sopenharmony_ci        self.assertEqual(A9.__parameters__, (Ts,))
77337db96d56Sopenharmony_ci        self.assertEqual(A9.__args__, ((Tuple[*Ts], *Ts),))
77347db96d56Sopenharmony_ci        self.assertEqual(A9[int, str], Base[Tuple[int, str], int, str])
77357db96d56Sopenharmony_ci
77367db96d56Sopenharmony_ci        A10 = Base[P2]
77377db96d56Sopenharmony_ci        self.assertEqual(A10.__parameters__, (P2,))
77387db96d56Sopenharmony_ci        self.assertEqual(A10.__args__, (P2,))
77397db96d56Sopenharmony_ci        self.assertEqual(A10[[int, str]], Base[[int, str]])
77407db96d56Sopenharmony_ci
77417db96d56Sopenharmony_ci        class DoubleP(Generic[P, P2]):
77427db96d56Sopenharmony_ci            pass
77437db96d56Sopenharmony_ci
77447db96d56Sopenharmony_ci        B1 = DoubleP[P, P2]
77457db96d56Sopenharmony_ci        self.assertEqual(B1.__parameters__, (P, P2))
77467db96d56Sopenharmony_ci        self.assertEqual(B1.__args__, (P, P2))
77477db96d56Sopenharmony_ci        self.assertEqual(B1[[int, str], [bool]], DoubleP[[int,  str], [bool]])
77487db96d56Sopenharmony_ci        self.assertEqual(B1[[], []], DoubleP[[], []])
77497db96d56Sopenharmony_ci
77507db96d56Sopenharmony_ci        B2 = DoubleP[[int, str], P2]
77517db96d56Sopenharmony_ci        self.assertEqual(B2.__parameters__, (P2,))
77527db96d56Sopenharmony_ci        self.assertEqual(B2.__args__, ((int, str), P2))
77537db96d56Sopenharmony_ci        self.assertEqual(B2[[bool, bool]], DoubleP[[int,  str], [bool, bool]])
77547db96d56Sopenharmony_ci        self.assertEqual(B2[[]], DoubleP[[int,  str], []])
77557db96d56Sopenharmony_ci
77567db96d56Sopenharmony_ci        B3 = DoubleP[P, [bool, bool]]
77577db96d56Sopenharmony_ci        self.assertEqual(B3.__parameters__, (P,))
77587db96d56Sopenharmony_ci        self.assertEqual(B3.__args__, (P, (bool, bool)))
77597db96d56Sopenharmony_ci        self.assertEqual(B3[[int, str]], DoubleP[[int,  str], [bool, bool]])
77607db96d56Sopenharmony_ci        self.assertEqual(B3[[]], DoubleP[[], [bool, bool]])
77617db96d56Sopenharmony_ci
77627db96d56Sopenharmony_ci        B4 = DoubleP[[T, int], [bool, T2]]
77637db96d56Sopenharmony_ci        self.assertEqual(B4.__parameters__, (T, T2))
77647db96d56Sopenharmony_ci        self.assertEqual(B4.__args__, ((T, int), (bool, T2)))
77657db96d56Sopenharmony_ci        self.assertEqual(B4[str, float], DoubleP[[str, int], [bool, float]])
77667db96d56Sopenharmony_ci
77677db96d56Sopenharmony_ci        B5 = DoubleP[[*Ts, int], [bool, T2]]
77687db96d56Sopenharmony_ci        self.assertEqual(B5.__parameters__, (Ts, T2))
77697db96d56Sopenharmony_ci        self.assertEqual(B5.__args__, ((*Ts, int), (bool, T2)))
77707db96d56Sopenharmony_ci        self.assertEqual(B5[str, bytes, float],
77717db96d56Sopenharmony_ci                         DoubleP[[str, bytes, int], [bool, float]])
77727db96d56Sopenharmony_ci
77737db96d56Sopenharmony_ci        B6 = DoubleP[[T, int], [bool, *Ts]]
77747db96d56Sopenharmony_ci        self.assertEqual(B6.__parameters__, (T, Ts))
77757db96d56Sopenharmony_ci        self.assertEqual(B6.__args__, ((T, int), (bool, *Ts)))
77767db96d56Sopenharmony_ci        self.assertEqual(B6[str, bytes, float],
77777db96d56Sopenharmony_ci                         DoubleP[[str, int], [bool, bytes, float]])
77787db96d56Sopenharmony_ci
77797db96d56Sopenharmony_ci        class PandT(Generic[P, T]):
77807db96d56Sopenharmony_ci            pass
77817db96d56Sopenharmony_ci
77827db96d56Sopenharmony_ci        C1 = PandT[P, T]
77837db96d56Sopenharmony_ci        self.assertEqual(C1.__parameters__, (P, T))
77847db96d56Sopenharmony_ci        self.assertEqual(C1.__args__, (P, T))
77857db96d56Sopenharmony_ci        self.assertEqual(C1[[int, str], bool], PandT[[int, str], bool])
77867db96d56Sopenharmony_ci
77877db96d56Sopenharmony_ci        C2 = PandT[[int, T], T]
77887db96d56Sopenharmony_ci        self.assertEqual(C2.__parameters__, (T,))
77897db96d56Sopenharmony_ci        self.assertEqual(C2.__args__, ((int, T), T))
77907db96d56Sopenharmony_ci        self.assertEqual(C2[str], PandT[[int, str], str])
77917db96d56Sopenharmony_ci
77927db96d56Sopenharmony_ci        C3 = PandT[[int, *Ts], T]
77937db96d56Sopenharmony_ci        self.assertEqual(C3.__parameters__, (Ts, T))
77947db96d56Sopenharmony_ci        self.assertEqual(C3.__args__, ((int, *Ts), T))
77957db96d56Sopenharmony_ci        self.assertEqual(C3[str, bool, bytes], PandT[[int, str, bool], bytes])
77967db96d56Sopenharmony_ci
77977db96d56Sopenharmony_ci    def test_paramspec_in_nested_generics(self):
77987db96d56Sopenharmony_ci        # Although ParamSpec should not be found in __parameters__ of most
77997db96d56Sopenharmony_ci        # generics, they probably should be found when nested in
78007db96d56Sopenharmony_ci        # a valid location.
78017db96d56Sopenharmony_ci        T = TypeVar("T")
78027db96d56Sopenharmony_ci        P = ParamSpec("P")
78037db96d56Sopenharmony_ci        C1 = Callable[P, T]
78047db96d56Sopenharmony_ci        G1 = List[C1]
78057db96d56Sopenharmony_ci        G2 = list[C1]
78067db96d56Sopenharmony_ci        G3 = list[C1] | int
78077db96d56Sopenharmony_ci        self.assertEqual(G1.__parameters__, (P, T))
78087db96d56Sopenharmony_ci        self.assertEqual(G2.__parameters__, (P, T))
78097db96d56Sopenharmony_ci        self.assertEqual(G3.__parameters__, (P, T))
78107db96d56Sopenharmony_ci        C = Callable[[int, str], float]
78117db96d56Sopenharmony_ci        self.assertEqual(G1[[int, str], float], List[C])
78127db96d56Sopenharmony_ci        self.assertEqual(G2[[int, str], float], list[C])
78137db96d56Sopenharmony_ci        self.assertEqual(G3[[int, str], float], list[C] | int)
78147db96d56Sopenharmony_ci
78157db96d56Sopenharmony_ci    def test_paramspec_gets_copied(self):
78167db96d56Sopenharmony_ci        # bpo-46581
78177db96d56Sopenharmony_ci        P = ParamSpec('P')
78187db96d56Sopenharmony_ci        P2 = ParamSpec('P2')
78197db96d56Sopenharmony_ci        C1 = Callable[P, int]
78207db96d56Sopenharmony_ci        self.assertEqual(C1.__parameters__, (P,))
78217db96d56Sopenharmony_ci        self.assertEqual(C1[P2].__parameters__, (P2,))
78227db96d56Sopenharmony_ci        self.assertEqual(C1[str].__parameters__, ())
78237db96d56Sopenharmony_ci        self.assertEqual(C1[str, T].__parameters__, (T,))
78247db96d56Sopenharmony_ci        self.assertEqual(C1[Concatenate[str, P2]].__parameters__, (P2,))
78257db96d56Sopenharmony_ci        self.assertEqual(C1[Concatenate[T, P2]].__parameters__, (T, P2))
78267db96d56Sopenharmony_ci        self.assertEqual(C1[...].__parameters__, ())
78277db96d56Sopenharmony_ci
78287db96d56Sopenharmony_ci        C2 = Callable[Concatenate[str, P], int]
78297db96d56Sopenharmony_ci        self.assertEqual(C2.__parameters__, (P,))
78307db96d56Sopenharmony_ci        self.assertEqual(C2[P2].__parameters__, (P2,))
78317db96d56Sopenharmony_ci        self.assertEqual(C2[str].__parameters__, ())
78327db96d56Sopenharmony_ci        self.assertEqual(C2[str, T].__parameters__, (T,))
78337db96d56Sopenharmony_ci        self.assertEqual(C2[Concatenate[str, P2]].__parameters__, (P2,))
78347db96d56Sopenharmony_ci        self.assertEqual(C2[Concatenate[T, P2]].__parameters__, (T, P2))
78357db96d56Sopenharmony_ci
78367db96d56Sopenharmony_ci
78377db96d56Sopenharmony_ciclass ConcatenateTests(BaseTestCase):
78387db96d56Sopenharmony_ci    def test_basics(self):
78397db96d56Sopenharmony_ci        P = ParamSpec('P')
78407db96d56Sopenharmony_ci        class MyClass: ...
78417db96d56Sopenharmony_ci        c = Concatenate[MyClass, P]
78427db96d56Sopenharmony_ci        self.assertNotEqual(c, Concatenate)
78437db96d56Sopenharmony_ci
78447db96d56Sopenharmony_ci    def test_dir(self):
78457db96d56Sopenharmony_ci        P = ParamSpec('P')
78467db96d56Sopenharmony_ci        dir_items = set(dir(Concatenate[int, P]))
78477db96d56Sopenharmony_ci        for required_item in [
78487db96d56Sopenharmony_ci            '__args__', '__parameters__', '__origin__',
78497db96d56Sopenharmony_ci        ]:
78507db96d56Sopenharmony_ci            with self.subTest(required_item=required_item):
78517db96d56Sopenharmony_ci                self.assertIn(required_item, dir_items)
78527db96d56Sopenharmony_ci
78537db96d56Sopenharmony_ci    def test_valid_uses(self):
78547db96d56Sopenharmony_ci        P = ParamSpec('P')
78557db96d56Sopenharmony_ci        T = TypeVar('T')
78567db96d56Sopenharmony_ci        C1 = Callable[Concatenate[int, P], int]
78577db96d56Sopenharmony_ci        self.assertEqual(C1.__args__, (Concatenate[int, P], int))
78587db96d56Sopenharmony_ci        self.assertEqual(C1.__parameters__, (P,))
78597db96d56Sopenharmony_ci        C2 = Callable[Concatenate[int, T, P], T]
78607db96d56Sopenharmony_ci        self.assertEqual(C2.__args__, (Concatenate[int, T, P], T))
78617db96d56Sopenharmony_ci        self.assertEqual(C2.__parameters__, (T, P))
78627db96d56Sopenharmony_ci
78637db96d56Sopenharmony_ci        # Test collections.abc.Callable too.
78647db96d56Sopenharmony_ci        C3 = collections.abc.Callable[Concatenate[int, P], int]
78657db96d56Sopenharmony_ci        self.assertEqual(C3.__args__, (Concatenate[int, P], int))
78667db96d56Sopenharmony_ci        self.assertEqual(C3.__parameters__, (P,))
78677db96d56Sopenharmony_ci        C4 = collections.abc.Callable[Concatenate[int, T, P], T]
78687db96d56Sopenharmony_ci        self.assertEqual(C4.__args__, (Concatenate[int, T, P], T))
78697db96d56Sopenharmony_ci        self.assertEqual(C4.__parameters__, (T, P))
78707db96d56Sopenharmony_ci
78717db96d56Sopenharmony_ci    def test_var_substitution(self):
78727db96d56Sopenharmony_ci        T = TypeVar('T')
78737db96d56Sopenharmony_ci        P = ParamSpec('P')
78747db96d56Sopenharmony_ci        P2 = ParamSpec('P2')
78757db96d56Sopenharmony_ci        C = Concatenate[T, P]
78767db96d56Sopenharmony_ci        self.assertEqual(C[int, P2], Concatenate[int, P2])
78777db96d56Sopenharmony_ci        self.assertEqual(C[int, [str, float]], (int, str, float))
78787db96d56Sopenharmony_ci        self.assertEqual(C[int, []], (int,))
78797db96d56Sopenharmony_ci        self.assertEqual(C[int, Concatenate[str, P2]],
78807db96d56Sopenharmony_ci                         Concatenate[int, str, P2])
78817db96d56Sopenharmony_ci        self.assertEqual(C[int, ...], Concatenate[int, ...])
78827db96d56Sopenharmony_ci
78837db96d56Sopenharmony_ci        C = Concatenate[int, P]
78847db96d56Sopenharmony_ci        self.assertEqual(C[P2], Concatenate[int, P2])
78857db96d56Sopenharmony_ci        self.assertEqual(C[[str, float]], (int, str, float))
78867db96d56Sopenharmony_ci        self.assertEqual(C[str, float], (int, str, float))
78877db96d56Sopenharmony_ci        self.assertEqual(C[[]], (int,))
78887db96d56Sopenharmony_ci        self.assertEqual(C[Concatenate[str, P2]], Concatenate[int, str, P2])
78897db96d56Sopenharmony_ci        self.assertEqual(C[...], Concatenate[int, ...])
78907db96d56Sopenharmony_ci
78917db96d56Sopenharmony_ciclass TypeGuardTests(BaseTestCase):
78927db96d56Sopenharmony_ci    def test_basics(self):
78937db96d56Sopenharmony_ci        TypeGuard[int]  # OK
78947db96d56Sopenharmony_ci
78957db96d56Sopenharmony_ci        def foo(arg) -> TypeGuard[int]: ...
78967db96d56Sopenharmony_ci        self.assertEqual(gth(foo), {'return': TypeGuard[int]})
78977db96d56Sopenharmony_ci
78987db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
78997db96d56Sopenharmony_ci            TypeGuard[int, str]
79007db96d56Sopenharmony_ci
79017db96d56Sopenharmony_ci    def test_repr(self):
79027db96d56Sopenharmony_ci        self.assertEqual(repr(TypeGuard), 'typing.TypeGuard')
79037db96d56Sopenharmony_ci        cv = TypeGuard[int]
79047db96d56Sopenharmony_ci        self.assertEqual(repr(cv), 'typing.TypeGuard[int]')
79057db96d56Sopenharmony_ci        cv = TypeGuard[Employee]
79067db96d56Sopenharmony_ci        self.assertEqual(repr(cv), 'typing.TypeGuard[%s.Employee]' % __name__)
79077db96d56Sopenharmony_ci        cv = TypeGuard[tuple[int]]
79087db96d56Sopenharmony_ci        self.assertEqual(repr(cv), 'typing.TypeGuard[tuple[int]]')
79097db96d56Sopenharmony_ci
79107db96d56Sopenharmony_ci    def test_cannot_subclass(self):
79117db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
79127db96d56Sopenharmony_ci            class C(type(TypeGuard)):
79137db96d56Sopenharmony_ci                pass
79147db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
79157db96d56Sopenharmony_ci            class C(type(TypeGuard[int])):
79167db96d56Sopenharmony_ci                pass
79177db96d56Sopenharmony_ci
79187db96d56Sopenharmony_ci    def test_cannot_init(self):
79197db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
79207db96d56Sopenharmony_ci            TypeGuard()
79217db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
79227db96d56Sopenharmony_ci            type(TypeGuard)()
79237db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
79247db96d56Sopenharmony_ci            type(TypeGuard[Optional[int]])()
79257db96d56Sopenharmony_ci
79267db96d56Sopenharmony_ci    def test_no_isinstance(self):
79277db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
79287db96d56Sopenharmony_ci            isinstance(1, TypeGuard[int])
79297db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
79307db96d56Sopenharmony_ci            issubclass(int, TypeGuard)
79317db96d56Sopenharmony_ci
79327db96d56Sopenharmony_ci
79337db96d56Sopenharmony_ciSpecialAttrsP = typing.ParamSpec('SpecialAttrsP')
79347db96d56Sopenharmony_ciSpecialAttrsT = typing.TypeVar('SpecialAttrsT', int, float, complex)
79357db96d56Sopenharmony_ci
79367db96d56Sopenharmony_ci
79377db96d56Sopenharmony_ciclass SpecialAttrsTests(BaseTestCase):
79387db96d56Sopenharmony_ci
79397db96d56Sopenharmony_ci    def test_special_attrs(self):
79407db96d56Sopenharmony_ci        cls_to_check = {
79417db96d56Sopenharmony_ci            # ABC classes
79427db96d56Sopenharmony_ci            typing.AbstractSet: 'AbstractSet',
79437db96d56Sopenharmony_ci            typing.AsyncContextManager: 'AsyncContextManager',
79447db96d56Sopenharmony_ci            typing.AsyncGenerator: 'AsyncGenerator',
79457db96d56Sopenharmony_ci            typing.AsyncIterable: 'AsyncIterable',
79467db96d56Sopenharmony_ci            typing.AsyncIterator: 'AsyncIterator',
79477db96d56Sopenharmony_ci            typing.Awaitable: 'Awaitable',
79487db96d56Sopenharmony_ci            typing.ByteString: 'ByteString',
79497db96d56Sopenharmony_ci            typing.Callable: 'Callable',
79507db96d56Sopenharmony_ci            typing.ChainMap: 'ChainMap',
79517db96d56Sopenharmony_ci            typing.Collection: 'Collection',
79527db96d56Sopenharmony_ci            typing.Container: 'Container',
79537db96d56Sopenharmony_ci            typing.ContextManager: 'ContextManager',
79547db96d56Sopenharmony_ci            typing.Coroutine: 'Coroutine',
79557db96d56Sopenharmony_ci            typing.Counter: 'Counter',
79567db96d56Sopenharmony_ci            typing.DefaultDict: 'DefaultDict',
79577db96d56Sopenharmony_ci            typing.Deque: 'Deque',
79587db96d56Sopenharmony_ci            typing.Dict: 'Dict',
79597db96d56Sopenharmony_ci            typing.FrozenSet: 'FrozenSet',
79607db96d56Sopenharmony_ci            typing.Generator: 'Generator',
79617db96d56Sopenharmony_ci            typing.Hashable: 'Hashable',
79627db96d56Sopenharmony_ci            typing.ItemsView: 'ItemsView',
79637db96d56Sopenharmony_ci            typing.Iterable: 'Iterable',
79647db96d56Sopenharmony_ci            typing.Iterator: 'Iterator',
79657db96d56Sopenharmony_ci            typing.KeysView: 'KeysView',
79667db96d56Sopenharmony_ci            typing.List: 'List',
79677db96d56Sopenharmony_ci            typing.Mapping: 'Mapping',
79687db96d56Sopenharmony_ci            typing.MappingView: 'MappingView',
79697db96d56Sopenharmony_ci            typing.MutableMapping: 'MutableMapping',
79707db96d56Sopenharmony_ci            typing.MutableSequence: 'MutableSequence',
79717db96d56Sopenharmony_ci            typing.MutableSet: 'MutableSet',
79727db96d56Sopenharmony_ci            typing.OrderedDict: 'OrderedDict',
79737db96d56Sopenharmony_ci            typing.Reversible: 'Reversible',
79747db96d56Sopenharmony_ci            typing.Sequence: 'Sequence',
79757db96d56Sopenharmony_ci            typing.Set: 'Set',
79767db96d56Sopenharmony_ci            typing.Sized: 'Sized',
79777db96d56Sopenharmony_ci            typing.Tuple: 'Tuple',
79787db96d56Sopenharmony_ci            typing.Type: 'Type',
79797db96d56Sopenharmony_ci            typing.ValuesView: 'ValuesView',
79807db96d56Sopenharmony_ci            # Subscribed ABC classes
79817db96d56Sopenharmony_ci            typing.AbstractSet[Any]: 'AbstractSet',
79827db96d56Sopenharmony_ci            typing.AsyncContextManager[Any]: 'AsyncContextManager',
79837db96d56Sopenharmony_ci            typing.AsyncGenerator[Any, Any]: 'AsyncGenerator',
79847db96d56Sopenharmony_ci            typing.AsyncIterable[Any]: 'AsyncIterable',
79857db96d56Sopenharmony_ci            typing.AsyncIterator[Any]: 'AsyncIterator',
79867db96d56Sopenharmony_ci            typing.Awaitable[Any]: 'Awaitable',
79877db96d56Sopenharmony_ci            typing.Callable[[], Any]: 'Callable',
79887db96d56Sopenharmony_ci            typing.Callable[..., Any]: 'Callable',
79897db96d56Sopenharmony_ci            typing.ChainMap[Any, Any]: 'ChainMap',
79907db96d56Sopenharmony_ci            typing.Collection[Any]: 'Collection',
79917db96d56Sopenharmony_ci            typing.Container[Any]: 'Container',
79927db96d56Sopenharmony_ci            typing.ContextManager[Any]: 'ContextManager',
79937db96d56Sopenharmony_ci            typing.Coroutine[Any, Any, Any]: 'Coroutine',
79947db96d56Sopenharmony_ci            typing.Counter[Any]: 'Counter',
79957db96d56Sopenharmony_ci            typing.DefaultDict[Any, Any]: 'DefaultDict',
79967db96d56Sopenharmony_ci            typing.Deque[Any]: 'Deque',
79977db96d56Sopenharmony_ci            typing.Dict[Any, Any]: 'Dict',
79987db96d56Sopenharmony_ci            typing.FrozenSet[Any]: 'FrozenSet',
79997db96d56Sopenharmony_ci            typing.Generator[Any, Any, Any]: 'Generator',
80007db96d56Sopenharmony_ci            typing.ItemsView[Any, Any]: 'ItemsView',
80017db96d56Sopenharmony_ci            typing.Iterable[Any]: 'Iterable',
80027db96d56Sopenharmony_ci            typing.Iterator[Any]: 'Iterator',
80037db96d56Sopenharmony_ci            typing.KeysView[Any]: 'KeysView',
80047db96d56Sopenharmony_ci            typing.List[Any]: 'List',
80057db96d56Sopenharmony_ci            typing.Mapping[Any, Any]: 'Mapping',
80067db96d56Sopenharmony_ci            typing.MappingView[Any]: 'MappingView',
80077db96d56Sopenharmony_ci            typing.MutableMapping[Any, Any]: 'MutableMapping',
80087db96d56Sopenharmony_ci            typing.MutableSequence[Any]: 'MutableSequence',
80097db96d56Sopenharmony_ci            typing.MutableSet[Any]: 'MutableSet',
80107db96d56Sopenharmony_ci            typing.OrderedDict[Any, Any]: 'OrderedDict',
80117db96d56Sopenharmony_ci            typing.Reversible[Any]: 'Reversible',
80127db96d56Sopenharmony_ci            typing.Sequence[Any]: 'Sequence',
80137db96d56Sopenharmony_ci            typing.Set[Any]: 'Set',
80147db96d56Sopenharmony_ci            typing.Tuple[Any]: 'Tuple',
80157db96d56Sopenharmony_ci            typing.Tuple[Any, ...]: 'Tuple',
80167db96d56Sopenharmony_ci            typing.Type[Any]: 'Type',
80177db96d56Sopenharmony_ci            typing.ValuesView[Any]: 'ValuesView',
80187db96d56Sopenharmony_ci            # Special Forms
80197db96d56Sopenharmony_ci            typing.Annotated: 'Annotated',
80207db96d56Sopenharmony_ci            typing.Any: 'Any',
80217db96d56Sopenharmony_ci            typing.ClassVar: 'ClassVar',
80227db96d56Sopenharmony_ci            typing.Concatenate: 'Concatenate',
80237db96d56Sopenharmony_ci            typing.Final: 'Final',
80247db96d56Sopenharmony_ci            typing.ForwardRef: 'ForwardRef',
80257db96d56Sopenharmony_ci            typing.Literal: 'Literal',
80267db96d56Sopenharmony_ci            typing.NewType: 'NewType',
80277db96d56Sopenharmony_ci            typing.NoReturn: 'NoReturn',
80287db96d56Sopenharmony_ci            typing.Never: 'Never',
80297db96d56Sopenharmony_ci            typing.Optional: 'Optional',
80307db96d56Sopenharmony_ci            typing.TypeAlias: 'TypeAlias',
80317db96d56Sopenharmony_ci            typing.TypeGuard: 'TypeGuard',
80327db96d56Sopenharmony_ci            typing.TypeVar: 'TypeVar',
80337db96d56Sopenharmony_ci            typing.Union: 'Union',
80347db96d56Sopenharmony_ci            typing.Self: 'Self',
80357db96d56Sopenharmony_ci            # Subscribed special forms
80367db96d56Sopenharmony_ci            typing.Annotated[Any, "Annotation"]: 'Annotated',
80377db96d56Sopenharmony_ci            typing.ClassVar[Any]: 'ClassVar',
80387db96d56Sopenharmony_ci            typing.Concatenate[Any, SpecialAttrsP]: 'Concatenate',
80397db96d56Sopenharmony_ci            typing.Final[Any]: 'Final',
80407db96d56Sopenharmony_ci            typing.Literal[Any]: 'Literal',
80417db96d56Sopenharmony_ci            typing.Literal[1, 2]: 'Literal',
80427db96d56Sopenharmony_ci            typing.Literal[True, 2]: 'Literal',
80437db96d56Sopenharmony_ci            typing.Optional[Any]: 'Optional',
80447db96d56Sopenharmony_ci            typing.TypeGuard[Any]: 'TypeGuard',
80457db96d56Sopenharmony_ci            typing.Union[Any]: 'Any',
80467db96d56Sopenharmony_ci            typing.Union[int, float]: 'Union',
80477db96d56Sopenharmony_ci            # Incompatible special forms (tested in test_special_attrs2)
80487db96d56Sopenharmony_ci            # - typing.ForwardRef('set[Any]')
80497db96d56Sopenharmony_ci            # - typing.NewType('TypeName', Any)
80507db96d56Sopenharmony_ci            # - typing.ParamSpec('SpecialAttrsP')
80517db96d56Sopenharmony_ci            # - typing.TypeVar('T')
80527db96d56Sopenharmony_ci        }
80537db96d56Sopenharmony_ci
80547db96d56Sopenharmony_ci        for cls, name in cls_to_check.items():
80557db96d56Sopenharmony_ci            with self.subTest(cls=cls):
80567db96d56Sopenharmony_ci                self.assertEqual(cls.__name__, name, str(cls))
80577db96d56Sopenharmony_ci                self.assertEqual(cls.__qualname__, name, str(cls))
80587db96d56Sopenharmony_ci                self.assertEqual(cls.__module__, 'typing', str(cls))
80597db96d56Sopenharmony_ci                for proto in range(pickle.HIGHEST_PROTOCOL + 1):
80607db96d56Sopenharmony_ci                    s = pickle.dumps(cls, proto)
80617db96d56Sopenharmony_ci                    loaded = pickle.loads(s)
80627db96d56Sopenharmony_ci                    self.assertIs(cls, loaded)
80637db96d56Sopenharmony_ci
80647db96d56Sopenharmony_ci    TypeName = typing.NewType('SpecialAttrsTests.TypeName', Any)
80657db96d56Sopenharmony_ci
80667db96d56Sopenharmony_ci    def test_special_attrs2(self):
80677db96d56Sopenharmony_ci        # Forward refs provide a different introspection API. __name__ and
80687db96d56Sopenharmony_ci        # __qualname__ make little sense for forward refs as they can store
80697db96d56Sopenharmony_ci        # complex typing expressions.
80707db96d56Sopenharmony_ci        fr = typing.ForwardRef('set[Any]')
80717db96d56Sopenharmony_ci        self.assertFalse(hasattr(fr, '__name__'))
80727db96d56Sopenharmony_ci        self.assertFalse(hasattr(fr, '__qualname__'))
80737db96d56Sopenharmony_ci        self.assertEqual(fr.__module__, 'typing')
80747db96d56Sopenharmony_ci        # Forward refs are currently unpicklable.
80757db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
80767db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
80777db96d56Sopenharmony_ci                pickle.dumps(fr, proto)
80787db96d56Sopenharmony_ci
80797db96d56Sopenharmony_ci        self.assertEqual(SpecialAttrsTests.TypeName.__name__, 'TypeName')
80807db96d56Sopenharmony_ci        self.assertEqual(
80817db96d56Sopenharmony_ci            SpecialAttrsTests.TypeName.__qualname__,
80827db96d56Sopenharmony_ci            'SpecialAttrsTests.TypeName',
80837db96d56Sopenharmony_ci        )
80847db96d56Sopenharmony_ci        self.assertEqual(
80857db96d56Sopenharmony_ci            SpecialAttrsTests.TypeName.__module__,
80867db96d56Sopenharmony_ci            __name__,
80877db96d56Sopenharmony_ci        )
80887db96d56Sopenharmony_ci        # NewTypes are picklable assuming correct qualname information.
80897db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
80907db96d56Sopenharmony_ci            s = pickle.dumps(SpecialAttrsTests.TypeName, proto)
80917db96d56Sopenharmony_ci            loaded = pickle.loads(s)
80927db96d56Sopenharmony_ci            self.assertIs(SpecialAttrsTests.TypeName, loaded)
80937db96d56Sopenharmony_ci
80947db96d56Sopenharmony_ci        # Type variables don't support non-global instantiation per PEP 484
80957db96d56Sopenharmony_ci        # restriction that "The argument to TypeVar() must be a string equal
80967db96d56Sopenharmony_ci        # to the variable name to which it is assigned".  Thus, providing
80977db96d56Sopenharmony_ci        # __qualname__ is unnecessary.
80987db96d56Sopenharmony_ci        self.assertEqual(SpecialAttrsT.__name__, 'SpecialAttrsT')
80997db96d56Sopenharmony_ci        self.assertFalse(hasattr(SpecialAttrsT, '__qualname__'))
81007db96d56Sopenharmony_ci        self.assertEqual(SpecialAttrsT.__module__, __name__)
81017db96d56Sopenharmony_ci        # Module-level type variables are picklable.
81027db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
81037db96d56Sopenharmony_ci            s = pickle.dumps(SpecialAttrsT, proto)
81047db96d56Sopenharmony_ci            loaded = pickle.loads(s)
81057db96d56Sopenharmony_ci            self.assertIs(SpecialAttrsT, loaded)
81067db96d56Sopenharmony_ci
81077db96d56Sopenharmony_ci        self.assertEqual(SpecialAttrsP.__name__, 'SpecialAttrsP')
81087db96d56Sopenharmony_ci        self.assertFalse(hasattr(SpecialAttrsP, '__qualname__'))
81097db96d56Sopenharmony_ci        self.assertEqual(SpecialAttrsP.__module__, __name__)
81107db96d56Sopenharmony_ci        # Module-level ParamSpecs are picklable.
81117db96d56Sopenharmony_ci        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
81127db96d56Sopenharmony_ci            s = pickle.dumps(SpecialAttrsP, proto)
81137db96d56Sopenharmony_ci            loaded = pickle.loads(s)
81147db96d56Sopenharmony_ci            self.assertIs(SpecialAttrsP, loaded)
81157db96d56Sopenharmony_ci
81167db96d56Sopenharmony_ci    def test_genericalias_dir(self):
81177db96d56Sopenharmony_ci        class Foo(Generic[T]):
81187db96d56Sopenharmony_ci            def bar(self):
81197db96d56Sopenharmony_ci                pass
81207db96d56Sopenharmony_ci            baz = 3
81217db96d56Sopenharmony_ci            __magic__ = 4
81227db96d56Sopenharmony_ci
81237db96d56Sopenharmony_ci        # The class attributes of the original class should be visible even
81247db96d56Sopenharmony_ci        # in dir() of the GenericAlias. See bpo-45755.
81257db96d56Sopenharmony_ci        dir_items = set(dir(Foo[int]))
81267db96d56Sopenharmony_ci        for required_item in [
81277db96d56Sopenharmony_ci            'bar', 'baz',
81287db96d56Sopenharmony_ci            '__args__', '__parameters__', '__origin__',
81297db96d56Sopenharmony_ci        ]:
81307db96d56Sopenharmony_ci            with self.subTest(required_item=required_item):
81317db96d56Sopenharmony_ci                self.assertIn(required_item, dir_items)
81327db96d56Sopenharmony_ci        self.assertNotIn('__magic__', dir_items)
81337db96d56Sopenharmony_ci
81347db96d56Sopenharmony_ci
81357db96d56Sopenharmony_ciclass RevealTypeTests(BaseTestCase):
81367db96d56Sopenharmony_ci    def test_reveal_type(self):
81377db96d56Sopenharmony_ci        obj = object()
81387db96d56Sopenharmony_ci        with captured_stderr() as stderr:
81397db96d56Sopenharmony_ci            self.assertIs(obj, reveal_type(obj))
81407db96d56Sopenharmony_ci        self.assertEqual(stderr.getvalue(), "Runtime type is 'object'\n")
81417db96d56Sopenharmony_ci
81427db96d56Sopenharmony_ci
81437db96d56Sopenharmony_ciclass DataclassTransformTests(BaseTestCase):
81447db96d56Sopenharmony_ci    def test_decorator(self):
81457db96d56Sopenharmony_ci        def create_model(*, frozen: bool = False, kw_only: bool = True):
81467db96d56Sopenharmony_ci            return lambda cls: cls
81477db96d56Sopenharmony_ci
81487db96d56Sopenharmony_ci        decorated = dataclass_transform(kw_only_default=True, order_default=False)(create_model)
81497db96d56Sopenharmony_ci
81507db96d56Sopenharmony_ci        class CustomerModel:
81517db96d56Sopenharmony_ci            id: int
81527db96d56Sopenharmony_ci
81537db96d56Sopenharmony_ci        self.assertIs(decorated, create_model)
81547db96d56Sopenharmony_ci        self.assertEqual(
81557db96d56Sopenharmony_ci            decorated.__dataclass_transform__,
81567db96d56Sopenharmony_ci            {
81577db96d56Sopenharmony_ci                "eq_default": True,
81587db96d56Sopenharmony_ci                "order_default": False,
81597db96d56Sopenharmony_ci                "kw_only_default": True,
81607db96d56Sopenharmony_ci                "field_specifiers": (),
81617db96d56Sopenharmony_ci                "kwargs": {},
81627db96d56Sopenharmony_ci            }
81637db96d56Sopenharmony_ci        )
81647db96d56Sopenharmony_ci        self.assertIs(
81657db96d56Sopenharmony_ci            decorated(frozen=True, kw_only=False)(CustomerModel),
81667db96d56Sopenharmony_ci            CustomerModel
81677db96d56Sopenharmony_ci        )
81687db96d56Sopenharmony_ci
81697db96d56Sopenharmony_ci    def test_base_class(self):
81707db96d56Sopenharmony_ci        class ModelBase:
81717db96d56Sopenharmony_ci            def __init_subclass__(cls, *, frozen: bool = False): ...
81727db96d56Sopenharmony_ci
81737db96d56Sopenharmony_ci        Decorated = dataclass_transform(
81747db96d56Sopenharmony_ci            eq_default=True,
81757db96d56Sopenharmony_ci            order_default=True,
81767db96d56Sopenharmony_ci            # Arbitrary unrecognized kwargs are accepted at runtime.
81777db96d56Sopenharmony_ci            make_everything_awesome=True,
81787db96d56Sopenharmony_ci        )(ModelBase)
81797db96d56Sopenharmony_ci
81807db96d56Sopenharmony_ci        class CustomerModel(Decorated, frozen=True):
81817db96d56Sopenharmony_ci            id: int
81827db96d56Sopenharmony_ci
81837db96d56Sopenharmony_ci        self.assertIs(Decorated, ModelBase)
81847db96d56Sopenharmony_ci        self.assertEqual(
81857db96d56Sopenharmony_ci            Decorated.__dataclass_transform__,
81867db96d56Sopenharmony_ci            {
81877db96d56Sopenharmony_ci                "eq_default": True,
81887db96d56Sopenharmony_ci                "order_default": True,
81897db96d56Sopenharmony_ci                "kw_only_default": False,
81907db96d56Sopenharmony_ci                "field_specifiers": (),
81917db96d56Sopenharmony_ci                "kwargs": {"make_everything_awesome": True},
81927db96d56Sopenharmony_ci            }
81937db96d56Sopenharmony_ci        )
81947db96d56Sopenharmony_ci        self.assertIsSubclass(CustomerModel, Decorated)
81957db96d56Sopenharmony_ci
81967db96d56Sopenharmony_ci    def test_metaclass(self):
81977db96d56Sopenharmony_ci        class Field: ...
81987db96d56Sopenharmony_ci
81997db96d56Sopenharmony_ci        class ModelMeta(type):
82007db96d56Sopenharmony_ci            def __new__(
82017db96d56Sopenharmony_ci                cls, name, bases, namespace, *, init: bool = True,
82027db96d56Sopenharmony_ci            ):
82037db96d56Sopenharmony_ci                return super().__new__(cls, name, bases, namespace)
82047db96d56Sopenharmony_ci
82057db96d56Sopenharmony_ci        Decorated = dataclass_transform(
82067db96d56Sopenharmony_ci            order_default=True, field_specifiers=(Field,)
82077db96d56Sopenharmony_ci        )(ModelMeta)
82087db96d56Sopenharmony_ci
82097db96d56Sopenharmony_ci        class ModelBase(metaclass=Decorated): ...
82107db96d56Sopenharmony_ci
82117db96d56Sopenharmony_ci        class CustomerModel(ModelBase, init=False):
82127db96d56Sopenharmony_ci            id: int
82137db96d56Sopenharmony_ci
82147db96d56Sopenharmony_ci        self.assertIs(Decorated, ModelMeta)
82157db96d56Sopenharmony_ci        self.assertEqual(
82167db96d56Sopenharmony_ci            Decorated.__dataclass_transform__,
82177db96d56Sopenharmony_ci            {
82187db96d56Sopenharmony_ci                "eq_default": True,
82197db96d56Sopenharmony_ci                "order_default": True,
82207db96d56Sopenharmony_ci                "kw_only_default": False,
82217db96d56Sopenharmony_ci                "field_specifiers": (Field,),
82227db96d56Sopenharmony_ci                "kwargs": {},
82237db96d56Sopenharmony_ci            }
82247db96d56Sopenharmony_ci        )
82257db96d56Sopenharmony_ci        self.assertIsInstance(CustomerModel, Decorated)
82267db96d56Sopenharmony_ci
82277db96d56Sopenharmony_ci
82287db96d56Sopenharmony_ciclass AllTests(BaseTestCase):
82297db96d56Sopenharmony_ci    """Tests for __all__."""
82307db96d56Sopenharmony_ci
82317db96d56Sopenharmony_ci    def test_all(self):
82327db96d56Sopenharmony_ci        from typing import __all__ as a
82337db96d56Sopenharmony_ci        # Just spot-check the first and last of every category.
82347db96d56Sopenharmony_ci        self.assertIn('AbstractSet', a)
82357db96d56Sopenharmony_ci        self.assertIn('ValuesView', a)
82367db96d56Sopenharmony_ci        self.assertIn('cast', a)
82377db96d56Sopenharmony_ci        self.assertIn('overload', a)
82387db96d56Sopenharmony_ci        # Context managers.
82397db96d56Sopenharmony_ci        self.assertIn('ContextManager', a)
82407db96d56Sopenharmony_ci        self.assertIn('AsyncContextManager', a)
82417db96d56Sopenharmony_ci        # Check that io and re are not exported.
82427db96d56Sopenharmony_ci        self.assertNotIn('io', a)
82437db96d56Sopenharmony_ci        self.assertNotIn('re', a)
82447db96d56Sopenharmony_ci        # Spot-check that stdlib modules aren't exported.
82457db96d56Sopenharmony_ci        self.assertNotIn('os', a)
82467db96d56Sopenharmony_ci        self.assertNotIn('sys', a)
82477db96d56Sopenharmony_ci        # Check that Text is defined.
82487db96d56Sopenharmony_ci        self.assertIn('Text', a)
82497db96d56Sopenharmony_ci        # Check previously missing classes.
82507db96d56Sopenharmony_ci        self.assertIn('SupportsBytes', a)
82517db96d56Sopenharmony_ci        self.assertIn('SupportsComplex', a)
82527db96d56Sopenharmony_ci
82537db96d56Sopenharmony_ci    def test_all_exported_names(self):
82547db96d56Sopenharmony_ci        actual_all = set(typing.__all__)
82557db96d56Sopenharmony_ci        computed_all = {
82567db96d56Sopenharmony_ci            k for k, v in vars(typing).items()
82577db96d56Sopenharmony_ci            # explicitly exported, not a thing with __module__
82587db96d56Sopenharmony_ci            if k in actual_all or (
82597db96d56Sopenharmony_ci                # avoid private names
82607db96d56Sopenharmony_ci                not k.startswith('_') and
82617db96d56Sopenharmony_ci                k not in {'io', 're'} and
82627db96d56Sopenharmony_ci                # there's a few types and metaclasses that aren't exported
82637db96d56Sopenharmony_ci                not k.endswith(('Meta', '_contra', '_co')) and
82647db96d56Sopenharmony_ci                not k.upper() == k and
82657db96d56Sopenharmony_ci                # but export all things that have __module__ == 'typing'
82667db96d56Sopenharmony_ci                getattr(v, '__module__', None) == typing.__name__
82677db96d56Sopenharmony_ci            )
82687db96d56Sopenharmony_ci        }
82697db96d56Sopenharmony_ci        self.assertSetEqual(computed_all, actual_all)
82707db96d56Sopenharmony_ci
82717db96d56Sopenharmony_ci
82727db96d56Sopenharmony_ciclass TypeIterationTests(BaseTestCase):
82737db96d56Sopenharmony_ci    _UNITERABLE_TYPES = (
82747db96d56Sopenharmony_ci        Any,
82757db96d56Sopenharmony_ci        Union,
82767db96d56Sopenharmony_ci        Union[str, int],
82777db96d56Sopenharmony_ci        Union[str, T],
82787db96d56Sopenharmony_ci        List,
82797db96d56Sopenharmony_ci        Tuple,
82807db96d56Sopenharmony_ci        Callable,
82817db96d56Sopenharmony_ci        Callable[..., T],
82827db96d56Sopenharmony_ci        Callable[[T], str],
82837db96d56Sopenharmony_ci        Annotated,
82847db96d56Sopenharmony_ci        Annotated[T, ''],
82857db96d56Sopenharmony_ci    )
82867db96d56Sopenharmony_ci
82877db96d56Sopenharmony_ci    def test_cannot_iterate(self):
82887db96d56Sopenharmony_ci        expected_error_regex = "object is not iterable"
82897db96d56Sopenharmony_ci        for test_type in self._UNITERABLE_TYPES:
82907db96d56Sopenharmony_ci            with self.subTest(type=test_type):
82917db96d56Sopenharmony_ci                with self.assertRaisesRegex(TypeError, expected_error_regex):
82927db96d56Sopenharmony_ci                    iter(test_type)
82937db96d56Sopenharmony_ci                with self.assertRaisesRegex(TypeError, expected_error_regex):
82947db96d56Sopenharmony_ci                    list(test_type)
82957db96d56Sopenharmony_ci                with self.assertRaisesRegex(TypeError, expected_error_regex):
82967db96d56Sopenharmony_ci                    for _ in test_type:
82977db96d56Sopenharmony_ci                        pass
82987db96d56Sopenharmony_ci
82997db96d56Sopenharmony_ci    def test_is_not_instance_of_iterable(self):
83007db96d56Sopenharmony_ci        for type_to_test in self._UNITERABLE_TYPES:
83017db96d56Sopenharmony_ci            self.assertNotIsInstance(type_to_test, collections.abc.Iterable)
83027db96d56Sopenharmony_ci
83037db96d56Sopenharmony_ci
83047db96d56Sopenharmony_ciif __name__ == '__main__':
83057db96d56Sopenharmony_ci    main()
8306