task_plan/tests/basic_test.cpp

125 lines
4.5 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "event_manager.hpp"
#include "task_template_manager.hpp"
#include <cassert>
#include <iostream>
#include <cstring>
/**
* @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;
}