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