CppGenerate/tests/test_alert_manager.cpp

387 lines
13 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 <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 getCoutOutput() const { return cout_buffer_.str(); }
std::string getCerrOutput() 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 {
// 每个测试用例前重置 AlertManager
manager_ = std::make_unique<AlertManager>();
}
void TearDown() override {
manager_.reset();
}
std::unique_ptr<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 output = capture.getCoutOutput();
EXPECT_EQ(output.find("[预警]"), std::string::npos);
}
// 正常输入测试:高度超过上限,触发上限预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertUpperThreshold) {
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 output = capture.getCoutOutput();
EXPECT_NE(output.find("高度上限预警"), std::string::npos);
EXPECT_NE(output.find("150"), std::string::npos);
}
// 正常输入测试:高度低于下限,触发下限预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertLowerThreshold) {
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 output = capture.getCoutOutput();
EXPECT_NE(output.find("高度下限预警"), std::string::npos);
EXPECT_NE(output.find("-100"), std::string::npos);
}
// 边界值测试:高度等于上限阈值,不触发预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertEqualToUpper) {
StreamCapture capture;
// 高度等于上限阈值,不应触发预警
manager_->checkAltitudeAlert(100.0f, 4000);
EXPECT_FALSE(manager_->hasActiveAlerts());
EXPECT_FALSE(manager_->hasUnacknowledgedAlerts());
std::string output = capture.getCoutOutput();
EXPECT_EQ(output.find("[预警]"), std::string::npos);
}
// 边界值测试:高度等于下限阈值,不触发预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertEqualToLower) {
StreamCapture capture;
// 高度等于下限阈值,不应触发预警
manager_->checkAltitudeAlert(-50.0f, 5000);
EXPECT_FALSE(manager_->hasActiveAlerts());
EXPECT_FALSE(manager_->hasUnacknowledgedAlerts());
std::string output = capture.getCoutOutput();
EXPECT_EQ(output.find("[预警]"), std::string::npos);
}
// 边界值测试:高度略高于上限,触发预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertJustAboveUpper) {
StreamCapture capture;
// 高度略高于上限
manager_->checkAltitudeAlert(100.1f, 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, testCheckAltitudeAlertJustBelowLower) {
StreamCapture capture;
// 高度略低于下限
manager_->checkAltitudeAlert(-50.1f, 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, testCheckAltitudeAlertExtremeHigh) {
StreamCapture capture;
// 测试非常大的高度值
manager_->checkAltitudeAlert(999999.0f, 8000);
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, testCheckAltitudeAlertExtremeLow) {
StreamCapture capture;
// 测试非常小的高度值
manager_->checkAltitudeAlert(-999999.0f, 9000);
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, testCheckAltitudeAlertRecovery) {
StreamCapture capture;
// 首先触发上限预警
manager_->checkAltitudeAlert(150.0f, 10000);
EXPECT_TRUE(manager_->hasActiveAlerts());
// 然后高度恢复正常
manager_->checkAltitudeAlert(50.0f, 10001);
// 验证预警已解决
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, testCheckAltitudeAlertBothThresholds) {
StreamCapture capture;
// 先触发上限预警
manager_->checkAltitudeAlert(150.0f, 11000);
// 然后触发下限预警(此时上限预警应保持活动)
manager_->checkAltitudeAlert(-100.0f, 11001);
// 验证有两个活动预警
auto active_alerts = manager_->getActiveAlerts();
ASSERT_EQ(active_alerts.size(), 2);
// 验证两个预警类型都存在
bool has_upper = false, has_lower = false;
for (const auto& alert : active_alerts) {
if (alert.type == AlertType::ALTITUDE_UPPER) has_upper = true;
if (alert.type == AlertType::ALTITUDE_LOWER) has_lower = true;
}
EXPECT_TRUE(has_upper);
EXPECT_TRUE(has_lower);
}
// 特殊场景测试:重复触发相同预警,不应重复创建
TEST_F(AlertManagerTest, testCheckAltitudeAlertDuplicateTrigger) {
StreamCapture capture;
// 第一次触发上限预警
manager_->checkAltitudeAlert(150.0f, 12000);
// 再次触发相同的上限预警
manager_->checkAltitudeAlert(200.0f, 12001);
// 验证仍然只有一个活动预警
auto active_alerts = manager_->getActiveAlerts();
ASSERT_EQ(active_alerts.size(), 1);
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_UPPER);
}
// ==================== setAltitudeThresholds 测试 ====================
// 正常输入测试:设置有效的阈值
TEST_F(AlertManagerTest, testSetAltitudeThresholdsValid) {
StreamCapture capture;
manager_->setAltitudeThresholds(200.0f, -100.0f);
// 验证阈值已更新
// 通过触发预警来验证
manager_->checkAltitudeAlert(150.0f, 13000); // 应低于新上限,不触发预警
EXPECT_FALSE(manager_->hasActiveAlerts());
manager_->checkAltitudeAlert(250.0f, 13001); // 应高于新上限,触发预警
EXPECT_TRUE(manager_->hasActiveAlerts());
// 验证输出信息
std::string output = capture.getCoutOutput();
EXPECT_NE(output.find("预警阈值已更新"), std::string::npos);
EXPECT_NE(output.find("200"), std::string::npos);
EXPECT_NE(output.find("-100"), std::string::npos);
}
// 边界值测试:设置上限等于下限,应输出错误
TEST_F(AlertManagerTest, testSetAltitudeThresholdsEqual) {
StreamCapture capture;
manager_->setAltitudeThresholds(100.0f, 100.0f);
// 验证错误输出
std::string error_output = capture.getCerrOutput();
EXPECT_NE(error_output.find("上限阈值必须大于下限阈值"), std::string::npos);
// 验证阈值未改变
manager_->checkAltitudeAlert(100.0f, 14000); // 应等于上限,不触发预警
EXPECT_FALSE(manager_->hasActiveAlerts());
manager_->checkAltitudeAlert(100.1f, 14001); // 应触发上限预警
EXPECT_TRUE(manager_->hasActiveAlerts());
}
// 异常输入测试:设置上限小于下限,应输出错误
TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalid) {
StreamCapture capture;
manager_->setAltitudeThresholds(-50.0f, 100.0f);
// 验证错误输出
std::string error_output = capture.getCerrOutput();
EXPECT_NE(error_output.find("上限阈值必须大于下限阈值"), std::string::npos);
// 验证阈值未改变
manager_->checkAltitudeAlert(150.0f, 15000); // 应触发上限预警
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, testSetAltitudeThresholdsExtremeValues) {
StreamCapture capture;
manager_->setAltitudeThresholds(10000.0f, -10000.0f);
// 验证阈值生效
manager_->checkAltitudeAlert(5000.0f, 16000); // 在范围内
EXPECT_FALSE(manager_->hasActiveAlerts());
manager_->checkAltitudeAlert(15000.0f, 16001); // 超出上限
EXPECT_TRUE(manager_->hasActiveAlerts());
}
// 特殊场景测试:设置阈值后,原有预警应被重置
TEST_F(AlertManagerTest, testSetAltitudeThresholdsResetAlerts) {
StreamCapture capture;
// 先触发一个预警
manager_->checkAltitudeAlert(150.0f, 17000);
EXPECT_TRUE(manager_->hasActiveAlerts());
// 设置新阈值
manager_->setAltitudeThresholds(200.0f, -100.0f);
// 验证原有预警已被重置
EXPECT_FALSE(manager_->hasActiveAlerts());
EXPECT_FALSE(manager_->hasUnacknowledgedAlerts());
}
// 特殊场景测试:多次设置阈值
TEST_F(AlertManagerTest, testSetAltitudeThresholdsMultipleTimes) {
StreamCapture capture;
// 第一次设置
manager_->setAltitudeThresholds(200.0f, -100.0f);
// 第二次设置
manager_->setAltitudeThresholds(300.0f, -200.0f);
// 验证最终阈值
manager_->checkAltitudeAlert(250.0f, 18000); // 在范围内
EXPECT_FALSE(manager_->hasActiveAlerts());
manager_->checkAltitudeAlert(350.0f, 18001); // 超出上限
EXPECT_TRUE(manager_->hasActiveAlerts());
}
// 特殊场景测试:设置阈值后立即检查高度
TEST_F(AlertManagerTest, testSetAltitudeThresholdsImmediateCheck) {
StreamCapture capture;
// 设置新阈值
manager_->setAltitudeThresholds(150.0f, -50.0f);
// 立即检查高度原默认阈值100会触发预警新阈值150不会
manager_->checkAltitudeAlert(120.0f, 19000);
// 验证没有触发预警
EXPECT_FALSE(manager_->hasActiveAlerts());
}
// 主函数
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}