mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
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:
parent
264a0110ff
commit
f5df347fcf
1 changed files with 65 additions and 0 deletions
|
@ -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):
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue