CppGenerate/tests/test_alert_manager.cpp

237 lines
9.1 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 "alert_manager.hpp"
#include <vector>
#include <string>
// Mock time function for deterministic testing
uint32_t mock_timestamp = 1000;
uint32_t get_mock_timestamp() { return mock_timestamp; }
// Override the real time function with mock
extern "C" uint32_t std_time(nullptr) { return mock_timestamp; }
// Test fixture for AlertManager
class AlertManagerTest : public ::testing::Test {
protected:
AlertManager alert_manager;
void SetUp() override {
// Reset state before each test
alert_manager.resetAllAlerts();
mock_timestamp = 1000;
}
void advance_time(uint32_t seconds) {
mock_timestamp += seconds;
}
};
// Test case: 正常输入测试 - checkAltitudeAlert 高度正常时无预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertNormalOperation) {
alert_manager.setAltitudeThresholds(150.0f, -100.0f);
alert_manager.checkAltitudeAlert(100.0f, get_mock_timestamp());
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: 边界值测试 - checkAltitudeAlert 上限阈值刚好触发预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertUpperThresholdEdge) {
alert_manager.setAltitudeThresholds(100.0f, -50.0f);
alert_manager.checkAltitudeAlert(100.0f, get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasActiveAlerts());
auto alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(alerts.size(), 1);
EXPECT_EQ(alerts[0].type, AlertType::ALTITUDE_UPPER);
}
// Test case: 异常输入测试 - checkAltitudeAlert 下限阈值非法输入
TEST_F(AlertManagerTest, testCheckAltitudeAlertLowerThresholdInvalid) {
alert_manager.setAltitudeThresholds(100.0f, 150.0f); // Invalid: upper <= lower
alert_manager.checkAltitudeAlert(-200.0f, get_mock_timestamp());
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: 特殊场景测试 - checkAltitudeAlert 高度从超限恢复到正常
TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoveryFromUpperLimit) {
alert_manager.setAltitudeThresholds(100.0f, -50.0f);
alert_manager.checkAltitudeAlert(150.0f, get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasActiveAlerts());
alert_manager.checkAltitudeAlert(80.0f, get_mock_timestamp());
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: 正常输入测试 - setAltitudeThresholds 设置合法阈值
TEST_F(AlertManagerTest, testSetAltitudeThresholdsValid) {
alert_manager.setAltitudeThresholds(200.0f, -100.0f);
EXPECT_FLOAT_EQ(alert_manager.getAltitudeThresholds().first, 200.0f);
EXPECT_FLOAT_EQ(alert_manager.getAltitudeThresholds().second, -100.0f);
}
// Test case: 异常输入测试 - setAltitudeThresholds 设置非法阈值upper <= lower
TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalid) {
alert_manager.setAltitudeThresholds(100.0f, 100.0f);
EXPECT_FLOAT_EQ(alert_manager.getAltitudeThresholds().first, 100.0f);
EXPECT_FLOAT_EQ(alert_manager.getAltitudeThresholds().second, -50.0f);
}
// Test case: 正常输入测试 - triggerSensorFailure 触发传感器故障预警
TEST_F(AlertManagerTest, testTriggerSensorFailure) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasActiveAlerts());
auto alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(alerts.size(), 1);
EXPECT_EQ(alerts[0].type, AlertType::SENSOR_FAILURE);
}
// Test case: 正常输入测试 - triggerLowBattery 触发低电量预警
TEST_F(AlertManagerTest, testTriggerLowBattery) {
alert_manager.triggerLowBattery(get_mock_timestamp(), 15.5f);
EXPECT_TRUE(alert_manager.hasActiveAlerts());
auto alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(alerts.size(), 1);
EXPECT_EQ(alerts[0].type, AlertType::LOW_BATTERY);
EXPECT_TRUE(alerts[0].description.find("15.5") != std::string::npos);
}
// Test case: 正常输入测试 - triggerCommunicationError 触发通信错误预警
TEST_F(AlertManagerTest, testTriggerCommunicationError) {
alert_manager.triggerCommunicationError(get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasActiveAlerts());
auto alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(alerts.size(), 1);
EXPECT_EQ(alerts[0].type, AlertType::COMMUNICATION_ERROR);
}
// Test case: 正常输入测试 - acknowledgeAllAlerts 确认所有预警
TEST_F(AlertManagerTest, testAcknowledgeAllAlerts) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.triggerLowBattery(get_mock_timestamp(), 10.0f);
alert_manager.acknowledgeAllAlerts(get_mock_timestamp());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
}
// Test case: 特殊场景测试 - acknowledgeAlert 确认不存在的预警类型
TEST_F(AlertManagerTest, testAcknowledgeAlertNonExistent) {
alert_manager.acknowledgeAlert(AlertType::CALIBRATION_ERROR, get_mock_timestamp());
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: 正常输入测试 - resetAlert 重置已激活的预警
TEST_F(AlertManagerTest, testResetAlertActive) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.resetAlert(AlertType::SENSOR_FAILURE);
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: 特殊场景测试 - resetAllAlerts 清除所有活动预警
TEST_F(AlertManagerTest, testResetAllAlerts) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.triggerLowBattery(get_mock_timestamp(), 5.0f);
alert_manager.resetAllAlerts();
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: 正常输入测试 - hasActiveAlerts 检查无活动预警
TEST_F(AlertManagerTest, testHasActiveAlertsNoAlerts) {
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test case: 正常输入测试 - hasUnacknowledgedAlerts 检查未确认预警
TEST_F(AlertManagerTest, testHasUnacknowledgedAlertsActive) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
EXPECT_TRUE(alert_manager.hasUnacknowledgedAlerts());
}
// Test case: 特殊场景测试 - getActiveAlerts 获取活动预警列表
TEST_F(AlertManagerTest, testGetActiveAlerts) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.triggerLowBattery(get_mock_timestamp(), 10.0f);
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 2);
EXPECT_EQ(active_alerts[0].type, AlertType::SENSOR_FAILURE);
EXPECT_EQ(active_alerts[1].type, AlertType::LOW_BATTERY);
}
// Test case: 边界值测试 - getAlertHistory 最大数量限制
TEST_F(AlertManagerTest, testGetAlertHistoryMaxCount) {
for (int i = 0; i < 10; ++i) {
alert_manager.triggerSensorFailure(get_mock_timestamp() + i);
}
auto history = alert_manager.getAlertHistory(5);
EXPECT_EQ(history.size(), 5);
}
// Test case: 特殊场景测试 - getStatusDescription 生成系统状态描述
TEST_F(AlertManagerTest, testGetStatusDescription) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.triggerLowBattery(get_mock_timestamp(), 10.0f);
std::string status_desc = alert_manager.getStatusDescription();
EXPECT_NE(status_desc.find("有2个活动预警"), std::string::npos);
EXPECT_NE(status_desc.find("传感器故障"), std::string::npos);
}
// Test case: 正常输入测试 - clearHistory 清空历史记录
TEST_F(AlertManagerTest, testClearHistory) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.clearHistory();
EXPECT_TRUE(alert_manager.getAlertHistory(1).empty());
}
// Test case: 特殊场景测试 - addToHistory 限制历史记录数量
TEST_F(AlertManagerTest, testAddToHistoryLimit) {
const size_t MAX_HISTORY = 5;
for (int i = 0; i < MAX_HISTORY + 1; ++i) {
alert_manager.triggerSensorFailure(get_mock_timestamp() + i);
}
auto history = alert_manager.getAlertHistory(MAX_HISTORY);
EXPECT_EQ(history.size(), MAX_HISTORY);
}
// Test case: 正常输入测试 - triggerAlert 触发自定义预警
TEST_F(AlertManagerTest, testTriggerAlertCustom) {
alert_manager.triggerAlert(AlertType::ALTITUDE_UPPER, get_mock_timestamp(), "Custom alert");
EXPECT_TRUE(alert_manager.hasActiveAlerts());
auto alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(alerts[0].description, "Custom alert");
}
// Test case: 特殊场景测试 - updateAlertStatus 更新状态为已解决
TEST_F(AlertManagerTest, testUpdateAlertStatusResolved) {
alert_manager.triggerSensorFailure(get_mock_timestamp());
alert_manager.updateAlertStatus(AlertType::SENSOR_FAILURE, AlertStatus::RESOLVED, get_mock_timestamp());
auto alerts = alert_manager.getActiveAlerts();
EXPECT_TRUE(alerts.empty());
}
// Test case: 正常输入测试 - getAlertTypeName 获取预警类型名称
TEST_F(AlertManagerTest, testGetAlertTypeName) {
EXPECT_EQ(alert_manager.getAlertTypeName(AlertType::ALTITUDE_UPPER), "高度上限预警");
EXPECT_EQ(alert_manager.getAlertTypeName(AlertType::NONE), "");
}
// Test case: 正常输入测试 - getAlertStatusName 获取状态名称
TEST_F(AlertManagerTest, testGetAlertStatusName) {
EXPECT_EQ(alert_manager.getAlertStatusName(AlertStatus::ACTIVE), "预警中");
EXPECT_EQ(alert_manager.getAlertStatusName(AlertStatus::INACTIVE), "未激活");
}