CppGenerate/tests/test_alert_manager.cpp

460 lines
15 KiB
C++
Raw Permalink 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 <gmock/gmock.h>
#include "alert_manager.hpp"
#include <sstream>
#include <iostream>
// 辅助类:用于捕获标准输出和标准错误输出
class StreamCapture {
public:
StreamCapture() {
old_cout_buf_ = std::cout.rdbuf(cout_buffer_.rdbuf());
old_cerr_buf_ = std::cerr.rdbuf(cerr_buffer_.rdbuf());
}
~StreamCapture() {
std::cout.rdbuf(old_cout_buf_);
std::cerr.rdbuf(old_cerr_buf_);
}
std::string getCout() const { return cout_buffer_.str(); }
std::string getCerr() const { return cerr_buffer_.str(); }
private:
std::stringstream cout_buffer_;
std::stringstream cerr_buffer_;
std::streambuf* old_cout_buf_;
std::streambuf* old_cerr_buf_;
};
// 测试夹具类
class AlertManagerTest : public ::testing::Test {
protected:
void SetUp() override {
manager.initialize();
}
void TearDown() override {
manager.resetAllAlerts();
}
AlertManager manager;
};
// ==================== checkAltitudeAlert 测试 ====================
// 正常输入测试:高度在阈值范围内,不应触发任何预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertNormalRange) {
StreamCapture capture;
// 默认阈值上限100.0,下限-50.0
manager.checkAltitudeAlert(50.0f, 1000);
EXPECT_FALSE(manager.hasActiveAlerts());
EXPECT_FALSE(manager.hasUnacknowledgedAlerts());
// 验证没有预警相关的输出
std::string cout_output = capture.getCout();
EXPECT_EQ(cout_output.find("[预警]"), std::string::npos);
}
// 正常输入测试:高度超过上限,应触发上限预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertUpperThresholdExceeded) {
StreamCapture capture;
manager.checkAltitudeAlert(150.0f, 2000);
EXPECT_TRUE(manager.hasActiveAlerts());
EXPECT_TRUE(manager.hasUnacknowledgedAlerts());
auto active_alerts = manager.getActiveAlerts();
ASSERT_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, 2000);
// 验证输出包含预警信息
std::string cout_output = capture.getCout();
EXPECT_NE(cout_output.find("高度上限预警"), std::string::npos);
EXPECT_NE(cout_output.find("150"), std::string::npos);
}
// 正常输入测试:高度低于下限,应触发下限预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertLowerThresholdExceeded) {
StreamCapture capture;
manager.checkAltitudeAlert(-100.0f, 3000);
EXPECT_TRUE(manager.hasActiveAlerts());
EXPECT_TRUE(manager.hasUnacknowledgedAlerts());
auto active_alerts = manager.getActiveAlerts();
ASSERT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_LOWER);
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
EXPECT_EQ(active_alerts[0].trigger_time, 3000);
// 验证输出包含预警信息
std::string cout_output = capture.getCout();
EXPECT_NE(cout_output.find("高度下限预警"), std::string::npos);
EXPECT_NE(cout_output.find("-100"), std::string::npos);
}
// 边界值测试:高度恰好等于上限阈值,不应触发预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertAtUpperBoundary) {
StreamCapture capture;
manager.checkAltitudeAlert(100.0f, 4000);
EXPECT_FALSE(manager.hasActiveAlerts());
EXPECT_FALSE(manager.hasUnacknowledgedAlerts());
std::string cout_output = capture.getCout();
EXPECT_EQ(cout_output.find("[预警]"), std::string::npos);
}
// 边界值测试:高度恰好等于下限阈值,不应触发预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertAtLowerBoundary) {
StreamCapture capture;
manager.checkAltitudeAlert(-50.0f, 5000);
EXPECT_FALSE(manager.hasActiveAlerts());
EXPECT_FALSE(manager.hasUnacknowledgedAlerts());
std::string cout_output = capture.getCout();
EXPECT_EQ(cout_output.find("[预警]"), std::string::npos);
}
// 边界值测试:高度略高于上限阈值(浮点数精度边界)
TEST_F(AlertManagerTest, testCheckAltitudeAlertJustAboveUpperBoundary) {
StreamCapture capture;
manager.checkAltitudeAlert(100.0001f, 6000);
EXPECT_TRUE(manager.hasActiveAlerts());
auto active_alerts = manager.getActiveAlerts();
ASSERT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_UPPER);
}
// 边界值测试:高度略低于下限阈值(浮点数精度边界)
TEST_F(AlertManagerTest, testCheckAltitudeAlertJustBelowLowerBoundary) {
StreamCapture capture;
manager.checkAltitudeAlert(-50.0001f, 7000);
EXPECT_TRUE(manager.hasActiveAlerts());
auto active_alerts = manager.getActiveAlerts();
ASSERT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_LOWER);
}
// 特殊场景测试:高度从超出上限恢复到正常范围,应解除预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoverFromUpperAlert) {
StreamCapture capture;
// 先触发上限预警
manager.checkAltitudeAlert(150.0f, 8000);
EXPECT_TRUE(manager.hasActiveAlerts());
// 高度恢复正常
manager.checkAltitudeAlert(50.0f, 9000);
EXPECT_FALSE(manager.hasActiveAlerts());
EXPECT_FALSE(manager.hasUnacknowledgedAlerts());
// 验证预警已解决
auto history = manager.getAlertHistory(10);
bool found_resolved = false;
for (const auto& alert : history) {
if (alert.type == AlertType::ALTITUDE_UPPER &&
alert.status == AlertStatus::RESOLVED) {
found_resolved = true;
break;
}
}
EXPECT_TRUE(found_resolved);
}
// 特殊场景测试:高度从低于下限恢复到正常范围,应解除预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoverFromLowerAlert) {
StreamCapture capture;
// 先触发下限预警
manager.checkAltitudeAlert(-100.0f, 10000);
EXPECT_TRUE(manager.hasActiveAlerts());
// 高度恢复正常
manager.checkAltitudeAlert(0.0f, 11000);
EXPECT_FALSE(manager.hasActiveAlerts());
EXPECT_FALSE(manager.hasUnacknowledgedAlerts());
// 验证预警已解决
auto history = manager.getAlertHistory(10);
bool found_resolved = false;
for (const auto& alert : history) {
if (alert.type == AlertType::ALTITUDE_LOWER &&
alert.status == AlertStatus::RESOLVED) {
found_resolved = true;
break;
}
}
EXPECT_TRUE(found_resolved);
}
// 特殊场景测试:同时触发上限和下限预警(理论上不可能,但测试边界情况)
TEST_F(AlertManagerTest, testCheckAltitudeAlertBothThresholdsExceeded) {
StreamCapture capture;
// 修改阈值为较小范围,使高度同时超出上下限(不可能,但测试代码健壮性)
manager.setAltitudeThresholds(10.0f, 20.0f);
// 高度30同时超出上下限下限20上限10实际只应触发上限预警
manager.checkAltitudeAlert(30.0f, 12000);
auto active_alerts = manager.getActiveAlerts();
EXPECT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_UPPER);
}
// 异常输入测试:高度为极大值
TEST_F(AlertManagerTest, testCheckAltitudeAlertExtremeHighValue) {
StreamCapture capture;
manager.checkAltitudeAlert(1e10f, 13000);
EXPECT_TRUE(manager.hasActiveAlerts());
auto active_alerts = manager.getActiveAlerts();
ASSERT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_UPPER);
}
// 异常输入测试:高度为极小值
TEST_F(AlertManagerTest, testCheckAltitudeAlertExtremeLowValue) {
StreamCapture capture;
manager.checkAltitudeAlert(-1e10f, 14000);
EXPECT_TRUE(manager.hasActiveAlerts());
auto active_alerts = manager.getActiveAlerts();
ASSERT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_LOWER);
}
// 异常输入测试时间戳为0
TEST_F(AlertManagerTest, testCheckAltitudeAlertZeroTimestamp) {
StreamCapture capture;
manager.checkAltitudeAlert(150.0f, 0);
EXPECT_TRUE(manager.hasActiveAlerts());
auto active_alerts = manager.getActiveAlerts();
ASSERT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].trigger_time, 0);
}
// 异常输入测试:时间戳为最大值
TEST_F(AlertManagerTest, testCheckAltitudeAlertMaxTimestamp) {
StreamCapture capture;
manager.checkAltitudeAlert(150.0f, UINT32_MAX);
EXPECT_TRUE(manager.hasActiveAlerts());
auto active_alerts = manager.getActiveAlerts();
ASSERT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].trigger_time, UINT32_MAX);
}
// ==================== setAltitudeThresholds 测试 ====================
// 正常输入测试:设置有效的上下限阈值
TEST_F(AlertManagerTest, testSetAltitudeThresholdsValidValues) {
StreamCapture capture;
manager.setAltitudeThresholds(200.0f, 0.0f);
// 验证新阈值生效
manager.checkAltitudeAlert(150.0f, 15000);
EXPECT_FALSE(manager.hasActiveAlerts());
manager.checkAltitudeAlert(250.0f, 16000);
EXPECT_TRUE(manager.hasActiveAlerts());
// 验证输出信息
std::string cout_output = capture.getCout();
EXPECT_NE(cout_output.find("预警阈值已更新"), std::string::npos);
EXPECT_NE(cout_output.find("200"), std::string::npos);
EXPECT_NE(cout_output.find("0"), std::string::npos);
}
// 正常输入测试:设置阈值后,之前的预警应被重置
TEST_F(AlertManagerTest, testSetAltitudeThresholdsResetsAlerts) {
StreamCapture capture;
// 先触发预警
manager.checkAltitudeAlert(150.0f, 17000);
EXPECT_TRUE(manager.hasActiveAlerts());
// 修改阈值
manager.setAltitudeThresholds(200.0f, 0.0f);
// 预警应被重置
EXPECT_FALSE(manager.hasActiveAlerts());
}
// 异常输入测试:上限小于下限,应输出错误信息且不修改阈值
TEST_F(AlertManagerTest, testSetAltitudeThresholdsUpperLessThanLower) {
StreamCapture capture;
float original_upper = 100.0f;
float original_lower = -50.0f;
manager.setAltitudeThresholds(10.0f, 20.0f);
// 验证阈值未改变
manager.checkAltitudeAlert(50.0f, 18000);
EXPECT_FALSE(manager.hasActiveAlerts());
// 验证错误输出
std::string cerr_output = capture.getCerr();
EXPECT_NE(cerr_output.find("上限阈值必须大于下限阈值"), std::string::npos);
}
// 边界值测试:上限等于下限,应视为非法输入
TEST_F(AlertManagerTest, testSetAltitudeThresholdsUpperEqualToLower) {
StreamCapture capture;
manager.setAltitudeThresholds(50.0f, 50.0f);
// 验证阈值未改变
manager.checkAltitudeAlert(50.0f, 19000);
EXPECT_FALSE(manager.hasActiveAlerts());
// 验证错误输出
std::string cerr_output = capture.getCerr();
EXPECT_NE(cerr_output.find("上限阈值必须大于下限阈值"), std::string::npos);
}
// 边界值测试:设置非常大的阈值范围
TEST_F(AlertManagerTest, testSetAltitudeThresholdsLargeRange) {
StreamCapture capture;
manager.setAltitudeThresholds(10000.0f, -10000.0f);
// 验证新阈值生效
manager.checkAltitudeAlert(5000.0f, 20000);
EXPECT_FALSE(manager.hasActiveAlerts());
manager.checkAltitudeAlert(15000.0f, 21000);
EXPECT_TRUE(manager.hasActiveAlerts());
}
// 边界值测试:设置非常小的阈值范围
TEST_F(AlertManagerTest, testSetAltitudeThresholdsSmallRange) {
StreamCapture capture;
manager.setAltitudeThresholds(1.0f, 0.0f);
// 验证新阈值生效
manager.checkAltitudeAlert(0.5f, 22000);
EXPECT_FALSE(manager.hasActiveAlerts());
manager.checkAltitudeAlert(1.5f, 23000);
EXPECT_TRUE(manager.hasActiveAlerts());
manager.checkAltitudeAlert(-0.5f, 24000);
EXPECT_TRUE(manager.hasActiveAlerts());
}
// 异常输入测试:设置负数的上限和下限
TEST_F(AlertManagerTest, testSetAltitudeThresholdsNegativeValues) {
StreamCapture capture;
manager.setAltitudeThresholds(-10.0f, -100.0f);
// 验证新阈值生效
manager.checkAltitudeAlert(-50.0f, 25000);
EXPECT_FALSE(manager.hasActiveAlerts());
manager.checkAltitudeAlert(-5.0f, 26000);
EXPECT_TRUE(manager.hasActiveAlerts());
}
// 异常输入测试:设置浮点数精度极限值
TEST_F(AlertManagerTest, testSetAltitudeThresholdsFloatPrecision) {
StreamCapture capture;
manager.setAltitudeThresholds(100.000001f, 0.000001f);
// 验证新阈值生效
manager.checkAltitudeAlert(50.0f, 27000);
EXPECT_FALSE(manager.hasActiveAlerts());
manager.checkAltitudeAlert(100.00001f, 28000);
EXPECT_TRUE(manager.hasActiveAlerts());
}
// 特殊场景测试:多次设置阈值,验证最后一次生效
TEST_F(AlertManagerTest, testSetAltitudeThresholdsMultipleCalls) {
StreamCapture capture;
manager.setAltitudeThresholds(200.0f, 100.0f);
manager.setAltitudeThresholds(300.0f, 200.0f);
manager.setAltitudeThresholds(400.0f, 300.0f);
// 验证最后一次设置生效
manager.checkAltitudeAlert(350.0f, 29000);
EXPECT_FALSE(manager.hasActiveAlerts());
manager.checkAltitudeAlert(450.0f, 30000);
EXPECT_TRUE(manager.hasActiveAlerts());
}
// 特殊场景测试:设置阈值后立即检查高度,验证阈值更新及时
TEST_F(AlertManagerTest, testSetAltitudeThresholdsImmediateEffect) {
StreamCapture capture;
// 当前高度50默认阈值下正常
manager.checkAltitudeAlert(50.0f, 31000);
EXPECT_FALSE(manager.hasActiveAlerts());
// 修改阈值为[30, 60]
manager.setAltitudeThresholds(60.0f, 30.0f);
// 高度50仍在范围内
manager.checkAltitudeAlert(50.0f, 32000);
EXPECT_FALSE(manager.hasActiveAlerts());
// 修改阈值为[40, 45]
manager.setAltitudeThresholds(45.0f, 40.0f);
// 高度50超出上限
manager.checkAltitudeAlert(50.0f, 33000);
EXPECT_TRUE(manager.hasActiveAlerts());
}
// 特殊场景测试:设置阈值后,之前已解决的预警不应再次触发
TEST_F(AlertManagerTest, testSetAltitudeThresholdsDoesNotReTriggerResolvedAlerts) {
StreamCapture capture;
// 触发并解决预警
manager.checkAltitudeAlert(150.0f, 34000);
manager.checkAltitudeAlert(50.0f, 35000);
EXPECT_FALSE(manager.hasActiveAlerts());
// 修改阈值
manager.setAltitudeThresholds(200.0f, 0.0f);
// 不应有活动预警
EXPECT_FALSE(manager.hasActiveAlerts());
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}