Skip to content

Commit

Permalink
[3.12] gh-103171: Forward-port new tests for runtime-checkable protoc…
Browse files Browse the repository at this point in the history
…ols decorated with `@final` (GH-105473) (#105474)

Forward-port of the tests that were added to the 3.11 branch in GH-105445
(cherry picked from commit f5df347)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
  • Loading branch information
miss-islington and AlexWaygood committed Jun 7, 2023
1 parent 3d4a786 commit 4b2263e
Showing 1 changed file with 65 additions and 0 deletions.
65 changes: 65 additions & 0 deletions Lib/test/test_typing.py
Expand Up @@ -3800,6 +3800,71 @@ class Foo(typing.Sized, Protocol): pass
# before any isinstance() checks against Sized
self.assertNotIsInstance(1, typing.Sized)

def test_empty_protocol_decorated_with_final(self):
@final
@runtime_checkable
class EmptyProtocol(Protocol): ...

self.assertIsSubclass(object, EmptyProtocol)
self.assertIsInstance(object(), EmptyProtocol)

def test_protocol_decorated_with_final_callable_members(self):
@final
@runtime_checkable
class ProtocolWithMethod(Protocol):
def startswith(self, string: str) -> bool: ...

self.assertIsSubclass(str, ProtocolWithMethod)
self.assertNotIsSubclass(int, ProtocolWithMethod)
self.assertIsInstance('foo', ProtocolWithMethod)
self.assertNotIsInstance(42, ProtocolWithMethod)

def test_protocol_decorated_with_final_noncallable_members(self):
@final
@runtime_checkable
class ProtocolWithNonCallableMember(Protocol):
x: int

class Foo:
x = 42

only_callable_members_please = (
r"Protocols with non-method members don't support issubclass()"
)

with self.assertRaisesRegex(TypeError, only_callable_members_please):
issubclass(Foo, ProtocolWithNonCallableMember)

with self.assertRaisesRegex(TypeError, only_callable_members_please):
issubclass(int, ProtocolWithNonCallableMember)

self.assertIsInstance(Foo(), ProtocolWithNonCallableMember)
self.assertNotIsInstance(42, ProtocolWithNonCallableMember)

def test_protocol_decorated_with_final_mixed_members(self):
@final
@runtime_checkable
class ProtocolWithMixedMembers(Protocol):
x: int
def method(self) -> None: ...

class Foo:
x = 42
def method(self) -> None: ...

only_callable_members_please = (
r"Protocols with non-method members don't support issubclass()"
)

with self.assertRaisesRegex(TypeError, only_callable_members_please):
issubclass(Foo, ProtocolWithMixedMembers)

with self.assertRaisesRegex(TypeError, only_callable_members_please):
issubclass(int, ProtocolWithMixedMembers)

self.assertIsInstance(Foo(), ProtocolWithMixedMembers)
self.assertNotIsInstance(42, ProtocolWithMixedMembers)


class GenericTests(BaseTestCase):

Expand Down

0 comments on commit 4b2263e

Please sign in to comment.