[Zope3-checkins] CVS: Zope3/src/zope/app/event/tests - __init__.py:1.2 placelesssetup.py:1.2 test_directives.py:1.2 test_eventservice.py:1.2 test_logger.py:1.2 test_objectevent.py:1.2

Jim Fulton jim@zope.com
Wed, 25 Dec 2002 09:13:53 -0500


Update of /cvs-repository/Zope3/src/zope/app/event/tests
In directory cvs.zope.org:/tmp/cvs-serv15352/src/zope/app/event/tests

Added Files:
	__init__.py placelesssetup.py test_directives.py 
	test_eventservice.py test_logger.py test_objectevent.py 
Log Message:
Grand renaming:

- Renamed most files (especially python modules) to lower case.

- Moved views and interfaces into separate hierarchies within each
  project, where each top-level directory under the zope package
  is a separate project.

- Moved everything to src from lib/python.

  lib/python will eventually go away. I need access to the cvs
  repository to make this happen, however.

There are probably some bits that are broken. All tests pass
and zope runs, but I haven't tried everything. There are a number
of cleanups I'll work on tomorrow.



=== Zope3/src/zope/app/event/tests/__init__.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:13:52 2002
+++ Zope3/src/zope/app/event/tests/__init__.py	Wed Dec 25 09:12:51 2002
@@ -0,0 +1,2 @@
+#
+# This file is necessary to make this directory a package.


=== Zope3/src/zope/app/event/tests/placelesssetup.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:13:52 2002
+++ Zope3/src/zope/app/event/tests/placelesssetup.py	Wed Dec 25 09:12:51 2002
@@ -0,0 +1,57 @@
+##############################################################################
+#
+# Copyright (c) 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Unit test logic for setting up and tearing down basic infrastructure
+
+
+$Id$
+"""
+
+from zope.component import getServiceManager
+from zope.interfaces.event import IEventService
+from zope.app.event.globaleventservice import eventService
+from zope.interface import Interface
+
+events = []
+
+class EventRecorderClass:
+    notify = events.append
+
+EventRecorder = EventRecorderClass()
+
+def getEvents(event_type = None, filter = None):
+    r = []
+    for event in events:
+        if event_type is not None and not event_type.isImplementedBy(event):
+            continue
+        if filter is not None and not filter(event):
+            continue
+        r.append(event)
+
+    return r
+
+
+
+class PlacelessSetup:
+
+    def setUp(self):
+
+        sm=getServiceManager(None)
+        defineService=sm.defineService
+        provideService=sm.provideService
+
+        defineService("Events", IEventService)
+        provideService("Events", eventService)
+
+        del events[:]
+        eventService.globalSubscribe(EventRecorder)


=== Zope3/src/zope/app/event/tests/test_directives.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:13:52 2002
+++ Zope3/src/zope/app/event/tests/test_directives.py	Wed Dec 25 09:12:51 2002
@@ -0,0 +1,79 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+Revision information:
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from StringIO import StringIO
+
+from zope.configuration.xmlconfig import xmlconfig
+
+from zope.exceptions import NotFoundError
+from zope.event import subscribe, unsubscribe, publish
+from zope.app.event.objectevent import ObjectAddedEvent
+from zope.app.event.objectevent import ObjectRemovedEvent
+from zope.app.event.objectevent import ObjectModifiedEvent
+from zope.app.event.tests.test_eventservice \
+     import DummySubscriber, DummyFilter, DummyEvent
+from zope.component.tests.placelesssetup import PlacelessSetup
+from zope.component import getServiceManager, getService
+from zope.configuration.tests.basetestdirectivesxml import makeconfig
+
+
+class Test(PlacelessSetup, TestCase):
+
+    def setUp(self):
+        PlacelessSetup.setUp(self)
+        from zope.interfaces.event import IEventService
+        getServiceManager(None).defineService("Events", IEventService)
+        from zope.app.event.globaleventservice import eventService
+        getServiceManager(None).provideService("Events", eventService)
+
+    def testSubscribe(self):
+        from zope.event.tests.subscriber import subscriber
+        # This should fail, since we're not subscribed
+        self.assertRaises(NotFoundError,unsubscribe,None,subscriber)
+
+        xmlconfig(makeconfig(
+            '''<directive
+                   name="subscribe"
+                   attributes="subscriber event_types filter"
+                   handler="zope.app.event.metaconfigure.subscribe" />''',
+            '''<test:subscribe
+                   subscriber="zope.event.tests.subscriber.subscriber"
+                   event_types=
+                       "zope.app.interfaces.event.IObjectAddedEvent
+                        zope.app.interfaces.event.IObjectRemovedEvent"
+                   filter="zope.event.tests.subscriber.filter" />'''
+            ))
+
+        publish(None,ObjectAddedEvent(None, 'foo'))
+        self.assertEqual(subscriber.notified,1)
+        publish(None,ObjectRemovedEvent(object(), 'foo'))
+        self.assertEqual(subscriber.notified,2)
+        publish(None,ObjectModifiedEvent(None, 'foo'))
+        self.assertEqual(subscriber.notified,2) # NB: no increase ;-)
+        publish(None,DummyEvent())
+        self.assertEqual(subscriber.notified,4) # NB: increased by 2 ;-)
+
+        unsubscribe(subscriber)
+
+def test_suite():
+    return makeSuite(Test)
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/event/tests/test_eventservice.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:13:52 2002
+++ Zope3/src/zope/app/event/tests/test_eventservice.py	Wed Dec 25 09:12:51 2002
@@ -0,0 +1,285 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+Revision information:
+$Id$
+"""
+
+import unittest, sys
+from zope.testing.cleanup import CleanUp # Base class w registry cleanup
+
+from zope.app.interfaces.event import IObjectEvent
+from zope.app.interfaces.event import IObjectAddedEvent
+from zope.app.interfaces.event import IObjectRemovedEvent
+from zope.app.interfaces.event import IObjectModifiedEvent
+from zope.app.event.objectevent import ObjectAddedEvent, ObjectModifiedEvent
+from zope.app.event.globaleventservice import GlobalEventService
+from zope.exceptions import NotFoundError
+from zope.interfaces.event import IEvent
+
+from zope.event.tests.subscriber import DummySubscriber, DummyFilter
+
+class DummyEvent:
+
+    __implements__ = IObjectAddedEvent, IObjectRemovedEvent
+
+class ObjectEvent:
+
+    __implements__ = IObjectEvent
+
+class TestEventService(CleanUp, unittest.TestCase):
+
+    def setUp(self):
+        CleanUp.setUp(self)
+        self.service = GlobalEventService()
+        self.event = ObjectAddedEvent(None, '/foo')
+        self.subscriber = DummySubscriber()
+
+    def testSubscribe1(self):
+        # Test subscribe method with one parameter
+        self.service.globalSubscribe(self.subscriber)
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 1)
+
+    def testSubscribe2(self):
+        # Test subscribe method with two parameters
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectAddedEvent
+            )
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 1)
+
+    def testSubscribe3(self):
+        # Test subscribe method with three parameters
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectAddedEvent,
+            filter=DummyFilter()
+            )
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 1)
+
+    def testSubscribe4(self):
+        # Test subscribe method with three parameters and an always failing
+        # filter.
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectAddedEvent,
+            filter=DummyFilter(0)
+            )
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 0)
+
+    def testSubscribe5(self):
+        # Test subscribe method with three parameters and an irrelevent event
+        # type.
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectModifiedEvent,
+            filter=DummyFilter()
+            )
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 0)
+
+    def testSubscribe6(self):
+        # Test subscribe method where the event type registered is a
+        # generalised interface of the event passed to the 'publish' method.
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectEvent
+            )
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 1)
+
+    def testSubscribe7(self):
+        # Test subscribe method where one of the event types registered is not
+        # interested in the published event.
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectModifiedEvent
+            )
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectAddedEvent
+            )
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 1)
+
+    def testSubscribe8(self):
+        # Test subscribe method where the same subscriber subscribes multiple
+        # times.
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectAddedEvent,
+            filter=DummyFilter()
+            )
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectAddedEvent,
+            filter=DummyFilter()
+            )
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectAddedEvent,
+            filter=DummyFilter(0)
+            )
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 2)
+
+    def testUnsubscribe1(self):
+        # Test unsubscribe method
+        subscriber = self.subscriber
+        self.service.globalSubscribe(subscriber)
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 1)
+        self.service.unsubscribe(subscriber)
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 1)
+
+    def testUnsubscribe2(self):
+        # Test unsubscribe of something that hasn't been subscribed
+        subscriber = self.subscriber
+        self.assertRaises(NotFoundError,
+                          self.service.unsubscribe,
+                          subscriber, IObjectEvent)
+        self.assertEqual(None,
+                         self.service.unsubscribe(subscriber))
+
+    def testUnsubscribe3(self):
+        # Test selective unsubscribe
+        subscriber2=DummySubscriber()
+        filter=DummyFilter()
+        event2=ObjectModifiedEvent(None, '/foo')
+        self.service.globalSubscribe(
+            self.subscriber)
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectAddedEvent,
+            filter=filter
+            )
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectAddedEvent
+            )
+        self.service.globalSubscribe(
+            subscriber2,
+            event_type=IObjectAddedEvent
+            )
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 3)
+        self.assertEqual(subscriber2.notified, 1)
+        self.service.publish(event2)
+        self.assertEqual(self.subscriber.notified, 4)
+        self.assertEqual(subscriber2.notified, 1)
+        self.service.unsubscribe(self.subscriber, IObjectAddedEvent)
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 6)
+        self.assertEqual(subscriber2.notified, 2)
+        self.service.unsubscribe(self.subscriber, IEvent)
+        self.service.publish(event2)
+        self.assertEqual(self.subscriber.notified, 6)
+        self.assertEqual(subscriber2.notified, 2)
+        self.assertRaises(NotFoundError, self.service.unsubscribe,
+                          self.subscriber, IObjectAddedEvent)
+        self.service.unsubscribe(self.subscriber, IObjectAddedEvent, filter)
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 6)
+        self.assertEqual(subscriber2.notified, 3)
+        self.service.unsubscribe(subscriber2, IObjectAddedEvent)
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 6)
+        self.assertEqual(subscriber2.notified, 3)
+
+    def testpublish1(self):
+        # Test publish method
+        subscriber = self.subscriber
+        self.service.globalSubscribe(subscriber)
+        self.assertEqual(self.subscriber.notified, 0)
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 1)
+
+    def testpublish2(self):
+        # Test publish method where subscriber has been subscribed twice, with
+        # a more generalised version of the initially subscribed interface in
+        # the second subscription.
+        subscriber = self.subscriber
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectEvent,
+            )
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectAddedEvent,
+            )
+        self.service.publish(self.event)
+        self.assertEqual(self.subscriber.notified, 2)
+
+    def testpublish3(self):
+        # Test publish method where subscriber has been to two interfaces and
+        # a single event implements both of those interfaces.
+        subscriber = self.subscriber
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectRemovedEvent
+            )
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectAddedEvent
+            )
+        self.service.publish(DummyEvent())
+        self.assertEqual(self.subscriber.notified, 2)
+
+    def testpublish4(self):
+        # Test publish method to make sure that we don't 'leak registrations
+        # up' sez Jim.
+        subscriber = self.subscriber
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectEvent
+            )
+        self.service.globalSubscribe(
+            self.subscriber,
+            event_type=IObjectAddedEvent
+            )
+        self.service.publish(ObjectEvent())
+        self.assertEqual(self.subscriber.notified, 1)
+
+    def testListSubscriptions1(self):
+        # a non-subscribed subscriber gets an empty array
+        self.assertEqual([], self.service.listSubscriptions(self.subscriber))
+
+    def testListSubscriptions2(self):
+        # one subscription
+        self.service.globalSubscribe(
+                self.subscriber, event_type=IObjectAddedEvent)
+        self.assertEqual([(IObjectAddedEvent, None)],
+                         self.service.listSubscriptions(self.subscriber))
+
+    def testListSubscriptions3(self):
+        # listing limited subscription
+        self.service.globalSubscribe(
+                self.subscriber, event_type=IObjectAddedEvent)
+        L = self.service.listSubscriptions(self.subscriber,
+                                           IObjectRemovedEvent)
+        self.assertEqual([], L)
+
+
+def test_suite():
+    return unittest.makeSuite(TestEventService)
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


=== Zope3/src/zope/app/event/tests/test_logger.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:13:52 2002
+++ Zope3/src/zope/app/event/tests/test_logger.py	Wed Dec 25 09:12:51 2002
@@ -0,0 +1,106 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Test suite for Zope.Event.Logger.
+
+$Id$
+"""
+
+import unittest
+import logging
+
+from zope.component.tests.placelesssetup import PlacelessSetup
+from zope.component import getServiceManager, getService
+
+from zope.app.event import globalSubscribe
+from zope.event import unsubscribe, publish
+from zope.app.event.objectevent import ObjectAddedEvent
+from zope.app.event.logger import Logger
+
+from zope.app.event.globaleventservice import GlobalEventService
+
+class DopeyHandler(logging.Handler):
+
+    def __init__(self):
+        logging.Handler.__init__(self)
+        self.results = []
+
+    def emit(self, record):
+        self.results.append(record)
+
+class TestLogger1(PlacelessSetup,unittest.TestCase):
+
+    eventlogger = Logger()
+
+    def setUp(self):
+        PlacelessSetup.setUp(self)
+        from zope.interfaces.event import IEventService
+        getServiceManager(None).defineService("Events", IEventService)
+        from zope.app.event.globaleventservice import eventService
+        getServiceManager(None).provideService("Events", eventService)
+        # futz a handler in for testing
+        self.logger = logging.getLogger("Event.Logger")
+        self.oldlevel = self.logger.level
+        self.oldprop = self.logger.propagate
+        self.logger.propagate = False
+        self.logger.setLevel(logging.DEBUG)
+        self.handler = DopeyHandler()
+        self.logger.addHandler(self.handler)
+        # register a logger
+        globalSubscribe(self.eventlogger)
+        # send an event
+        publish(None, ObjectAddedEvent(None, 'foo'))
+
+    def tearDown(self):
+        unsubscribe(self.eventlogger)
+        self.logger.removeHandler(self.handler)
+        self.logger.setLevel(self.oldlevel)
+        self.logger.propagate = self.oldprop
+        PlacelessSetup.tearDown(self)
+
+    def testLogger(self):
+        # Test the logger logs appropriately
+        results = self.handler.results
+        self.assertEqual(len(results), 1)
+        result = results[0]
+        self.assertEqual(result.name, "Event.Logger")
+        self.assertEqual(result.levelno, logging.INFO)
+        self.assertEqual(result.getMessage(),
+                         "zope.app.event.objectevent.ObjectAddedEvent: "
+                         "XXX detail temporarily disabled\n")
+        self.assertEqual(result.exc_info, None)
+
+class TestLogger2(TestLogger1):
+
+    eventlogger = Logger(logging.CRITICAL)
+
+    def testLogger(self):
+        # Test the logger logs appropriately
+        results = self.handler.results
+        self.assertEqual(len(results), 1)
+        result = results[0]
+        self.assertEqual(result.name, "Event.Logger")
+        self.assertEqual(result.levelno, logging.CRITICAL)
+        self.assertEqual(result.getMessage(),
+                         "zope.app.event.objectevent.ObjectAddedEvent: "
+                         "XXX detail temporarily disabled\n")
+        self.assertEqual(result.exc_info, None)
+
+def test_suite():
+    return unittest.TestSuite([
+        unittest.makeSuite(TestLogger1),
+        unittest.makeSuite(TestLogger2),
+        ])
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')


=== Zope3/src/zope/app/event/tests/test_objectevent.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:13:53 2002
+++ Zope3/src/zope/app/event/tests/test_objectevent.py	Wed Dec 25 09:12:51 2002
@@ -0,0 +1,91 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+Revision information:
+$Id$
+"""
+
+import unittest, sys
+
+from zope.app.event.objectevent import ObjectAddedEvent
+from zope.app.event.objectevent import ObjectModifiedEvent
+from zope.app.event.objectevent import ObjectRemovedEvent
+from zope.app.event.objectevent import ObjectMovedEvent
+from zope.app.event.objectevent import ObjectAnnotationsModifiedEvent
+from zope.app.event.objectevent import ObjectContentModifiedEvent
+
+class TestObjectAddedEvent(unittest.TestCase):
+
+    location = '/some/location'
+    object = object()
+    klass = ObjectAddedEvent
+
+    def setUp(self):
+        self.event = self.klass(self.object, self.location)
+
+    def testGetLocation(self):
+        self.assertEqual(self.event.location, self.location)
+
+    def testGetObject(self):
+        self.assertEqual(self.event.object, self.object)
+
+class TestObjectModifiedEvent(TestObjectAddedEvent):
+
+    klass = ObjectModifiedEvent
+
+class TestObjectAnnotationsModifiedEvent(TestObjectAddedEvent):
+    klass = ObjectAnnotationsModifiedEvent
+
+class TestObjectContentModifiedEvent(TestObjectAddedEvent):
+    klass = ObjectContentModifiedEvent
+
+
+class TestObjectRemovedEvent(TestObjectAddedEvent):
+
+
+    location = '/some/location'
+
+    def setUp(self):
+        self.event = ObjectRemovedEvent(self.object, self.location)
+
+    def testGetLocation(self):
+        self.assertEqual(self.event.location, self.location)
+
+    def testGetObject(self):
+        self.assertEqual(self.event.object, self.object)
+
+
+
+class TestObjectMovedEvent(TestObjectAddedEvent):
+
+    from_location = '/some/other/location'
+
+    def setUp(self):
+        self.event = ObjectMovedEvent(self.object,
+                                      self.from_location, self.location)
+
+    def testFromLocation(self):
+        self.assertEqual(self.event.fromLocation, self.from_location)
+
+def test_suite():
+    return unittest.TestSuite((unittest.makeSuite(TestObjectAddedEvent),
+                               unittest.makeSuite(TestObjectModifiedEvent),
+                               unittest.makeSuite(TestObjectAnnotationsModifiedEvent),
+                               unittest.makeSuite(TestObjectContentModifiedEvent),
+                               unittest.makeSuite(TestObjectRemovedEvent),
+                               unittest.makeSuite(TestObjectMovedEvent)))
+
+if __name__=='__main__':
+    unittest.main(defaultTest='test_suite')