summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_functools.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_functools.py')
-rw-r--r--Lib/test/test_functools.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
index 755ac03..70ae8e0 100644
--- a/Lib/test/test_functools.py
+++ b/Lib/test/test_functools.py
@@ -2722,6 +2722,74 @@ class TestSingleDispatch(unittest.TestCase):
self.assertEqual(f(1), "types.UnionType")
self.assertEqual(f(1.0), "types.UnionType")
+ def test_register_genericalias(self):
+ @functools.singledispatch
+ def f(arg):
+ return "default"
+
+ with self.assertRaisesRegex(TypeError, "Invalid first argument to "):
+ f.register(list[int], lambda arg: "types.GenericAlias")
+ with self.assertRaisesRegex(TypeError, "Invalid first argument to "):
+ f.register(typing.List[int], lambda arg: "typing.GenericAlias")
+ with self.assertRaisesRegex(TypeError, "Invalid first argument to "):
+ f.register(list[int] | str, lambda arg: "types.UnionTypes(types.GenericAlias)")
+ with self.assertRaisesRegex(TypeError, "Invalid first argument to "):
+ f.register(typing.List[float] | bytes, lambda arg: "typing.Union[typing.GenericAlias]")
+ with self.assertRaisesRegex(TypeError, "Invalid first argument to "):
+ f.register(typing.Any, lambda arg: "typing.Any")
+
+ self.assertEqual(f([1]), "default")
+ self.assertEqual(f([1.0]), "default")
+ self.assertEqual(f(""), "default")
+ self.assertEqual(f(b""), "default")
+
+ def test_register_genericalias_decorator(self):
+ @functools.singledispatch
+ def f(arg):
+ return "default"
+
+ with self.assertRaisesRegex(TypeError, "Invalid first argument to "):
+ f.register(list[int])
+ with self.assertRaisesRegex(TypeError, "Invalid first argument to "):
+ f.register(typing.List[int])
+ with self.assertRaisesRegex(TypeError, "Invalid first argument to "):
+ f.register(list[int] | str)
+ with self.assertRaisesRegex(TypeError, "Invalid first argument to "):
+ f.register(typing.List[int] | str)
+ with self.assertRaisesRegex(TypeError, "Invalid first argument to "):
+ f.register(typing.Any)
+
+ def test_register_genericalias_annotation(self):
+ @functools.singledispatch
+ def f(arg):
+ return "default"
+
+ with self.assertRaisesRegex(TypeError, "Invalid annotation for 'arg'"):
+ @f.register
+ def _(arg: list[int]):
+ return "types.GenericAlias"
+ with self.assertRaisesRegex(TypeError, "Invalid annotation for 'arg'"):
+ @f.register
+ def _(arg: typing.List[float]):
+ return "typing.GenericAlias"
+ with self.assertRaisesRegex(TypeError, "Invalid annotation for 'arg'"):
+ @f.register
+ def _(arg: list[int] | str):
+ return "types.UnionType(types.GenericAlias)"
+ with self.assertRaisesRegex(TypeError, "Invalid annotation for 'arg'"):
+ @f.register
+ def _(arg: typing.List[float] | bytes):
+ return "typing.Union[typing.GenericAlias]"
+ with self.assertRaisesRegex(TypeError, "Invalid annotation for 'arg'"):
+ @f.register
+ def _(arg: typing.Any):
+ return "typing.Any"
+
+ self.assertEqual(f([1]), "default")
+ self.assertEqual(f([1.0]), "default")
+ self.assertEqual(f(""), "default")
+ self.assertEqual(f(b""), "default")
+
class CachedCostItem:
_cost = 1