CppGenerate/tests/test_alert_manager.cpp

145 lines
4.9 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:20:23 +00:00
// Mock time function for deterministic testing
uint32_t mock_timestamp = 1640995200; // Fixed timestamp for testing
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
// Override the time function to return a fixed value
uint32_t get_mock_time() {
return mock_timestamp;
}
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
// Replace the real time function with mock
extern "C" uint32_t std_time(nullptr) {
return get_mock_time();
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:20:23 +00:00
// Test fixture for AlertManager
2026-04-20 03:19:33 +00:00
class AlertManagerTest : public ::testing::Test {
protected:
2026-04-30 02:20:23 +00:00
AlertManager alert_manager;
2026-04-20 03:19:33 +00:00
void SetUp() override {
mock_timestamp = 1640995200;
2026-04-30 02:20:23 +00:00
alert_manager.initialize();
2026-04-20 03:19:33 +00:00
}
void TearDown() override {
2026-04-30 02:20:23 +00:00
alert_manager.resetAllAlerts();
2026-04-20 03:19:33 +00:00
}
};
2026-04-30 02:20:23 +00:00
// Test case: 正常输入测试 - 设置合法阈值
TEST_F(AlertManagerTest, testSetAltitudeThresholdsNormalInput) {
const float upper = 200.0f;
const float lower = 50.0f;
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
alert_manager.setAltitudeThresholds(upper, lower);
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +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:20:23 +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:20:23 +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:20:23 +00:00
// Capture stderr output
testing::internal::CaptureStderr();
alert_manager.setAltitudeThresholds(upper, lower);
std::string stderr_output = testing::internal::GetCapturedStderr();
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
EXPECT_NE(stderr_output.find("错误:上限阈值必须大于下限阈值。"), std::string::npos);
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 100.0f); // Should remain unchanged
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -50.0f); // Default value
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:20:23 +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:20:23 +00:00
// Capture stderr output
testing::internal::CaptureStderr();
alert_manager.setAltitudeThresholds(upper, lower);
std::string stderr_output = testing::internal::GetCapturedStderr();
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
EXPECT_NE(stderr_output.find("错误:上限阈值必须大于下限阈值。"), std::string::npos);
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 100.0f); // Should remain unchanged
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -50.0f); // Default value
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:20:23 +00:00
// Test case: 特殊场景测试 - 阈值更新后重置预警状态
TEST_F(AlertManagerTest, testSetAltitudeThresholdsResetAlerts) {
// Trigger an altitude upper alert
alert_manager.checkAltitudeAlert(150.0f, mock_timestamp);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_UPPER);
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
// Update thresholds
alert_manager.setAltitudeThresholds(180.0f, 50.0f);
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
// Check if alert was reset
active_alerts = alert_manager.getActiveAlerts();
EXPECT_TRUE(active_alerts.empty());
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:20:23 +00:00
// Test case: 正常输入测试 - 获取活动预警信息
TEST_F(AlertManagerTest, testGetActiveAlertsNormal) {
// Add a simulated active alert
AlertInfo alert;
alert.type = AlertType::ALTITUDE_UPPER;
alert.status = AlertStatus::ACTIVE;
alert.trigger_time = mock_timestamp;
alert.description = "High altitude";
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
alert_manager.alerts_[AlertType::ALTITUDE_UPPER] = alert;
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
auto result = alert_manager.getActiveAlerts();
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
EXPECT_EQ(result.size(), 1);
EXPECT_EQ(result[0].type, AlertType::ALTITUDE_UPPER);
EXPECT_EQ(result[0].status, AlertStatus::ACTIVE);
EXPECT_EQ(result[0].trigger_time, mock_timestamp);
EXPECT_EQ(result[0].description, "High altitude");
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:20:23 +00:00
// Test case: 边界值测试 - 无活动预警时获取结果为空
TEST_F(AlertManagerTest, testGetActiveAlertsEmpty) {
auto result = alert_manager.getActiveAlerts();
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
EXPECT_TRUE(result.empty());
2026-04-20 03:19:33 +00:00
}
2026-04-30 02:20:23 +00:00
// Test case: 特殊场景测试 - 多个活动预警同时存在
TEST_F(AlertManagerTest, testGetActiveAlertsMultipleAlerts) {
// Simulate two active alerts
AlertInfo upper_alert, lower_alert;
upper_alert.type = AlertType::ALTITUDE_UPPER;
upper_alert.status = AlertStatus::ACTIVE;
upper_alert.trigger_time = mock_timestamp;
upper_alert.description = "Above upper limit";
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
lower_alert.type = AlertType::ALTITUDE_LOWER;
lower_alert.status = AlertStatus::ACTIVE;
lower_alert.trigger_time = mock_timestamp + 1;
lower_alert.description = "Below lower limit";
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
alert_manager.alerts_[AlertType::ALTITUDE_UPPER] = upper_alert;
alert_manager.alerts_[AlertType::ALTITUDE_LOWER] = lower_alert;
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
auto result = alert_manager.getActiveAlerts();
2026-04-20 03:19:33 +00:00
2026-04-30 02:20:23 +00:00
EXPECT_EQ(result.size(), 2);
EXPECT_EQ(result[0].type, AlertType::ALTITUDE_UPPER);
EXPECT_EQ(result[1].type, AlertType::ALTITUDE_LOWER);
2026-04-20 03:19:33 +00:00
}