|
|
# 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
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
import unittest
|
|
|
|
|
|
from IPython.utils.notification import (
|
|
|
NotificationCenter,
|
|
|
NotificationError,
|
|
|
shared_center
|
|
|
)
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Support Classes
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
class Observer(object):
|
|
|
|
|
|
def __init__(self, expected_ntype, expected_sender,
|
|
|
center=shared_center, *args, **kwargs):
|
|
|
super(Observer, self).__init__()
|
|
|
self.expected_ntype = expected_ntype
|
|
|
self.expected_sender = expected_sender
|
|
|
self.expected_args = args
|
|
|
self.expected_kwargs = kwargs
|
|
|
self.recieved = False
|
|
|
center.add_observer(self.callback,
|
|
|
self.expected_ntype,
|
|
|
self.expected_sender)
|
|
|
|
|
|
def callback(self, ntype, sender, *args, **kwargs):
|
|
|
assert(ntype == self.expected_ntype or
|
|
|
self.expected_ntype == None)
|
|
|
assert(sender == self.expected_sender or
|
|
|
self.expected_sender == None)
|
|
|
assert(args == self.expected_args)
|
|
|
assert(kwargs == self.expected_kwargs)
|
|
|
self.recieved = True
|
|
|
|
|
|
def verify(self):
|
|
|
assert(self.recieved)
|
|
|
|
|
|
def reset(self):
|
|
|
self.recieved = False
|
|
|
|
|
|
|
|
|
class Notifier(object):
|
|
|
|
|
|
def __init__(self, ntype, **kwargs):
|
|
|
super(Notifier, self).__init__()
|
|
|
self.ntype = ntype
|
|
|
self.kwargs = kwargs
|
|
|
|
|
|
def post(self, center=shared_center):
|
|
|
|
|
|
center.post_notification(self.ntype, self,
|
|
|
**self.kwargs)
|
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Tests
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
class NotificationTests(unittest.TestCase):
|
|
|
|
|
|
def tearDown(self):
|
|
|
shared_center.remove_all_observers()
|
|
|
|
|
|
def test_notification_delivered(self):
|
|
|
"""Test that notifications are delivered"""
|
|
|
|
|
|
expected_ntype = 'EXPECTED_TYPE'
|
|
|
sender = Notifier(expected_ntype)
|
|
|
observer = Observer(expected_ntype, sender)
|
|
|
|
|
|
sender.post()
|
|
|
observer.verify()
|
|
|
|
|
|
def test_type_specificity(self):
|
|
|
"""Test that observers are registered by type"""
|
|
|
|
|
|
expected_ntype = 1
|
|
|
unexpected_ntype = "UNEXPECTED_TYPE"
|
|
|
sender = Notifier(expected_ntype)
|
|
|
unexpected_sender = Notifier(unexpected_ntype)
|
|
|
observer = Observer(expected_ntype, sender)
|
|
|
|
|
|
sender.post()
|
|
|
unexpected_sender.post()
|
|
|
observer.verify()
|
|
|
|
|
|
def test_sender_specificity(self):
|
|
|
"""Test that observers are registered by sender"""
|
|
|
|
|
|
expected_ntype = "EXPECTED_TYPE"
|
|
|
sender1 = Notifier(expected_ntype)
|
|
|
sender2 = Notifier(expected_ntype)
|
|
|
observer = Observer(expected_ntype, 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=shared_center)
|
|
|
|
|
|
self.assert_(len(shared_center.observers[('TYPE',None)]) >= 10,
|
|
|
"observers registered")
|
|
|
|
|
|
shared_center.remove_all_observers()
|
|
|
self.assert_(len(shared_center.observers) == 0, "observers removed")
|
|
|
|
|
|
def test_any_sender(self):
|
|
|
expected_ntype = "EXPECTED_TYPE"
|
|
|
sender1 = Notifier(expected_ntype)
|
|
|
sender2 = Notifier(expected_ntype)
|
|
|
observer = Observer(expected_ntype, 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)
|
|
|
shared_center.post_notification('EXPECTED_TYPE', self)
|
|
|
o.verify()
|
|
|
|
|
|
|
|
|
|