# -*- coding: utf-8 -*-
import unittest
import events
from events import Events, EventsException
class TestBase(unittest.TestCase):
def setUp(self):
self.events = Events()
def callback1(self):
pass
def callback2(self):
pass
def callback3(self):
pass
class TestEvents(TestBase):
def test_getattr(self):
class MyEvents(Events):
__events__ = ('on_eventOne', )
try:
MyEvents().on_eventNotOne += self.callback1
except EventsException:
pass
else:
self.fail("'EventsException' expected and not raised.")
try:
self.events.on_eventNotOne += self.callback1
except:
self.fail("Exception raised but not expected.")
def test_len(self):
# We want __events__ to be set to verify that it is not counted as
# part of __len__.
self.events = Events(events=("on_change", "on_get"))
self.events.on_change += self.callback1
self.events.on_get += self.callback2
self.assertEqual(len(self.events), 2)
def test_iter(self):
self.events.on_change += self.callback1
self.events.on_change += self.callback2
self.events.on_edit += self.callback1
i = 0
for event in self.events:
i += 1
self.assertTrue(isinstance(event, events.events._EventSlot))
self.assertEqual(i, 2)
def test_iter_custom_event_slot_cls(self):
class CustomEventSlot(events.events._EventSlot):
pass
self.events = Events(event_slot_cls=CustomEventSlot)
self.events.on_change += self.callback1
self.events.on_change += self.callback2
self.events.on_edit += self.callback1
i = 0
for event in self.events:
i += 1
self.assertTrue(isinstance(event, CustomEventSlot))
self.assertEqual(i, 2)
def test_event_slot_cls_default(self):
self.assertEqual(
events.events._EventSlot, self.events.__event_slot_cls__)
def test_event_slot_cls_custom(self):
class CustomEventSlot(events.events._EventSlot):
pass
custom = Events(event_slot_cls=CustomEventSlot)
self.assertEqual(CustomEventSlot, custom.__event_slot_cls__)
class TestEventSlot(TestBase):
def setUp(self):
super(TestEventSlot, self).setUp()
self.events.on_change += self.callback1
self.events.on_change += self.callback2
self.events.on_change += self.callback3
self.events.on_edit += self.callback3
def test_type(self):
ev = self.events.on_change
self.assertTrue(isinstance(ev, events.events._EventSlot))
self.assertEqual(ev.__name__, 'on_change')
def test_len(self):
self.assertEqual(len(self.events.on_change), 3)
self.assertEqual(len(self.events.on_edit), 1)
def test_repr(self):
ev = self.events.on_change
self.assertEqual(ev.__repr__(), "event 'on_change'")
def test_iter(self):
ev = self.events.on_change
self.assertEqual(len(ev), 3)
i = 0
for target in ev:
i += 1
self.assertEqual(target.__name__, 'callback%d' % i)
def test_getitem(self):
ev = self.events.on_edit
self.assertEqual(len(ev), 1)
self.assertTrue(ev[0].__name__, 'callback3')
try:
ev[1]
except IndexError:
pass
else:
self.fail("IndexError expected.")
self.assertIs(ev, self.events["on_edit"])
self.assertIsNot(ev, self.events["on_change"])
try:
self.events["on_nonexistent_event"]
except KeyError:
pass
else:
self.fail("KeyError expected.")
def test_isub(self):
self.events.on_change -= self.callback1
ev = self.events.on_change
self.assertEqual(len(ev), 2)
self.assertEqual(ev[0].__name__, 'callback2')
self.assertEqual(ev[1].__name__, 'callback3')
class TestInstanceEvents(TestBase):
def test_getattr(self):
MyEvents = Events(('on_eventOne', ))
try:
MyEvents.on_eventOne += self.callback1
except:
self.fail("Exception raised but not expected.")
try:
MyEvents.on_eventNotOne += self.callback1
except EventsException:
pass
else:
self.fail("'EventsException' expected and not raised.")
try:
self.events.on_eventNotOne += self.callback1
except:
self.fail("Exception raised but not expected.")
def test_instance_restriction(self):
class MyEvents(Events):
__events__ = ('on_eventOne', 'on_eventTwo')
MyRestrictedInstance = MyEvents(('on_everyTwo', ))
try:
MyRestrictedInstance.on_everyTwo += self.callback1
except:
self.fail("Exception raised but not expected.")
try:
MyRestrictedInstance.on_everyOne += self.callback1
except:
pass
else:
self.fail("'EventsException' expected and not raised.")