Skip to content

Commit

Permalink
bpo-45678: Add functools.singledispatchmethod tests (GH-29328)
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexWaygood authored Nov 3, 2021
1 parent e346f19 commit 5a14929
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 1 deletion.
42 changes: 41 additions & 1 deletion Lib/test/test_functools.py
Original file line number Diff line number Diff line change
Expand Up @@ -2411,14 +2411,18 @@ def _(cls, arg):
self.assertEqual(A.t(0.0).arg, "base")

def test_abstractmethod_register(self):
class Abstract(abc.ABCMeta):
class Abstract(metaclass=abc.ABCMeta):

@functools.singledispatchmethod
@abc.abstractmethod
def add(self, x, y):
pass

self.assertTrue(Abstract.add.__isabstractmethod__)
self.assertTrue(Abstract.__dict__['add'].__isabstractmethod__)

with self.assertRaises(TypeError):
Abstract()

def test_type_ann_register(self):
class A:
Expand Down Expand Up @@ -2479,6 +2483,42 @@ def _(cls, arg: str):
self.assertEqual(A.t('').arg, "str")
self.assertEqual(A.t(0.0).arg, "base")

def test_method_wrapping_attributes(self):
class A:
@functools.singledispatchmethod
def func(self, arg: int) -> str:
"""My function docstring"""
return str(arg)
@functools.singledispatchmethod
@classmethod
def cls_func(cls, arg: int) -> str:
"""My function docstring"""
return str(arg)
@functools.singledispatchmethod
@staticmethod
def static_func(arg: int) -> str:
"""My function docstring"""
return str(arg)

for meth in (
A.func,
A().func,
A.cls_func,
A().cls_func,
A.static_func,
A().static_func
):
with self.subTest(meth=meth):
self.assertEqual(meth.__doc__, 'My function docstring')
self.assertEqual(meth.__annotations__['arg'], int)

self.assertEqual(A.func.__name__, 'func')
self.assertEqual(A().func.__name__, 'func')
self.assertEqual(A.cls_func.__name__, 'cls_func')
self.assertEqual(A().cls_func.__name__, 'cls_func')
self.assertEqual(A.static_func.__name__, 'static_func')
self.assertEqual(A().static_func.__name__, 'static_func')

def test_invalid_registrations(self):
msg_prefix = "Invalid first argument to `register()`: "
msg_suffix = (
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Add tests to ensure that ``functools.singledispatchmethod`` correctly wraps
the attributes of the target function.

0 comments on commit 5a14929

Please sign in to comment.