From b4dec7fb65f60c63e43f4490ef021eddcf2743ff Mon Sep 17 00:00:00 2001 From: linianlin Date: Wed, 6 May 2026 22:19:00 +0800 Subject: [PATCH] =?UTF-8?q?AI=20=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/CMakeLists.txt | 25 +++++++ tests/test_app.cpp | 162 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 187 insertions(+) create mode 100644 tests/CMakeLists.txt create mode 100644 tests/test_app.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..26bbfb0 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.10.0) +project(test_plan_execute_t1) +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 14) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../include) + +include(CTest) +enable_testing() + +add_executable(test_plan_execute_t1 test_app.cpp ../src/app.cpp) + +target_link_libraries(test_plan_execute_t1 gtest gmock gtest_main) +include(GoogleTest) +gtest_discover_tests(test_plan_execute_t1) \ No newline at end of file diff --git a/tests/test_app.cpp b/tests/test_app.cpp new file mode 100644 index 0000000..22a386b --- /dev/null +++ b/tests/test_app.cpp @@ -0,0 +1,162 @@ +#include +#include "app.hpp" + +// 测试 getUnreadNotifications +TEST(CmsEngineTest, GetUnreadNotifications_NoNotifications) { + CmsEngine engine; + auto unread = engine.getUnreadNotifications(); + EXPECT_TRUE(unread.empty()); +} + +TEST(CmsEngineTest, GetUnreadNotifications_AllRead) { + CmsEngine engine; + NotificationMessage msg1, msg2; + msg1.isRead = true; + msg2.isRead = true; + engine.pushNotification(msg1); + engine.pushNotification(msg2); + auto unread = engine.getUnreadNotifications(); + EXPECT_TRUE(unread.empty()); +} + +TEST(CmsEngineTest, GetUnreadNotifications_AllUnread) { + CmsEngine engine; + NotificationMessage msg1, msg2; + msg1.isRead = false; + msg2.isRead = false; + engine.pushNotification(msg1); + engine.pushNotification(msg2); + auto unread = engine.getUnreadNotifications(); + EXPECT_EQ(unread.size(), 2); +} + +TEST(CmsEngineTest, GetUnreadNotifications_Mixed) { + CmsEngine engine; + NotificationMessage msg1, msg2, msg3; + msg1.isRead = true; + msg2.isRead = false; + msg3.isRead = false; + engine.pushNotification(msg1); + engine.pushNotification(msg2); + engine.pushNotification(msg3); + auto unread = engine.getUnreadNotifications(); + EXPECT_EQ(unread.size(), 2); + // 验证返回的是未读消息 + for (const auto& msg : unread) { + EXPECT_FALSE(msg.isRead); + } +} + +// 测试 switchMode +TEST(CmsEngineTest, SwitchMode_FromIdleToHumanLoop) { + CmsEngine engine; + EXPECT_TRUE(engine.switchMode(RunMode::HumanLoop)); + const auto& ctx = engine.getSystemContext(); + EXPECT_EQ(ctx.currentMode, RunMode::HumanLoop); +} + +TEST(CmsEngineTest, SwitchMode_FromIdleToAutoExec) { + CmsEngine engine; + EXPECT_TRUE(engine.switchMode(RunMode::AutoExec)); + EXPECT_EQ(engine.getSystemContext().currentMode, RunMode::AutoExec); +} + +TEST(CmsEngineTest, SwitchMode_FromDegradedToOther) { + CmsEngine engine; + // 先切换到 Degraded + engine.switchMode(RunMode::Degraded); + // 尝试切换到其他模式,应失败 + EXPECT_FALSE(engine.switchMode(RunMode::Idle)); + EXPECT_EQ(engine.getSystemContext().currentMode, RunMode::Degraded); +} + +TEST(CmsEngineTest, SwitchMode_FromDegradedToDegraded) { + CmsEngine engine; + engine.switchMode(RunMode::Degraded); + // 切换到自身,应成功(因为 newMode == Degraded) + EXPECT_TRUE(engine.switchMode(RunMode::Degraded)); + EXPECT_EQ(engine.getSystemContext().currentMode, RunMode::Degraded); +} + +TEST(CmsEngineTest, SwitchMode_FromHumanLoopToDegraded) { + CmsEngine engine; + engine.switchMode(RunMode::HumanLoop); + EXPECT_TRUE(engine.switchMode(RunMode::Degraded)); + EXPECT_EQ(engine.getSystemContext().currentMode, RunMode::Degraded); +} + +// 测试 getSystemContext +TEST(CmsEngineTest, GetSystemContext_InitialState) { + CmsEngine engine; + const auto& ctx = engine.getSystemContext(); + EXPECT_EQ(ctx.currentMode, RunMode::Idle); + EXPECT_EQ(ctx.consistencyMark, 0); + // switchTime 应接近当前时间,但无法精确断言 + EXPECT_FALSE(ctx.contextSnapshot.empty()); +} + +TEST(CmsEngineTest, GetSystemContext_AfterSwitch) { + CmsEngine engine; + engine.switchMode(RunMode::AutoExec); + const auto& ctx = engine.getSystemContext(); + EXPECT_EQ(ctx.currentMode, RunMode::AutoExec); + // consistencyMark 应为 nextId_ 的值(初始0,但 switchMode 会赋值为 nextId_,nextId_ 初始0,但 generateNextId 会递增,但 switchMode 中 consistencyMark = nextId_,此时 nextId_ 仍为0) + // 注意:switchMode 中 consistencyMark = nextId_,而 nextId_ 初始为0,所以 consistencyMark 应为0 + EXPECT_EQ(ctx.consistencyMark, 0); +} + +// 测试 getSummary +TEST(CmsEngineTest, GetSummary_Initial) { + CmsEngine engine; + std::string summary = engine.getSummary(); + EXPECT_NE(summary.find("Events : 0"), std::string::npos); + EXPECT_NE(summary.find("Plans : 0"), std::string::npos); + EXPECT_NE(summary.find("Templates : 0"), std::string::npos); + EXPECT_NE(summary.find("Monitor Nodes : 0"), std::string::npos); + EXPECT_NE(summary.find("Active Sessions : 0"), std::string::npos); + EXPECT_NE(summary.find("Notifications : 0"), std::string::npos); + EXPECT_NE(summary.find("Mode : Idle"), std::string::npos); +} + +TEST(CmsEngineTest, GetSummary_AfterOperations) { + CmsEngine engine; + // 添加事件 + EventRecord evt; + evt.id = "evt1"; + evt.priority = 10; + engine.ingestEvent(evt); + // 添加方案 + TaskPlan plan; + plan.name = "plan1"; + engine.createTaskPlan(plan); + // 添加模板 + TemplateInstance tmpl; + tmpl.confidence = 0.8; + engine.registerTemplate(tmpl); + // 添加节点状态 + ExecutionStatus status; + status.nodeId = "node1"; + status.healthIndex = 1.0; + status.errorCode = 0; + status.lastReport = std::chrono::system_clock::now(); + engine.reportExecutionStatus(status); + // 添加会话 + UserSession session; + session.userId = "user1"; + engine.createSession(session); + // 添加通知 + NotificationMessage msg; + msg.isRead = false; + engine.pushNotification(msg); + // 切换模式 + engine.switchMode(RunMode::AutoExec); + + std::string summary = engine.getSummary(); + EXPECT_NE(summary.find("Events : 1"), std::string::npos); + EXPECT_NE(summary.find("Plans : 1"), std::string::npos); + EXPECT_NE(summary.find("Templates : 1"), std::string::npos); + EXPECT_NE(summary.find("Monitor Nodes : 1"), std::string::npos); + EXPECT_NE(summary.find("Active Sessions : 1"), std::string::npos); + EXPECT_NE(summary.find("Notifications : 1"), std::string::npos); + EXPECT_NE(summary.find("Mode : AutoExec"), std::string::npos); +}