diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e514650f..20a71a39 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -25,3 +25,4 @@ endmacro() pip_test(concurrent "") pip_test(math "") pip_test(core "") +pip_test(piobject "") diff --git a/tests/piobject/connect.cpp b/tests/piobject/connect.cpp new file mode 100644 index 00000000..b254cdf8 --- /dev/null +++ b/tests/piobject/connect.cpp @@ -0,0 +1,235 @@ +#include "gtest/gtest.h" +#include "piobject.h" + + +class Object : public PIObject +{ + PIOBJECT(Object) + public: + Object() {x=0;} + void test() {event_test();} + void test_val() {event_val(x);} + int getX() const {return x;} + + EVENT(event_test) + EVENT1(event_val, int, arg) + + EVENT_HANDLER(void, handler_test) {x++;} + EVENT_HANDLER1(void, handler_val, int, arg) {x = arg;} +private: + int x; +}; + + +TEST(PiobjectConnections, CONNECT0) { + Object a; + Object b; + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + CONNECT0(void, &a, event_test, &b, handler_test); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); +} + + +TEST(PiobjectConnections, CONNECT0_DISCONNECT) { + Object a; + Object b; + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + CONNECT0(void, &a, event_test, &b, handler_test); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + a.piDisconnect(&b); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); +} + +TEST(PiobjectConnections, CONNECTU) { + Object a; + Object b; + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + CONNECTU(&a, event_test, &b, handler_test); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); +} + +TEST(PiobjectConnections, CONNECTU_DISCONNECT) { + Object a; + Object b; + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + CONNECTU(&a, event_test, &b, handler_test); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + PIObject::piDisconnect(&a); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + a.handler_val(99); + ASSERT_EQ(a.getX(), 99); + ASSERT_EQ(b.getX(), 1); + CONNECTU(&a, event_val, &b, handler_val); + ASSERT_EQ(a.getX(), 99); + ASSERT_EQ(b.getX(), 1); + a.test_val(); + ASSERT_EQ(a.getX(), 99); + ASSERT_EQ(b.getX(), 99); + a.handler_val(-1); + ASSERT_EQ(a.getX(), -1); + ASSERT_EQ(b.getX(), 99); + PIObject::piDisconnect(&a, "event_val", &b); + ASSERT_EQ(a.getX(), -1); + ASSERT_EQ(b.getX(), 99); + a.test_val(); + ASSERT_EQ(a.getX(), -1); + ASSERT_EQ(b.getX(), 99); +} + + +TEST(PiobjectConnections, CONNECTL) { + Object a; + Object b; + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + CONNECTL(&a, event_test, [&b](){ + b.handler_val(7); + }); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 7); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 7); +} + +TEST(PiobjectConnections, CONNECTL_DISCONNECT) { + Object a; + Object b; + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + CONNECTL(&a, event_test, [&b](){ + b.handler_test(); + }); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + b.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + b.handler_test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 2); + PIObject::piDisconnect(&a); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 2); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 2); +} + +TEST(PiobjectConnections, CONNECTL_twice) { + Object a; + Object b; + CONNECTL(&a, event_test, [&b](){ + b.handler_test(); + }); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); + CONNECTL(&a, event_test, [&b](){ + b.handler_test(); + }); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 3); + b.handler_val(0); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + PIObject::piDisconnect(&a); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 0); + CONNECTL(&a, event_test, [&b](){ + b.handler_test(); + }); + a.test(); + ASSERT_EQ(a.getX(), 0); + ASSERT_EQ(b.getX(), 1); +}