generic/tests/test_event.py
2021-07-03 15:13:29 -04:00

183 lines
4.1 KiB
Python

"""Tests for :module:`generic.event`."""
from __future__ import annotations
from typing import Callable
from generic.event import Manager
def make_handler(effect: object) -> Callable[[Event], None]:
return lambda e: e.effects.append(effect)
def create_manager():
return Manager()
def test_subscribe_single_event():
events = create_manager()
events.subscribe(make_handler("handler1"), EventA)
e = EventA()
events.handle(e)
assert len(e.effects) == 1
assert "handler1" in e.effects
def test_subscribe_via_decorator():
events = create_manager()
events.subscriber(EventA)(make_handler("handler1"))
e = EventA()
events.handle(e)
assert len(e.effects) == 1
assert "handler1" in e.effects
def test_subscribe_event_inheritance():
events = create_manager()
events.subscribe(make_handler("handler1"), EventA)
events.subscribe(make_handler("handler2"), EventB)
ea = EventA()
events.handle(ea)
assert len(ea.effects) == 1
assert "handler1" in ea.effects
eb = EventB()
events.handle(eb)
assert len(eb.effects) == 2
assert "handler1" in eb.effects
assert "handler2" in eb.effects
def test_subscribe_event_multiple_inheritance():
events = create_manager()
events.subscribe(make_handler("handler1"), EventA)
events.subscribe(make_handler("handler2"), EventC)
events.subscribe(make_handler("handler3"), EventD)
ea = EventA()
events.handle(ea)
assert len(ea.effects) == 1
assert "handler1" in ea.effects
ec = EventC()
events.handle(ec)
assert len(ec.effects) == 1
assert "handler2" in ec.effects
ed = EventD()
events.handle(ed)
assert len(ed.effects) == 3
assert "handler1" in ed.effects
assert "handler2" in ed.effects
assert "handler3" in ed.effects
def test_subscribe_no_events():
events = create_manager()
ea = EventA()
events.handle(ea)
assert len(ea.effects) == 0
def test_subscribe_base_event():
events = create_manager()
events.subscribe(make_handler("handler1"), EventA)
ea = EventB()
events.handle(ea)
assert len(ea.effects) == 1
assert "handler1" in ea.effects
def test_subscribe_event_malformed_multiple_inheritance():
events = create_manager()
events.subscribe(make_handler("handler1"), EventA)
events.subscribe(make_handler("handler2"), EventD)
events.subscribe(make_handler("handler3"), EventE)
ea = EventA()
events.handle(ea)
assert len(ea.effects) == 1
assert "handler1" in ea.effects
ed = EventD()
events.handle(ed)
assert len(ed.effects) == 2
assert "handler1" in ed.effects
assert "handler2" in ed.effects
ee = EventE()
events.handle(ee)
assert len(ee.effects) == 3
assert "handler1" in ee.effects
assert "handler2" in ee.effects
assert "handler3" in ee.effects
def test_subscribe_event_with_no_subscribers_in_the_middle_of_mro():
events = create_manager()
events.subscribe(make_handler("handler1"), Event)
events.subscribe(make_handler("handler2"), EventB)
eb = EventB()
events.handle(eb)
assert len(eb.effects) == 2
assert "handler1" in eb.effects
assert "handler2" in eb.effects
def test_unsubscribe_single_event():
events = create_manager()
handler = make_handler("handler1")
events.subscribe(handler, EventA)
events.unsubscribe(handler, EventA)
e = EventA()
events.handle(e)
assert len(e.effects) == 0
def test_unsubscribe_event_inheritance():
events = create_manager()
handler1 = make_handler("handler1")
handler2 = make_handler("handler2")
events.subscribe(handler1, EventA)
events.subscribe(handler2, EventB)
events.unsubscribe(handler1, EventA)
ea = EventA()
events.handle(ea)
assert len(ea.effects) == 0
eb = EventB()
events.handle(eb)
assert len(eb.effects) == 1
assert "handler2" in eb.effects
class Event:
def __init__(self) -> None:
self.effects: list[object] = []
class EventA(Event):
pass
class EventB(EventA):
pass
class EventC(Event):
pass
class EventD(EventA, EventC):
pass
class EventE(EventD, EventA):
pass