#include "gtest/gtest.h" #include "alert_manager.hpp" #include #include // Mock for time to ensure deterministic tests static uint32_t mock_timestamp = 1640995200; // 2022-01-01 00:00:00 UTC class MockTime { public: static uint32_t getTimestamp() { return mock_timestamp; } static void setTimestamp(uint32_t t) { mock_timestamp = t; } }; // Helper function to compare AlertInfo bool operator==(const AlertInfo& a, const AlertInfo& b) { return a.type == b.type && a.status == b.status && a.trigger_time == b.trigger_time && a.acknowledge_time == b.acknowledge_time && a.resolve_time == b.resolve_time && a.description == b.description; } // Test fixture class AlertManagerTest : public ::testing::Test { protected: AlertManager manager; void SetUp() override { mock_timestamp = 1640995200; manager.initialize(); } void TearDown() override { manager.clearHistory(); } }; TEST_F(AlertManagerTest, testAlertManagerDefaultInitialization) { EXPECT_FLOAT_EQ(manager.getAltitudeThresholds().first, 100.0f); EXPECT_FLOAT_EQ(manager.getAltitudeThresholds().second, -50.0f); EXPECT_TRUE(manager.getActiveAlerts().empty()); EXPECT_TRUE(manager.getAlertHistory(10).empty()); } TEST_F(AlertManagerTest, testInitialize) { // No direct output assertion, but verify initialization logic // This is tested implicitly via constructor EXPECT_NO_FATAL_FAILURE(manager.initialize()); } TEST_F(AlertManagerTest, testCheckAltitudeAlertNormal) { mock_timestamp = 1640995200; manager.checkAltitudeAlert(105.0f, mock_timestamp); auto alerts = manager.getActiveAlerts(); EXPECT_EQ(alerts.size(), 1); EXPECT_EQ(alerts[0].type, AlertType::ALTITUDE_UPPER); EXPECT_EQ(alerts[0].status, AlertStatus::ACTIVE); EXPECT_EQ(alerts[0].trigger_time, mock_timestamp); } TEST_F(AlertManagerTest, testCheckAltitudeAlertBelowLower) { mock_timestamp = 1640995200; manager.checkAltitudeAlert(-55.0f, mock_timestamp); auto alerts = manager.getActiveAlerts(); EXPECT_EQ(alerts.size(), 1); EXPECT_EQ(alerts[0].type, AlertType::ALTITUDE_LOWER); EXPECT_EQ(alerts[0].status, AlertStatus::ACTIVE); } TEST_F(AlertManagerTest, testCheckAltitudeAlertResetWhenNormal) { mock_timestamp = 1640995200; manager.checkAltitudeAlert(105.0f, mock_timestamp); // Trigger upper mock_timestamp = 1640995201; manager.checkAltitudeAlert(90.0f, mock_timestamp); // Reset auto alerts = manager.getActiveAlerts(); EXPECT_TRUE(alerts.empty()); } TEST_F(AlertManagerTest, testSetAltitudeThresholdsValid) { manager.setAltitudeThresholds(200.0f, -100.0f); auto thresholds = manager.getAltitudeThresholds(); EXPECT_FLOAT_EQ(thresholds.first, 200.0f); EXPECT_FLOAT_EQ(thresholds.second, -100.0f); } TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalid) { EXPECT_NO_FATAL_FAILURE(manager.setAltitudeThresholds(50.0f, 100.0f)); // Should print error, but no crash EXPECT_FLOAT_EQ(manager.getAltitudeThresholds().first, 100.0f); EXPECT_FLOAT_EQ(manager.getAltitudeThresholds().second, -50.0f); } TEST_F(AlertManagerTest, testTriggerSensorFailure) { mock_timestamp = 1640995200; manager.triggerSensorFailure(mock_timestamp); auto alerts = manager.getActiveAlerts(); EXPECT_EQ(alerts.size(), 1); EXPECT_EQ(alerts[0].type, AlertType::SENSOR_FAILURE); EXPECT_EQ(alerts[0].status, AlertStatus::ACTIVE); EXPECT_EQ(alerts[0].trigger_time, mock_timestamp); } TEST_F(AlertManagerTest, testTriggerLowBattery) { mock_timestamp = 1640995200; manager.triggerLowBattery(mock_timestamp, 15.0f); auto alerts = manager.getActiveAlerts(); EXPECT_EQ(alerts.size(), 1); EXPECT_EQ(alerts[0].type, AlertType::LOW_BATTERY); EXPECT_EQ(alerts[0].status, AlertStatus::ACTIVE); EXPECT_NE(alerts[0].description.find("15.0%"), std::string::npos); } TEST_F(AlertManagerTest, testTriggerCommunicationError) { mock_timestamp = 1640995200; manager.triggerCommunicationError(mock_timestamp); auto alerts = manager.getActiveAlerts(); EXPECT_EQ(alerts.size(), 1); EXPECT_EQ(alerts[0].type, AlertType::COMMUNICATION_ERROR); EXPECT_EQ(alerts[0].status, AlertStatus::ACTIVE); } TEST_F(AlertManagerTest, testAcknowledgeAllAlerts) { mock_timestamp = 1640995200; manager.triggerSensorFailure(mock_timestamp); manager.triggerLowBattery(mock_timestamp + 1, 10.0f); mock_timestamp = 1640995202; manager.acknowledgeAllAlerts(mock_timestamp); auto alerts = manager.getActiveAlerts(); EXPECT_TRUE(alerts.empty()); EXPECT_EQ(alerts.size(), 0); } TEST_F(AlertManagerTest, testAcknowledgeAlert) { mock_timestamp = 1640995200; manager.triggerSensorFailure(mock_timestamp); mock_timestamp = 1640995201; manager.acknowledgeAlert(AlertType::SENSOR_FAILURE, mock_timestamp); auto alerts = manager.getActiveAlerts(); EXPECT_TRUE(alerts.empty()); } TEST_F(AlertManagerTest, testResetAlert) { mock_timestamp = 1640995200; manager.triggerSensorFailure(mock_timestamp); manager.resetAlert(AlertType::SENSOR_FAILURE); auto alerts = manager.getActiveAlerts(); EXPECT_TRUE(alerts.empty()); } TEST_F(AlertManagerTest, testResetAllAlerts) { mock_timestamp = 1640995200; manager.triggerSensorFailure(mock_timestamp); manager.triggerLowBattery(mock_timestamp + 1, 10.0f); manager.resetAllAlerts(); auto alerts = manager.getActiveAlerts(); EXPECT_TRUE(alerts.empty()); } TEST_F(AlertManagerTest, testHasActiveAlerts) { EXPECT_FALSE(manager.hasActiveAlerts()); mock_timestamp = 1640995200; manager.triggerSensorFailure(mock_timestamp); EXPECT_TRUE(manager.hasActiveAlerts()); } TEST_F(AlertManagerTest, testHasUnacknowledgedAlerts) { EXPECT_FALSE(manager.hasUnacknowledgedAlerts()); mock_timestamp = 1640995200; manager.triggerSensorFailure(mock_timestamp); EXPECT_TRUE(manager.hasUnacknowledgedAlerts()); manager.acknowledgeAllAlerts(mock_timestamp + 1); EXPECT_FALSE(manager.hasUnacknowledgedAlerts()); } TEST_F(AlertManagerTest, testGetActiveAlerts) { mock_timestamp = 1640995200; manager.triggerSensorFailure(mock_timestamp); auto alerts = manager.getActiveAlerts(); EXPECT_EQ(alerts.size(), 1); EXPECT_EQ(alerts[0].type, AlertType::SENSOR_FAILURE); } TEST_F(AlertManagerTest, testGetAlertHistoryMaxCount) { mock_timestamp = 1640995200; for (int i = 0; i < 15; ++i) { manager.triggerSensorFailure(mock_timestamp + i); } auto history = manager.getAlertHistory(10); EXPECT_EQ(history.size(), 10); } TEST_F(AlertManagerTest, testGetStatusDescriptionNoAlerts) { std::string desc = manager.getStatusDescription(); EXPECT_EQ(desc, "系统状态:正常"); } TEST_F(AlertManagerTest, testGetStatusDescriptionWithAlerts) { mock_timestamp = 1640995200; manager.triggerSensorFailure(mock_timestamp); std::string desc = manager.getStatusDescription(); EXPECT_NE(desc.find("有1个活动预警"), std::string::npos); EXPECT_NE(desc.find("传感器故障"), std::string::npos); } TEST_F(AlertManagerTest, testClearHistory) { mock_timestamp = 1640995200; manager.triggerSensorFailure(mock_timestamp); manager.clearHistory(); EXPECT_TRUE(manager.getAlertHistory(10).empty()); } TEST_F(AlertManagerTest, testAddToHistoryLimit) { mock_timestamp = 1640995200; for (int i = 0; i < 100; ++i) { manager.triggerSensorFailure(mock_timestamp + i); } auto history = manager.getAlertHistory(10); EXPECT_EQ(history.size(), 10); } TEST_F(AlertManagerTest, testTriggerAlert) { mock_timestamp = 1640995200; manager.triggerAlert(AlertType::SENSOR_FAILURE, mock_timestamp, "Test alert"); auto alerts = manager.getActiveAlerts(); EXPECT_EQ(alerts.size(), 1); EXPECT_EQ(alerts[0].description, "Test alert"); } TEST_F(AlertManagerTest, testUpdateAlertStatusAcknowledged) { mock_timestamp = 1640995200; manager.triggerSensorFailure(mock_timestamp); mock_timestamp = 1640995201; manager.updateAlertStatus(AlertType::SENSOR_FAILURE, AlertStatus::ACKNOWLEDGED, mock_timestamp); auto alerts = manager.getActiveAlerts(); EXPECT_TRUE(alerts.empty()); } TEST_F(AlertManagerTest, testUpdateAlertStatusResolved) { mock_timestamp = 1640995200; manager.triggerSensorFailure(mock_timestamp); mock_timestamp = 1640995201; manager.updateAlertStatus(AlertType::SENSOR_FAILURE, AlertStatus::RESOLVED, mock_timestamp); auto alerts = manager.getActiveAlerts(); EXPECT_TRUE(alerts.empty()); } TEST_F(AlertManagerTest, testGetAlertTypeName) { EXPECT_EQ(manager.getAlertTypeName(AlertType::ALTITUDE_UPPER), "高度上限预警"); EXPECT_EQ(manager.getAlertTypeName(AlertType::NONE), "无"); EXPECT_EQ(manager.getAlertTypeName(static_cast(99)), "未知预警"); } TEST_F(AlertManagerTest, testGetAlertStatusName) { EXPECT_EQ(manager.getAlertStatusName(AlertStatus::ACTIVE), "预警中"); EXPECT_EQ(manager.getAlertStatusName(AlertStatus::INACTIVE), "未激活"); EXPECT_EQ(manager.getAlertStatusName(static_cast(99)), "未知状态"); } TEST_F(AlertManagerTest, testDestructorDoesNotCrash) { // Verify destructor doesn't throw or crash EXPECT_NO_FATAL_FAILURE({ AlertManager* mgr = new AlertManager(); delete mgr; }); }