# -*- coding: utf-8 -*- """Tests for CommandChainDispatcher.""" #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- import pytest from IPython.core.error import TryNext from IPython.core.hooks import CommandChainDispatcher #----------------------------------------------------------------------------- # Local utilities #----------------------------------------------------------------------------- # Define two classes, one which succeeds and one which raises TryNext. Each # sets the attribute `called` to True when it is called. class Okay(object): def __init__(self, message): self.message = message self.called = False def __call__(self): self.called = True return self.message class Fail(object): def __init__(self, message): self.message = message self.called = False def __call__(self): self.called = True raise TryNext(self.message) #----------------------------------------------------------------------------- # Test functions #----------------------------------------------------------------------------- def test_command_chain_dispatcher_ff(): """Test two failing hooks""" fail1 = Fail("fail1") fail2 = Fail("fail2") dp = CommandChainDispatcher([(0, fail1), (10, fail2)]) with pytest.raises(TryNext) as e: dp() assert str(e.value) == "fail2" assert fail1.called is True assert fail2.called is True def test_command_chain_dispatcher_fofo(): """Test a mixture of failing and succeeding hooks.""" fail1 = Fail("fail1") fail2 = Fail("fail2") okay1 = Okay("okay1") okay2 = Okay("okay2") dp = CommandChainDispatcher([(0, fail1), # (5, okay1), # add this later (10, fail2), (15, okay2)]) dp.add(okay1, 5) assert dp() == "okay1" assert fail1.called is True assert okay1.called is True assert fail2.called is False assert okay2.called is False def test_command_chain_dispatcher_eq_priority(): okay1 = Okay(u'okay1') okay2 = Okay(u'okay2') dp = CommandChainDispatcher([(1, okay1)]) dp.add(okay2, 1)