CppGenerate/tests/test_alert_manager.cpp

290 lines
10 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <gtest/gtest.h>
#include "alert_manager.hpp"
#include <sstream>
#include <iostream>
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<void()> 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<void()> 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<float>::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<float>::infinity();
manager.setAltitudeThresholds(inf, -inf);
// 验证不会崩溃
manager.checkAltitudeAlert(50.0f, 1000);
EXPECT_FALSE(manager.hasActiveAlerts());
}