From 1a4bfd3ebebfd8d6fb621eddff7fd62346c25af9 Mon Sep 17 00:00:00 2001 From: John Maguire Date: Mon, 19 Mar 2012 18:38:38 +0100 Subject: [PATCH] Add small unit test for closure. --- tests/CMakeLists.txt | 2 ++ tests/closure_test.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ tests/test_utils.cpp | 13 +++++++++++++ tests/test_utils.h | 19 +++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 tests/closure_test.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 36fabaadf..1dd447a7c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -63,6 +63,7 @@ set(TESTUTILS-SOURCES set(TESTUTILS-MOC-HEADERS mock_networkaccessmanager.h + test_utils.h testobjectdecorators.h ) @@ -138,6 +139,7 @@ add_test_file(song_test.cpp false) add_test_file(translations_test.cpp false) add_test_file(utilities_test.cpp false) #add_test_file(xspfparser_test.cpp false) +add_test_file(closure_test.cpp false) #if(LINUX AND HAVE_DBUS) # add_test_file(mpris1_test.cpp true) diff --git a/tests/closure_test.cpp b/tests/closure_test.cpp new file mode 100644 index 000000000..80e3bf8e7 --- /dev/null +++ b/tests/closure_test.cpp @@ -0,0 +1,40 @@ +#include "gtest/gtest.h" + +#include +#include + +#include "core/closure.h" +#include "test_utils.h" + +class ClosureTest : public ::testing::Test { + +}; + +TEST_F(ClosureTest, ClosureInvokesReceiver) { + TestQObject sender; + TestQObject receiver; + Closure* closure = NewClosure( + &sender, SIGNAL(Emitted()), + &receiver, SLOT(Invoke())); + EXPECT_EQ(0, receiver.invoked()); + sender.Emit(); + EXPECT_EQ(1, receiver.invoked()); +} + +TEST_F(ClosureTest, ClosureDeletesSelf) { + TestQObject sender; + TestQObject receiver; + Closure* closure = NewClosure( + &sender, SIGNAL(Emitted()), + &receiver, SLOT(Invoke())); + QSignalSpy spy(closure, SIGNAL(destroyed())); + EXPECT_EQ(0, receiver.invoked()); + sender.Emit(); + EXPECT_EQ(1, receiver.invoked()); + + EXPECT_EQ(0, spy.count()); + QEventLoop loop; + QObject::connect(closure, SIGNAL(destroyed()), &loop, SLOT(quit())); + loop.exec(); + EXPECT_EQ(1, spy.count()); +} diff --git a/tests/test_utils.cpp b/tests/test_utils.cpp index 5a9610174..f404b543a 100644 --- a/tests/test_utils.cpp +++ b/tests/test_utils.cpp @@ -65,3 +65,16 @@ TemporaryResource::TemporaryResource(const QString& filename) { reset(); } + +TestQObject::TestQObject(QObject* parent) + : QObject(parent), + invoked_(0) { +} + +void TestQObject::Emit() { + emit Emitted(); +} + +void TestQObject::Invoke() { + ++invoked_; +} diff --git a/tests/test_utils.h b/tests/test_utils.h index 26cbab828..29730dbef 100644 --- a/tests/test_utils.h +++ b/tests/test_utils.h @@ -62,4 +62,23 @@ public: TemporaryResource(const QString& filename); }; +class TestQObject : public QObject { + Q_OBJECT + public: + TestQObject(QObject* parent = 0); + + void Emit(); + + int invoked() const { return invoked_; } + + signals: + void Emitted(); + + public slots: + void Invoke(); + + private: + int invoked_; +}; + #endif // TEST_UTILS_H