gh-103171: Forward-port new tests for runtime-checkable protocols dec orated with @final (#105473)

Forward-port of the tests that were added to the 3.11 branch in #105445
This commit is contained in:
Alex Waygood 2023-06-07 23:25:17 +01:00 committed by GitHub
parent 264a0110ff
commit f5df347fcf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -3800,6 +3800,71 @@ class ProtocolTests(BaseTestCase):
# 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):