#include "event_manager.hpp" #include "task_template_manager.hpp" #include #include #include /** * @brief ETMS 单元测试 * * 使用标准 assert 宏进行基本功能验证,无需引入外部测试框架。 */ int main() { std::cout << "[TEST] 启动 ETMS 基础单元测试...\n\n"; // ============================ // 1. EventManager 测试 // ============================ std::cout << "[TEST] EventManager 测试...\n"; EventManager evtMgr; // 1.1 接收合法事件 bool ok = evtMgr.receiveEvent("{\"eventId\":\"E001\",\"type\":\"air_raid\",\"level\":3,\"desc\":\"\u654c\u673a\u7a81\u88ad\"}"); assert(ok); assert(evtMgr.totalEvents() == 1); // 1.2 接收另一个事件 ok = evtMgr.receiveEvent("{\"eventId\":\"E002\",\"type\":\"recon\",\"level\":1,\"desc\":\"\u4fa6\u5bdf\"}"); assert(ok); assert(evtMgr.totalEvents() == 2); // 1.3 接收非法事件(缺少 eventId) ok = evtMgr.receiveEvent("{\"type\":\"invalid\"}"); assert(!ok); // should be rejected assert(evtMgr.totalEvents() == 2); // 数量不变 // 1.4 状态流转 ok = evtMgr.updateStatus("E001", EventStatus::Processed); assert(ok); const Event* evt1 = evtMgr.findEvent("E001"); assert(evt1 != nullptr); assert(evt1->status == EventStatus::Processed); // 1.5 查询不存在的 ID const Event* none = evtMgr.findEvent("NONEXIST"); assert(none == nullptr); // 1.6 分页查询 auto page = evtMgr.queryEvents(1, 10); assert(page.totalCount == 2); assert(page.items.size() == 2); // 1.7 levelToString / statusToString assert(std::strcmp(EventManager::levelToString(EventLevel::Critical), "\u5371\u6025") == 0); assert(std::strcmp(EventManager::statusToString(EventStatus::Received), "\u5df2\u63a5\u6536") == 0); std::cout << " [PASS] EventManager \u5168\u90e8\u6d4b\u8bd5\u901a\u8fc7\n\n"; // ============================ // 2. TaskTemplateManager 测试 // ============================ std::cout << "[TEST] TaskTemplateManager \u6d4b\u8bd5...\n"; TaskTemplateManager tmplMgr; // 2.1 添加模板 TaskTemplate t1{"T001", "\u9632\u7a7a\u53cd\u5bfc\u65b9\u6848", "1.0", "/minio/templates/T001.json", "{\"type\":\"air_defense\"}", 0, 5}; TaskTemplate t2{"T002", "\u4fa6\u5bdf\u6253\u51fb\u65b9\u6848", "1.2", "/minio/templates/T002.json", "{\"type\":\"strike\"}", 0, 3}; assert(tmplMgr.upsertTemplate(t1)); assert(tmplMgr.upsertTemplate(t2)); assert(tmplMgr.totalTemplates() == 2); // 2.2 查找模板 const TaskTemplate* found = tmplMgr.findTemplate("T001"); assert(found != nullptr); assert(found->name == "\u9632\u7a7a\u53cd\u5bfc\u65b9\u6848"); // 2.3 更新模板(增量更新) TaskTemplate t1Updated{"T001", "\u9632\u7a7a\u53cd\u5bfc\u65b9\u6848v2", "2.0", "/minio/templates/T001_v2.json", "{}", 0, 10}; assert(tmplMgr.upsertTemplate(t1Updated)); const TaskTemplate* updated = tmplMgr.findTemplate("T001"); assert(updated != nullptr); assert(updated->version == "2.0"); // 2.4 按名称排序 auto sortedByName = tmplMgr.getTemplatesSortedByName(true); assert(sortedByName.size() == 2); assert(sortedByName[0].templateId == "T001"); // "防空" < "侦察" in GBK/Pinyin... well, just check size // 2.5 按使用频率排序(降序) auto sortedByUsage = tmplMgr.getTemplatesSortedByUsage(false); assert(sortedByUsage.size() == 2); assert(sortedByUsage[0].usageCount >= sortedByUsage[1].usageCount); // 2.6 删除模板 assert(tmplMgr.removeTemplate("T002")); assert(tmplMgr.totalTemplates() == 1); assert(tmplMgr.findTemplate("T002") == nullptr); // 2.7 知识库版本管理 KbVersion kb1{"KB-2024-01", 1704067200000LL, "2024\u5e74\u57fa\u7840\u77e5\u8bc6\u5e93", true}; KbVersion kb2{"KB-2024-02", 1706745600000LL, "2024\u5e74\u66f4\u65b0\u77e5\u8bc6\u5e93", false}; assert(tmplMgr.addKbVersion(kb1)); assert(tmplMgr.addKbVersion(kb2)); assert(tmplMgr.getAllKbVersions().size() == 2); // 切换活跃版本 assert(tmplMgr.activateKbVersion("KB-2024-02")); const KbVersion* active = tmplMgr.getActiveKbVersion(); assert(active != nullptr); assert(active->versionId == "KB-2024-02"); assert(active->isActive); std::cout << " [PASS] TaskTemplateManager \u5168\u90e8\u6d4b\u8bd5\u901a\u8fc7\n\n"; std::cout << "[TEST] \u5168\u90e8\u6d4b\u8bd5\u901a\u8fc7\u2714\n"; return 0; }