157 lines
6.2 KiB
C++
157 lines
6.2 KiB
C++
#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);
|
||
}
|