#include "gtest/gtest.h" #include "alert_manager.hpp" #include #include 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 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 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 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 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(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(999); // Act string result = alert_manager.getAlertStatusName(status); // Assert EXPECT_EQ(result, "未知状态"); }