Skip to content

Commit

Permalink
gh-74690: Add more tests for runtime-checkable protocols (GH-103347)
Browse files Browse the repository at this point in the history
(cherry picked from commit 800382a)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
  • Loading branch information
miss-islington and AlexWaygood committed Apr 7, 2023
1 parent ecb09a8 commit 1b1f016
Showing 1 changed file with 39 additions and 2 deletions.
41 changes: 39 additions & 2 deletions Lib/test/test_typing.py
Expand Up @@ -2572,6 +2572,22 @@ def meth(x): ...
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): ...

Expand All @@ -2581,8 +2597,15 @@ def meth(x): ...
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):
Expand Down Expand Up @@ -2735,6 +2758,20 @@ def __init__(self, x):
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
Expand Down

0 comments on commit 1b1f016

Please sign in to comment.