diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..cf23571 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.10.0) +project(test_presentation) +include(FetchContent) +if (MSVC) + add_compile_options(/utf-8) +endif() +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip +) +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include) + +include(CTest) +enable_testing() + +add_executable(test_presentation test_app.cpp ../src/app.cpp) + +target_link_libraries(test_presentation gtest gmock gtest_main) +include(GoogleTest) +gtest_discover_tests(test_presentation) \ No newline at end of file diff --git a/tests/test_app.cpp b/tests/test_app.cpp new file mode 100644 index 0000000..d656884 --- /dev/null +++ b/tests/test_app.cpp @@ -0,0 +1,117 @@ +#include +#include "app.hpp" +#include +#include + +namespace ocpm { + +TEST(PlanManagerTest, testQueryPlansNormalInput) { + PlanManager manager; + manager.loadSampleData(); + PlanQueryRequest req; + req.status_filter = -1; + req.priority_min = 0; + req.keyword = ""; + req.page = 1; + req.page_size = 10; + SortParam sort{"priority", SortDirection::DESC}; + auto result = manager.queryPlans(req, sort); + EXPECT_EQ(result.size(), 5); + EXPECT_EQ(result[0].priority, 95); +} + +TEST(PlanManagerTest, testQueryPlansBoundaryPagination) { + PlanManager manager; + manager.loadSampleData(); + PlanQueryRequest req; + req.page = 3; + req.page_size = 2; + auto result = manager.queryPlans(req, SortParam{}); + EXPECT_TRUE(result.empty()); +} + +TEST(PlanManagerTest, testGetPlanDetailValidId) { + PlanManager manager; + manager.loadSampleData(); + auto plan = manager.getPlanDetail("PLAN-001"); + EXPECT_EQ(plan.plan_name, "突击行动-甲"); +} + +TEST(PlanManagerTest, testGetPlanDetailInvalidId) { + PlanManager manager; + manager.loadSampleData(); + EXPECT_THROW(manager.getPlanDetail("INVALID"), std::invalid_argument); +} + +TEST(PlanManagerTest, testComparePlansIdentical) { + PlanManager manager; + manager.loadSampleData(); + auto diffs = manager.comparePlans("PLAN-001", "PLAN-001"); + EXPECT_EQ(diffs.size(), 1); + EXPECT_EQ(diffs[0], "(no differences)"); +} + +TEST(PlanManagerTest, testReconstructSuccess) { + PlanManager manager; + manager.loadSampleData(); + ReconstructCommand cmd{"PLAN-001", {"mod1", "mod2"}}; + auto result = manager.reconstruct(cmd); + EXPECT_TRUE(result.success); + EXPECT_EQ(result.new_version, "PLAN-001-v2"); +} + +TEST(PlanManagerTest, testReconstructFailure) { + PlanManager manager; + ReconstructCommand cmd{"NONEXIST", {}}; + auto result = manager.reconstruct(cmd); + EXPECT_FALSE(result.success); +} + +TEST(PlanManagerTest, testLoadSampleData) { + PlanManager manager; + manager.loadSampleData(); + EXPECT_NO_THROW(manager.getPlanDetail("PLAN-005")); +} + +TEST(DistributedPlanManagerTest, testAddRemoveNode) { + DistributedPlanManager mgr; + TopoNode node{"N1", "Test", 0, 0}; + mgr.addNode(node); + mgr.removeNode("N1"); + EXPECT_TRUE(mgr.isConnected()); +} + +TEST(DistributedPlanManagerTest, testIsConnectedGraph) { + DistributedPlanManager mgr; + mgr.loadSampleData(); + EXPECT_TRUE(mgr.isConnected()); +} + +TEST(DispatchManagerTest, testDispatchPlanValidAssets) { + DispatchManager mgr; + mgr.loadSampleData(); + int count = mgr.dispatchPlan("P1", {"ASSET-001", "ASSET-004"}); + EXPECT_EQ(count, 2); +} + +TEST(DispatchManagerTest, testGetAssetStatusOffline) { + DispatchManager mgr; + EXPECT_EQ(mgr.getAssetStatus("UNKNOWN"), AssetStatusCode::OFFLINE); +} + +TEST(DispatchManagerTest, testGetAlertsFiltered) { + DispatchManager mgr; + mgr.loadSampleData(); + AlertLevel filter = AlertLevel::ERROR; + auto alerts = mgr.getAlerts(&filter); + EXPECT_EQ(alerts.size(), 1); +} + +TEST(DispatchManagerTest, testClearAlerts) { + DispatchManager mgr; + mgr.loadSampleData(); + mgr.clearAlerts(); + EXPECT_TRUE(mgr.getAlerts().empty()); +} + +} // namespace ocpm \ No newline at end of file