Skip to content

Commit 32e3e0b

Browse files
authored
bpo-46685: improve test coverage of Self and Never in typing (GH-31222)
1 parent 25c0b9d commit 32e3e0b

File tree

1 file changed

+48
-1
lines changed

1 file changed

+48
-1
lines changed

Lib/test/test_typing.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,14 @@ def test_any_works_with_alias(self):
127127
class BottomTypeTestsMixin:
128128
bottom_type: ClassVar[Any]
129129

130+
def test_equality(self):
131+
self.assertEqual(self.bottom_type, self.bottom_type)
132+
self.assertIs(self.bottom_type, self.bottom_type)
133+
self.assertNotEqual(self.bottom_type, None)
134+
135+
def test_get_origin(self):
136+
self.assertIs(get_origin(self.bottom_type), None)
137+
130138
def test_instance_type_error(self):
131139
with self.assertRaises(TypeError):
132140
isinstance(42, self.bottom_type)
@@ -162,13 +170,35 @@ class NoReturnTests(BottomTypeTestsMixin, BaseTestCase):
162170
def test_repr(self):
163171
self.assertEqual(repr(NoReturn), 'typing.NoReturn')
164172

173+
def test_get_type_hints(self):
174+
def some(arg: NoReturn) -> NoReturn: ...
175+
def some_str(arg: 'NoReturn') -> 'typing.NoReturn': ...
176+
177+
expected = {'arg': NoReturn, 'return': NoReturn}
178+
for target in [some, some_str]:
179+
with self.subTest(target=target):
180+
self.assertEqual(gth(target), expected)
181+
182+
def test_not_equality(self):
183+
self.assertNotEqual(NoReturn, Never)
184+
self.assertNotEqual(Never, NoReturn)
185+
165186

166187
class NeverTests(BottomTypeTestsMixin, BaseTestCase):
167188
bottom_type = Never
168189

169190
def test_repr(self):
170191
self.assertEqual(repr(Never), 'typing.Never')
171192

193+
def test_get_type_hints(self):
194+
def some(arg: Never) -> Never: ...
195+
def some_str(arg: 'Never') -> 'typing.Never': ...
196+
197+
expected = {'arg': Never, 'return': Never}
198+
for target in [some, some_str]:
199+
with self.subTest(target=target):
200+
self.assertEqual(gth(target), expected)
201+
172202

173203
class AssertNeverTests(BaseTestCase):
174204
def test_exception(self):
@@ -177,11 +207,23 @@ def test_exception(self):
177207

178208

179209
class SelfTests(BaseTestCase):
210+
def test_equality(self):
211+
self.assertEqual(Self, Self)
212+
self.assertIs(Self, Self)
213+
self.assertNotEqual(Self, None)
214+
180215
def test_basics(self):
181216
class Foo:
182217
def bar(self) -> Self: ...
218+
class FooStr:
219+
def bar(self) -> 'Self': ...
220+
class FooStrTyping:
221+
def bar(self) -> 'typing.Self': ...
183222

184-
self.assertEqual(gth(Foo.bar), {'return': Self})
223+
for target in [Foo, FooStr, FooStrTyping]:
224+
with self.subTest(target=target):
225+
self.assertEqual(gth(target.bar), {'return': Self})
226+
self.assertIs(get_origin(Self), None)
185227

186228
def test_repr(self):
187229
self.assertEqual(repr(Self), 'typing.Self')
@@ -194,6 +236,9 @@ def test_cannot_subclass(self):
194236
with self.assertRaises(TypeError):
195237
class C(type(Self)):
196238
pass
239+
with self.assertRaises(TypeError):
240+
class C(Self):
241+
pass
197242

198243
def test_cannot_init(self):
199244
with self.assertRaises(TypeError):
@@ -5425,11 +5470,13 @@ def test_special_attrs(self):
54255470
typing.Literal: 'Literal',
54265471
typing.NewType: 'NewType',
54275472
typing.NoReturn: 'NoReturn',
5473+
typing.Never: 'Never',
54285474
typing.Optional: 'Optional',
54295475
typing.TypeAlias: 'TypeAlias',
54305476
typing.TypeGuard: 'TypeGuard',
54315477
typing.TypeVar: 'TypeVar',
54325478
typing.Union: 'Union',
5479+
typing.Self: 'Self',
54335480
# Subscribed special forms
54345481
typing.Annotated[Any, "Annotation"]: 'Annotated',
54355482
typing.ClassVar[Any]: 'ClassVar',

0 commit comments

Comments
 (0)