class ImmutableEventDispatcherTest(TestCase):

    def __init__(self, methodName='runTest'):
        super().__init__(methodName)
        self.__dispatcher = None
        self.__inner_dispatcher = None

    def setUp(self):
        self.__inner_dispatcher = EventDispatcher()
        self.__dispatcher = ImmutableEventDispatcher(self.__inner_dispatcher)

    def test_dispatch_delegates(self):
        event = Event()
        self.__inner_dispatcher.dispatch = Mock(return_value='result')
        self.assertEqual('result', self.__dispatcher.dispatch('event', event))
        self.__inner_dispatcher.dispatch.assert_called_with('event', event)

    def test_get_listeners_delegates(self):
        self.__inner_dispatcher.get_listeners = Mock(return_value='result')
        self.assertEqual('result', self.__dispatcher.get_listeners('event'))
        self.__inner_dispatcher.get_listeners.assert_called_with('event')

    def test_has_listeners_delegates(self):
        self.__inner_dispatcher.has_listeners = Mock(return_value='result')
        self.assertEqual('result', self.__dispatcher.has_listeners('event'))
        self.__inner_dispatcher.has_listeners.assert_called_with('event')

    def test_add_listener_disallowed(self):
        with self.assertRaises(BadMethodCallError):
            self.__dispatcher.add_listener('event', lambda event, name, dispatcher: event.stop_propagation())

    def test_add_subscriber_disallowed(self):
        with self.assertRaises(BadMethodCallError):
            subscriber = Mock()
            self.__dispatcher.add_subscriber(subscriber)

    def test_remove_listener_disallowed(self):
        with self.assertRaises(BadMethodCallError):
            self.__dispatcher.remove_listener('event', lambda event, name, dispatcher: event.stop_propagation())

    def test_remove_subscriber_disallowed(self):
        with self.assertRaises(BadMethodCallError):
            subscriber = Mock()
            self.__dispatcher.remove_subscriber(subscriber)
 def setUp(self):
     self.__inner_dispatcher = EventDispatcher()
     self.__dispatcher = ImmutableEventDispatcher(self.__inner_dispatcher)