From 6f80c548e617308a082355a908e2a886dcbc2f79 Mon Sep 17 00:00:00 2001 From: Christopher Lam Date: Mon, 31 Oct 2022 09:43:46 +0800 Subject: [PATCH] [gtest-qofevent.cpp] comprehensive tests for qofevent --- libgnucash/engine/test/CMakeLists.txt | 6 + libgnucash/engine/test/gtest-qofevent.cpp | 137 ++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 libgnucash/engine/test/gtest-qofevent.cpp diff --git a/libgnucash/engine/test/CMakeLists.txt b/libgnucash/engine/test/CMakeLists.txt index d1029bb6b6..b1ff56f965 100644 --- a/libgnucash/engine/test/CMakeLists.txt +++ b/libgnucash/engine/test/CMakeLists.txt @@ -197,6 +197,11 @@ gtest-qofquerycore.cpp) gnc_add_test(test-qofquerycore "${test_qofquerycore_SOURCES}" gtest_engine_INCLUDES gtest_old_engine_LIBS) +set(test_qofevent_SOURCES +gtest-qofevent.cpp) +gnc_add_test(test-qofevent "${test_qofevent_SOURCES}" + gtest_engine_INCLUDES gtest_old_engine_LIBS) + set(test_engine_SOURCES_DIST dummy.cpp @@ -208,6 +213,7 @@ set(test_engine_SOURCES_DIST gtest-gnc-datetime.cpp gtest-import-map.cpp gtest-qofquerycore.cpp + gtest-qofevent.cpp test-account-object.cpp test-address.c test-business.c diff --git a/libgnucash/engine/test/gtest-qofevent.cpp b/libgnucash/engine/test/gtest-qofevent.cpp new file mode 100644 index 0000000000..a07ca27f8e --- /dev/null +++ b/libgnucash/engine/test/gtest-qofevent.cpp @@ -0,0 +1,137 @@ +/********************************************************************\ + * gtest-qofevent.cpp -- Unit tests for qofevent.cpp * + * * + * Copyright 2022 Christopher Lam * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 2 of * + * the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License* + * along with this program; if not, contact: * + * * + * Free Software Foundation Voice: +1-617-542-5942 * + * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 * + * Boston, MA 02110-1301, USA gnu@gnu.org * + * * + \ *********************************************************************/ + +#include +#include +#include "../test-core/test-engine-stuff.h" +#include "../qofevent.h" +#include "../qofevent-p.h" +#include + +static void +easy_handler (QofInstance *ent, QofEventId event_type, + gpointer handler_data, gpointer event_data) +{ + int *data = static_cast(handler_data); + int increment = GPOINTER_TO_INT(event_data); + *data = *data + increment; +} + +TEST (qofevent, events) +{ + QofInstance entity; // qofevents needs a non-null entity. + int data = 1; + + // initial setup. register first handler. id is 1. data is initialized at 1. + int id1 = qof_event_register_handler (easy_handler, &data); + EXPECT_EQ (id1, 1); + EXPECT_EQ (data, 1); + + // call events. this increment data by 2. data is now 3. + qof_event_gen (&entity, QOF_EVENT_ALL, GINT_TO_POINTER(2)); + EXPECT_EQ (data, 3); + + // entity is NULL, call events. data is unchanged. + qof_event_gen (NULL, QOF_EVENT_ALL, GINT_TO_POINTER(2)); + EXPECT_EQ (data, 3); + + // event is QOF_EVENT_NONE, call events. data is unchanged. + qof_event_gen (&entity, QOF_EVENT_NONE, GINT_TO_POINTER(2)); + EXPECT_EQ (data, 3); + + // call events. this increment data by 2. data is now 5. + qof_event_gen (&entity, QOF_EVENT_ALL, GINT_TO_POINTER(2)); + EXPECT_EQ (data, 5); + + // suspend, try calling events. data unchanged at 5. + qof_event_suspend (); + qof_event_gen (&entity, QOF_EVENT_ALL, GINT_TO_POINTER(2)); + EXPECT_EQ (data, 5); + + // although suspended, force events. data changed to 7. + qof_event_force (&entity, QOF_EVENT_ALL, GINT_TO_POINTER(2)); + EXPECT_EQ (data, 7); + + // resume, call events. data incremented by 2 to 9. + qof_event_resume (); + qof_event_gen (&entity, QOF_EVENT_ALL, GINT_TO_POINTER(2)); + EXPECT_EQ (data, 9); + + qof_event_unregister_handler (id1); + + // no more handler. running events means data is no longer updated. + qof_event_gen (&entity, QOF_EVENT_ALL, GINT_TO_POINTER(2)); + EXPECT_EQ (data, 9); + + // test handler id is incremented to 2 + int id2 = qof_event_register_handler (easy_handler, &data); + EXPECT_EQ (id2, 2); + + // test handler id is incremented to 3 + int id3 = qof_event_register_handler (easy_handler, &data); + EXPECT_EQ (id3, 3); + qof_event_unregister_handler (id3); + qof_event_unregister_handler (id2); + + // handler_id 1 to 3 are now unregistered, the next handler_id is still 4. + int id4 = qof_event_register_handler (easy_handler, &data); + EXPECT_EQ (id4, 4); + qof_event_unregister_handler (id4); +} + +static void +compound_handler (QofInstance *ent, QofEventId event_type, + gpointer handler_data, gpointer event_data) +{ + QofInstance entity; + int *data = static_cast(handler_data); + int increment = GPOINTER_TO_INT(event_data); + + int id = qof_event_register_handler (easy_handler, &data); + // this handler is immediately deregistered but is not deleted + // until all handlers have run + qof_event_unregister_handler (id); + + *data = *data + increment; +} + +TEST (qofevent, compound_events) +{ + QofInstance entity; // qofevents needs a non-null entity. + int data = 1; + + // initial setup. first handler_id is 1. data is initialized at 1. + int id5 = qof_event_register_handler (compound_handler, &data); + EXPECT_EQ (id5, 5); + EXPECT_EQ (data, 1); + + // call handlers. this increments data by 2. calling + // compound_handler will cause the deletion to be effected after + // all the handlers have completed. + qof_event_gen (&entity, QOF_EVENT_ALL, GINT_TO_POINTER(2)); + EXPECT_EQ (data, 3); + + qof_event_unregister_handler (id5); +} +