|
8 | 8 | import types
|
9 | 9 | from unittest import TestCase, main, skipUnless
|
10 | 10 |
|
11 |
| -from typing_extensions import NoReturn, ClassVar, Final, IntVar, Literal, TypedDict |
| 11 | +from typing_extensions import Annotated, NoReturn, ClassVar, Final, IntVar, Literal, TypedDict |
12 | 12 | from typing_extensions import ContextManager, Counter, Deque, DefaultDict
|
13 | 13 | from typing_extensions import NewType, overload, Protocol, runtime
|
| 14 | +from typing import Dict, List |
14 | 15 | import typing
|
15 | 16 | import typing_extensions
|
16 | 17 |
|
@@ -926,6 +927,147 @@ def test_total(self):
|
926 | 927 | self.assertEqual(D.__total__, False)
|
927 | 928 |
|
928 | 929 |
|
| 930 | +class AnnotatedTests(BaseTestCase): |
| 931 | + |
| 932 | + def test_repr(self): |
| 933 | + self.assertEqual( |
| 934 | + repr(Annotated[int, 4, 5]), |
| 935 | + "typing_extensions.Annotated[int, 4, 5]" |
| 936 | + ) |
| 937 | + self.assertEqual( |
| 938 | + repr(Annotated[List[int], 4, 5]), |
| 939 | + "typing_extensions.Annotated[typing.List[int], 4, 5]" |
| 940 | + ) |
| 941 | + self.assertEqual(repr(Annotated), "typing_extensions.Annotated") |
| 942 | + |
| 943 | + def test_flatten(self): |
| 944 | + A = Annotated[Annotated[int, 4], 5] |
| 945 | + self.assertEqual(A, Annotated[int, 4, 5]) |
| 946 | + self.assertEqual(A.__metadata__, (4, 5)) |
| 947 | + |
| 948 | + def test_specialize(self): |
| 949 | + L = Annotated[List[T], "my decoration"] |
| 950 | + LI = Annotated[List[int], "my decoration"] |
| 951 | + self.assertEqual(L[int], Annotated[List[int], "my decoration"]) |
| 952 | + self.assertEqual(L[int].__metadata__, ("my decoration",)) |
| 953 | + with self.assertRaises(TypeError): |
| 954 | + LI[int] |
| 955 | + with self.assertRaises(TypeError): |
| 956 | + L[int, float] |
| 957 | + |
| 958 | + def test_hash_eq(self): |
| 959 | + self.assertEqual(len({Annotated[int, 4, 5], Annotated[int, 4, 5]}), 1) |
| 960 | + self.assertNotEqual(Annotated[int, 4, 5], Annotated[int, 5, 4]) |
| 961 | + self.assertNotEqual(Annotated[int, 4, 5], Annotated[str, 4, 5]) |
| 962 | + self.assertNotEqual(Annotated[int, 4], Annotated[int, 4, 4]) |
| 963 | + self.assertEqual( |
| 964 | + {Annotated[int, 4, 5], Annotated[int, 4, 5], Annotated[T, 4, 5]}, |
| 965 | + {Annotated[int, 4, 5], Annotated[T, 4, 5]} |
| 966 | + ) |
| 967 | + |
| 968 | + def test_instantiate(self): |
| 969 | + class C: |
| 970 | + classvar = 4 |
| 971 | + |
| 972 | + def __init__(self, x): |
| 973 | + self.x = x |
| 974 | + |
| 975 | + def __eq__(self, other): |
| 976 | + if not isinstance(other, C): |
| 977 | + return NotImplemented |
| 978 | + return other.x == self.x |
| 979 | + |
| 980 | + A = Annotated[C, "a decoration"] |
| 981 | + a = A(5) |
| 982 | + c = C(5) |
| 983 | + self.assertEqual(a, c) |
| 984 | + self.assertEqual(a.x, c.x) |
| 985 | + self.assertEqual(a.classvar, c.classvar) |
| 986 | + |
| 987 | + def test_instantiate_generic(self): |
| 988 | + MyCount = Annotated[typing_extensions.Counter[T], "my decoration"] |
| 989 | + self.assertEqual(MyCount([4, 4, 5]), {4: 2, 5: 1}) |
| 990 | + self.assertEqual(MyCount[int]([4, 4, 5]), {4: 2, 5: 1}) |
| 991 | + |
| 992 | + def test_cannot_instantiate_forward(self): |
| 993 | + A = Annotated["int", (5, 6)] |
| 994 | + with self.assertRaises(TypeError): |
| 995 | + A(5) |
| 996 | + |
| 997 | + def test_cannot_instantiate_type_var(self): |
| 998 | + A = Annotated[T, (5, 6)] |
| 999 | + with self.assertRaises(TypeError): |
| 1000 | + A(5) |
| 1001 | + |
| 1002 | + def test_cannot_getattr_typevar(self): |
| 1003 | + with self.assertRaises(AttributeError): |
| 1004 | + Annotated[T, (5, 7)].x |
| 1005 | + |
| 1006 | + def test_attr_passthrough(self): |
| 1007 | + class C: |
| 1008 | + classvar = 4 |
| 1009 | + |
| 1010 | + A = Annotated[C, "a decoration"] |
| 1011 | + self.assertEqual(A.classvar, 4) |
| 1012 | + A.x = 5 |
| 1013 | + self.assertEqual(C.x, 5) |
| 1014 | + |
| 1015 | + def test_hash_eq(self): |
| 1016 | + self.assertEqual(len({Annotated[int, 4, 5], Annotated[int, 4, 5]}), 1) |
| 1017 | + self.assertNotEqual(Annotated[int, 4, 5], Annotated[int, 5, 4]) |
| 1018 | + self.assertNotEqual(Annotated[int, 4, 5], Annotated[str, 4, 5]) |
| 1019 | + self.assertNotEqual(Annotated[int, 4], Annotated[int, 4, 4]) |
| 1020 | + self.assertEqual( |
| 1021 | + {Annotated[int, 4, 5], Annotated[int, 4, 5], Annotated[T, 4, 5]}, |
| 1022 | + {Annotated[int, 4, 5], Annotated[T, 4, 5]} |
| 1023 | + ) |
| 1024 | + |
| 1025 | + def test_cannot_subclass(self): |
| 1026 | + with self.assertRaises(TypeError): |
| 1027 | + class C(Annotated): |
| 1028 | + pass |
| 1029 | + |
| 1030 | + def test_cannot_check_instance(self): |
| 1031 | + with self.assertRaises(TypeError): |
| 1032 | + isinstance(5, Annotated[int, "positive"]) |
| 1033 | + |
| 1034 | + def test_cannot_check_subclass(self): |
| 1035 | + with self.assertRaises(TypeError): |
| 1036 | + issubclass(int, Annotated[int, "positive"]) |
| 1037 | + |
| 1038 | + def test_subst(self): |
| 1039 | + dec = "a decoration" |
| 1040 | + dec2 = "another decoration" |
| 1041 | + |
| 1042 | + S = Annotated[T, dec2] |
| 1043 | + self.assertEqual(S[int], Annotated[int, dec2]) |
| 1044 | + |
| 1045 | + self.assertEqual(S[Annotated[int, dec]], Annotated[int, dec, dec2]) |
| 1046 | + L = Annotated[List[T], dec] |
| 1047 | + |
| 1048 | + self.assertEqual(L[int], Annotated[List[int], dec]) |
| 1049 | + with self.assertRaises(TypeError): |
| 1050 | + L[int, int] |
| 1051 | + |
| 1052 | + self.assertEqual(S[L[int]], Annotated[List[int], dec, dec2]) |
| 1053 | + |
| 1054 | + D = Annotated[Dict[KT, VT], dec] |
| 1055 | + self.assertEqual(D[str, int], Annotated[Dict[str, int], dec]) |
| 1056 | + with self.assertRaises(TypeError): |
| 1057 | + D[int] |
| 1058 | + |
| 1059 | + I = Annotated[int, dec] |
| 1060 | + with self.assertRaises(TypeError): |
| 1061 | + I[None] |
| 1062 | + |
| 1063 | + LI = L[int] |
| 1064 | + with self.assertRaises(TypeError): |
| 1065 | + LI[None] |
| 1066 | + |
| 1067 | + def test_annotated_in_other_types(self): |
| 1068 | + X = List[Annotated[T, 5]] |
| 1069 | + self.assertEqual(X[int], List[Annotated[int, 5]]) |
| 1070 | + |
929 | 1071 | class AllTests(BaseTestCase):
|
930 | 1072 |
|
931 | 1073 | def test_typing_extensions_includes_standard(self):
|
|
0 commit comments