#include #include "alert_manager.hpp" #include #include class AlertManagerTest : public ::testing::Test { protected: AlertManager manager; void SetUp() override { // 重置阈值到默认值 manager.setAltitudeThresholds(100.0f, -50.0f); // 清空预警 manager.resetAllAlerts(); } void TearDown() override { // 清理 } // 辅助函数:捕获标准输出 std::string captureStdout(std::function func) { std::stringstream buffer; std::streambuf* old = std::cout.rdbuf(buffer.rdbuf()); func(); std::cout.rdbuf(old); return buffer.str(); } // 辅助函数:捕获标准错误输出 std::string captureStderr(std::function func) { std::stringstream buffer; std::streambuf* old = std::cerr.rdbuf(buffer.rdbuf()); func(); std::cerr.rdbuf(old); return buffer.str(); } }; // ==================== checkAltitudeAlert 测试 ==================== // 正常输入测试:高度在阈值范围内,不应触发预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertNormalRange) { manager.checkAltitudeAlert(50.0f, 1000); EXPECT_FALSE(manager.hasActiveAlerts()); } // 正常输入测试:高度超过上限阈值,应触发上限预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertUpperThresholdExceeded) { manager.checkAltitudeAlert(150.0f, 1000); EXPECT_TRUE(manager.hasActiveAlerts()); auto activeAlerts = manager.getActiveAlerts(); ASSERT_EQ(1, activeAlerts.size()); EXPECT_EQ(AlertType::ALTITUDE_UPPER, activeAlerts[0].type); EXPECT_EQ(AlertStatus::ACTIVE, activeAlerts[0].status); } // 正常输入测试:高度低于下限阈值,应触发下限预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertLowerThresholdExceeded) { manager.checkAltitudeAlert(-100.0f, 1000); EXPECT_TRUE(manager.hasActiveAlerts()); auto activeAlerts = manager.getActiveAlerts(); ASSERT_EQ(1, activeAlerts.size()); EXPECT_EQ(AlertType::ALTITUDE_LOWER, activeAlerts[0].type); EXPECT_EQ(AlertStatus::ACTIVE, activeAlerts[0].status); } // 边界值测试:高度等于上限阈值,不应触发预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertAtUpperBoundary) { manager.checkAltitudeAlert(100.0f, 1000); EXPECT_FALSE(manager.hasActiveAlerts()); } // 边界值测试:高度等于下限阈值,不应触发预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertAtLowerBoundary) { manager.checkAltitudeAlert(-50.0f, 1000); EXPECT_FALSE(manager.hasActiveAlerts()); } // 边界值测试:高度略高于上限阈值,应触发预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertJustAboveUpper) { manager.checkAltitudeAlert(100.001f, 1000); EXPECT_TRUE(manager.hasActiveAlerts()); auto activeAlerts = manager.getActiveAlerts(); ASSERT_EQ(1, activeAlerts.size()); EXPECT_EQ(AlertType::ALTITUDE_UPPER, activeAlerts[0].type); } // 边界值测试:高度略低于下限阈值,应触发预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertJustBelowLower) { manager.checkAltitudeAlert(-50.001f, 1000); EXPECT_TRUE(manager.hasActiveAlerts()); auto activeAlerts = manager.getActiveAlerts(); ASSERT_EQ(1, activeAlerts.size()); EXPECT_EQ(AlertType::ALTITUDE_LOWER, activeAlerts[0].type); } // 特殊场景测试:高度从超出上限恢复到正常范围,应解除预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoverFromUpper) { manager.checkAltitudeAlert(150.0f, 1000); EXPECT_TRUE(manager.hasActiveAlerts()); manager.checkAltitudeAlert(50.0f, 1001); EXPECT_FALSE(manager.hasActiveAlerts()); } // 特殊场景测试:高度从超出下限恢复到正常范围,应解除预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoverFromLower) { manager.checkAltitudeAlert(-100.0f, 1000); EXPECT_TRUE(manager.hasActiveAlerts()); manager.checkAltitudeAlert(0.0f, 1001); EXPECT_FALSE(manager.hasActiveAlerts()); } // 特殊场景测试:同时超出上下限(不可能,但测试逻辑),应触发上限预警 TEST_F(AlertManagerTest, testCheckAltitudeAlertBothThresholdsExceeded) { // 设置阈值使上下限重叠,测试逻辑 manager.setAltitudeThresholds(50.0f, -50.0f); manager.checkAltitudeAlert(100.0f, 1000); auto activeAlerts = manager.getActiveAlerts(); ASSERT_EQ(1, activeAlerts.size()); EXPECT_EQ(AlertType::ALTITUDE_UPPER, activeAlerts[0].type); } // 特殊场景测试:连续触发相同预警,不应重复触发 TEST_F(AlertManagerTest, testCheckAltitudeAlertDuplicateTrigger) { manager.checkAltitudeAlert(150.0f, 1000); EXPECT_TRUE(manager.hasActiveAlerts()); // 再次触发相同预警 manager.checkAltitudeAlert(200.0f, 1001); auto activeAlerts = manager.getActiveAlerts(); ASSERT_EQ(1, activeAlerts.size()); EXPECT_EQ(AlertType::ALTITUDE_UPPER, activeAlerts[0].type); } // 异常输入测试:高度为极大值 TEST_F(AlertManagerTest, testCheckAltitudeAlertExtremeHigh) { manager.checkAltitudeAlert(1e10f, 1000); EXPECT_TRUE(manager.hasActiveAlerts()); auto activeAlerts = manager.getActiveAlerts(); ASSERT_EQ(1, activeAlerts.size()); EXPECT_EQ(AlertType::ALTITUDE_UPPER, activeAlerts[0].type); } // 异常输入测试:高度为极小值 TEST_F(AlertManagerTest, testCheckAltitudeAlertExtremeLow) { manager.checkAltitudeAlert(-1e10f, 1000); EXPECT_TRUE(manager.hasActiveAlerts()); auto activeAlerts = manager.getActiveAlerts(); ASSERT_EQ(1, activeAlerts.size()); EXPECT_EQ(AlertType::ALTITUDE_LOWER, activeAlerts[0].type); } // 异常输入测试:高度为0 TEST_F(AlertManagerTest, testCheckAltitudeAlertZero) { manager.checkAltitudeAlert(0.0f, 1000); EXPECT_FALSE(manager.hasActiveAlerts()); } // 异常输入测试:时间戳为0 TEST_F(AlertManagerTest, testCheckAltitudeAlertTimestampZero) { manager.checkAltitudeAlert(150.0f, 0); EXPECT_TRUE(manager.hasActiveAlerts()); auto activeAlerts = manager.getActiveAlerts(); ASSERT_EQ(1, activeAlerts.size()); EXPECT_EQ(0, activeAlerts[0].trigger_time); } // ==================== setAltitudeThresholds 测试 ==================== // 正常输入测试:设置有效的上下限阈值 TEST_F(AlertManagerTest, testSetAltitudeThresholdsValid) { manager.setAltitudeThresholds(200.0f, -100.0f); // 验证新阈值生效 manager.checkAltitudeAlert(150.0f, 1000); EXPECT_FALSE(manager.hasActiveAlerts()); manager.checkAltitudeAlert(250.0f, 1001); EXPECT_TRUE(manager.hasActiveAlerts()); } // 正常输入测试:设置阈值后,旧预警应被重置 TEST_F(AlertManagerTest, testSetAltitudeThresholdsResetsOldAlerts) { // 先触发预警 manager.checkAltitudeAlert(150.0f, 1000); EXPECT_TRUE(manager.hasActiveAlerts()); // 设置新阈值 manager.setAltitudeThresholds(200.0f, -100.0f); EXPECT_FALSE(manager.hasActiveAlerts()); } // 边界值测试:上下限相等,应输出错误并拒绝 TEST_F(AlertManagerTest, testSetAltitudeThresholdsEqual) { std::string errOutput = captureStderr([this]() { manager.setAltitudeThresholds(100.0f, 100.0f); }); EXPECT_FALSE(errOutput.empty()); EXPECT_NE(std::string::npos, errOutput.find("错误")); // 验证阈值未改变 manager.checkAltitudeAlert(100.0f, 1000); EXPECT_FALSE(manager.hasActiveAlerts()); manager.checkAltitudeAlert(150.0f, 1001); EXPECT_TRUE(manager.hasActiveAlerts()); } // 边界值测试:上限小于下限,应输出错误并拒绝 TEST_F(AlertManagerTest, testSetAltitudeThresholdsUpperLessThanLower) { std::string errOutput = captureStderr([this]() { manager.setAltitudeThresholds(-50.0f, 100.0f); }); EXPECT_FALSE(errOutput.empty()); EXPECT_NE(std::string::npos, errOutput.find("错误")); // 验证阈值未改变 EXPECT_TRUE(manager.hasActiveAlerts() == false); } // 边界值测试:设置极大值 TEST_F(AlertManagerTest, testSetAltitudeThresholdsExtremeValues) { manager.setAltitudeThresholds(1e10f, -1e10f); manager.checkAltitudeAlert(1e9f, 1000); EXPECT_FALSE(manager.hasActiveAlerts()); manager.checkAltitudeAlert(1e11f, 1001); EXPECT_TRUE(manager.hasActiveAlerts()); } // 边界值测试:设置极小值 TEST_F(AlertManagerTest, testSetAltitudeThresholdsTinyValues) { manager.setAltitudeThresholds(0.001f, -0.001f); manager.checkAltitudeAlert(0.0f, 1000); EXPECT_FALSE(manager.hasActiveAlerts()); manager.checkAltitudeAlert(0.002f, 1001); EXPECT_TRUE(manager.hasActiveAlerts()); } // 特殊场景测试:多次设置阈值,验证最终生效 TEST_F(AlertManagerTest, testSetAltitudeThresholdsMultipleTimes) { manager.setAltitudeThresholds(200.0f, -100.0f); manager.setAltitudeThresholds(300.0f, -200.0f); manager.setAltitudeThresholds(150.0f, -50.0f); // 验证最终阈值 manager.checkAltitudeAlert(100.0f, 1000); EXPECT_FALSE(manager.hasActiveAlerts()); manager.checkAltitudeAlert(200.0f, 1001); EXPECT_TRUE(manager.hasActiveAlerts()); } // 特殊场景测试:设置阈值后立即检查边界值 TEST_F(AlertManagerTest, testSetAltitudeThresholdsCheckBoundary) { manager.setAltitudeThresholds(100.5f, -50.5f); // 边界值不应触发预警 manager.checkAltitudeAlert(100.5f, 1000); EXPECT_FALSE(manager.hasActiveAlerts()); manager.checkAltitudeAlert(-50.5f, 1001); EXPECT_FALSE(manager.hasActiveAlerts()); } // 异常输入测试:设置NaN值(如果编译器支持) TEST_F(AlertManagerTest, testSetAltitudeThresholdsNaN) { float nan = std::numeric_limits::quiet_NaN(); // NaN比较总是false,所以upper <= lower可能为false,导致设置成功 manager.setAltitudeThresholds(nan, nan); // 验证不会崩溃 manager.checkAltitudeAlert(50.0f, 1000); } // 异常输入测试:设置INF值 TEST_F(AlertManagerTest, testSetAltitudeThresholdsInfinity) { float inf = std::numeric_limits::infinity(); manager.setAltitudeThresholds(inf, -inf); // 验证不会崩溃 manager.checkAltitudeAlert(50.0f, 1000); EXPECT_FALSE(manager.hasActiveAlerts()); }