plan_execute_t1/tests/test_app.cpp

271 lines
7.8 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"
// ============================================================================
// CmsEngine 测试夹具
// ============================================================================
class CmsEngineTest : public ::testing::Test {
protected:
void SetUp() override {
// 每个测试用例开始前创建一个新的 CmsEngine 实例
engine = new CmsEngine();
}
void TearDown() override {
delete engine;
}
CmsEngine* engine;
};
// ============================================================================
// ingestEvent 函数测试
// ============================================================================
/**
* @brief 测试 ingestEvent 正常输入场景
*
* 验证一个有效的事件(非空 ID优先级 <= 255能够成功接入。
*/
TEST_F(CmsEngineTest, testIngestEventNormal) {
EventRecord event;
event.id = "EVT-001";
event.priority = 100;
event.status = EventStatus::Pending;
bool result = engine->ingestEvent(event);
EXPECT_TRUE(result);
}
/**
* @brief 测试 ingestEvent 空 ID 场景
*
* 验证 ID 为空时,接入失败并返回 false。
*/
TEST_F(CmsEngineTest, testIngestEventEmptyId) {
EventRecord event;
event.id = "";
event.priority = 100;
event.status = EventStatus::Pending;
bool result = engine->ingestEvent(event);
EXPECT_FALSE(result);
}
/**
* @brief 测试 ingestEvent 优先级边界值场景
*
* 验证优先级为 0最小值和 255最大值时都能成功接入。
*/
TEST_F(CmsEngineTest, testIngestEventPriorityBoundary) {
// 优先级为 0最小值
EventRecord event1;
event1.id = "EVT-002";
event1.priority = 0;
event1.status = EventStatus::Pending;
EXPECT_TRUE(engine->ingestEvent(event1));
// 优先级为 255最大值
EventRecord event2;
event2.id = "EVT-003";
event2.priority = 255;
event2.status = EventStatus::Pending;
EXPECT_TRUE(engine->ingestEvent(event2));
}
/**
* @brief 测试 ingestEvent 优先级越界场景
*
* 验证优先级 > 255 时,接入失败并返回 false。
*/
TEST_F(CmsEngineTest, testIngestEventPriorityOverflow) {
EventRecord event;
event.id = "EVT-004";
event.priority = 256; // 超过最大值
event.status = EventStatus::Pending;
bool result = engine->ingestEvent(event);
EXPECT_FALSE(result);
}
/**
* @brief 测试 ingestEvent 多次接入场景
*
* 验证多个有效事件可以连续接入。
*/
TEST_F(CmsEngineTest, testIngestEventMultipleEvents) {
EventRecord event1;
event1.id = "EVT-005";
event1.priority = 50;
event1.status = EventStatus::Pending;
EXPECT_TRUE(engine->ingestEvent(event1));
EventRecord event2;
event2.id = "EVT-006";
event2.priority = 150;
event2.status = EventStatus::Pending;
EXPECT_TRUE(engine->ingestEvent(event2));
EventRecord event3;
event3.id = "EVT-007";
event3.priority = 200;
event3.status = EventStatus::Pending;
EXPECT_TRUE(engine->ingestEvent(event3));
}
// ============================================================================
// processPendingEvents 函数测试
// ============================================================================
/**
* @brief 测试 processPendingEvents 正常处理场景
*
* 验证接入一个 Pending 状态的事件后processPendingEvents 能正确处理并返回 1。
*/
TEST_F(CmsEngineTest, testProcessPendingEventsNormal) {
EventRecord event;
event.id = "EVT-010";
event.priority = 100;
event.status = EventStatus::Pending;
engine->ingestEvent(event);
size_t count = engine->processPendingEvents();
EXPECT_EQ(count, 1);
}
/**
* @brief 测试 processPendingEvents 无待处理事件场景
*
* 验证当没有 Pending 状态的事件时,返回 0。
*/
TEST_F(CmsEngineTest, testProcessPendingEventsNoPending) {
// 接入一个非 Pending 状态的事件
EventRecord event;
event.id = "EVT-011";
event.priority = 100;
event.status = EventStatus::Generated; // 非 Pending
engine->ingestEvent(event);
size_t count = engine->processPendingEvents();
EXPECT_EQ(count, 0);
}
/**
* @brief 测试 processPendingEvents 多个待处理事件场景
*
* 验证多个 Pending 事件都能被正确处理。
*/
TEST_F(CmsEngineTest, testProcessPendingEventsMultiple) {
// 接入三个 Pending 事件
for (int i = 0; i < 3; ++i) {
EventRecord event;
event.id = "EVT-" + std::to_string(100 + i);
event.priority = 100;
event.status = EventStatus::Pending;
engine->ingestEvent(event);
}
size_t count = engine->processPendingEvents();
EXPECT_EQ(count, 3);
}
/**
* @brief 测试 processPendingEvents 混合状态事件场景
*
* 验证只有 Pending 状态的事件被处理,其他状态的事件被忽略。
*/
TEST_F(CmsEngineTest, testProcessPendingEventsMixedStatus) {
// 接入一个 Pending 事件
EventRecord pendingEvent;
pendingEvent.id = "EVT-020";
pendingEvent.priority = 100;
pendingEvent.status = EventStatus::Pending;
engine->ingestEvent(pendingEvent);
// 接入一个非 Pending 事件
EventRecord nonPendingEvent;
nonPendingEvent.id = "EVT-021";
nonPendingEvent.priority = 100;
nonPendingEvent.status = EventStatus::Generated;
engine->ingestEvent(nonPendingEvent);
size_t count = engine->processPendingEvents();
EXPECT_EQ(count, 1); // 只处理了 Pending 事件
}
/**
* @brief 测试 processPendingEvents 事件状态变更场景
*
* 验证处理完成后,事件状态从 Pending 变为 Generated。
*/
TEST_F(CmsEngineTest, testProcessPendingEventsStatusChange) {
EventRecord event;
event.id = "EVT-030";
event.priority = 100;
event.status = EventStatus::Pending;
engine->ingestEvent(event);
engine->processPendingEvents();
// 通过 findEventById 验证状态变更
const EventRecord* processedEvent = engine->findEventById("EVT-030");
ASSERT_NE(processedEvent, nullptr);
EXPECT_EQ(processedEvent->status, EventStatus::Generated);
}
/**
* @brief 测试 processPendingEvents 生成任务计划场景
*
* 验证处理 Pending 事件后,会生成对应的 TaskPlan。
*/
TEST_F(CmsEngineTest, testProcessPendingEventsGeneratesPlan) {
EventRecord event;
event.id = "EVT-040";
event.priority = 100;
event.status = EventStatus::Pending;
engine->ingestEvent(event);
engine->processPendingEvents();
// 验证生成了对应的 TaskPlan
const auto& plans = engine->getAllPlans();
ASSERT_EQ(plans.size(), 1);
EXPECT_EQ(plans[0].relatedEventId, "EVT-040");
EXPECT_EQ(plans[0].name, "AutoPlan-EVT-040");
EXPECT_EQ(plans[0].type, PlanType::Centralized);
EXPECT_EQ(plans[0].status, PlanStatus::Drafting);
EXPECT_EQ(plans[0].resourceQuota, 0.5);
EXPECT_EQ(plans[0].constraints, "自动生成约束");
}
/**
* @brief 测试 processPendingEvents 多次调用场景
*
* 验证多次调用 processPendingEvents 时,只有新接入的 Pending 事件被处理。
*/
TEST_F(CmsEngineTest, testProcessPendingEventsMultipleCalls) {
// 第一次调用:处理一个 Pending 事件
EventRecord event1;
event1.id = "EVT-050";
event1.priority = 100;
event1.status = EventStatus::Pending;
engine->ingestEvent(event1);
EXPECT_EQ(engine->processPendingEvents(), 1);
// 第二次调用:没有新的 Pending 事件
EXPECT_EQ(engine->processPendingEvents(), 0);
// 接入一个新的 Pending 事件
EventRecord event2;
event2.id = "EVT-051";
event2.priority = 100;
event2.status = EventStatus::Pending;
engine->ingestEvent(event2);
// 第三次调用:处理新接入的 Pending 事件
EXPECT_EQ(engine->processPendingEvents(), 1);
}