plan_execute_t1/tests/test_app.cpp

315 lines
9.9 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 <gtest/gtest.h>
#include <string>
#include <vector>
#include <chrono>
#include "app.hpp"
// ============================================================================
// 测试夹具CmsEngineTest
// ============================================================================
class CmsEngineTest : public ::testing::Test {
protected:
CmsEngine engine;
// 辅助函数创建一个有效的事件注意EventRecord 没有 timestamp 成员)
EventRecord createValidEvent(const std::string& id = "EVT-001", int priority = 100) {
EventRecord evt;
evt.id = id;
evt.priority = priority;
evt.status = EventStatus::Pending;
return evt;
}
// 辅助函数:向引擎添加多个事件
void addEventsToEngine(const std::vector<EventRecord>& events) {
for (const auto& evt : events) {
engine.ingestEvent(evt);
}
}
};
// ============================================================================
// ingestEvent 测试用例
// ============================================================================
/**
* @brief 测试 ingestEvent 正常输入:有效事件应成功接入
*/
TEST_F(CmsEngineTest, testIngestEventValidEvent) {
EventRecord evt = createValidEvent("EVT-001", 100);
bool result = engine.ingestEvent(evt);
EXPECT_TRUE(result);
// 验证事件已存储
const EventRecord* found = engine.findEventById("EVT-001");
ASSERT_NE(found, nullptr);
EXPECT_EQ(found->id, "EVT-001");
EXPECT_EQ(found->priority, 100);
EXPECT_EQ(found->status, EventStatus::Pending);
}
/**
* @brief 测试 ingestEvent 边界值:优先级为 0 的最小值
*/
TEST_F(CmsEngineTest, testIngestEventPriorityMin) {
EventRecord evt = createValidEvent("EVT-002", 0);
bool result = engine.ingestEvent(evt);
EXPECT_TRUE(result);
const EventRecord* found = engine.findEventById("EVT-002");
ASSERT_NE(found, nullptr);
EXPECT_EQ(found->priority, 0);
}
/**
* @brief 测试 ingestEvent 边界值:优先级为 255 的最大值
*/
TEST_F(CmsEngineTest, testIngestEventPriorityMax) {
EventRecord evt = createValidEvent("EVT-003", 255);
bool result = engine.ingestEvent(evt);
EXPECT_TRUE(result);
const EventRecord* found = engine.findEventById("EVT-003");
ASSERT_NE(found, nullptr);
EXPECT_EQ(found->priority, 255);
}
/**
* @brief 测试 ingestEvent 异常输入:空 ID 应返回 false
*/
TEST_F(CmsEngineTest, testIngestEventEmptyId) {
EventRecord evt = createValidEvent("", 100);
bool result = engine.ingestEvent(evt);
EXPECT_FALSE(result);
// 验证事件未存储
const EventRecord* found = engine.findEventById("");
EXPECT_EQ(found, nullptr);
}
/**
* @brief 测试 ingestEvent 异常输入:优先级超过 255 应返回 false
*/
TEST_F(CmsEngineTest, testIngestEventPriorityOverflow) {
EventRecord evt = createValidEvent("EVT-004", 256);
bool result = engine.ingestEvent(evt);
EXPECT_FALSE(result);
const EventRecord* found = engine.findEventById("EVT-004");
EXPECT_EQ(found, nullptr);
}
/**
* @brief 测试 ingestEvent 特殊场景:重复 ID 的事件应允许接入
*/
TEST_F(CmsEngineTest, testIngestEventDuplicateId) {
EventRecord evt1 = createValidEvent("EVT-005", 100);
EventRecord evt2 = createValidEvent("EVT-005", 200);
bool result1 = engine.ingestEvent(evt1);
EXPECT_TRUE(result1);
bool result2 = engine.ingestEvent(evt2);
EXPECT_TRUE(result2);
// 验证两个事件都存储findEventById 返回第一个匹配的)
const EventRecord* found = engine.findEventById("EVT-005");
ASSERT_NE(found, nullptr);
EXPECT_EQ(found->priority, 100);
}
// ============================================================================
// processPendingEvents 测试用例
// ============================================================================
/**
* @brief 测试 processPendingEvents 正常输入:处理所有 Pending 事件
*/
TEST_F(CmsEngineTest, testProcessPendingEventsAllPending) {
std::vector<EventRecord> events = {
createValidEvent("EVT-010", 100),
createValidEvent("EVT-011", 200),
createValidEvent("EVT-012", 150)
};
addEventsToEngine(events);
size_t processed = engine.processPendingEvents();
EXPECT_EQ(processed, 3);
// 验证事件状态已更新
const EventRecord* evt1 = engine.findEventById("EVT-010");
ASSERT_NE(evt1, nullptr);
EXPECT_EQ(evt1->status, EventStatus::Generated);
const EventRecord* evt2 = engine.findEventById("EVT-011");
ASSERT_NE(evt2, nullptr);
EXPECT_EQ(evt2->status, EventStatus::Generated);
// 验证生成了对应的 TaskPlan
const std::vector<TaskPlan>& plans = engine.getAllPlans();
EXPECT_EQ(plans.size(), 3);
EXPECT_EQ(plans[0].relatedEventId, "EVT-010");
EXPECT_EQ(plans[0].type, PlanType::Centralized);
EXPECT_EQ(plans[0].status, PlanStatus::Drafting);
}
/**
* @brief 测试 processPendingEvents 边界值:没有 Pending 事件
*/
TEST_F(CmsEngineTest, testProcessPendingEventsNoPending) {
// 添加一个非 Pending 状态的事件
EventRecord evt = createValidEvent("EVT-020", 100);
evt.status = EventStatus::Generated;
engine.ingestEvent(evt);
size_t processed = engine.processPendingEvents();
EXPECT_EQ(processed, 0);
// 验证没有生成新的 TaskPlan
const std::vector<TaskPlan>& plans = engine.getAllPlans();
EXPECT_EQ(plans.size(), 0);
}
/**
* @brief 测试 processPendingEvents 边界值:空事件库
*/
TEST_F(CmsEngineTest, testProcessPendingEventsEmpty) {
size_t processed = engine.processPendingEvents();
EXPECT_EQ(processed, 0);
const std::vector<TaskPlan>& plans = engine.getAllPlans();
EXPECT_EQ(plans.size(), 0);
}
/**
* @brief 测试 processPendingEvents 特殊场景:混合状态的事件
*/
TEST_F(CmsEngineTest, testProcessPendingEventsMixedStatus) {
EventRecord evt1 = createValidEvent("EVT-030", 100);
evt1.status = EventStatus::Pending;
engine.ingestEvent(evt1);
EventRecord evt2 = createValidEvent("EVT-031", 200);
evt2.status = EventStatus::Generated;
engine.ingestEvent(evt2);
EventRecord evt3 = createValidEvent("EVT-032", 150);
evt3.status = EventStatus::Pending;
engine.ingestEvent(evt3);
size_t processed = engine.processPendingEvents();
EXPECT_EQ(processed, 2);
// 验证只有 Pending 的事件被处理
const EventRecord* evt1_after = engine.findEventById("EVT-030");
ASSERT_NE(evt1_after, nullptr);
EXPECT_EQ(evt1_after->status, EventStatus::Generated);
const EventRecord* evt2_after = engine.findEventById("EVT-031");
ASSERT_NE(evt2_after, nullptr);
EXPECT_EQ(evt2_after->status, EventStatus::Generated);
const EventRecord* evt3_after = engine.findEventById("EVT-032");
ASSERT_NE(evt3_after, nullptr);
EXPECT_EQ(evt3_after->status, EventStatus::Generated);
// 验证生成了 2 个 TaskPlan
const std::vector<TaskPlan>& plans = engine.getAllPlans();
EXPECT_EQ(plans.size(), 2);
}
// ============================================================================
// findEventById 测试用例
// ============================================================================
/**
* @brief 测试 findEventById 正常输入:查找已存在的事件
*/
TEST_F(CmsEngineTest, testFindEventByIdExisting) {
EventRecord evt = createValidEvent("EVT-100", 100);
engine.ingestEvent(evt);
const EventRecord* found = engine.findEventById("EVT-100");
ASSERT_NE(found, nullptr);
EXPECT_EQ(found->id, "EVT-100");
EXPECT_EQ(found->priority, 100);
EXPECT_EQ(found->status, EventStatus::Pending);
}
/**
* @brief 测试 findEventById 边界值:查找空字符串 ID
*/
TEST_F(CmsEngineTest, testFindEventByIdEmptyString) {
// 添加一个空 ID 的事件(虽然 ingestEvent 会拒绝,但直接测试 findEventById
const EventRecord* found = engine.findEventById("");
EXPECT_EQ(found, nullptr);
}
/**
* @brief 测试 findEventById 异常输入:查找不存在的事件
*/
TEST_F(CmsEngineTest, testFindEventByIdNonExistent) {
EventRecord evt = createValidEvent("EVT-200", 100);
engine.ingestEvent(evt);
const EventRecord* found = engine.findEventById("EVT-999");
EXPECT_EQ(found, nullptr);
}
/**
* @brief 测试 findEventById 特殊场景:查找长 ID 字符串
*/
TEST_F(CmsEngineTest, testFindEventByIdLongId) {
std::string longId = "EVT-" + std::string(100, 'A');
EventRecord evt = createValidEvent(longId, 100);
engine.ingestEvent(evt);
const EventRecord* found = engine.findEventById(longId);
ASSERT_NE(found, nullptr);
EXPECT_EQ(found->id, longId);
}
/**
* @brief 测试 findEventById 特殊场景:多个事件中查找特定 ID
*/
TEST_F(CmsEngineTest, testFindEventByIdAmongMultiple) {
std::vector<EventRecord> events = {
createValidEvent("EVT-300", 100),
createValidEvent("EVT-301", 200),
createValidEvent("EVT-302", 150)
};
addEventsToEngine(events);
// 查找中间的事件
const EventRecord* found = engine.findEventById("EVT-301");
ASSERT_NE(found, nullptr);
EXPECT_EQ(found->id, "EVT-301");
EXPECT_EQ(found->priority, 200);
// 查找第一个事件
found = engine.findEventById("EVT-300");
ASSERT_NE(found, nullptr);
EXPECT_EQ(found->id, "EVT-300");
// 查找最后一个事件
found = engine.findEventById("EVT-302");
ASSERT_NE(found, nullptr);
EXPECT_EQ(found->id, "EVT-302");
}
/**
* @brief 测试 findEventById 特殊场景:查找已处理事件的状态
*/
TEST_F(CmsEngineTest, testFindEventByIdAfterProcessing) {
EventRecord evt = createValidEvent("EVT-400", 100);
engine.ingestEvent(evt);
// 处理事件
engine.processPendingEvents();
// 查找事件并验证状态已更新
const EventRecord* found = engine.findEventById("EVT-400");
ASSERT_NE(found, nullptr);
EXPECT_EQ(found->status, EventStatus::Generated);
}