#include "gtest/gtest.h" #include "alert_manager.hpp" #include #include // Mock class to capture output for testing class MockAlertManager : public AlertManager { public: std::vector captured_output; void print(const std::string& msg) override { captured_output.push_back(msg); } // Override to prevent actual console output void triggerAlert(AlertType type, uint32_t timestamp, const std::string& description) override { AlertInfo alert; alert.type = type; alert.status = AlertStatus::ACTIVE; alert.trigger_time = timestamp; alert.description = description; alerts_[type] = alert; addToHistory(alert); } void updateAlertStatus(AlertType type, AlertStatus new_status, uint32_t timestamp) override { auto it = alerts_.find(type); if (it == alerts_.end()) return; AlertInfo& alert = it->second; alert.status = new_status; alert.acknowledge_time = (new_status == AlertStatus::ACKNOWLEDGED) ? timestamp : alert.acknowledge_time; alert.resolve_time = (new_status == AlertStatus::RESOLVED) ? timestamp : alert.resolve_time; } }; // Test fixture for AlertManager class AlertManagerTest : public ::testing::Test { protected: std::unique_ptr alert_manager_; void SetUp() override { alert_manager_ = std::make_unique(); } void TearDown() override { alert_manager_->captured_output.clear(); } }; // Test case: 正常输入测试 - 检查高度上限预警触发 TEST_F(AlertManagerTest, testCheckAltitudeAlertNormalUpperTrigger) { alert_manager_->setAltitudeThresholds(100.0f, -50.0f); alert_manager_->checkAltitudeAlert(105.0f, 1234567890); EXPECT_TRUE(alert_manager_->hasActiveAlerts()); EXPECT_EQ(alert_manager_->getActiveAlerts().size(), 1); EXPECT_EQ(alert_manager_->getActiveAlerts()[0].type, AlertType::ALTITUDE_UPPER); EXPECT_EQ(alert_manager_->getActiveAlerts()[0].status, AlertStatus::ACTIVE); } // Test case: 正常输入测试 - 检查高度下限预警触发 TEST_F(AlertManagerTest, testCheckAltitudeAlertNormalLowerTrigger) { alert_manager_->setAltitudeThresholds(100.0f, -50.0f); alert_manager_->checkAltitudeAlert(-55.0f, 1234567890); EXPECT_TRUE(alert_manager_->hasActiveAlerts()); EXPECT_EQ(alert_manager_->getActiveAlerts().size(), 1); EXPECT_EQ(alert_manager_->getActiveAlerts()[0].type, AlertType::ALTITUDE_LOWER); EXPECT_EQ(alert_manager_->getActiveAlerts()[0].status, AlertStatus::ACTIVE); } // Test case: 边界值测试 - 高度等于上限阈值,不应触发预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertBoundaryUpperEqual) { alert_manager_->setAltitudeThresholds(100.0f, -50.0f); alert_manager_->checkAltitudeAlert(100.0f, 1234567890); EXPECT_FALSE(alert_manager_->hasActiveAlerts()); } // Test case: 边界值测试 - 高度等于下限阈值,不应触发预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertBoundaryLowerEqual) { alert_manager_->setAltitudeThresholds(100.0f, -50.0f); alert_manager_->checkAltitudeAlert(-50.0f, 1234567890); EXPECT_FALSE(alert_manager_->hasActiveAlerts()); } // Test case: 异常输入测试 - 上限阈值小于下限阈值,应输出错误提示 TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalidInput) { alert_manager_->setAltitudeThresholds(-10.0f, 10.0f); EXPECT_EQ(alert_manager_->upper_threshold_, 100.0f); // Should remain unchanged EXPECT_EQ(alert_manager_->lower_threshold_, -50.0f); EXPECT_TRUE(alert_manager_->captured_output.empty()); // No error message printed } // Test case: 特殊场景测试 - 高度从超限恢复到正常范围,预警应被解决 TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoveryFromUpper) { alert_manager_->setAltitudeThresholds(100.0f, -50.0f); alert_manager_->checkAltitudeAlert(105.0f, 1234567890); // Trigger upper alert EXPECT_TRUE(alert_manager_->hasActiveAlerts()); alert_manager_->checkAltitudeAlert(95.0f, 1234567891); // Recovery EXPECT_FALSE(alert_manager_->hasActiveAlerts()); EXPECT_EQ(alert_manager_->getActiveAlerts().size(), 0); } // Test case: 特殊场景测试 - 高度从超限恢复到正常范围,下限预警应被解决 TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoveryFromLower) { alert_manager_->setAltitudeThresholds(100.0f, -50.0f); alert_manager_->checkAltitudeAlert(-55.0f, 1234567890); // Trigger lower alert EXPECT_TRUE(alert_manager_->hasActiveAlerts()); alert_manager_->checkAltitudeAlert(-45.0f, 1234567891); // Recovery EXPECT_FALSE(alert_manager_->hasActiveAlerts()); EXPECT_EQ(alert_manager_->getActiveAlerts().size(), 0); } // Test case: 正常输入测试 - 设置合法阈值,检查是否更新成功 TEST_F(AlertManagerTest, testSetAltitudeThresholdsValidInput) { alert_manager_->setAltitudeThresholds(200.0f, -100.0f); EXPECT_EQ(alert_manager_->upper_threshold_, 200.0f); EXPECT_EQ(alert_manager_->lower_threshold_, -100.0f); EXPECT_TRUE(alert_manager_->hasActiveAlerts()); } // Test case: 特殊场景测试 - 多次调用 checkAltitudeAlert,验证状态一致性 TEST_F(AlertManagerTest, testCheckAltitudeAlertMultipleCalls) { alert_manager_->setAltitudeThresholds(100.0f, -50.0f); alert_manager_->checkAltitudeAlert(105.0f, 1234567890); // Trigger EXPECT_TRUE(alert_manager_->hasActiveAlerts()); alert_manager_->checkAltitudeAlert(105.0f, 1234567891); // Still above EXPECT_TRUE(alert_manager_->hasActiveAlerts()); alert_manager_->checkAltitudeAlert(95.0f, 1234567892); // Recover EXPECT_FALSE(alert_manager_->hasActiveAlerts()); } // Test case: 边界值测试 - 阈值为极小值和极大值 TEST_F(AlertManagerTest, testSetAltitudeThresholdsExtremeValues) { alert_manager_->setAltitudeThresholds(FLT_MAX, FLT_MIN); EXPECT_EQ(alert_manager_->upper_threshold_, FLT_MAX); EXPECT_EQ(alert_manager_->lower_threshold_, FLT_MIN); } // Test case: 异常输入测试 - 空值输入(使用零值) TEST_F(AlertManagerTest, testSetAltitudeThresholdsZeroValues) { alert_manager_->setAltitudeThresholds(0.0f, 0.0f); EXPECT_EQ(alert_manager_->upper_threshold_, 100.0f); EXPECT_EQ(alert_manager_->lower_threshold_, -50.0f); }