# encoding: utf-8 """This file contains unittests for the notification.py module.""" #----------------------------------------------------------------------------- # Copyright (C) 2008-2009 The IPython Development Team # # Distributed under the terms of the BSD License. The full license is # in the file COPYING, distributed as part of this software. #----------------------------------------------------------------------------- #----------------------------------------------------------------------------- # Imports #----------------------------------------------------------------------------- # Tell nose to skip this module __test__ = {} from twisted.trial import unittest import IPython.kernel.core.notification as notification #----------------------------------------------------------------------------- # Support Classes #----------------------------------------------------------------------------- class Observer(object): """docstring for Observer""" def __init__(self, expectedType, expectedSender, center=notification.sharedCenter, **kwargs): super(Observer, self).__init__() self.expectedType = expectedType self.expectedSender = expectedSender self.expectedKwArgs = kwargs self.recieved = False center.add_observer(self.callback, self.expectedType, self.expectedSender) def callback(self, theType, sender, args={}): """callback""" assert(theType == self.expectedType or self.expectedType == None) assert(sender == self.expectedSender or self.expectedSender == None) assert(args == self.expectedKwArgs) self.recieved = True def verify(self): """verify""" assert(self.recieved) def reset(self): """reset""" self.recieved = False class Notifier(object): """docstring for Notifier""" def __init__(self, theType, **kwargs): super(Notifier, self).__init__() self.theType = theType self.kwargs = kwargs def post(self, center=notification.sharedCenter): """fire""" center.post_notification(self.theType, self, **self.kwargs) #----------------------------------------------------------------------------- # Tests #----------------------------------------------------------------------------- class NotificationTests(unittest.TestCase): """docstring for NotificationTests""" def tearDown(self): notification.sharedCenter.remove_all_observers() def test_notification_delivered(self): """Test that notifications are delivered""" expectedType = 'EXPECTED_TYPE' sender = Notifier(expectedType) observer = Observer(expectedType, sender) sender.post() observer.verify() def test_type_specificity(self): """Test that observers are registered by type""" expectedType = 1 unexpectedType = "UNEXPECTED_TYPE" sender = Notifier(expectedType) unexpectedSender = Notifier(unexpectedType) observer = Observer(expectedType, sender) sender.post() unexpectedSender.post() observer.verify() def test_sender_specificity(self): """Test that observers are registered by sender""" expectedType = "EXPECTED_TYPE" sender1 = Notifier(expectedType) sender2 = Notifier(expectedType) observer = Observer(expectedType, sender1) sender1.post() sender2.post() observer.verify() def test_remove_all_observers(self): """White-box test for remove_all_observers""" for i in xrange(10): Observer('TYPE', None, center=notification.sharedCenter) self.assert_(len(notification.sharedCenter.observers[('TYPE',None)]) >= 10, "observers registered") notification.sharedCenter.remove_all_observers() self.assert_(len(notification.sharedCenter.observers) == 0, "observers removed") def test_any_sender(self): """test_any_sender""" expectedType = "EXPECTED_TYPE" sender1 = Notifier(expectedType) sender2 = Notifier(expectedType) observer = Observer(expectedType, None) sender1.post() observer.verify() observer.reset() sender2.post() observer.verify() def test_post_performance(self): """Test that post_notification, even with many registered irrelevant observers is fast""" for i in xrange(10): Observer("UNRELATED_TYPE", None) o = Observer('EXPECTED_TYPE', None) notification.sharedCenter.post_notification('EXPECTED_TYPE', self) o.verify()