diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2014-11-15 21:36:36 +0100 |
---|---|---|
committer | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2014-11-15 21:36:36 +0100 |
commit | 2910a2e310b04dfa1983cc9b9af7dc1f5d045c99 (patch) | |
tree | c636faf1430c9be192db3863f56b1bdbad8ed8e8 /test/core/dom | |
parent | 96de51de8f588b0668d75836d9279210d3311e13 (diff) |
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)
Diffstat (limited to 'test/core/dom')
-rw-r--r-- | test/core/dom/NodeTest.cpp | 198 |
1 files changed, 196 insertions, 2 deletions
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<Managed> owner) +{ + owner.cast<TestManagedEventOwner>()->triggered++; +} + +static void handleEventStop(const Event &ev, Handle<Managed> owner) +{ + owner.cast<TestManagedEventOwner>()->triggered++; + ev.stopPropagation(); +} + +TEST(Node, events) +{ + Manager mgr; + Rooted<Node> n{new Node(mgr)}; + + Rooted<TestManagedEventOwner> e1{new TestManagedEventOwner(mgr)}; + Rooted<TestManagedEventOwner> e2{new TestManagedEventOwner(mgr)}; + Rooted<TestManagedEventOwner> 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<Node> n1{new Node(mgr)}; + Rooted<Node> n2{new Node(mgr, n1)}; + + Rooted<TestManagedEventOwner> e1{new TestManagedEventOwner(mgr)}; + Rooted<TestManagedEventOwner> e2{new TestManagedEventOwner(mgr)}; + Rooted<TestManagedEventOwner> 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<Node> n1{new Node(mgr)}; + Rooted<Node> n2{new Node(mgr, n1)}; + + Rooted<TestManagedEventOwner> e1{new TestManagedEventOwner(mgr)}; + Rooted<TestManagedEventOwner> 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); + } + +} + } } |