Beispiel #1
0
    def test_reject_kwargs(self):
        class Foo:
            def __init__(self, **kwargs):
                pass

        with self.assertRaises(TypeError):
            dynamic_dispatch(Foo)
Beispiel #2
0
    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)
Beispiel #3
0
    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)
Beispiel #4
0
    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)
Beispiel #5
0
    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)
Beispiel #6
0
    def test_register_fn(self):
        wrapped = dynamic_dispatch(OneArgInit)

        def foo() -> OneArgInit:
            pass

        wrapped.dispatch(foo, on=1)
Beispiel #7
0
    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)
Beispiel #8
0
    def test_dispatch_default_exc(self):
        default = create_autospec(lambda _: _)
        wrapped = dynamic_dispatch(default)

        with self.assertRaises(ValueError):
            wrapped(1)

        default.assert_not_called()
Beispiel #9
0
    def test_register_fn_non_class(self):
        wrapped = dynamic_dispatch(OneArgInit)

        def foo() -> int:
            pass

        with self.assertRaises(TypeError):
            wrapped.dispatch(foo, on=1)
Beispiel #10
0
    def test_register_multi_key(self):
        wrapped = dynamic_dispatch(lambda _: _)

        def impl(_):
            return _

        wrapped.dispatch(impl, on=1)
        wrapped.dispatch(impl, on=2)
Beispiel #11
0
    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)
Beispiel #12
0
    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)
Beispiel #13
0
    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)
Beispiel #14
0
    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__)
Beispiel #15
0
    def test_register_fn_subclass(self):
        wrapped = dynamic_dispatch(OneArgInit)

        class Foo(OneArgInit):
            pass

        def foo() -> Foo:
            pass

        wrapped.dispatch(foo, on=1)
Beispiel #16
0
    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()
Beispiel #17
0
    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)
Beispiel #18
0
    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)
Beispiel #19
0
    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__)
Beispiel #20
0
    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__)
Beispiel #21
0
    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:])
Beispiel #22
0
    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:])
Beispiel #23
0
    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()
Beispiel #24
0
    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()
Beispiel #25
0
    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)
Beispiel #26
0
    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)
Beispiel #27
0
    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)
Beispiel #28
0
    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)
Beispiel #29
0
    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()
Beispiel #30
0
    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:]))