task_plan/tests/basic_test.cpp

198 lines
5.7 KiB
C++
Raw 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.

/**
* @file basic_test.cpp
* @brief ETMS 核心功能单元测试(使用标准库 assert无外部依赖
*/
#include "app.hpp"
#include <cassert>
#include <iostream>
#include <string>
/**
* @brief 打印测试结果
* @param testName 测试名称
* @param passed 是否通过
*/
static void testResult(const char* testName, bool passed)
{
std::cout << " " << (passed ? "[PASS]" : "[FAIL]") << " " << testName << "\n";
}
/**
* @brief 测试 EventManager 事件接收与校验
*/
static void testEventReceive()
{
etms::EventManager mgr;
// 合法事件应返回 ACK
std::string validJson = R"({"eventId":"E1","eventType":"","timestamp":1000})";
assert(mgr.receiveEvent(validJson) == true);
assert(mgr.eventCount() == 1);
// 缺少关键字段应返回 NACK
std::string invalidJson = R"({"eventType":""})";
assert(mgr.receiveEvent(invalidJson) == false);
assert(mgr.eventCount() == 1); // 数量不变
testResult("EventReceive", true);
}
/**
* @brief 测试事件状态流转
*/
static void testEventStatusFlow()
{
etms::EventManager mgr;
std::string json = R"({"eventId":"E2","eventType":"","timestamp":2000})";
mgr.receiveEvent(json);
// Received → Processed
assert(mgr.processEvent("E2") == true);
// 重复处理应失败
assert(mgr.processEvent("E2") == false);
// Processed → PendingTask
assert(mgr.markPendingTask("E2") == true);
// 重复标记应失败
assert(mgr.markPendingTask("E2") == false);
// 查询待处理事件
auto pending = mgr.getPendingEvents();
assert(pending.size() == 1);
assert(pending[0].eventId == "E2");
// 拒绝操作(在 Rejected 状态测试)
etms::EventManager mgr2;
mgr2.receiveEvent(json);
assert(mgr2.rejectEvent("E2") == true);
auto ev = mgr2.getEvent("E2");
assert(static_cast<int>(ev.status) == static_cast<int>(etms::EventStatus::Rejected));
testResult("EventStatusFlow", true);
}
/**
* @brief 测试 TaskGenerator 模板管理
*/
static void testTemplateManagement()
{
etms::TaskGenerator gen;
// 加载合法模板
std::string tmplJson = R"({"id":"T1","name":"","type":"","version":"1.0"})";
assert(gen.loadTemplate(tmplJson) == true);
// 缺少关键字段应失败
std::string badJson = R"({"name":"ID模板"})";
assert(gen.loadTemplate(badJson) == false);
// 查询模板
auto tmpl = gen.getTemplate("T1");
assert(tmpl.id == "T1");
assert(tmpl.name == "侦察模板");
// 搜索
auto results = gen.searchTemplates("侦察");
assert(results.size() == 1);
results = gen.searchTemplates("不存在");
assert(results.empty());
testResult("TemplateManagement", true);
}
/**
* @brief 测试知识库版本管理
*/
static void testKBVersionManagement()
{
etms::TaskGenerator gen;
etms::KBVersion kb1;
kb1.id = "KB-V1";
kb1.status = etms::KBVersionStatus::Enabled;
gen.addKBVersion(kb1);
etms::KBVersion kb2;
kb2.id = "KB-V2";
kb2.status = etms::KBVersionStatus::Disabled; // 禁用
gen.addKBVersion(kb2);
// 可用版本应只返回 Enabled
auto avail = gen.getAvailableKBVersions();
assert(avail.size() == 1);
assert(avail[0].id == "KB-V1");
// 选择版本
assert(gen.selectKBVersion("KB-V1") == true);
assert(gen.getLockedKBVersion() == "KB-V1");
// 选择禁用版本应失败
assert(gen.selectKBVersion("KB-V2") == false);
assert(gen.getLockedKBVersion() == "KB-V1"); // 不变
testResult("KBVersionManagement", true);
}
/**
* @brief 测试任务请求组装
*/
static void testTaskRequestBuilding()
{
etms::TaskGenerator gen;
// 准备好模板和版本
std::string tmplJson = R"({"id":"T1","name":"","type":"","version":"1.0"})";
gen.loadTemplate(tmplJson);
etms::KBVersion kb;
kb.id = "KB-V1";
kb.status = etms::KBVersionStatus::Enabled;
gen.addKBVersion(kb);
gen.selectKBVersion("KB-V1");
// 手动模式映射
gen.setWorkMode(etms::WorkMode::Manual);
assert(gen.mapEventToTemplate("EVT-001", "T1") == true);
// 构建请求
etms::TaskRequest req = gen.buildTaskRequest("EVT-001");
assert(req.requestId.find("REQ_EVT-001") == 0);
assert(req.eventRef == "EVT-001");
assert(req.templateId == "T1");
assert(req.kbVersionId == "KB-V1");
assert(req.workMode == "manual");
// 未映射的事件应返回默认请求
etms::TaskRequest emptyReq = gen.buildTaskRequest("EVT-999");
assert(emptyReq.requestId.empty());
testResult("TaskRequestBuilding", true);
}
/**
* @brief 主测试入口
* @return int 失败返回 1全部通过返回 0
*/
int main()
{
std::cout << "══════════════════════════════════════════════════════\n";
std::cout << " ETMS Unit Tests (std::assert)\n";
std::cout << "══════════════════════════════════════════════════════\n\n";
testEventReceive();
testEventStatusFlow();
testTemplateManagement();
testKBVersionManagement();
testTaskRequestBuilding();
std::cout << "\n══════════════════════════════════════════════════════\n";
std::cout << " 所有测试通过 ✓\n";
std::cout << "══════════════════════════════════════════════════════\n";
return 0;
}