# ===========================================================================
# 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.
# ===========================================================================
import sys, os, string, unittest, types
from Python.Test import EventTest,TestEventHandler
from Python.Test import TestEventArgs
class EventTests(unittest.TestCase):
"""Test CLR event support."""
def testPublicInstanceEvent(self):
"""Test public instance events."""
object = EventTest()
handler = GenericHandler()
self.failUnless(handler.value == None)
object.PublicEvent += handler.handler
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 10)
object.PublicEvent -= handler.handler
def testPublicStaticEvent(self):
"""Test public static events."""
handler = GenericHandler()
self.failUnless(handler.value == None)
EventTest.PublicStaticEvent += handler.handler
EventTest.OnPublicStaticEvent(TestEventArgs(10))
self.failUnless(handler.value == 10)
def testProtectedInstanceEvent(self):
"""Test protected instance events."""
object = EventTest()
handler = GenericHandler()
self.failUnless(handler.value == None)
object.ProtectedEvent += handler.handler
object.OnProtectedEvent(TestEventArgs(10))
self.failUnless(handler.value == 10)
object.ProtectedEvent -= handler.handler
def testProtectedStaticEvent(self):
"""Test protected static events."""
object = EventTest
handler = GenericHandler()
self.failUnless(handler.value == None)
EventTest.ProtectedStaticEvent += handler.handler
EventTest.OnProtectedStaticEvent(TestEventArgs(10))
self.failUnless(handler.value == 10)
EventTest.ProtectedStaticEvent -= handler.handler
def testInternalEvents(self):
"""Test internal events."""
def test():
f = EventTest().InternalEvent
self.failUnlessRaises(AttributeError, test)
def test():
f = EventTest().InternalStaticEvent
self.failUnlessRaises(AttributeError, test)
def test():
f = EventTest.InternalStaticEvent
self.failUnlessRaises(AttributeError, test)
def testPrivateEvents(self):
"""Test private events."""
def test():
f = EventTest().PrivateEvent
self.failUnlessRaises(AttributeError, test)
def test():
f = EventTest().PrivateStaticEvent
self.failUnlessRaises(AttributeError, test)
def test():
f = EventTest.PrivateStaticEvent
self.failUnlessRaises(AttributeError, test)
def testMulticastEvent(self):
"""Test multicast events."""
object = EventTest()
handler1 = GenericHandler()
handler2 = GenericHandler()
handler3 = GenericHandler()
object.PublicEvent += handler1.handler
object.PublicEvent += handler2.handler
object.PublicEvent += handler3.handler
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler1.value == 10)
self.failUnless(handler2.value == 10)
self.failUnless(handler3.value == 10)
object.OnPublicEvent(TestEventArgs(20))
self.failUnless(handler1.value == 20)
self.failUnless(handler2.value == 20)
self.failUnless(handler3.value == 20)
object.PublicEvent -= handler1.handler
object.PublicEvent -= handler2.handler
object.PublicEvent -= handler3.handler
def testInstanceMethodHandler(self):
"""Test instance method handlers."""
object = EventTest()
handler = GenericHandler()
object.PublicEvent += handler.handler
self.failUnless(handler.value == None)
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 10)
object.PublicEvent -= handler.handler
self.failUnless(handler.value == 10)
object.OnPublicEvent(TestEventArgs(20))
self.failUnless(handler.value == 10)
def testVarArgsInstanceMethodHandler(self):
"""Test vararg instance method handlers."""
object = EventTest()
handler = VariableArgsHandler()
object.PublicEvent += handler.handler
self.failUnless(handler.value == None)
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 10)
object.PublicEvent -= handler.handler
self.failUnless(handler.value == 10)
object.OnPublicEvent(TestEventArgs(20))
self.failUnless(handler.value == 10)
def testCallableObjectHandler(self):
"""Test callable object handlers."""
object = EventTest()
handler = CallableHandler()
object.PublicEvent += handler
self.failUnless(handler.value == None)
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 10)
object.PublicEvent -= handler
self.failUnless(handler.value == 10)
object.OnPublicEvent(TestEventArgs(20))
self.failUnless(handler.value == 10)
def testVarArgsCallableHandler(self):
"""Test varargs callable handlers."""
object = EventTest()
handler = VarCallableHandler()
object.PublicEvent += handler
self.failUnless(handler.value == None)
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 10)
object.PublicEvent -= handler
self.failUnless(handler.value == 10)
object.OnPublicEvent(TestEventArgs(20))
self.failUnless(handler.value == 10)
def testStaticMethodHandler(self):
"""Test static method handlers."""
object = EventTest()
handler = StaticMethodHandler()
StaticMethodHandler.value = None
object.PublicEvent += handler.handler
self.failUnless(handler.value == None)
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 10)
object.PublicEvent -= handler.handler
self.failUnless(handler.value == 10)
object.OnPublicEvent(TestEventArgs(20))
self.failUnless(handler.value == 10)
def testClassMethodHandler(self):
"""Test class method handlers."""
object = EventTest()
handler = ClassMethodHandler()
ClassMethodHandler.value = None
object.PublicEvent += handler.handler
self.failUnless(handler.value == None)
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 10)
object.PublicEvent -= handler.handler
self.failUnless(handler.value == 10)
object.OnPublicEvent(TestEventArgs(20))
self.failUnless(handler.value == 10)
def testManagedInstanceMethodHandler(self):
"""Test managed instance method handlers."""
object = EventTest()
object.PublicEvent += object.GenericHandler
self.failUnless(object.value == 0)
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(object.value == 10)
object.PublicEvent -= object.GenericHandler
self.failUnless(object.value == 10)
object.OnPublicEvent(TestEventArgs(20))
self.failUnless(object.value == 10)
def testManagedStaticMethodHandler(self):
"""Test managed static method handlers."""
object = EventTest()
EventTest.s_value = 0
object.PublicEvent += object.StaticHandler
self.failUnless(EventTest.s_value == 0)
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(EventTest.s_value == 10)
object.PublicEvent -= object.StaticHandler
self.failUnless(EventTest.s_value == 10)
object.OnPublicEvent(TestEventArgs(20))
self.failUnless(EventTest.s_value == 10)
def testUnboundMethodHandler(self):
"""Test failure mode for unbound method handlers."""
object = EventTest()
object.PublicEvent += GenericHandler.handler
try:
object.OnPublicEvent(TestEventArgs(10))
except TypeError:
object.PublicEvent -= GenericHandler.handler
return
raise TypeError("should have raised a TypeError")
def testFunctionHandler(self):
"""Test function handlers."""
object = EventTest()
dict = {'value':None}
def handler(sender, args, dict=dict):
dict['value'] = args.value
object.PublicEvent += handler
self.failUnless(dict['value'] == None)
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(dict['value'] == 10)
object.PublicEvent -= handler
self.failUnless(dict['value'] == 10)
object.OnPublicEvent(TestEventArgs(20))
self.failUnless(dict['value'] == 10)
def testAddNonCallableHandler(self):
"""Test handling of attempts to add non-callable handlers."""
def test():
object = EventTest()
object.PublicEvent += 10
self.failUnlessRaises(TypeError, test)
def test():
object = EventTest()
object.PublicEvent += "spam"
self.failUnlessRaises(TypeError, test)
def test():
class spam:
pass
object = EventTest()
object.PublicEvent += spam()
self.failUnlessRaises(TypeError, test)
def testRemoveMultipleHandlers(self):
"""Test removing multiple instances of the same handler."""
object = EventTest()
handler = MultipleHandler()
h1 = handler.handler
object.PublicEvent += h1
h2 = handler.handler
object.PublicEvent += h2
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 20)
object.PublicEvent -= h1
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 30)
object.PublicEvent -= h2
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 30)
# try again, removing in a different order.
object = EventTest()
handler = MultipleHandler()
h1 = handler.handler
object.PublicEvent += h1
h2 = handler.handler
object.PublicEvent += h2
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 20)
object.PublicEvent -= h2
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 30)
object.PublicEvent -= h1
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 30)
def testRemoveMultipleStaticHandlers(self):
"""Test removing multiple instances of a static handler."""
object = EventTest()
handler = MultipleHandler()
h1 = handler.handler
object.PublicStaticEvent += h1
h2 = handler.handler
object.PublicStaticEvent += h2
object.OnPublicStaticEvent(TestEventArgs(10))
self.failUnless(handler.value == 20)
object.PublicStaticEvent -= h1
object.OnPublicStaticEvent(TestEventArgs(10))
self.failUnless(handler.value == 30)
object.PublicStaticEvent -= h2
object.OnPublicStaticEvent(TestEventArgs(10))
self.failUnless(handler.value == 30)
# try again, removing in a different order.
object = EventTest()
handler = MultipleHandler()
h1 = handler.handler
object.PublicStaticEvent += h1
h2 = handler.handler
object.PublicStaticEvent += h2
object.OnPublicStaticEvent(TestEventArgs(10))
self.failUnless(handler.value == 20)
object.PublicStaticEvent -= h2
object.OnPublicStaticEvent(TestEventArgs(10))
self.failUnless(handler.value == 30)
object.PublicStaticEvent -= h1
object.OnPublicStaticEvent(TestEventArgs(10))
self.failUnless(handler.value == 30)
def testRandomMultipleHandlers(self):
"""Test random subscribe / unsubscribe of the same handlers."""
import random
object = EventTest()
handler = MultipleHandler()
handler2 = MultipleHandler()
object.PublicEvent += handler2.handler
object.PublicEvent += handler2.handler
handlers = []
for i in range(30):
method = handler.handler
object.PublicEvent += method
handlers.append(method)
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 300)
self.failUnless(handler2.value == 20)
handler.value = 0
handler2.value = 0
for i in range(30):
item = random.choice(handlers)
handlers.remove(item)
object.PublicEvent -= item
handler.value = 0
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == (len(handlers) * 10))
self.failUnless(handler2.value == ((i + 1) * 20))
handler2.value = 0
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler2.value == 20)
object.PublicEvent -= handler2.handler
handler2.value = 0
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler2.value == 10)
object.PublicEvent -= handler2.handler
handler2.value = 0
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler2.value == 0)
def testRemoveInternalCallHandler(self):
"""Test remove on an event sink implemented w/internalcall."""
object = EventTest()
def h(sender, args):
pass
object.PublicEvent += h
object.PublicEvent -= h
from System.Windows.Forms import Form
f = Form()
f.Click += h
f.Click -= h
f.Dispose()
def testRemoveUnknownHandler(self):
"""Test removing an event handler that was never added."""
def test():
object = EventTest()
handler = GenericHandler()
object.PublicEvent -= handler.handler
self.failUnlessRaises(ValueError, test)
def testHandlerCallbackFailure(self):
"""Test failure mode for inappropriate handlers."""
class BadHandler:
def handler(self, one):
return 'too many'
object = EventTest()
handler = BadHandler()
def test():
object.PublicEvent += handler.handler
object.OnPublicEvent(TestEventArgs(10))
self.failUnlessRaises(TypeError, test)
object.PublicEvent -= handler.handler
class BadHandler:
def handler(self, one, two, three, four, five):
return 'not enough'
object = EventTest()
handler = BadHandler()
def test():
object.PublicEvent += handler.handler
object.OnPublicEvent(TestEventArgs(10))
self.failUnlessRaises(TypeError, test)
object.PublicEvent -= handler.handler
def testIncorrectInvokation(self):
"""Test incorrect invokation of events."""
object = EventTest()
handler = GenericHandler()
object.PublicEvent += handler.handler
def test():
object.OnPublicEvent()
self.failUnlessRaises(TypeError, test)
def test():
object.OnPublicEvent(32)
self.failUnlessRaises(TypeError, test)
object.PublicEvent -= handler.handler
def testExplicitCLSEventRegistration(self):
"""Test explicit CLS event registration."""
object = EventTest()
handler = GenericHandler()
delegate = TestEventHandler(handler.handler)
object.add_PublicEvent(delegate)
self.failUnless(handler.value == None)
object.OnPublicEvent(TestEventArgs(10))
self.failUnless(handler.value == 10)
object.remove_PublicEvent(delegate)
self.failUnless(handler.value == 10)
object.OnPublicEvent(TestEventArgs(20))
self.failUnless(handler.value == 10)
def testImplicitCLSEventRegistration(self):
"""Test implicit CLS event registration."""
def test():
object = EventTest()
handler = GenericHandler()
object.add_PublicEvent(handler.handler)
self.failUnlessRaises(TypeError, test)
def testEventDescriptorAbuse(self):
"""Test event descriptor abuse."""
def test():
del EventTest.PublicEvent
self.failUnlessRaises(TypeError, test)
def test():
del EventTest.__dict__['PublicEvent']
self.failUnlessRaises(TypeError, test)
desc = EventTest.__dict__['PublicEvent']
def test():
desc.__get__(0, 0)
self.failUnlessRaises(TypeError, test)
def test():
desc.__set__(0, 0)
self.failUnlessRaises(TypeError, test)
def test():
object = EventTest()
object.PublicEvent = 0
self.failUnlessRaises(TypeError, test)
def test():
EventTest.PublicStaticEvent = 0
self.failUnlessRaises(TypeError, test)
class GenericHandler:
"""A generic handler to test event callbacks."""
def __init__(self):
self.value = None
def handler(self, sender, args):
self.value = args.value
class VariableArgsHandler:
"""A variable args handler to test event callbacks."""
def __init__(self):
self.value = None
def handler(self, *args):
ob, eventargs = args
self.value = eventargs.value
class CallableHandler:
"""A callable handler to test event callbacks."""
def __init__(self):
self.value = None
def __call__(self, sender, args):
self.value = args.value
class VarCallableHandler:
"""A variable args callable handler to test event callbacks."""
def __init__(self):
self.value = None
def __call__(self, *args):
ob, eventargs = args
self.value = eventargs.value
class StaticMethodHandler(object):
"""A static method handler to test event callbacks."""
value = None
def handler(sender, args):
StaticMethodHandler.value = args.value
handler = staticmethod(handler)
class ClassMethodHandler(object):
"""A class method handler to test event callbacks."""
value = None
def handler(cls, sender, args):
cls.value = args.value
handler = classmethod(handler)
class MultipleHandler:
"""A generic handler to test multiple callbacks."""
def __init__(self):
self.value = 0
def handler(self, sender, args):
self.value += args.value
def test_suite():
return unittest.makeSuite(EventTests)
def main():
unittest.TextTestRunner().run(test_suite())
if __name__ == '__main__':
main()
|