CppGenerate/tests/test_alert_manager.cpp

157 lines
6.2 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 "alert_manager.hpp"
#include <memory>
#include <vector>
// Mock class to capture output for testing
class MockAlertManager : public AlertManager {
public:
std::vector<std::string> captured_output;
void print(const std::string& msg) override {
captured_output.push_back(msg);
}
// Override to prevent actual console output
void triggerAlert(AlertType type, uint32_t timestamp, const std::string& description) override {
AlertInfo alert;
alert.type = type;
alert.status = AlertStatus::ACTIVE;
alert.trigger_time = timestamp;
alert.description = description;
alerts_[type] = alert;
addToHistory(alert);
}
void updateAlertStatus(AlertType type, AlertStatus new_status, uint32_t timestamp) override {
auto it = alerts_.find(type);
if (it == alerts_.end()) return;
AlertInfo& alert = it->second;
alert.status = new_status;
alert.acknowledge_time = (new_status == AlertStatus::ACKNOWLEDGED) ? timestamp : alert.acknowledge_time;
alert.resolve_time = (new_status == AlertStatus::RESOLVED) ? timestamp : alert.resolve_time;
}
};
// Test fixture for AlertManager
class AlertManagerTest : public ::testing::Test {
protected:
std::unique_ptr<MockAlertManager> alert_manager_;
void SetUp() override {
alert_manager_ = std::make_unique<MockAlertManager>();
}
void TearDown() override {
alert_manager_->captured_output.clear();
}
};
// Test case: 正常输入测试 - 检查高度上限预警触发
TEST_F(AlertManagerTest, testCheckAltitudeAlertNormalUpperTrigger) {
alert_manager_->setAltitudeThresholds(100.0f, -50.0f);
alert_manager_->checkAltitudeAlert(105.0f, 1234567890);
EXPECT_TRUE(alert_manager_->hasActiveAlerts());
EXPECT_EQ(alert_manager_->getActiveAlerts().size(), 1);
EXPECT_EQ(alert_manager_->getActiveAlerts()[0].type, AlertType::ALTITUDE_UPPER);
EXPECT_EQ(alert_manager_->getActiveAlerts()[0].status, AlertStatus::ACTIVE);
}
// Test case: 正常输入测试 - 检查高度下限预警触发
TEST_F(AlertManagerTest, testCheckAltitudeAlertNormalLowerTrigger) {
alert_manager_->setAltitudeThresholds(100.0f, -50.0f);
alert_manager_->checkAltitudeAlert(-55.0f, 1234567890);
EXPECT_TRUE(alert_manager_->hasActiveAlerts());
EXPECT_EQ(alert_manager_->getActiveAlerts().size(), 1);
EXPECT_EQ(alert_manager_->getActiveAlerts()[0].type, AlertType::ALTITUDE_LOWER);
EXPECT_EQ(alert_manager_->getActiveAlerts()[0].status, AlertStatus::ACTIVE);
}
// Test case: 边界值测试 - 高度等于上限阈值,不应触发预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertBoundaryUpperEqual) {
alert_manager_->setAltitudeThresholds(100.0f, -50.0f);
alert_manager_->checkAltitudeAlert(100.0f, 1234567890);
EXPECT_FALSE(alert_manager_->hasActiveAlerts());
}
// Test case: 边界值测试 - 高度等于下限阈值,不应触发预警
TEST_F(AlertManagerTest, testCheckAltitudeAlertBoundaryLowerEqual) {
alert_manager_->setAltitudeThresholds(100.0f, -50.0f);
alert_manager_->checkAltitudeAlert(-50.0f, 1234567890);
EXPECT_FALSE(alert_manager_->hasActiveAlerts());
}
// Test case: 异常输入测试 - 上限阈值小于下限阈值,应输出错误提示
TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalidInput) {
alert_manager_->setAltitudeThresholds(-10.0f, 10.0f);
EXPECT_EQ(alert_manager_->upper_threshold_, 100.0f); // Should remain unchanged
EXPECT_EQ(alert_manager_->lower_threshold_, -50.0f);
EXPECT_TRUE(alert_manager_->captured_output.empty()); // No error message printed
}
// Test case: 特殊场景测试 - 高度从超限恢复到正常范围,预警应被解决
TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoveryFromUpper) {
alert_manager_->setAltitudeThresholds(100.0f, -50.0f);
alert_manager_->checkAltitudeAlert(105.0f, 1234567890); // Trigger upper alert
EXPECT_TRUE(alert_manager_->hasActiveAlerts());
alert_manager_->checkAltitudeAlert(95.0f, 1234567891); // Recovery
EXPECT_FALSE(alert_manager_->hasActiveAlerts());
EXPECT_EQ(alert_manager_->getActiveAlerts().size(), 0);
}
// Test case: 特殊场景测试 - 高度从超限恢复到正常范围,下限预警应被解决
TEST_F(AlertManagerTest, testCheckAltitudeAlertRecoveryFromLower) {
alert_manager_->setAltitudeThresholds(100.0f, -50.0f);
alert_manager_->checkAltitudeAlert(-55.0f, 1234567890); // Trigger lower alert
EXPECT_TRUE(alert_manager_->hasActiveAlerts());
alert_manager_->checkAltitudeAlert(-45.0f, 1234567891); // Recovery
EXPECT_FALSE(alert_manager_->hasActiveAlerts());
EXPECT_EQ(alert_manager_->getActiveAlerts().size(), 0);
}
// Test case: 正常输入测试 - 设置合法阈值,检查是否更新成功
TEST_F(AlertManagerTest, testSetAltitudeThresholdsValidInput) {
alert_manager_->setAltitudeThresholds(200.0f, -100.0f);
EXPECT_EQ(alert_manager_->upper_threshold_, 200.0f);
EXPECT_EQ(alert_manager_->lower_threshold_, -100.0f);
EXPECT_TRUE(alert_manager_->hasActiveAlerts());
}
// Test case: 特殊场景测试 - 多次调用 checkAltitudeAlert验证状态一致性
TEST_F(AlertManagerTest, testCheckAltitudeAlertMultipleCalls) {
alert_manager_->setAltitudeThresholds(100.0f, -50.0f);
alert_manager_->checkAltitudeAlert(105.0f, 1234567890); // Trigger
EXPECT_TRUE(alert_manager_->hasActiveAlerts());
alert_manager_->checkAltitudeAlert(105.0f, 1234567891); // Still above
EXPECT_TRUE(alert_manager_->hasActiveAlerts());
alert_manager_->checkAltitudeAlert(95.0f, 1234567892); // Recover
EXPECT_FALSE(alert_manager_->hasActiveAlerts());
}
// Test case: 边界值测试 - 阈值为极小值和极大值
TEST_F(AlertManagerTest, testSetAltitudeThresholdsExtremeValues) {
alert_manager_->setAltitudeThresholds(FLT_MAX, FLT_MIN);
EXPECT_EQ(alert_manager_->upper_threshold_, FLT_MAX);
EXPECT_EQ(alert_manager_->lower_threshold_, FLT_MIN);
}
// Test case: 异常输入测试 - 空值输入(使用零值)
TEST_F(AlertManagerTest, testSetAltitudeThresholdsZeroValues) {
alert_manager_->setAltitudeThresholds(0.0f, 0.0f);
EXPECT_EQ(alert_manager_->upper_threshold_, 100.0f);
EXPECT_EQ(alert_manager_->lower_threshold_, -50.0f);
}