#include "gtest/gtest.h" #include "alert_manager.hpp" #include #include using namespace std; // Mock time function for deterministic testing uint32_t mock_timestamp = 1640995200; // 2022-01-01 00:00:00 UTC // Mock the time function to return a fixed value uint32_t getMockTimestamp() { return mock_timestamp; } // Override the global time function in AlertManager namespace { uint32_t (*original_time_func)() = nullptr; uint32_t mock_time_func() { return mock_timestamp; } } // Test fixture for AlertManager class AlertManagerTest : public ::testing::Test { protected: AlertManager alert_manager; void SetUp() override { // Reset timestamp mock_timestamp = 1640995200; // Initialize with default thresholds alert_manager.initialize(); } void TearDown() override { // Clean up alert_manager.resetAllAlerts(); } }; // Test case: 正常输入测试 - 设置合法的上下限阈值 TEST_F(AlertManagerTest, testSetAltitudeThresholdsNormalInput) { const float upper = 200.0f; const float lower = -100.0f; alert_manager.setAltitudeThresholds(upper, lower); EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), upper); EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), lower); // Verify that active alerts are reset auto active_alerts = alert_manager.getActiveAlerts(); EXPECT_TRUE(active_alerts.empty()); } // Test case: 边界值测试 - 上限等于下限(非法输入) TEST_F(AlertManagerTest, testSetAltitudeThresholdsBoundaryEqual) { const float upper = 100.0f; const float lower = 100.0f; // Capture stderr output testing::internal::CaptureStderr(); alert_manager.setAltitudeThresholds(upper, lower); string stderr_output = testing::internal::GetCapturedStderr(); EXPECT_NE(stderr_output.find("错误:上限阈值必须大于下限阈值"), string::npos); EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 100.0f); // Should not change EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -50.0f); // Default value } // Test case: 异常输入测试 - 上限小于下限(非法输入) TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalidInput) { const float upper = 50.0f; const float lower = 100.0f; // Capture stderr output testing::internal::CaptureStderr(); alert_manager.setAltitudeThresholds(upper, lower); string stderr_output = testing::internal::GetCapturedStderr(); EXPECT_NE(stderr_output.find("错误:上限阈值必须大于下限阈值"), string::npos); EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 100.0f); // Should remain unchanged EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -50.0f); } // Test case: 特殊场景测试 - 阈值更新后,高度越界触发预警 TEST_F(AlertManagerTest, testSetAltitudeThresholdsAndTriggerAlert) { const float upper = 150.0f; const float lower = -80.0f; const float altitude = 160.0f; // Exceeds upper threshold alert_manager.setAltitudeThresholds(upper, lower); // Simulate check mock_timestamp += 100; alert_manager.checkAltitudeAlert(altitude, mock_timestamp); 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); EXPECT_EQ(active_alerts[0].trigger_time, mock_timestamp); EXPECT_TRUE(active_alerts[0].description.find("超过上限阈值") != string::npos); } // Test case: 正常输入测试 - 获取活动预警信息 TEST_F(AlertManagerTest, testGetActiveAlertsNormalInput) { const float upper = 100.0f; const float lower = -50.0f; const float altitude = 120.0f; // Above upper threshold alert_manager.setAltitudeThresholds(upper, lower); mock_timestamp += 100; alert_manager.checkAltitudeAlert(altitude, mock_timestamp); 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); EXPECT_EQ(active_alerts[0].trigger_time, mock_timestamp); } // Test case: 边界值测试 - 无活动预警时获取空列表 TEST_F(AlertManagerTest, testGetActiveAlertsNoActiveAlerts) { auto active_alerts = alert_manager.getActiveAlerts(); EXPECT_TRUE(active_alerts.empty()); } // Test case: 特殊场景测试 - 多个预警同时存在 TEST_F(AlertManagerTest, testGetActiveAlertsMultipleAlerts) { const float upper = 100.0f; const float lower = -50.0f; const float altitude_high = 120.0f; // Above upper const float altitude_low = -70.0f; // Below lower alert_manager.setAltitudeThresholds(upper, lower); mock_timestamp += 100; alert_manager.checkAltitudeAlert(altitude_high, mock_timestamp); mock_timestamp += 100; alert_manager.checkAltitudeAlert(altitude_low, mock_timestamp); auto active_alerts = alert_manager.getActiveAlerts(); EXPECT_EQ(active_alerts.size(), 2); EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_UPPER); EXPECT_EQ(active_alerts[1].type, AlertType::ALTITUDE_LOWER); EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE); EXPECT_EQ(active_alerts[1].status, AlertStatus::ACTIVE); } // Test case: 异常输入测试 - 空值处理(虽然函数无参数,但验证状态) TEST_F(AlertManagerTest, testGetActiveAlertsEmptyState) { // Ensure no prior state alert_manager.resetAllAlerts(); auto active_alerts = alert_manager.getActiveAlerts(); EXPECT_TRUE(active_alerts.empty()); } // Test case: 特殊场景测试 - 预警解除后不再返回 TEST_F(AlertManagerTest, testGetActiveAlertsAfterResolution) { const float upper = 100.0f; const float lower = -50.0f; const float altitude = 120.0f; alert_manager.setAltitudeThresholds(upper, lower); mock_timestamp += 100; alert_manager.checkAltitudeAlert(altitude, mock_timestamp); // Now simulate normal altitude mock_timestamp += 100; alert_manager.checkAltitudeAlert(90.0f, mock_timestamp); auto active_alerts = alert_manager.getActiveAlerts(); EXPECT_TRUE(active_alerts.empty()); }