CppGenerate/tests/test_alert_manager.cpp

179 lines
6.2 KiB
C++
Raw Normal View History

2026-04-20 03:19:33 +00:00
#include "gtest/gtest.h"
#include "alert_manager.hpp"
#include <vector>
#include <string>
2026-04-30 02:45:55 +00:00
using namespace std;
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
// Mock time function for deterministic testing
uint32_t mock_timestamp = 1640995200; // 2022-01-01 00:00:00 UTC
// Mock the time function to return a fixed value
uint32_t getMockTimestamp() {
return mock_timestamp;
}
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
// Override the global time function in AlertManager
namespace {
uint32_t (*original_time_func)() = nullptr;
uint32_t mock_time_func() { return mock_timestamp; }
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:45:55 +00:00
// Test fixture for AlertManager
2026-04-20 03:19:33 +00:00
class AlertManagerTest : public ::testing::Test {
protected:
2026-04-30 02:45:55 +00:00
AlertManager alert_manager;
2026-04-20 03:19:33 +00:00
void SetUp() override {
2026-04-30 02:45:55 +00:00
// Reset timestamp
2026-04-20 03:19:33 +00:00
mock_timestamp = 1640995200;
2026-04-30 02:45:55 +00:00
// Initialize with default thresholds
alert_manager.initialize();
2026-04-20 03:19:33 +00:00
}
void TearDown() override {
2026-04-30 02:45:55 +00:00
// Clean up
alert_manager.resetAllAlerts();
2026-04-20 03:19:33 +00:00
}
};
2026-04-30 02:45:55 +00:00
// Test case: 正常输入测试 - 设置合法的上下限阈值
TEST_F(AlertManagerTest, testSetAltitudeThresholdsNormalInput) {
const float upper = 200.0f;
const float lower = -100.0f;
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
alert_manager.setAltitudeThresholds(upper, lower);
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), upper);
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), lower);
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
// Verify that active alerts are reset
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_TRUE(active_alerts.empty());
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:45:55 +00:00
// Test case: 边界值测试 - 上限等于下限(非法输入)
TEST_F(AlertManagerTest, testSetAltitudeThresholdsBoundaryEqual) {
const float upper = 100.0f;
const float lower = 100.0f;
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
// Capture stderr output
testing::internal::CaptureStderr();
alert_manager.setAltitudeThresholds(upper, lower);
string stderr_output = testing::internal::GetCapturedStderr();
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
EXPECT_NE(stderr_output.find("错误:上限阈值必须大于下限阈值"), string::npos);
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 100.0f); // Should not change
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -50.0f); // Default value
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:45:55 +00:00
// Test case: 异常输入测试 - 上限小于下限(非法输入)
TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalidInput) {
const float upper = 50.0f;
const float lower = 100.0f;
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
// Capture stderr output
testing::internal::CaptureStderr();
alert_manager.setAltitudeThresholds(upper, lower);
string stderr_output = testing::internal::GetCapturedStderr();
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
EXPECT_NE(stderr_output.find("错误:上限阈值必须大于下限阈值"), string::npos);
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 100.0f); // Should remain unchanged
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -50.0f);
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:45:55 +00:00
// Test case: 特殊场景测试 - 阈值更新后,高度越界触发预警
TEST_F(AlertManagerTest, testSetAltitudeThresholdsAndTriggerAlert) {
const float upper = 150.0f;
const float lower = -80.0f;
const float altitude = 160.0f; // Exceeds upper threshold
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
alert_manager.setAltitudeThresholds(upper, lower);
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
// Simulate check
mock_timestamp += 100;
alert_manager.checkAltitudeAlert(altitude, mock_timestamp);
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_UPPER);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
EXPECT_EQ(active_alerts[0].trigger_time, mock_timestamp);
EXPECT_TRUE(active_alerts[0].description.find("超过上限阈值") != string::npos);
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:45:55 +00:00
// Test case: 正常输入测试 - 获取活动预警信息
TEST_F(AlertManagerTest, testGetActiveAlertsNormalInput) {
const float upper = 100.0f;
const float lower = -50.0f;
const float altitude = 120.0f; // Above upper threshold
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
alert_manager.setAltitudeThresholds(upper, lower);
mock_timestamp += 100;
alert_manager.checkAltitudeAlert(altitude, mock_timestamp);
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
auto active_alerts = alert_manager.getActiveAlerts();
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_UPPER);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
EXPECT_EQ(active_alerts[0].trigger_time, mock_timestamp);
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:45:55 +00:00
// Test case: 边界值测试 - 无活动预警时获取空列表
TEST_F(AlertManagerTest, testGetActiveAlertsNoActiveAlerts) {
auto active_alerts = alert_manager.getActiveAlerts();
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
EXPECT_TRUE(active_alerts.empty());
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:45:55 +00:00
// Test case: 特殊场景测试 - 多个预警同时存在
TEST_F(AlertManagerTest, testGetActiveAlertsMultipleAlerts) {
const float upper = 100.0f;
const float lower = -50.0f;
const float altitude_high = 120.0f; // Above upper
const float altitude_low = -70.0f; // Below lower
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
alert_manager.setAltitudeThresholds(upper, lower);
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
mock_timestamp += 100;
alert_manager.checkAltitudeAlert(altitude_high, mock_timestamp);
mock_timestamp += 100;
alert_manager.checkAltitudeAlert(altitude_low, mock_timestamp);
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
auto active_alerts = alert_manager.getActiveAlerts();
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
EXPECT_EQ(active_alerts.size(), 2);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_UPPER);
EXPECT_EQ(active_alerts[1].type, AlertType::ALTITUDE_LOWER);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
EXPECT_EQ(active_alerts[1].status, AlertStatus::ACTIVE);
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:45:55 +00:00
// Test case: 异常输入测试 - 空值处理(虽然函数无参数,但验证状态)
TEST_F(AlertManagerTest, testGetActiveAlertsEmptyState) {
// Ensure no prior state
alert_manager.resetAllAlerts();
auto active_alerts = alert_manager.getActiveAlerts();
2026-04-20 03:19:33 +00:00
2026-04-30 02:45:55 +00:00
EXPECT_TRUE(active_alerts.empty());
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:45:55 +00:00
// Test case: 特殊场景测试 - 预警解除后不再返回
TEST_F(AlertManagerTest, testGetActiveAlertsAfterResolution) {
const float upper = 100.0f;
const float lower = -50.0f;
const float altitude = 120.0f;
alert_manager.setAltitudeThresholds(upper, lower);
mock_timestamp += 100;
alert_manager.checkAltitudeAlert(altitude, mock_timestamp);
// Now simulate normal altitude
mock_timestamp += 100;
alert_manager.checkAltitudeAlert(90.0f, mock_timestamp);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_TRUE(active_alerts.empty());
2026-04-20 03:19:33 +00:00
}