def test_dispatcher(): f = Dispatcher('f') f.add((int,), inc) f.add((float,), dec) assert f.resolve((int,)) == inc assert f(1) == 2 assert f(1.0) == 0.0
def test_dispatcher(): f = Dispatcher('f') f.add((int,), inc) f.add((float,), dec) with warnings.catch_warnings(): warnings.simplefilter("ignore", DeprecationWarning) assert f.resolve((int,)) == inc assert f.dispatch(int) is inc assert f(1) == 2 assert f(1.0) == 0.0
def test_source(): def one(x, y): """ Docstring number one """ return x + y def two(x, y): """ Docstring number two """ return x - y master_doc = 'Doc of the multimethod itself' f = Dispatcher('f', doc=master_doc) f.add((int, int), one) f.add((float, float), two) assert 'x + y' in f._source(1, 1) assert 'x - y' in f._source(1.0, 1.0)
def test_on_ambiguity(): f = Dispatcher('f') def identity(x): return x ambiguities = [False] def on_ambiguity(dispatcher, amb): ambiguities[0] = True f.add((object, object), identity) f.add((object, float), identity) f.add((float, object), identity) assert not ambiguities[0] f.reorder(on_ambiguity=on_ambiguity) assert ambiguities[0]
def test_docstring(): def one(x, y): """ Docstring number one """ return x + y def two(x, y): """ Docstring number two """ return x + y def three(x, y): return x + y master_doc = 'Doc of the multimethod itself' f = Dispatcher('f', doc=master_doc) f.add((object, object), one) f.add((int, int), two) f.add((float, float), three) assert one.__doc__.strip() in f.__doc__ assert two.__doc__.strip() in f.__doc__ assert ( f.__doc__.find(one.__doc__.strip()) < f.__doc__.find(two.__doc__.strip()) ) assert 'object, object' in f.__doc__ assert master_doc in f.__doc__
def test_halt_method_resolution(): g = [0] def on_ambiguity(a, b): g[0] += 1 f = Dispatcher('f') halt_ordering() def func(*args): pass f.add((int, object), func) f.add((object, int), func) assert g == [0] restart_ordering(on_ambiguity=on_ambiguity) assert g == [1] print(list(f.ordering)) assert set(f.ordering) == set([(int, object), (object, int)])
def test_serializable(): f = Dispatcher('f') f.add((int,), inc) f.add((float,), dec) f.add((object,), identity) import pickle assert isinstance(pickle.dumps(f), (str, bytes)) g = pickle.loads(pickle.dumps(f)) assert g(1) == 2 assert g(1.0) == 0.0 assert g('hello') == 'hello'
def test_on_ambiguity(): f = Dispatcher('f') identity = lambda x: x ambiguities = [False] def on_ambiguity(dispatcher, amb): ambiguities[0] = True f.add((object, object), identity, on_ambiguity=on_ambiguity) assert not ambiguities[0] f.add((object, float), identity, on_ambiguity=on_ambiguity) assert not ambiguities[0] f.add((float, object), identity, on_ambiguity=on_ambiguity) assert ambiguities[0]
def test_help(): def one(x, y): """ Docstring number one """ return x + y def two(x, y): """ Docstring number two """ return x + y def three(x, y): """ Docstring number three """ return x + y master_doc = 'Doc of the multimethod itself' f = Dispatcher('f', doc=master_doc) f.add((object, object), one) f.add((int, int), two) f.add((float, float), three) assert f._help(1, 1) == two.__doc__ assert f._help(1.0, 2.0) == three.__doc__
def test_docstring(): def one(x, y): """ Docstring number one """ return x + y def two(x, y): """ Docstring number two """ return x + y def three(x, y): return x + y f = Dispatcher('f') f.add((object, object), one) f.add((int, int), two) f.add((float, float), three) assert one.__doc__.strip() in f.__doc__ assert two.__doc__.strip() in f.__doc__ assert f.__doc__.find(one.__doc__.strip()) < \ f.__doc__.find(two.__doc__.strip()) assert 'object, object' in f.__doc__
def test_raise_error_on_non_class(): f = Dispatcher('f') assert raises(TypeError, lambda: f.add((1,), inc))