From 2910a2e310b04dfa1983cc9b9af7dc1f5d045c99 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Sat, 15 Nov 2014 21:36:36 +0100 Subject: added event system to Node class (needed for updating name->node maps in parent nodes and to be capbable of informing about updates in the node graph) --- test/core/dom/NodeTest.cpp | 198 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 196 insertions(+), 2 deletions(-) (limited to 'test/core') diff --git a/test/core/dom/NodeTest.cpp b/test/core/dom/NodeTest.cpp index b4e55aa..1291d60 100644 --- a/test/core/dom/NodeTest.cpp +++ b/test/core/dom/NodeTest.cpp @@ -66,8 +66,6 @@ TEST(Node, isRoot) ASSERT_FALSE(n3->isRoot()); } - - TEST(Node, simpleResolve) { Manager mgr; @@ -89,5 +87,201 @@ TEST(Node, simpleResolve) ASSERT_TRUE(child11 == *(res.begin())); } +class TestManagedEventOwner : public Managed { +public: + using Managed::Managed; + + int triggered = false; +}; + +static void handleEvent(const Event &ev, Handle owner) +{ + owner.cast()->triggered++; +} + +static void handleEventStop(const Event &ev, Handle owner) +{ + owner.cast()->triggered++; + ev.stopPropagation(); +} + +TEST(Node, events) +{ + Manager mgr; + Rooted n{new Node(mgr)}; + + Rooted e1{new TestManagedEventOwner(mgr)}; + Rooted e2{new TestManagedEventOwner(mgr)}; + Rooted e3{new TestManagedEventOwner(mgr)}; + + ASSERT_EQ(0, n->registerEventHandler(EventType::UPDATE, handleEvent, e1)); + ASSERT_EQ(1, n->registerEventHandler(EventType::NAME_CHANGE, handleEvent, e2)); + ASSERT_EQ(2, n->registerEventHandler(EventType::NAME_CHANGE, handleEvent, e3)); + + ASSERT_FALSE(e1->triggered); + ASSERT_FALSE(e2->triggered); + ASSERT_FALSE(e3->triggered); + + { + Event ev{EventType::ADD_CHILD}; + ASSERT_FALSE(n->triggerEvent(ev)); + } + + { + Event ev{EventType::UPDATE}; + ASSERT_TRUE(n->triggerEvent(ev)); + ASSERT_EQ(1, e1->triggered); + ASSERT_EQ(0, e2->triggered); + ASSERT_EQ(0, e3->triggered); + } + + { + Event ev{EventType::NAME_CHANGE}; + ASSERT_TRUE(n->triggerEvent(ev)); + ASSERT_EQ(1, e1->triggered); + ASSERT_EQ(1, e2->triggered); + ASSERT_EQ(1, e3->triggered); + } + + ASSERT_TRUE(n->unregisterEventHandler(1)); + ASSERT_FALSE(n->unregisterEventHandler(1)); + + { + Event ev{EventType::NAME_CHANGE}; + ASSERT_TRUE(n->triggerEvent(ev)); + ASSERT_EQ(1, e1->triggered); + ASSERT_EQ(1, e2->triggered); + ASSERT_EQ(2, e3->triggered); + } + + ASSERT_TRUE(n->unregisterEventHandler(0)); + ASSERT_FALSE(n->unregisterEventHandler(0)); + + { + Event ev{EventType::UPDATE}; + ASSERT_FALSE(n->triggerEvent(ev)); + ASSERT_EQ(1, e1->triggered); + ASSERT_EQ(1, e2->triggered); + ASSERT_EQ(2, e3->triggered); + } + + ASSERT_TRUE(n->unregisterEventHandler(2)); + ASSERT_FALSE(n->unregisterEventHandler(2)); + + { + Event ev{EventType::NAME_CHANGE}; + ASSERT_FALSE(n->triggerEvent(ev)); + ASSERT_EQ(1, e1->triggered); + ASSERT_EQ(1, e2->triggered); + ASSERT_EQ(2, e3->triggered); + } +} + +TEST(Node, eventBubbling) +{ + Manager mgr; + Rooted n1{new Node(mgr)}; + Rooted n2{new Node(mgr, n1)}; + + Rooted e1{new TestManagedEventOwner(mgr)}; + Rooted e2{new TestManagedEventOwner(mgr)}; + Rooted e3{new TestManagedEventOwner(mgr)}; + + ASSERT_EQ(0, n1->registerEventHandler(EventType::UPDATE, handleEvent, e1, true)); + ASSERT_EQ(1, n1->registerEventHandler(EventType::NAME_CHANGE, handleEvent, e2, true)); + ASSERT_EQ(2, n1->registerEventHandler(EventType::NAME_CHANGE, handleEvent, e3, false)); + + ASSERT_FALSE(e1->triggered); + ASSERT_FALSE(e2->triggered); + ASSERT_FALSE(e3->triggered); + + { + Event ev{EventType::ADD_CHILD}; + ASSERT_FALSE(n2->triggerEvent(ev)); + } + + { + Event ev{EventType::UPDATE}; + ASSERT_TRUE(n2->triggerEvent(ev)); + ASSERT_EQ(1, e1->triggered); + ASSERT_EQ(0, e2->triggered); + ASSERT_EQ(0, e3->triggered); + } + + { + Event ev{EventType::UPDATE, false}; + ASSERT_FALSE(n2->triggerEvent(ev)); + ASSERT_EQ(1, e1->triggered); + ASSERT_EQ(0, e2->triggered); + ASSERT_EQ(0, e3->triggered); + } + + { + Event ev{EventType::NAME_CHANGE}; + ASSERT_TRUE(n2->triggerEvent(ev)); + ASSERT_EQ(1, e1->triggered); + ASSERT_EQ(1, e2->triggered); + ASSERT_EQ(0, e3->triggered); + } + + ASSERT_TRUE(n1->unregisterEventHandler(1)); + ASSERT_FALSE(n1->unregisterEventHandler(1)); + + { + Event ev{EventType::NAME_CHANGE}; + ASSERT_FALSE(n2->triggerEvent(ev)); + ASSERT_EQ(1, e1->triggered); + ASSERT_EQ(1, e2->triggered); + ASSERT_EQ(0, e3->triggered); + } + + ASSERT_TRUE(n1->unregisterEventHandler(0)); + ASSERT_FALSE(n1->unregisterEventHandler(0)); + + { + Event ev{EventType::UPDATE}; + ASSERT_FALSE(n2->triggerEvent(ev)); + ASSERT_EQ(1, e1->triggered); + ASSERT_EQ(1, e2->triggered); + ASSERT_EQ(0, e3->triggered); + } + + ASSERT_TRUE(n1->unregisterEventHandler(2)); + ASSERT_FALSE(n1->unregisterEventHandler(2)); + + { + Event ev{EventType::NAME_CHANGE}; + ASSERT_FALSE(n2->triggerEvent(ev)); + ASSERT_EQ(1, e1->triggered); + ASSERT_EQ(1, e2->triggered); + ASSERT_EQ(0, e3->triggered); + } +} + +TEST(Node, eventStopPropagation) +{ + Manager mgr; + Rooted n1{new Node(mgr)}; + Rooted n2{new Node(mgr, n1)}; + + Rooted e1{new TestManagedEventOwner(mgr)}; + Rooted e2{new TestManagedEventOwner(mgr)}; + + ASSERT_EQ(0, n1->registerEventHandler(EventType::UPDATE, handleEvent, e1, true)); + ASSERT_EQ(0, n2->registerEventHandler(EventType::UPDATE, handleEventStop, e2, true)); + + ASSERT_FALSE(e1->triggered); + ASSERT_FALSE(e2->triggered); + + { + Event ev{EventType::UPDATE}; + n2->triggerEvent(ev); + + ASSERT_EQ(0, e1->triggered); + ASSERT_EQ(1, e2->triggered); + } + +} + } } -- cgit v1.2.3