from unittest import TestCase, TestSuite, makeSuite, main
import Zope

from Products.ZTM2.Events import EventData, EventSourceMulticaster


class EventCaster(EventSourceMulticaster):
  
    def delete(self):
        eventdata = EventData()
        eventdata.source = self
        self.broadcastEvent(self, eventdata)
    
    
class EventReciever:
  
    def __init__(self):
        self.signaled = False
        self.casterRemoved = False
        
    def __hash__(self):
        hash(id(self))

    def listenToEvent(self, caster):
        caster.addListener('onTestEvent', self.recieveMethod)
        caster.addListener('onDelete', self.onCasterDelete)
        
    def unregisterEventListener(self, caster):
        caster.removeListener('onTestEvent', self.recieveMethod)
        caster.removeListener('onDelete', self.onCasterDelete)
        
    def __nonzero__(self):
        return self.signaled
  
    def recieveMethod(self, eventdata):
        self.signaled = True
        
    def onCasterDelete(self, eventdata):
        self.unregisterEventListener(eventdata.source)
        self.casterRemoved = True


class EventHandlerTests(TestCase):
    
    def testSingleEventBroadcast(self):
        """ Testing a simple deletion event. """
        caster = EventCaster()
        caster.addEventType('onTestEvent')
        reciever = EventReciever()
        reciever.listenToEvent(caster)
        caster.delete()
        self.assertEqual(reciever.casterRemoved, True)
    
  
# TODO: Verify that events sent to many objects are caught  
# TODO: Write a test that checks that ZODB correctly persists data.
# TODO: Test if recursive events are caught


def test_suite():
  return TestSuite((
      makeSuite( EventHandlerTests ),
      ))

if __name__ == "__main__":
    main()