gh-74690: Add more tests for runtime-checkable protocols (#103347)

This commit is contained in:
Alex Waygood 2023-04-07 18:21:19 +01:00 committed by GitHub
parent 04501ee57e
commit 800382a2b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2577,6 +2577,22 @@ class ProtocolTests(BaseTestCase):
class PG(Protocol[T]):
def meth(x): ...
@runtime_checkable
class WeirdProto(Protocol):
meth = str.maketrans
@runtime_checkable
class WeirdProto2(Protocol):
meth = lambda *args, **kwargs: None
class CustomCallable:
def __call__(self, *args, **kwargs):
pass
@runtime_checkable
class WeirderProto(Protocol):
meth = CustomCallable()
class BadP(Protocol):
def meth(x): ...
@ -2586,8 +2602,15 @@ class ProtocolTests(BaseTestCase):
class C:
def meth(x): ...
self.assertIsInstance(C(), P)
self.assertIsInstance(C(), PG)
class C2:
def __init__(self):
self.meth = lambda: None
for klass in C, C2:
for proto in P, PG, WeirdProto, WeirdProto2, WeirderProto:
with self.subTest(klass=klass.__name__, proto=proto.__name__):
self.assertIsInstance(klass(), proto)
with self.assertRaises(TypeError):
isinstance(C(), PG[T])
with self.assertRaises(TypeError):
@ -2829,6 +2852,20 @@ class ProtocolTests(BaseTestCase):
self.assertIsInstance(C(1), P)
self.assertIsInstance(C(1), PG)
def test_protocols_isinstance_monkeypatching(self):
@runtime_checkable
class HasX(Protocol):
x: int
class Foo: ...
f = Foo()
self.assertNotIsInstance(f, HasX)
f.x = 42
self.assertIsInstance(f, HasX)
del f.x
self.assertNotIsInstance(f, HasX)
def test_protocol_checks_after_subscript(self):
class P(Protocol[T]): pass
class C(P[T]): pass