diff --git a/scwx-qt/source/scwx/qt/main/application.cpp b/scwx-qt/source/scwx/qt/main/application.cpp index d851c8ec..3f62120a 100644 --- a/scwx-qt/source/scwx/qt/main/application.cpp +++ b/scwx-qt/source/scwx/qt/main/application.cpp @@ -44,6 +44,14 @@ void WaitForInitialization() } } +// Only use for test cases +void ResetInitilization() +{ + logger_->debug("Application initialization reset"); + std::unique_lock lock(initializationMutex_); + initialized_ = false; +} + } // namespace Application } // namespace main } // namespace qt diff --git a/scwx-qt/source/scwx/qt/main/application.hpp b/scwx-qt/source/scwx/qt/main/application.hpp index 9b63ffad..0237f13c 100644 --- a/scwx-qt/source/scwx/qt/main/application.hpp +++ b/scwx-qt/source/scwx/qt/main/application.hpp @@ -11,6 +11,8 @@ namespace Application void FinishInitialization(); void WaitForInitialization(); +// Only use for test cases +void ResetInitilization(); } // namespace Application } // namespace main diff --git a/scwx-qt/source/scwx/qt/manager/marker_manager.cpp b/scwx-qt/source/scwx/qt/manager/marker_manager.cpp index 382aafd7..c8ceda09 100644 --- a/scwx-qt/source/scwx/qt/manager/marker_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/marker_manager.cpp @@ -36,7 +36,7 @@ public: explicit Impl(MarkerManager* self) : self_ {self} {} ~Impl() { threadPool_.join(); } - std::string markerSettingsPath_ {}; + std::string markerSettingsPath_ {""}; std::vector> markerRecords_ {}; MarkerManager* self_; @@ -176,14 +176,13 @@ MarkerManager::Impl::GetMarkerByName(const std::string& name) MarkerManager::MarkerManager() : p(std::make_unique(this)) { + p->InitializeMarkerSettings(); boost::asio::post(p->threadPool_, [this]() { try { - p->InitializeMarkerSettings(); - // Read Marker settings on startup main::Application::WaitForInitialization(); p->ReadMarkerSettings(); @@ -293,6 +292,13 @@ void MarkerManager::move_marker(size_t from, size_t to) Q_EMIT MarkersUpdated(); } +// Only use for testing +void MarkerManager::set_marker_settings_path(const std::string& path) +{ + p->markerSettingsPath_ = path; +} + + std::shared_ptr MarkerManager::Instance() { static std::weak_ptr markerManagerReference_ {}; diff --git a/scwx-qt/source/scwx/qt/manager/marker_manager.hpp b/scwx-qt/source/scwx/qt/manager/marker_manager.hpp index 2f073ab7..2166725f 100644 --- a/scwx-qt/source/scwx/qt/manager/marker_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/marker_manager.hpp @@ -20,13 +20,16 @@ public: explicit MarkerManager(); ~MarkerManager(); - size_t marker_count(); + size_t marker_count(); std::optional get_marker(size_t index); void set_marker(size_t index, const types::MarkerInfo& marker); void add_marker(const types::MarkerInfo& marker); void remove_marker(size_t index); void move_marker(size_t from, size_t to); + // Only use for testing + void set_marker_settings_path(const std::string& path); + static std::shared_ptr Instance(); signals: diff --git a/test/data b/test/data index 40a367ca..166c5a7b 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit 40a367ca89b5b197353ca58dea547a3e3407c7f3 +Subproject commit 166c5a7bcaf8ad0a42bedf8f8dc5c4aa907e7151 diff --git a/test/source/scwx/qt/model/marker_model.test.cpp b/test/source/scwx/qt/model/marker_model.test.cpp new file mode 100644 index 00000000..b237e182 --- /dev/null +++ b/test/source/scwx/qt/model/marker_model.test.cpp @@ -0,0 +1,201 @@ +#include +#include +#include + +#include +#include +#include + +#include +#include + + +namespace scwx +{ +namespace qt +{ +namespace model +{ + +static const std::string EMPTY_MARKERS_FILE = + std::string(SCWX_TEST_DATA_DIR) + "/json/markers/markers-empty.json"; +static const std::string TEMP_MARKERS_FILE = + std::string(SCWX_TEST_DATA_DIR) + "/json/markers/markers-temp.json"; +static const std::string ONE_MARKERS_FILE = + std::string(SCWX_TEST_DATA_DIR) + "/json/markers/markers-one.json"; +static const std::string FIVE_MARKERS_FILE = + std::string(SCWX_TEST_DATA_DIR) + "/json/markers/markers-five.json"; + +static std::mutex initializedMutex {}; +static std::condition_variable initializedCond {}; +static bool initialized; + +void CompareFiles(const std::string& file1, const std::string& file2) +{ + std::ifstream ifs1 {file1}; + std::stringstream buffer1; + buffer1 << ifs1.rdbuf(); + + std::ifstream ifs2 {file2}; + std::stringstream buffer2; + buffer2 << ifs2.rdbuf(); + + EXPECT_EQ(buffer1.str(), buffer2.str()); +} + +void CopyFile(const std::string& from, const std::string& to) +{ + std::filesystem::copy_file(from, to); + CompareFiles(from, to); +} + +typedef void TestFunction(std::shared_ptr manager, + MarkerModel& model); + +void RunTest(const std::string& filename, TestFunction testFunction) +{ + { + main::Application::ResetInitilization(); + MarkerModel model = MarkerModel(); + std::shared_ptr manager = + manager::MarkerManager::Instance(); + + manager->set_marker_settings_path(TEMP_MARKERS_FILE); + + initialized = false; + QObject::connect(manager.get(), + &manager::MarkerManager::MarkersInitialized, + []() + { + std::unique_lock lock(initializedMutex); + initialized = true; + initializedCond.notify_all(); + }); + + main::Application::FinishInitialization(); + + std::unique_lock lock(initializedMutex); + while (!initialized) + { + initializedCond.wait(lock); + } + + testFunction(manager, model); + } + + EXPECT_EQ(std::filesystem::exists(TEMP_MARKERS_FILE), true); + + CompareFiles(TEMP_MARKERS_FILE, filename); +} + +TEST(MarkerModelTest, CreateJson) +{ + // Verify file doesn't exist prior to test start + EXPECT_EQ(std::filesystem::exists(TEMP_MARKERS_FILE), false); + + RunTest(EMPTY_MARKERS_FILE, + [](std::shared_ptr, MarkerModel&) {}); + + std::filesystem::remove(TEMP_MARKERS_FILE); + EXPECT_EQ(std::filesystem::exists(TEMP_MARKERS_FILE), false); +} + +TEST(MarkerModelTest, LoadEmpty) +{ + CopyFile(EMPTY_MARKERS_FILE, TEMP_MARKERS_FILE); + + RunTest(EMPTY_MARKERS_FILE, + [](std::shared_ptr, MarkerModel&) {}); + + std::filesystem::remove(TEMP_MARKERS_FILE); + EXPECT_EQ(std::filesystem::exists(TEMP_MARKERS_FILE), false); +} + +TEST(MarkerModelTest, AddRemove) +{ + CopyFile(EMPTY_MARKERS_FILE, TEMP_MARKERS_FILE); + + RunTest(ONE_MARKERS_FILE, + [](std::shared_ptr manager, MarkerModel&) + { manager->add_marker(types::MarkerInfo("Null", 0, 0)); }); + RunTest(EMPTY_MARKERS_FILE, + [](std::shared_ptr manager, MarkerModel&) + { manager->remove_marker(0); }); + + std::filesystem::remove(TEMP_MARKERS_FILE); + EXPECT_EQ(std::filesystem::exists(TEMP_MARKERS_FILE), false); +} + +TEST(MarkerModelTest, AddFive) +{ + CopyFile(EMPTY_MARKERS_FILE, TEMP_MARKERS_FILE); + + RunTest(FIVE_MARKERS_FILE, + [](std::shared_ptr manager, MarkerModel&) + { + manager->add_marker(types::MarkerInfo("Null", 0, 0)); + manager->add_marker(types::MarkerInfo("North", 90, 0)); + manager->add_marker(types::MarkerInfo("South", -90, 0)); + manager->add_marker(types::MarkerInfo("East", 0, 90)); + manager->add_marker(types::MarkerInfo("West", 0, -90)); + }); + + std::filesystem::remove(TEMP_MARKERS_FILE); + EXPECT_EQ(std::filesystem::exists(TEMP_MARKERS_FILE), false); +} + +TEST(MarkerModelTest, AddFour) +{ + CopyFile(ONE_MARKERS_FILE, TEMP_MARKERS_FILE); + + RunTest(FIVE_MARKERS_FILE, + [](std::shared_ptr manager, MarkerModel&) + { + manager->add_marker(types::MarkerInfo("North", 90, 0)); + manager->add_marker(types::MarkerInfo("South", -90, 0)); + manager->add_marker(types::MarkerInfo("East", 0, 90)); + manager->add_marker(types::MarkerInfo("West", 0, -90)); + }); + + std::filesystem::remove(TEMP_MARKERS_FILE); + EXPECT_EQ(std::filesystem::exists(TEMP_MARKERS_FILE), false); +} + +TEST(MarkerModelTest, RemoveFive) +{ + CopyFile(FIVE_MARKERS_FILE, TEMP_MARKERS_FILE); + + RunTest(EMPTY_MARKERS_FILE, + [](std::shared_ptr manager, MarkerModel&) + { + manager->remove_marker(4); + manager->remove_marker(3); + manager->remove_marker(2); + manager->remove_marker(1); + manager->remove_marker(0); + }); + + std::filesystem::remove(TEMP_MARKERS_FILE); + EXPECT_EQ(std::filesystem::exists(TEMP_MARKERS_FILE), false); +} + +TEST(MarkerModelTest, RemoveFour) +{ + CopyFile(FIVE_MARKERS_FILE, TEMP_MARKERS_FILE); + + RunTest(ONE_MARKERS_FILE, + [](std::shared_ptr manager, MarkerModel&) + { + manager->remove_marker(4); + manager->remove_marker(3); + manager->remove_marker(2); + manager->remove_marker(1); + }); + + std::filesystem::remove(TEMP_MARKERS_FILE); + EXPECT_EQ(std::filesystem::exists(TEMP_MARKERS_FILE), false); +} + +} // namespace model +} // namespace qt +} // namespace scwx diff --git a/test/test.cmake b/test/test.cmake index b3cfedd2..dad5ab9b 100644 --- a/test/test.cmake +++ b/test/test.cmake @@ -25,7 +25,8 @@ set(SRC_QT_CONFIG_TESTS source/scwx/qt/config/county_database.test.cpp set(SRC_QT_MANAGER_TESTS source/scwx/qt/manager/settings_manager.test.cpp source/scwx/qt/manager/update_manager.test.cpp) set(SRC_QT_MAP_TESTS source/scwx/qt/map/map_provider.test.cpp) -set(SRC_QT_MODEL_TESTS source/scwx/qt/model/imgui_context_model.test.cpp) +set(SRC_QT_MODEL_TESTS source/scwx/qt/model/imgui_context_model.test.cpp + source/scwx/qt/model/marker_model.test.cpp) set(SRC_QT_SETTINGS_TESTS source/scwx/qt/settings/settings_container.test.cpp source/scwx/qt/settings/settings_variable.test.cpp) set(SRC_QT_UTIL_TESTS source/scwx/qt/util/q_file_input_stream.test.cpp