summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikita Sobolev <mail@sobolevn.me>2023-04-23 17:50:23 (GMT)
committerGitHub <noreply@github.com>2023-04-23 17:50:23 (GMT)
commit5041c2ba6e9c992d1c54834481c9be64581c0235 (patch)
tree622165d2056be98ddcdf5342a7ee998ff80b16d3
parent777bdff0ec4c21176ddf61e07bc75d170bc65d54 (diff)
downloadcpython-5041c2ba6e9c992d1c54834481c9be64581c0235.zip
cpython-5041c2ba6e9c992d1c54834481c9be64581c0235.tar.gz
cpython-5041c2ba6e9c992d1c54834481c9be64581c0235.tar.bz2
gh-103592: Add tests of `Literal` with `Enum` and `Union` of `Literal`s (#103706)
-rw-r--r--Lib/test/test_typing.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 715710b..b78ce1e 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -1789,6 +1789,30 @@ class UnionTests(BaseTestCase):
Union[Elem, str] # Nor should this
+ def test_union_of_literals(self):
+ self.assertEqual(Union[Literal[1], Literal[2]].__args__,
+ (Literal[1], Literal[2]))
+ self.assertEqual(Union[Literal[1], Literal[1]],
+ Literal[1])
+
+ self.assertEqual(Union[Literal[False], Literal[0]].__args__,
+ (Literal[False], Literal[0]))
+ self.assertEqual(Union[Literal[True], Literal[1]].__args__,
+ (Literal[True], Literal[1]))
+
+ import enum
+ class Ints(enum.IntEnum):
+ A = 0
+ B = 1
+
+ self.assertEqual(Union[Literal[Ints.A], Literal[Ints.B]].__args__,
+ (Literal[Ints.A], Literal[Ints.B]))
+
+ self.assertEqual(Union[Literal[0], Literal[Ints.A], Literal[False]].__args__,
+ (Literal[0], Literal[Ints.A], Literal[False]))
+ self.assertEqual(Union[Literal[1], Literal[Ints.B], Literal[True]].__args__,
+ (Literal[1], Literal[Ints.B], Literal[True]))
+
class TupleTests(BaseTestCase):
@@ -2156,6 +2180,13 @@ class LiteralTests(BaseTestCase):
Literal[Literal[1, 2], Literal[4, 5]]
Literal[b"foo", u"bar"]
+ def test_enum(self):
+ import enum
+ class My(enum.Enum):
+ A = 'A'
+
+ self.assertEqual(Literal[My.A].__args__, (My.A,))
+
def test_illegal_parameters_do_not_raise_runtime_errors(self):
# Type checkers should reject these types, but we do not
# raise errors at runtime to maintain maximum flexibility.
@@ -2245,6 +2276,20 @@ class LiteralTests(BaseTestCase):
self.assertEqual(l, Literal[1, 2, 3])
self.assertEqual(l.__args__, (1, 2, 3))
+ def test_does_not_flatten_enum(self):
+ import enum
+ class Ints(enum.IntEnum):
+ A = 1
+ B = 2
+
+ l = Literal[
+ Literal[Ints.A],
+ Literal[Ints.B],
+ Literal[1],
+ Literal[2],
+ ]
+ self.assertEqual(l.__args__, (Ints.A, Ints.B, 1, 2))
+
XK = TypeVar('XK', str, bytes)
XV = TypeVar('XV')