task_plan/tests/basic_test.cpp

125 lines
4.5 KiB
C++
Raw Permalink Normal View History

2026-05-21 07:09:58 +00:00
#include "event_manager.hpp"
#include "task_template_manager.hpp"
2026-05-20 08:00:11 +00:00
#include <cassert>
#include <iostream>
2026-05-21 07:09:58 +00:00
#include <cstring>
2026-05-20 08:00:11 +00:00
2026-05-20 09:17:29 +00:00
/**
2026-05-21 07:09:58 +00:00
* @brief ETMS
*
* 使 assert
2026-05-20 09:17:29 +00:00
*/
2026-05-21 07:09:58 +00:00
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";
2026-05-20 08:00:11 +00:00
return 0;
}