def test_reject_kwargs(self): class Foo: def __init__(self, **kwargs): pass with self.assertRaises(TypeError): dynamic_dispatch(Foo)
def test_has_register(self): wrapped = dynamic_dispatch(lambda _: _) self.assertTrue(hasattr(wrapped, 'dispatch'), 'wrapped function has no dispatch attribute') self.assertIsInstance(wrapped.dispatch, Callable) wrapped = dynamic_dispatch(lambda _: _, default=True) self.assertTrue(hasattr(wrapped, 'dispatch'), 'wrapped function has no dispatch attribute') self.assertIsInstance(wrapped.dispatch, Callable)
def test_has_register(self): wrapped = dynamic_dispatch(OneArgInit) self.assertTrue(hasattr(wrapped, 'dispatch'), 'wrapped class has no dispatch attribute') self.assertIsInstance(wrapped.dispatch, Callable) wrapped = dynamic_dispatch(OneArgInit, default=True) self.assertTrue(hasattr(wrapped, 'dispatch'), 'wrapped class has no dispatch attribute') self.assertIsInstance(wrapped.dispatch, Callable)
def test_abstract_class(self): class Foo(OneArgInit, ABC): @abstractmethod def bar(self): pass with self.assertRaises(TypeError): dynamic_dispatch(Foo, default=True) # Abstract classes are allowed if not default. dynamic_dispatch(Foo)
def test_register_duplicate_value(self): wrapped = dynamic_dispatch(OneArgInit) wrapped.dispatch(type('foo', (OneArgInit, ), {}), on=1) with self.assertRaises(ValueError): wrapped.dispatch(type('bar', (OneArgInit, ), {}), on=1)
def test_register_fn(self): wrapped = dynamic_dispatch(OneArgInit) def foo() -> OneArgInit: pass wrapped.dispatch(foo, on=1)
def test_dispatch_default(self): default = create_autospec(lambda _: _) wrapped = dynamic_dispatch(default, default=True) args = (1,) wrapped(*args) default.assert_called_once_with(*args)
def test_dispatch_default_exc(self): default = create_autospec(lambda _: _) wrapped = dynamic_dispatch(default) with self.assertRaises(ValueError): wrapped(1) default.assert_not_called()
def test_register_fn_non_class(self): wrapped = dynamic_dispatch(OneArgInit) def foo() -> int: pass with self.assertRaises(TypeError): wrapped.dispatch(foo, on=1)
def test_register_multi_key(self): wrapped = dynamic_dispatch(lambda _: _) def impl(_): return _ wrapped.dispatch(impl, on=1) wrapped.dispatch(impl, on=2)
def test_dispatch_default(self): wrapped = dynamic_dispatch(OneArgInit, default=True) args = (1, ) obj = wrapped(*args) self.assertIsInstance(obj, OneArgInit) self.assertEqual(obj.abc_count, 1) self.assertEqual(obj.abc, 1)
def test_register_reject_kwargs(self): wrapped = dynamic_dispatch(OneArgInit) class Foo: def __init__(self, **kwargs): pass with self.assertRaises(TypeError): wrapped.dispatch(Foo, on=1)
def test_register_non_subclass(self): wrapped = dynamic_dispatch(OneArgInit) class Foo: def __init__(self, bar): pass with self.assertRaises(TypeError): wrapped.dispatch(Foo, on=1)
def test_wraps(self): def foo(_): """ Comment """ pass wrapped = dynamic_dispatch(foo) self.assertEqual(foo.__doc__, wrapped.__doc__) self.assertEqual(foo.__name__, wrapped.__name__) self.assertEqual(foo.__module__, wrapped.__module__)
def test_register_fn_subclass(self): wrapped = dynamic_dispatch(OneArgInit) class Foo(OneArgInit): pass def foo() -> Foo: pass wrapped.dispatch(foo, on=1)
def test_dispatch_no_args(self): default = create_autospec(lambda _: _) wrapped = dynamic_dispatch(default) impl = create_autospec(lambda: None) wrapped.dispatch(impl, on=1) wrapped(1) default.assert_not_called() impl.assert_called_once_with()
def test_dispatch_no_args_type_error(self): wrapped = dynamic_dispatch(OneArgInit, default=True) abc = 1 class Foo(OneArgInit): def __init__(self): super().__init__(abc) wrapped.dispatch(Foo, on=abc) with self.assertRaises(TypeError): wrapped(abc, 2)
def test_dispatch_override_key(self): default = create_autospec(lambda _: _) wrapped = dynamic_dispatch(default) impl = create_autospec(lambda _: _) wrapped.dispatch(impl, on=1) args = (1,) wrapped(*args) default.assert_not_called() impl.assert_called_once_with(*args)
def test_register_wraps(self): wrapped = dynamic_dispatch(OneArgInit) class Foo(OneArgInit): """ Another comment """ pass reg = wrapped.dispatch(Foo, on=1) self.assertEqual(Foo.__doc__, reg.__doc__) self.assertEqual(Foo.__name__, reg.__name__) self.assertEqual(Foo.__module__, reg.__module__)
def test_register_wraps(self): wrapped = dynamic_dispatch(lambda _: _) def foo(): """ Doc comment """ pass reg = wrapped.dispatch(foo, on=1) self.assertEqual(foo.__doc__, reg.__doc__) self.assertEqual(foo.__name__, reg.__name__) self.assertEqual(foo.__module__, reg.__module__)
def test_dispatch_multi_arg_override_key_reorder(self): default = create_autospec(lambda _: _) wrapped = dynamic_dispatch(default) impl = create_autospec(lambda a, b, _, c: None) wrapped.dispatch(impl, on=1) args = (1, 2, 3, 4) wrapped(*args) default.assert_not_called() impl.assert_called_once_with(*args[1:3], args[0], *args[3:])
def test_dispatch_multi_arg(self): default = create_autospec(lambda _: _) wrapped = dynamic_dispatch(default) impl = create_autospec(lambda a, b, c: None) wrapped.dispatch(impl, on=1) args = (1, 2, 3, 4) wrapped(*args) default.assert_not_called() impl.assert_called_once_with(*args[1:])
def test_dispatch_no_args_type_error(self): default = create_autospec(lambda _: _) wrapped = dynamic_dispatch(default) impl = create_autospec(lambda: None) wrapped.dispatch(default, on=1) with self.assertRaises(TypeError): wrapped(1, 2) default.assert_not_called() impl.assert_not_called()
def test_dispatch_arg_type_error(self): default = create_autospec(lambda _: _) wrapped = dynamic_dispatch(default) impl = create_autospec(lambda a, b, c: None) wrapped.dispatch(impl, on=1) args = (1, 2, 3) with self.assertRaises(TypeError): wrapped(*args) default.assert_not_called() impl.assert_not_called()
def test_dispatch_arg_type_error(self): wrapped = dynamic_dispatch(OneArgInit, default=True) args = (1, 2, 3) class Baz(OneArgInit): def __init__(self, d, e, f): super().__init__(args[0]) self.bar = d, e, f self.bar_count = getattr(self, 'bar_count', 0) + 1 wrapped.dispatch(Baz, on=args[0]) with self.assertRaises(TypeError): wrapped(*args)
def test_dispatch_no_args(self): wrapped = dynamic_dispatch(OneArgInit, default=True) abc = 1 class Foo(OneArgInit): def __init__(self): super().__init__(abc) wrapped.dispatch(Foo, on=abc) obj = wrapped(abc) self.assertIsInstance(obj, OneArgInit) self.assertEqual(obj.abc_count, 1) self.assertEqual(obj.abc, abc)
def test_dispatch_kwarg_type_error(self): wrapped = dynamic_dispatch(OneArgInit, default=True) abc = 1 kwargs = dict(f=4, d=2) class Baz(OneArgInit): def __init__(self, *, d, e, f): super().__init__(abc) self.bar = d, e, f self.bar_count = getattr(self, 'bar_count', 0) + 1 wrapped.dispatch(Baz, on=abc) with self.assertRaises(TypeError): wrapped(abc, **kwargs)
def test_dispatch_kwarg_override_key(self): default = create_autospec(lambda _: _) wrapped = dynamic_dispatch(default) def impl(_, *, a, b, c): return _, a, b, c impl = create_autospec(impl) wrapped.dispatch(impl, on=1) args = (1,) kwargs = dict(c=4, b=3, a=2) wrapped(*args, **kwargs) default.assert_not_called() impl.assert_called_once_with(*args, **kwargs)
def test_dispatch_kwargs_type_error(self): default = create_autospec(lambda _: _) wrapped = dynamic_dispatch(default) def impl(*, a, b, c): return a, b, c impl = create_autospec(impl) wrapped.dispatch(impl, on=1) args = (1,) kwargs = dict(a=2, b=3) with self.assertRaises(TypeError): wrapped(*args, **kwargs) default.assert_not_called() impl.assert_not_called()
def test_dispatch_multi_arg_override_key_reorder(self): wrapped = dynamic_dispatch(OneArgInit, default=True) args = (1, 2, 3, 4) class Baz(OneArgInit): def __init__(self, d, e, abc, f): super().__init__(abc) self.bar = d, e, abc, f self.bar_count = getattr(self, 'bar_count', 0) + 1 wrapped.dispatch(Baz, on=args[0]) obj = wrapped(*args) self.assertIsInstance(obj, Baz) self.assertEqual(obj.abc_count, 1) self.assertEqual(obj.abc, args[0]) self.assertEqual(obj.bar_count, 1) self.assertEqual(obj.bar, (*args[1:3], args[0], *args[3:]))