17db96d56Sopenharmony_ci"""Tests for C-implemented GenericAlias.""" 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciimport unittest 47db96d56Sopenharmony_ciimport pickle 57db96d56Sopenharmony_ciimport copy 67db96d56Sopenharmony_cifrom collections import ( 77db96d56Sopenharmony_ci defaultdict, deque, OrderedDict, Counter, UserDict, UserList 87db96d56Sopenharmony_ci) 97db96d56Sopenharmony_cifrom collections.abc import * 107db96d56Sopenharmony_cifrom concurrent.futures import Future 117db96d56Sopenharmony_cifrom concurrent.futures.thread import _WorkItem 127db96d56Sopenharmony_cifrom contextlib import AbstractContextManager, AbstractAsyncContextManager 137db96d56Sopenharmony_cifrom contextvars import ContextVar, Token 147db96d56Sopenharmony_cifrom dataclasses import Field 157db96d56Sopenharmony_cifrom functools import partial, partialmethod, cached_property 167db96d56Sopenharmony_cifrom graphlib import TopologicalSorter 177db96d56Sopenharmony_cifrom logging import LoggerAdapter, StreamHandler 187db96d56Sopenharmony_cifrom mailbox import Mailbox, _PartialFile 197db96d56Sopenharmony_citry: 207db96d56Sopenharmony_ci import ctypes 217db96d56Sopenharmony_ciexcept ImportError: 227db96d56Sopenharmony_ci ctypes = None 237db96d56Sopenharmony_cifrom difflib import SequenceMatcher 247db96d56Sopenharmony_cifrom filecmp import dircmp 257db96d56Sopenharmony_cifrom fileinput import FileInput 267db96d56Sopenharmony_cifrom itertools import chain 277db96d56Sopenharmony_cifrom http.cookies import Morsel 287db96d56Sopenharmony_citry: 297db96d56Sopenharmony_ci from multiprocessing.managers import ValueProxy 307db96d56Sopenharmony_ci from multiprocessing.pool import ApplyResult 317db96d56Sopenharmony_ci from multiprocessing.queues import SimpleQueue as MPSimpleQueue 327db96d56Sopenharmony_ciexcept ImportError: 337db96d56Sopenharmony_ci # _multiprocessing module is optional 347db96d56Sopenharmony_ci ValueProxy = None 357db96d56Sopenharmony_ci ApplyResult = None 367db96d56Sopenharmony_ci MPSimpleQueue = None 377db96d56Sopenharmony_citry: 387db96d56Sopenharmony_ci from multiprocessing.shared_memory import ShareableList 397db96d56Sopenharmony_ciexcept ImportError: 407db96d56Sopenharmony_ci # multiprocessing.shared_memory is not available on e.g. Android 417db96d56Sopenharmony_ci ShareableList = None 427db96d56Sopenharmony_cifrom os import DirEntry 437db96d56Sopenharmony_cifrom re import Pattern, Match 447db96d56Sopenharmony_cifrom types import GenericAlias, MappingProxyType, AsyncGeneratorType 457db96d56Sopenharmony_cifrom tempfile import TemporaryDirectory, SpooledTemporaryFile 467db96d56Sopenharmony_cifrom urllib.parse import SplitResult, ParseResult 477db96d56Sopenharmony_cifrom unittest.case import _AssertRaisesContext 487db96d56Sopenharmony_cifrom queue import Queue, SimpleQueue 497db96d56Sopenharmony_cifrom weakref import WeakSet, ReferenceType, ref 507db96d56Sopenharmony_ciimport typing 517db96d56Sopenharmony_cifrom typing import Unpack 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_cifrom typing import TypeVar 547db96d56Sopenharmony_ciT = TypeVar('T') 557db96d56Sopenharmony_ciK = TypeVar('K') 567db96d56Sopenharmony_ciV = TypeVar('V') 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci_UNPACKED_TUPLES = [ 597db96d56Sopenharmony_ci # Unpacked tuple using `*` 607db96d56Sopenharmony_ci (*tuple[int],)[0], 617db96d56Sopenharmony_ci (*tuple[T],)[0], 627db96d56Sopenharmony_ci (*tuple[int, str],)[0], 637db96d56Sopenharmony_ci (*tuple[int, ...],)[0], 647db96d56Sopenharmony_ci (*tuple[T, ...],)[0], 657db96d56Sopenharmony_ci tuple[*tuple[int, ...]], 667db96d56Sopenharmony_ci tuple[*tuple[T, ...]], 677db96d56Sopenharmony_ci tuple[str, *tuple[int, ...]], 687db96d56Sopenharmony_ci tuple[*tuple[int, ...], str], 697db96d56Sopenharmony_ci tuple[float, *tuple[int, ...], str], 707db96d56Sopenharmony_ci tuple[*tuple[*tuple[int, ...]]], 717db96d56Sopenharmony_ci # Unpacked tuple using `Unpack` 727db96d56Sopenharmony_ci Unpack[tuple[int]], 737db96d56Sopenharmony_ci Unpack[tuple[T]], 747db96d56Sopenharmony_ci Unpack[tuple[int, str]], 757db96d56Sopenharmony_ci Unpack[tuple[int, ...]], 767db96d56Sopenharmony_ci Unpack[tuple[T, ...]], 777db96d56Sopenharmony_ci tuple[Unpack[tuple[int, ...]]], 787db96d56Sopenharmony_ci tuple[Unpack[tuple[T, ...]]], 797db96d56Sopenharmony_ci tuple[str, Unpack[tuple[int, ...]]], 807db96d56Sopenharmony_ci tuple[Unpack[tuple[int, ...]], str], 817db96d56Sopenharmony_ci tuple[float, Unpack[tuple[int, ...]], str], 827db96d56Sopenharmony_ci tuple[Unpack[tuple[Unpack[tuple[int, ...]]]]], 837db96d56Sopenharmony_ci # Unpacked tuple using `*` AND `Unpack` 847db96d56Sopenharmony_ci tuple[Unpack[tuple[*tuple[int, ...]]]], 857db96d56Sopenharmony_ci tuple[*tuple[Unpack[tuple[int, ...]]]], 867db96d56Sopenharmony_ci] 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ciclass BaseTest(unittest.TestCase): 907db96d56Sopenharmony_ci """Test basics.""" 917db96d56Sopenharmony_ci generic_types = [type, tuple, list, dict, set, frozenset, enumerate, 927db96d56Sopenharmony_ci defaultdict, deque, 937db96d56Sopenharmony_ci SequenceMatcher, 947db96d56Sopenharmony_ci dircmp, 957db96d56Sopenharmony_ci FileInput, 967db96d56Sopenharmony_ci OrderedDict, Counter, UserDict, UserList, 977db96d56Sopenharmony_ci Pattern, Match, 987db96d56Sopenharmony_ci partial, partialmethod, cached_property, 997db96d56Sopenharmony_ci TopologicalSorter, 1007db96d56Sopenharmony_ci AbstractContextManager, AbstractAsyncContextManager, 1017db96d56Sopenharmony_ci Awaitable, Coroutine, 1027db96d56Sopenharmony_ci AsyncIterable, AsyncIterator, 1037db96d56Sopenharmony_ci AsyncGenerator, Generator, 1047db96d56Sopenharmony_ci Iterable, Iterator, 1057db96d56Sopenharmony_ci Reversible, 1067db96d56Sopenharmony_ci Container, Collection, 1077db96d56Sopenharmony_ci Mailbox, _PartialFile, 1087db96d56Sopenharmony_ci ContextVar, Token, 1097db96d56Sopenharmony_ci Field, 1107db96d56Sopenharmony_ci Set, MutableSet, 1117db96d56Sopenharmony_ci Mapping, MutableMapping, MappingView, 1127db96d56Sopenharmony_ci KeysView, ItemsView, ValuesView, 1137db96d56Sopenharmony_ci Sequence, MutableSequence, 1147db96d56Sopenharmony_ci MappingProxyType, AsyncGeneratorType, 1157db96d56Sopenharmony_ci DirEntry, 1167db96d56Sopenharmony_ci chain, 1177db96d56Sopenharmony_ci LoggerAdapter, StreamHandler, 1187db96d56Sopenharmony_ci TemporaryDirectory, SpooledTemporaryFile, 1197db96d56Sopenharmony_ci Queue, SimpleQueue, 1207db96d56Sopenharmony_ci _AssertRaisesContext, 1217db96d56Sopenharmony_ci SplitResult, ParseResult, 1227db96d56Sopenharmony_ci WeakSet, ReferenceType, ref, 1237db96d56Sopenharmony_ci ShareableList, 1247db96d56Sopenharmony_ci Future, _WorkItem, 1257db96d56Sopenharmony_ci Morsel] 1267db96d56Sopenharmony_ci if ctypes is not None: 1277db96d56Sopenharmony_ci generic_types.extend((ctypes.Array, ctypes.LibraryLoader)) 1287db96d56Sopenharmony_ci if ValueProxy is not None: 1297db96d56Sopenharmony_ci generic_types.extend((ValueProxy, ApplyResult, MPSimpleQueue)) 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci def test_subscriptable(self): 1327db96d56Sopenharmony_ci for t in self.generic_types: 1337db96d56Sopenharmony_ci if t is None: 1347db96d56Sopenharmony_ci continue 1357db96d56Sopenharmony_ci tname = t.__name__ 1367db96d56Sopenharmony_ci with self.subTest(f"Testing {tname}"): 1377db96d56Sopenharmony_ci alias = t[int] 1387db96d56Sopenharmony_ci self.assertIs(alias.__origin__, t) 1397db96d56Sopenharmony_ci self.assertEqual(alias.__args__, (int,)) 1407db96d56Sopenharmony_ci self.assertEqual(alias.__parameters__, ()) 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci def test_unsubscriptable(self): 1437db96d56Sopenharmony_ci for t in int, str, float, Sized, Hashable: 1447db96d56Sopenharmony_ci tname = t.__name__ 1457db96d56Sopenharmony_ci with self.subTest(f"Testing {tname}"): 1467db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, tname): 1477db96d56Sopenharmony_ci t[int] 1487db96d56Sopenharmony_ci 1497db96d56Sopenharmony_ci def test_instantiate(self): 1507db96d56Sopenharmony_ci for t in tuple, list, dict, set, frozenset, defaultdict, deque: 1517db96d56Sopenharmony_ci tname = t.__name__ 1527db96d56Sopenharmony_ci with self.subTest(f"Testing {tname}"): 1537db96d56Sopenharmony_ci alias = t[int] 1547db96d56Sopenharmony_ci self.assertEqual(alias(), t()) 1557db96d56Sopenharmony_ci if t is dict: 1567db96d56Sopenharmony_ci self.assertEqual(alias(iter([('a', 1), ('b', 2)])), dict(a=1, b=2)) 1577db96d56Sopenharmony_ci self.assertEqual(alias(a=1, b=2), dict(a=1, b=2)) 1587db96d56Sopenharmony_ci elif t is defaultdict: 1597db96d56Sopenharmony_ci def default(): 1607db96d56Sopenharmony_ci return 'value' 1617db96d56Sopenharmony_ci a = alias(default) 1627db96d56Sopenharmony_ci d = defaultdict(default) 1637db96d56Sopenharmony_ci self.assertEqual(a['test'], d['test']) 1647db96d56Sopenharmony_ci else: 1657db96d56Sopenharmony_ci self.assertEqual(alias(iter((1, 2, 3))), t((1, 2, 3))) 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci def test_unbound_methods(self): 1687db96d56Sopenharmony_ci t = list[int] 1697db96d56Sopenharmony_ci a = t() 1707db96d56Sopenharmony_ci t.append(a, 'foo') 1717db96d56Sopenharmony_ci self.assertEqual(a, ['foo']) 1727db96d56Sopenharmony_ci x = t.__getitem__(a, 0) 1737db96d56Sopenharmony_ci self.assertEqual(x, 'foo') 1747db96d56Sopenharmony_ci self.assertEqual(t.__len__(a), 1) 1757db96d56Sopenharmony_ci 1767db96d56Sopenharmony_ci def test_subclassing(self): 1777db96d56Sopenharmony_ci class C(list[int]): 1787db96d56Sopenharmony_ci pass 1797db96d56Sopenharmony_ci self.assertEqual(C.__bases__, (list,)) 1807db96d56Sopenharmony_ci self.assertEqual(C.__class__, type) 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_ci def test_class_methods(self): 1837db96d56Sopenharmony_ci t = dict[int, None] 1847db96d56Sopenharmony_ci self.assertEqual(dict.fromkeys(range(2)), {0: None, 1: None}) # This works 1857db96d56Sopenharmony_ci self.assertEqual(t.fromkeys(range(2)), {0: None, 1: None}) # Should be equivalent 1867db96d56Sopenharmony_ci 1877db96d56Sopenharmony_ci def test_no_chaining(self): 1887db96d56Sopenharmony_ci t = list[int] 1897db96d56Sopenharmony_ci with self.assertRaises(TypeError): 1907db96d56Sopenharmony_ci t[int] 1917db96d56Sopenharmony_ci 1927db96d56Sopenharmony_ci def test_generic_subclass(self): 1937db96d56Sopenharmony_ci class MyList(list): 1947db96d56Sopenharmony_ci pass 1957db96d56Sopenharmony_ci t = MyList[int] 1967db96d56Sopenharmony_ci self.assertIs(t.__origin__, MyList) 1977db96d56Sopenharmony_ci self.assertEqual(t.__args__, (int,)) 1987db96d56Sopenharmony_ci self.assertEqual(t.__parameters__, ()) 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ci def test_repr(self): 2017db96d56Sopenharmony_ci class MyList(list): 2027db96d56Sopenharmony_ci pass 2037db96d56Sopenharmony_ci self.assertEqual(repr(list[str]), 'list[str]') 2047db96d56Sopenharmony_ci self.assertEqual(repr(list[()]), 'list[()]') 2057db96d56Sopenharmony_ci self.assertEqual(repr(tuple[int, ...]), 'tuple[int, ...]') 2067db96d56Sopenharmony_ci x1 = tuple[*tuple[int]] 2077db96d56Sopenharmony_ci self.assertEqual(repr(x1), 'tuple[*tuple[int]]') 2087db96d56Sopenharmony_ci x2 = tuple[*tuple[int, str]] 2097db96d56Sopenharmony_ci self.assertEqual(repr(x2), 'tuple[*tuple[int, str]]') 2107db96d56Sopenharmony_ci x3 = tuple[*tuple[int, ...]] 2117db96d56Sopenharmony_ci self.assertEqual(repr(x3), 'tuple[*tuple[int, ...]]') 2127db96d56Sopenharmony_ci self.assertTrue(repr(MyList[int]).endswith('.BaseTest.test_repr.<locals>.MyList[int]')) 2137db96d56Sopenharmony_ci self.assertEqual(repr(list[str]()), '[]') # instances should keep their normal repr 2147db96d56Sopenharmony_ci 2157db96d56Sopenharmony_ci def test_exposed_type(self): 2167db96d56Sopenharmony_ci import types 2177db96d56Sopenharmony_ci a = types.GenericAlias(list, int) 2187db96d56Sopenharmony_ci self.assertEqual(str(a), 'list[int]') 2197db96d56Sopenharmony_ci self.assertIs(a.__origin__, list) 2207db96d56Sopenharmony_ci self.assertEqual(a.__args__, (int,)) 2217db96d56Sopenharmony_ci self.assertEqual(a.__parameters__, ()) 2227db96d56Sopenharmony_ci 2237db96d56Sopenharmony_ci def test_parameters(self): 2247db96d56Sopenharmony_ci from typing import List, Dict, Callable 2257db96d56Sopenharmony_ci 2267db96d56Sopenharmony_ci D0 = dict[str, int] 2277db96d56Sopenharmony_ci self.assertEqual(D0.__args__, (str, int)) 2287db96d56Sopenharmony_ci self.assertEqual(D0.__parameters__, ()) 2297db96d56Sopenharmony_ci D1a = dict[str, V] 2307db96d56Sopenharmony_ci self.assertEqual(D1a.__args__, (str, V)) 2317db96d56Sopenharmony_ci self.assertEqual(D1a.__parameters__, (V,)) 2327db96d56Sopenharmony_ci D1b = dict[K, int] 2337db96d56Sopenharmony_ci self.assertEqual(D1b.__args__, (K, int)) 2347db96d56Sopenharmony_ci self.assertEqual(D1b.__parameters__, (K,)) 2357db96d56Sopenharmony_ci D2a = dict[K, V] 2367db96d56Sopenharmony_ci self.assertEqual(D2a.__args__, (K, V)) 2377db96d56Sopenharmony_ci self.assertEqual(D2a.__parameters__, (K, V)) 2387db96d56Sopenharmony_ci D2b = dict[T, T] 2397db96d56Sopenharmony_ci self.assertEqual(D2b.__args__, (T, T)) 2407db96d56Sopenharmony_ci self.assertEqual(D2b.__parameters__, (T,)) 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ci L0 = list[str] 2437db96d56Sopenharmony_ci self.assertEqual(L0.__args__, (str,)) 2447db96d56Sopenharmony_ci self.assertEqual(L0.__parameters__, ()) 2457db96d56Sopenharmony_ci L1 = list[T] 2467db96d56Sopenharmony_ci self.assertEqual(L1.__args__, (T,)) 2477db96d56Sopenharmony_ci self.assertEqual(L1.__parameters__, (T,)) 2487db96d56Sopenharmony_ci L2 = list[list[T]] 2497db96d56Sopenharmony_ci self.assertEqual(L2.__args__, (list[T],)) 2507db96d56Sopenharmony_ci self.assertEqual(L2.__parameters__, (T,)) 2517db96d56Sopenharmony_ci L3 = list[List[T]] 2527db96d56Sopenharmony_ci self.assertEqual(L3.__args__, (List[T],)) 2537db96d56Sopenharmony_ci self.assertEqual(L3.__parameters__, (T,)) 2547db96d56Sopenharmony_ci L4a = list[Dict[K, V]] 2557db96d56Sopenharmony_ci self.assertEqual(L4a.__args__, (Dict[K, V],)) 2567db96d56Sopenharmony_ci self.assertEqual(L4a.__parameters__, (K, V)) 2577db96d56Sopenharmony_ci L4b = list[Dict[T, int]] 2587db96d56Sopenharmony_ci self.assertEqual(L4b.__args__, (Dict[T, int],)) 2597db96d56Sopenharmony_ci self.assertEqual(L4b.__parameters__, (T,)) 2607db96d56Sopenharmony_ci L5 = list[Callable[[K, V], K]] 2617db96d56Sopenharmony_ci self.assertEqual(L5.__args__, (Callable[[K, V], K],)) 2627db96d56Sopenharmony_ci self.assertEqual(L5.__parameters__, (K, V)) 2637db96d56Sopenharmony_ci 2647db96d56Sopenharmony_ci T1 = tuple[*tuple[int]] 2657db96d56Sopenharmony_ci self.assertEqual( 2667db96d56Sopenharmony_ci T1.__args__, 2677db96d56Sopenharmony_ci (*tuple[int],), 2687db96d56Sopenharmony_ci ) 2697db96d56Sopenharmony_ci self.assertEqual(T1.__parameters__, ()) 2707db96d56Sopenharmony_ci 2717db96d56Sopenharmony_ci T2 = tuple[*tuple[T]] 2727db96d56Sopenharmony_ci self.assertEqual( 2737db96d56Sopenharmony_ci T2.__args__, 2747db96d56Sopenharmony_ci (*tuple[T],), 2757db96d56Sopenharmony_ci ) 2767db96d56Sopenharmony_ci self.assertEqual(T2.__parameters__, (T,)) 2777db96d56Sopenharmony_ci 2787db96d56Sopenharmony_ci T4 = tuple[*tuple[int, str]] 2797db96d56Sopenharmony_ci self.assertEqual( 2807db96d56Sopenharmony_ci T4.__args__, 2817db96d56Sopenharmony_ci (*tuple[int, str],), 2827db96d56Sopenharmony_ci ) 2837db96d56Sopenharmony_ci self.assertEqual(T4.__parameters__, ()) 2847db96d56Sopenharmony_ci 2857db96d56Sopenharmony_ci def test_parameter_chaining(self): 2867db96d56Sopenharmony_ci from typing import List, Dict, Union, Callable 2877db96d56Sopenharmony_ci self.assertEqual(list[T][int], list[int]) 2887db96d56Sopenharmony_ci self.assertEqual(dict[str, T][int], dict[str, int]) 2897db96d56Sopenharmony_ci self.assertEqual(dict[T, int][str], dict[str, int]) 2907db96d56Sopenharmony_ci self.assertEqual(dict[K, V][str, int], dict[str, int]) 2917db96d56Sopenharmony_ci self.assertEqual(dict[T, T][int], dict[int, int]) 2927db96d56Sopenharmony_ci 2937db96d56Sopenharmony_ci self.assertEqual(list[list[T]][int], list[list[int]]) 2947db96d56Sopenharmony_ci self.assertEqual(list[dict[T, int]][str], list[dict[str, int]]) 2957db96d56Sopenharmony_ci self.assertEqual(list[dict[str, T]][int], list[dict[str, int]]) 2967db96d56Sopenharmony_ci self.assertEqual(list[dict[K, V]][str, int], list[dict[str, int]]) 2977db96d56Sopenharmony_ci self.assertEqual(dict[T, list[int]][str], dict[str, list[int]]) 2987db96d56Sopenharmony_ci 2997db96d56Sopenharmony_ci self.assertEqual(list[List[T]][int], list[List[int]]) 3007db96d56Sopenharmony_ci self.assertEqual(list[Dict[K, V]][str, int], list[Dict[str, int]]) 3017db96d56Sopenharmony_ci self.assertEqual(list[Union[K, V]][str, int], list[Union[str, int]]) 3027db96d56Sopenharmony_ci self.assertEqual(list[Callable[[K, V], K]][str, int], 3037db96d56Sopenharmony_ci list[Callable[[str, int], str]]) 3047db96d56Sopenharmony_ci self.assertEqual(dict[T, List[int]][str], dict[str, List[int]]) 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_ci with self.assertRaises(TypeError): 3077db96d56Sopenharmony_ci list[int][int] 3087db96d56Sopenharmony_ci with self.assertRaises(TypeError): 3097db96d56Sopenharmony_ci dict[T, int][str, int] 3107db96d56Sopenharmony_ci with self.assertRaises(TypeError): 3117db96d56Sopenharmony_ci dict[str, T][str, int] 3127db96d56Sopenharmony_ci with self.assertRaises(TypeError): 3137db96d56Sopenharmony_ci dict[T, T][str, int] 3147db96d56Sopenharmony_ci 3157db96d56Sopenharmony_ci def test_equality(self): 3167db96d56Sopenharmony_ci self.assertEqual(list[int], list[int]) 3177db96d56Sopenharmony_ci self.assertEqual(dict[str, int], dict[str, int]) 3187db96d56Sopenharmony_ci self.assertEqual((*tuple[int],)[0], (*tuple[int],)[0]) 3197db96d56Sopenharmony_ci self.assertEqual(tuple[*tuple[int]], tuple[*tuple[int]]) 3207db96d56Sopenharmony_ci self.assertNotEqual(dict[str, int], dict[str, str]) 3217db96d56Sopenharmony_ci self.assertNotEqual(list, list[int]) 3227db96d56Sopenharmony_ci self.assertNotEqual(list[int], list) 3237db96d56Sopenharmony_ci self.assertNotEqual(list[int], tuple[int]) 3247db96d56Sopenharmony_ci self.assertNotEqual((*tuple[int],)[0], tuple[int]) 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ci def test_isinstance(self): 3277db96d56Sopenharmony_ci self.assertTrue(isinstance([], list)) 3287db96d56Sopenharmony_ci with self.assertRaises(TypeError): 3297db96d56Sopenharmony_ci isinstance([], list[str]) 3307db96d56Sopenharmony_ci 3317db96d56Sopenharmony_ci def test_issubclass(self): 3327db96d56Sopenharmony_ci class L(list): ... 3337db96d56Sopenharmony_ci self.assertTrue(issubclass(L, list)) 3347db96d56Sopenharmony_ci with self.assertRaises(TypeError): 3357db96d56Sopenharmony_ci issubclass(L, list[str]) 3367db96d56Sopenharmony_ci 3377db96d56Sopenharmony_ci def test_type_generic(self): 3387db96d56Sopenharmony_ci t = type[int] 3397db96d56Sopenharmony_ci Test = t('Test', (), {}) 3407db96d56Sopenharmony_ci self.assertTrue(isinstance(Test, type)) 3417db96d56Sopenharmony_ci test = Test() 3427db96d56Sopenharmony_ci self.assertEqual(t(test), Test) 3437db96d56Sopenharmony_ci self.assertEqual(t(0), int) 3447db96d56Sopenharmony_ci 3457db96d56Sopenharmony_ci def test_type_subclass_generic(self): 3467db96d56Sopenharmony_ci class MyType(type): 3477db96d56Sopenharmony_ci pass 3487db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, 'MyType'): 3497db96d56Sopenharmony_ci MyType[int] 3507db96d56Sopenharmony_ci 3517db96d56Sopenharmony_ci def test_pickle(self): 3527db96d56Sopenharmony_ci aliases = [GenericAlias(list, T)] + _UNPACKED_TUPLES 3537db96d56Sopenharmony_ci for alias in aliases: 3547db96d56Sopenharmony_ci for proto in range(pickle.HIGHEST_PROTOCOL + 1): 3557db96d56Sopenharmony_ci with self.subTest(alias=alias, proto=proto): 3567db96d56Sopenharmony_ci s = pickle.dumps(alias, proto) 3577db96d56Sopenharmony_ci loaded = pickle.loads(s) 3587db96d56Sopenharmony_ci self.assertEqual(loaded.__origin__, alias.__origin__) 3597db96d56Sopenharmony_ci self.assertEqual(loaded.__args__, alias.__args__) 3607db96d56Sopenharmony_ci self.assertEqual(loaded.__parameters__, alias.__parameters__) 3617db96d56Sopenharmony_ci self.assertEqual(type(loaded), type(alias)) 3627db96d56Sopenharmony_ci 3637db96d56Sopenharmony_ci def test_copy(self): 3647db96d56Sopenharmony_ci class X(list): 3657db96d56Sopenharmony_ci def __copy__(self): 3667db96d56Sopenharmony_ci return self 3677db96d56Sopenharmony_ci def __deepcopy__(self, memo): 3687db96d56Sopenharmony_ci return self 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ci aliases = [ 3717db96d56Sopenharmony_ci GenericAlias(list, T), 3727db96d56Sopenharmony_ci GenericAlias(deque, T), 3737db96d56Sopenharmony_ci GenericAlias(X, T) 3747db96d56Sopenharmony_ci ] + _UNPACKED_TUPLES 3757db96d56Sopenharmony_ci for alias in aliases: 3767db96d56Sopenharmony_ci with self.subTest(alias=alias): 3777db96d56Sopenharmony_ci copied = copy.copy(alias) 3787db96d56Sopenharmony_ci self.assertEqual(copied.__origin__, alias.__origin__) 3797db96d56Sopenharmony_ci self.assertEqual(copied.__args__, alias.__args__) 3807db96d56Sopenharmony_ci self.assertEqual(copied.__parameters__, alias.__parameters__) 3817db96d56Sopenharmony_ci copied = copy.deepcopy(alias) 3827db96d56Sopenharmony_ci self.assertEqual(copied.__origin__, alias.__origin__) 3837db96d56Sopenharmony_ci self.assertEqual(copied.__args__, alias.__args__) 3847db96d56Sopenharmony_ci self.assertEqual(copied.__parameters__, alias.__parameters__) 3857db96d56Sopenharmony_ci 3867db96d56Sopenharmony_ci def test_unpack(self): 3877db96d56Sopenharmony_ci alias = tuple[str, ...] 3887db96d56Sopenharmony_ci self.assertIs(alias.__unpacked__, False) 3897db96d56Sopenharmony_ci unpacked = (*alias,)[0] 3907db96d56Sopenharmony_ci self.assertIs(unpacked.__unpacked__, True) 3917db96d56Sopenharmony_ci 3927db96d56Sopenharmony_ci def test_union(self): 3937db96d56Sopenharmony_ci a = typing.Union[list[int], list[str]] 3947db96d56Sopenharmony_ci self.assertEqual(a.__args__, (list[int], list[str])) 3957db96d56Sopenharmony_ci self.assertEqual(a.__parameters__, ()) 3967db96d56Sopenharmony_ci 3977db96d56Sopenharmony_ci def test_union_generic(self): 3987db96d56Sopenharmony_ci a = typing.Union[list[T], tuple[T, ...]] 3997db96d56Sopenharmony_ci self.assertEqual(a.__args__, (list[T], tuple[T, ...])) 4007db96d56Sopenharmony_ci self.assertEqual(a.__parameters__, (T,)) 4017db96d56Sopenharmony_ci 4027db96d56Sopenharmony_ci def test_dir(self): 4037db96d56Sopenharmony_ci dir_of_gen_alias = set(dir(list[int])) 4047db96d56Sopenharmony_ci self.assertTrue(dir_of_gen_alias.issuperset(dir(list))) 4057db96d56Sopenharmony_ci for generic_alias_property in ("__origin__", "__args__", "__parameters__"): 4067db96d56Sopenharmony_ci self.assertIn(generic_alias_property, dir_of_gen_alias) 4077db96d56Sopenharmony_ci 4087db96d56Sopenharmony_ci def test_weakref(self): 4097db96d56Sopenharmony_ci for t in self.generic_types: 4107db96d56Sopenharmony_ci if t is None: 4117db96d56Sopenharmony_ci continue 4127db96d56Sopenharmony_ci tname = t.__name__ 4137db96d56Sopenharmony_ci with self.subTest(f"Testing {tname}"): 4147db96d56Sopenharmony_ci alias = t[int] 4157db96d56Sopenharmony_ci self.assertEqual(ref(alias)(), alias) 4167db96d56Sopenharmony_ci 4177db96d56Sopenharmony_ci def test_no_kwargs(self): 4187db96d56Sopenharmony_ci # bpo-42576 4197db96d56Sopenharmony_ci with self.assertRaises(TypeError): 4207db96d56Sopenharmony_ci GenericAlias(bad=float) 4217db96d56Sopenharmony_ci 4227db96d56Sopenharmony_ci def test_subclassing_types_genericalias(self): 4237db96d56Sopenharmony_ci class SubClass(GenericAlias): ... 4247db96d56Sopenharmony_ci alias = SubClass(list, int) 4257db96d56Sopenharmony_ci class Bad(GenericAlias): 4267db96d56Sopenharmony_ci def __new__(cls, *args, **kwargs): 4277db96d56Sopenharmony_ci super().__new__(cls, *args, **kwargs) 4287db96d56Sopenharmony_ci 4297db96d56Sopenharmony_ci self.assertEqual(alias, list[int]) 4307db96d56Sopenharmony_ci with self.assertRaises(TypeError): 4317db96d56Sopenharmony_ci Bad(list, int, bad=int) 4327db96d56Sopenharmony_ci 4337db96d56Sopenharmony_ci def test_iter_creates_starred_tuple(self): 4347db96d56Sopenharmony_ci t = tuple[int, str] 4357db96d56Sopenharmony_ci iter_t = iter(t) 4367db96d56Sopenharmony_ci x = next(iter_t) 4377db96d56Sopenharmony_ci self.assertEqual(repr(x), '*tuple[int, str]') 4387db96d56Sopenharmony_ci 4397db96d56Sopenharmony_ci def test_calling_next_twice_raises_stopiteration(self): 4407db96d56Sopenharmony_ci t = tuple[int, str] 4417db96d56Sopenharmony_ci iter_t = iter(t) 4427db96d56Sopenharmony_ci next(iter_t) 4437db96d56Sopenharmony_ci with self.assertRaises(StopIteration): 4447db96d56Sopenharmony_ci next(iter_t) 4457db96d56Sopenharmony_ci 4467db96d56Sopenharmony_ci def test_del_iter(self): 4477db96d56Sopenharmony_ci t = tuple[int, str] 4487db96d56Sopenharmony_ci iter_x = iter(t) 4497db96d56Sopenharmony_ci del iter_x 4507db96d56Sopenharmony_ci 4517db96d56Sopenharmony_ci 4527db96d56Sopenharmony_ciclass TypeIterationTests(unittest.TestCase): 4537db96d56Sopenharmony_ci _UNITERABLE_TYPES = (list, tuple) 4547db96d56Sopenharmony_ci 4557db96d56Sopenharmony_ci def test_cannot_iterate(self): 4567db96d56Sopenharmony_ci for test_type in self._UNITERABLE_TYPES: 4577db96d56Sopenharmony_ci with self.subTest(type=test_type): 4587db96d56Sopenharmony_ci expected_error_regex = "object is not iterable" 4597db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, expected_error_regex): 4607db96d56Sopenharmony_ci iter(test_type) 4617db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, expected_error_regex): 4627db96d56Sopenharmony_ci list(test_type) 4637db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, expected_error_regex): 4647db96d56Sopenharmony_ci for _ in test_type: 4657db96d56Sopenharmony_ci pass 4667db96d56Sopenharmony_ci 4677db96d56Sopenharmony_ci def test_is_not_instance_of_iterable(self): 4687db96d56Sopenharmony_ci for type_to_test in self._UNITERABLE_TYPES: 4697db96d56Sopenharmony_ci self.assertNotIsInstance(type_to_test, Iterable) 4707db96d56Sopenharmony_ci 4717db96d56Sopenharmony_ci 4727db96d56Sopenharmony_ciif __name__ == "__main__": 4737db96d56Sopenharmony_ci unittest.main() 474