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