#include #include #include "alert_manager.hpp" #include #include using namespace testing; class AlertManagerTest : public ::testing::Test { protected: AlertManager alertManager; void SetUp() override { // 重置预警管理器状态 alertManager.resetAllAlerts(); } void TearDown() override { // 清理 } }; // ==================== checkAltitudeAlert 测试 ==================== // 正常输入测试:高度在阈值范围内,不应触发预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertNormalRange) { alertManager.setAltitudeThresholds(100.0f, -50.0f); alertManager.checkAltitudeAlert(50.0f, 1000); EXPECT_FALSE(alertManager.hasActiveAlerts()); EXPECT_FALSE(alertManager.hasUnacknowledgedAlerts()); } // 正常输入测试:高度超过上限,应触发上限预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertUpperThresholdExceeded) { alertManager.setAltitudeThresholds(100.0f, -50.0f); alertManager.checkAltitudeAlert(150.0f, 1001); EXPECT_TRUE(alertManager.hasActiveAlerts()); EXPECT_TRUE(alertManager.hasUnacknowledgedAlerts()); auto activeAlerts = alertManager.getActiveAlerts(); ASSERT_EQ(activeAlerts.size(), 1); EXPECT_EQ(activeAlerts[0].type, AlertType::ALTITUDE_UPPER); EXPECT_EQ(activeAlerts[0].status, AlertStatus::ACTIVE); } // 正常输入测试:高度低于下限,应触发下限预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertLowerThresholdExceeded) { alertManager.setAltitudeThresholds(100.0f, -50.0f); alertManager.checkAltitudeAlert(-100.0f, 1002); EXPECT_TRUE(alertManager.hasActiveAlerts()); EXPECT_TRUE(alertManager.hasUnacknowledgedAlerts()); auto activeAlerts = alertManager.getActiveAlerts(); ASSERT_EQ(activeAlerts.size(), 1); EXPECT_EQ(activeAlerts[0].type, AlertType::ALTITUDE_LOWER); EXPECT_EQ(activeAlerts[0].status, AlertStatus::ACTIVE); } // 边界值测试:高度等于上限阈值,不应触发预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertAtUpperBoundary) { alertManager.setAltitudeThresholds(100.0f, -50.0f); alertManager.checkAltitudeAlert(100.0f, 1003); EXPECT_FALSE(alertManager.hasActiveAlerts()); } // 边界值测试:高度等于下限阈值,不应触发预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertAtLowerBoundary) { alertManager.setAltitudeThresholds(100.0f, -50.0f); alertManager.checkAltitudeAlert(-50.0f, 1004); EXPECT_FALSE(alertManager.hasActiveAlerts()); } // 边界值测试:高度略高于上限阈值,应触发预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertJustAboveUpper) { alertManager.setAltitudeThresholds(100.0f, -50.0f); alertManager.checkAltitudeAlert(100.001f, 1005); EXPECT_TRUE(alertManager.hasActiveAlerts()); auto activeAlerts = alertManager.getActiveAlerts(); EXPECT_EQ(activeAlerts[0].type, AlertType::ALTITUDE_UPPER); } // 边界值测试:高度略低于下限阈值,应触发预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertJustBelowLower) { alertManager.setAltitudeThresholds(100.0f, -50.0f); alertManager.checkAltitudeAlert(-50.001f, 1006); EXPECT_TRUE(alertManager.hasActiveAlerts()); auto activeAlerts = alertManager.getActiveAlerts(); EXPECT_EQ(activeAlerts[0].type, AlertType::ALTITUDE_LOWER); } // 异常输入测试:高度为极大值,应触发上限预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertExtremeHighValue) { alertManager.setAltitudeThresholds(100.0f, -50.0f); alertManager.checkAltitudeAlert(999999.0f, 1007); EXPECT_TRUE(alertManager.hasActiveAlerts()); auto activeAlerts = alertManager.getActiveAlerts(); EXPECT_EQ(activeAlerts[0].type, AlertType::ALTITUDE_UPPER); } // 异常输入测试:高度为极小值,应触发下限预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertExtremeLowValue) { alertManager.setAltitudeThresholds(100.0f, -50.0f); alertManager.checkAltitudeAlert(-999999.0f, 1008); EXPECT_TRUE(alertManager.hasActiveAlerts()); auto activeAlerts = alertManager.getActiveAlerts(); EXPECT_EQ(activeAlerts[0].type, AlertType::ALTITUDE_LOWER); } // 特殊场景测试:高度恢复正常后,预警应被解决 TEST_F(AlertManagerTest, testCheckAltitudeAlertResolveAfterNormalization) { alertManager.setAltitudeThresholds(100.0f, -50.0f); // 先触发预警 alertManager.checkAltitudeAlert(150.0f, 1009); EXPECT_TRUE(alertManager.hasActiveAlerts()); // 高度恢复正常 alertManager.checkAltitudeAlert(50.0f, 1010); EXPECT_FALSE(alertManager.hasActiveAlerts()); // 检查历史记录中预警状态已更新 auto history = alertManager.getAlertHistory(10); bool foundResolved = false; for (const auto& alert : history) { if (alert.type == AlertType::ALTITUDE_UPPER && alert.status == AlertStatus::RESOLVED) { foundResolved = true; break; } } EXPECT_TRUE(foundResolved); } // 特殊场景测试:同时触发上下限预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertBothThresholdsExceeded) { alertManager.setAltitudeThresholds(50.0f, -50.0f); // 先触发上限预警 alertManager.checkAltitudeAlert(100.0f, 1011); EXPECT_TRUE(alertManager.hasActiveAlerts()); // 再触发下限预警(高度从上限直接跳到下限) alertManager.checkAltitudeAlert(-100.0f, 1012); auto activeAlerts = alertManager.getActiveAlerts(); EXPECT_EQ(activeAlerts.size(), 1); // 只有下限预警活动 EXPECT_EQ(activeAlerts[0].type, AlertType::ALTITUDE_LOWER); } // 特殊场景测试:多次触发相同预警,不应重复创建 TEST_F(AlertManagerTest, testCheckAltitudeAlertDuplicateTrigger) { alertManager.setAltitudeThresholds(100.0f, -50.0f); // 第一次触发 alertManager.checkAltitudeAlert(150.0f, 1013); auto activeAlerts1 = alertManager.getActiveAlerts(); ASSERT_EQ(activeAlerts1.size(), 1); // 第二次触发(高度仍然超出) alertManager.checkAltitudeAlert(200.0f, 1014); auto activeAlerts2 = alertManager.getActiveAlerts(); EXPECT_EQ(activeAlerts2.size(), 1); // 仍然只有一个预警 EXPECT_EQ(activeAlerts2[0].trigger_time, 1013); // 触发时间不应更新 } // ==================== setAltitudeThresholds 测试 ==================== // 正常输入测试:设置有效的上下限阈值 TEST_F(AlertManagerTest, testSetAltitudeThresholdsValidValues) { testing::internal::CaptureStdout(); alertManager.setAltitudeThresholds(200.0f, -100.0f); std::string output = testing::internal::GetCapturedStdout(); EXPECT_THAT(output, HasSubstr("预警阈值已更新")); EXPECT_THAT(output, HasSubstr("上限=200")); EXPECT_THAT(output, HasSubstr("下限=-100")); // 验证新阈值生效 alertManager.checkAltitudeAlert(150.0f, 2000); EXPECT_FALSE(alertManager.hasActiveAlerts()); alertManager.checkAltitudeAlert(250.0f, 2001); EXPECT_TRUE(alertManager.hasActiveAlerts()); } // 边界值测试:设置上限等于下限,应输出错误并拒绝 TEST_F(AlertManagerTest, testSetAltitudeThresholdsEqualValues) { testing::internal::CaptureStderr(); alertManager.setAltitudeThresholds(100.0f, 100.0f); std::string errorOutput = testing::internal::GetCapturedStderr(); EXPECT_THAT(errorOutput, HasSubstr("错误:上限阈值必须大于下限阈值")); // 验证阈值未改变 alertManager.checkAltitudeAlert(150.0f, 2002); EXPECT_TRUE(alertManager.hasActiveAlerts()); } // 异常输入测试:设置上限小于下限,应输出错误并拒绝 TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalidOrder) { testing::internal::CaptureStderr(); alertManager.setAltitudeThresholds(-50.0f, 100.0f); std::string errorOutput = testing::internal::GetCapturedStderr(); EXPECT_THAT(errorOutput, HasSubstr("错误:上限阈值必须大于下限阈值")); // 验证阈值未改变 alertManager.checkAltitudeAlert(150.0f, 2003); EXPECT_TRUE(alertManager.hasActiveAlerts()); } // 边界值测试:设置极大值阈值 TEST_F(AlertManagerTest, testSetAltitudeThresholdsExtremeValues) { testing::internal::CaptureStdout(); alertManager.setAltitudeThresholds(1000000.0f, -1000000.0f); std::string output = testing::internal::GetCapturedStdout(); EXPECT_THAT(output, HasSubstr("预警阈值已更新")); // 验证新阈值生效 alertManager.checkAltitudeAlert(500000.0f, 2004); EXPECT_FALSE(alertManager.hasActiveAlerts()); alertManager.checkAltitudeAlert(1500000.0f, 2005); EXPECT_TRUE(alertManager.hasActiveAlerts()); } // 特殊场景测试:设置阈值后,原有预警应被重置 TEST_F(AlertManagerTest, testSetAltitudeThresholdsResetsExistingAlerts) { // 先触发预警 alertManager.checkAltitudeAlert(150.0f, 2006); EXPECT_TRUE(alertManager.hasActiveAlerts()); // 设置新阈值 testing::internal::CaptureStdout(); alertManager.setAltitudeThresholds(200.0f, -100.0f); testing::internal::GetCapturedStdout(); // 原有预警应被重置 EXPECT_FALSE(alertManager.hasActiveAlerts()); } // 特殊场景测试:连续多次设置阈值 TEST_F(AlertManagerTest, testSetAltitudeThresholdsMultipleTimes) { testing::internal::CaptureStdout(); alertManager.setAltitudeThresholds(200.0f, -100.0f); alertManager.setAltitudeThresholds(300.0f, -200.0f); alertManager.setAltitudeThresholds(400.0f, -300.0f); std::string output = testing::internal::GetCapturedStdout(); // 验证最后一次设置生效 EXPECT_THAT(output, HasSubstr("上限=400")); EXPECT_THAT(output, HasSubstr("下限=-300")); // 验证新阈值 alertManager.checkAltitudeAlert(350.0f, 2007); EXPECT_FALSE(alertManager.hasActiveAlerts()); alertManager.checkAltitudeAlert(450.0f, 2008); EXPECT_TRUE(alertManager.hasActiveAlerts()); } // 特殊场景测试:设置阈值后立即检查高度 TEST_F(AlertManagerTest, testSetAltitudeThresholdsImmediateCheck) { testing::internal::CaptureStdout(); alertManager.setAltitudeThresholds(50.0f, -50.0f); testing::internal::GetCapturedStdout(); // 新阈值下,当前高度应触发预警 alertManager.checkAltitudeAlert(75.0f, 2009); EXPECT_TRUE(alertManager.hasActiveAlerts()); auto activeAlerts = alertManager.getActiveAlerts(); EXPECT_EQ(activeAlerts[0].type, AlertType::ALTITUDE_UPPER); } // 主函数 int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }