CppGenerate/tests/test_alert_manager.cpp

510 lines
15 KiB
C++
Raw 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>
using namespace std;
// Mock time function for deterministic testing
uint32_t mock_timestamp = 1000;
uint32_t getMockTimestamp() { return mock_timestamp; }
// Override the real time function with mock
uint32_t getCurrentTime() { return getMockTimestamp(); }
// Test fixture for AlertManager
class AlertManagerTest : public ::testing::Test {
protected:
AlertManager alert_manager;
void SetUp() override {
// Reset mock timestamp
mock_timestamp = 1000;
alert_manager.initialize();
}
void advanceTime(uint32_t seconds) {
mock_timestamp += seconds;
}
};
// Test checkAltitudeAlert - Normal Input
TEST_F(AlertManagerTest, testCheckAltitudeAlertNormalInput) {
// Arrange
float altitude = 90.0f; // Below upper threshold
// Act
alert_manager.checkAltitudeAlert(altitude, getMockTimestamp());
// Assert
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test checkAltitudeAlert - Upper Threshold Exceeded
TEST_F(AlertManagerTest, testCheckAltitudeAlertUpperThresholdExceeded) {
// Arrange
float altitude = 105.0f; // Above upper threshold
// Act
alert_manager.checkAltitudeAlert(altitude, getMockTimestamp());
// Assert
EXPECT_TRUE(alert_manager.hasActiveAlerts());
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);
}
// Test checkAltitudeAlert - Lower Threshold Exceeded
TEST_F(AlertManagerTest, testCheckAltitudeAlertLowerThresholdExceeded) {
// Arrange
float altitude = -60.0f; // Below lower threshold
// Act
alert_manager.checkAltitudeAlert(altitude, getMockTimestamp());
// Assert
EXPECT_TRUE(alert_manager.hasActiveAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_LOWER);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
}
// Test checkAltitudeAlert - Recovery from Upper Threshold
TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoveryFromUpper) {
// Arrange
float altitude_high = 105.0f;
float altitude_low = 90.0f;
// Act
alert_manager.checkAltitudeAlert(altitude_high, getMockTimestamp());
alert_manager.checkAltitudeAlert(altitude_low, getMockTimestamp());
// Assert
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test checkAltitudeAlert - Recovery from Lower Threshold
TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoveryFromLower) {
// Arrange
float altitude_low = -60.0f;
float altitude_high = -40.0f;
// Act
alert_manager.checkAltitudeAlert(altitude_low, getMockTimestamp());
alert_manager.checkAltitudeAlert(altitude_high, getMockTimestamp());
// Assert
EXPECT_FALSE(alert_manager.hasActiveAlerts());
}
// Test setAltitudeThresholds - Valid Thresholds
TEST_F(AlertManagerTest, testSetAltitudeThresholdsValidThresholds) {
// Arrange
float upper = 150.0f;
float lower = -100.0f;
// Act
alert_manager.setAltitudeThresholds(upper, lower);
// Assert
EXPECT_EQ(alert_manager.getAltitudeThresholds().first, upper);
EXPECT_EQ(alert_manager.getAltitudeThresholds().second, lower);
}
// Test setAltitudeThresholds - Invalid Thresholds (upper <= lower)
TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalidThresholds) {
// Arrange
float upper = 100.0f;
float lower = 100.0f;
// Act & Assert
EXPECT_NO_THROW(alert_manager.setAltitudeThresholds(upper, lower));
// Error message should be printed but not throw exception
}
// Test triggerSensorFailure - Normal Operation
TEST_F(AlertManagerTest, testTriggerSensorFailureNormalOperation) {
// Arrange
uint32_t timestamp = getMockTimestamp();
// Act
alert_manager.triggerSensorFailure(timestamp);
// Assert
EXPECT_TRUE(alert_manager.hasActiveAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::SENSOR_FAILURE);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
}
// Test triggerLowBattery - Normal Operation
TEST_F(AlertManagerTest, testTriggerLowBatteryNormalOperation) {
// Arrange
uint32_t timestamp = getMockTimestamp();
float battery_level = 15.0f;
// Act
alert_manager.triggerLowBattery(timestamp, battery_level);
// Assert
EXPECT_TRUE(alert_manager.hasActiveAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::LOW_BATTERY);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
EXPECT_NE(active_alerts[0].description.find("低电量警告"), string::npos);
}
// Test triggerCommunicationError - Normal Operation
TEST_F(AlertManagerTest, testTriggerCommunicationErrorNormalOperation) {
// Arrange
uint32_t timestamp = getMockTimestamp();
// Act
alert_manager.triggerCommunicationError(timestamp);
// Assert
EXPECT_TRUE(alert_manager.hasActiveAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::COMMUNICATION_ERROR);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
}
// Test acknowledgeAllAlerts - Acknowledge All Active Alerts
TEST_F(AlertManagerTest, testAcknowledgeAllAlertsAcknowledgeAllActive) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
alert_manager.triggerLowBattery(getMockTimestamp(), 10.0f);
// Act
alert_manager.acknowledgeAllAlerts(getMockTimestamp());
// Assert
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 2);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACKNOWLEDGED);
EXPECT_EQ(active_alerts[1].status, AlertStatus::ACKNOWLEDGED);
}
// Test acknowledgeAlert - Acknowledge Specific Alert
TEST_F(AlertManagerTest, testAcknowledgeAlertAcknowledgeSpecific) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
// Act
alert_manager.acknowledgeAlert(AlertType::SENSOR_FAILURE, getMockTimestamp());
// Assert
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACKNOWLEDGED);
}
// Test acknowledgeAlert - Non-Existing Alert
TEST_F(AlertManagerTest, testAcknowledgeAlertNonExistingAlert) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
// Act
alert_manager.acknowledgeAlert(AlertType::COMMUNICATION_ERROR, getMockTimestamp());
// Assert
EXPECT_TRUE(alert_manager.hasActiveAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
}
// Test resetAlert - Reset Existing Alert
TEST_F(AlertManagerTest, testResetAlertResetExisting) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
// Act
alert_manager.resetAlert(AlertType::SENSOR_FAILURE);
// Assert
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
}
// Test resetAlert - Reset Non-Existing Alert
TEST_F(AlertManagerTest, testResetAlertResetNonExisting) {
// Arrange
// Act
alert_manager.resetAlert(AlertType::COMMUNICATION_ERROR);
// Assert
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
}
// Test resetAllAlerts - Reset All Alerts
TEST_F(AlertManagerTest, testResetAllAlertsResetAll) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
alert_manager.triggerLowBattery(getMockTimestamp(), 10.0f);
// Act
alert_manager.resetAllAlerts();
// Assert
EXPECT_FALSE(alert_manager.hasActiveAlerts());
EXPECT_FALSE(alert_manager.hasUnacknowledgedAlerts());
}
// Test hasActiveAlerts - No Active Alerts
TEST_F(AlertManagerTest, testHasActiveAlertsNoActiveAlerts) {
// Arrange
// Act
bool result = alert_manager.hasActiveAlerts();
// Assert
EXPECT_FALSE(result);
}
// Test hasActiveAlerts - With Active Alerts
TEST_F(AlertManagerTest, testHasActiveAlertsWithActiveAlerts) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
// Act
bool result = alert_manager.hasActiveAlerts();
// Assert
EXPECT_TRUE(result);
}
// Test hasUnacknowledgedAlerts - No Unacknowledged Alerts
TEST_F(AlertManagerTest, testHasUnacknowledgedAlertsNoUnacknowledgedAlerts) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
alert_manager.acknowledgeAllAlerts(getMockTimestamp());
// Act
bool result = alert_manager.hasUnacknowledgedAlerts();
// Assert
EXPECT_FALSE(result);
}
// Test hasUnacknowledgedAlerts - With Unacknowledged Alerts
TEST_F(AlertManagerTest, testHasUnacknowledgedAlertsWithUnacknowledgedAlerts) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
// Act
bool result = alert_manager.hasUnacknowledgedAlerts();
// Assert
EXPECT_TRUE(result);
}
// Test getActiveAlerts - Empty List
TEST_F(AlertManagerTest, testGetActiveAlertsEmptyList) {
// Arrange
// Act
vector<AlertInfo> result = alert_manager.getActiveAlerts();
// Assert
EXPECT_EQ(result.size(), 0);
}
// Test getActiveAlerts - With Active Alerts
TEST_F(AlertManagerTest, testGetActiveAlertsWithActiveAlerts) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
// Act
vector<AlertInfo> result = alert_manager.getActiveAlerts();
// Assert
EXPECT_EQ(result.size(), 1);
EXPECT_EQ(result[0].type, AlertType::SENSOR_FAILURE);
EXPECT_EQ(result[0].status, AlertStatus::ACTIVE);
}
// Test getAlertHistory - Max Count Greater Than History Size
TEST_F(AlertManagerTest, testGetAlertHistoryMaxCountGreaterThanHistorySize) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
alert_manager.triggerLowBattery(getMockTimestamp(), 10.0f);
// Act
vector<AlertInfo> result = alert_manager.getAlertHistory(5);
// Assert
EXPECT_EQ(result.size(), 2);
}
// Test getAlertHistory - Max Count Less Than History Size
TEST_F(AlertManagerTest, testGetAlertHistoryMaxCountLessThanHistorySize) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
alert_manager.triggerLowBattery(getMockTimestamp(), 10.0f);
alert_manager.triggerCommunicationError(getMockTimestamp());
// Act
vector<AlertInfo> result = alert_manager.getAlertHistory(2);
// Assert
EXPECT_EQ(result.size(), 2);
EXPECT_EQ(result[0].type, AlertType::COMMUNICATION_ERROR);
EXPECT_EQ(result[1].type, AlertType::LOW_BATTERY);
}
// Test getStatusDescription - No Active Alerts
TEST_F(AlertManagerTest, testGetStatusDescriptionNoActiveAlerts) {
// Arrange
// Act
string result = alert_manager.getStatusDescription();
// Assert
EXPECT_EQ(result, "系统状态:正常");
}
// Test getStatusDescription - With Active Alerts
TEST_F(AlertManagerTest, testGetStatusDescriptionWithActiveAlerts) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
// Act
string result = alert_manager.getStatusDescription();
// Assert
EXPECT_NE(result.find("系统状态有1个活动预警"), string::npos);
EXPECT_NE(result.find("传感器故障"), string::npos);
}
// Test clearHistory - Clear All History
TEST_F(AlertManagerTest, testClearHistoryClearAll) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
alert_manager.triggerLowBattery(getMockTimestamp(), 10.0f);
// Act
alert_manager.clearHistory();
// Assert
EXPECT_EQ(alert_manager.getAlertHistory(10).size(), 0);
}
// Test addToHistory - Add to History
TEST_F(AlertManagerTest, testAddToHistoryAddToHistory) {
// Arrange
AlertInfo alert;
alert.type = AlertType::SENSOR_FAILURE;
alert.status = AlertStatus::ACTIVE;
alert.trigger_time = getMockTimestamp();
alert.description = "Test alert";
// Act
alert_manager.addToHistory(alert);
// Assert
EXPECT_EQ(alert_manager.getAlertHistory(1).size(), 1);
}
// Test triggerAlert - Trigger New Alert
TEST_F(AlertManagerTest, testTriggerAlertTriggerNewAlert) {
// Arrange
uint32_t timestamp = getMockTimestamp();
string description = "Test trigger";
// Act
alert_manager.triggerAlert(AlertType::SENSOR_FAILURE, timestamp, description);
// Assert
EXPECT_TRUE(alert_manager.hasActiveAlerts());
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::SENSOR_FAILURE);
EXPECT_EQ(active_alerts[0].description, description);
}
// Test updateAlertStatus - Update to Acknowledged
TEST_F(AlertManagerTest, testUpdateAlertStatusUpdateToAcknowledged) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
// Act
alert_manager.updateAlertStatus(AlertType::SENSOR_FAILURE, AlertStatus::ACKNOWLEDGED, getMockTimestamp());
// Assert
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACKNOWLEDGED);
}
// Test updateAlertStatus - Update to Resolved
TEST_F(AlertManagerTest, testUpdateAlertStatusUpdateToResolved) {
// Arrange
alert_manager.triggerSensorFailure(getMockTimestamp());
// Act
alert_manager.updateAlertStatus(AlertType::SENSOR_FAILURE, AlertStatus::RESOLVED, getMockTimestamp());
// Assert
auto active_alerts = alert_manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].status, AlertStatus::RESOLVED);
}
// Test getAlertTypeName - Valid Type
TEST_F(AlertManagerTest, testGetAlertTypeNameValidType) {
// Arrange
AlertType type = AlertType::ALTITUDE_UPPER;
// Act
string result = alert_manager.getAlertTypeName(type);
// Assert
EXPECT_EQ(result, "高度上限预警");
}
// Test getAlertTypeName - Unknown Type
TEST_F(AlertManagerTest, testGetAlertTypeNameUnknownType) {
// Arrange
AlertType type = static_cast<AlertType>(999);
// Act
string result = alert_manager.getAlertTypeName(type);
// Assert
EXPECT_EQ(result, "未知预警");
}
// Test getAlertStatusName - Valid Status
TEST_F(AlertManagerTest, testGetAlertStatusNameValidStatus) {
// Arrange
AlertStatus status = AlertStatus::ACTIVE;
// Act
string result = alert_manager.getAlertStatusName(status);
// Assert
EXPECT_EQ(result, "预警中");
}
// Test getAlertStatusName - Unknown Status
TEST_F(AlertManagerTest, testGetAlertStatusNameUnknownStatus) {
// Arrange
AlertStatus status = static_cast<AlertStatus>(999);
// Act
string result = alert_manager.getAlertStatusName(status);
// Assert
EXPECT_EQ(result, "未知状态");
}