179 lines
6.2 KiB
C++
179 lines
6.2 KiB
C++
#include "gtest/gtest.h"
|
|
#include "alert_manager.hpp"
|
|
#include <vector>
|
|
#include <string>
|
|
|
|
using namespace std;
|
|
|
|
// Mock time function for deterministic testing
|
|
uint32_t mock_timestamp = 1640995200; // 2022-01-01 00:00:00 UTC
|
|
|
|
// Mock the time function to return a fixed value
|
|
uint32_t getMockTimestamp() {
|
|
return mock_timestamp;
|
|
}
|
|
|
|
// Override the global time function in AlertManager
|
|
namespace {
|
|
uint32_t (*original_time_func)() = nullptr;
|
|
uint32_t mock_time_func() { return mock_timestamp; }
|
|
}
|
|
|
|
// Test fixture for AlertManager
|
|
class AlertManagerTest : public ::testing::Test {
|
|
protected:
|
|
AlertManager alert_manager;
|
|
|
|
void SetUp() override {
|
|
// Reset timestamp
|
|
mock_timestamp = 1640995200;
|
|
// Initialize with default thresholds
|
|
alert_manager.initialize();
|
|
}
|
|
|
|
void TearDown() override {
|
|
// Clean up
|
|
alert_manager.resetAllAlerts();
|
|
}
|
|
};
|
|
|
|
// Test case: 正常输入测试 - 设置合法的上下限阈值
|
|
TEST_F(AlertManagerTest, testSetAltitudeThresholdsNormalInput) {
|
|
const float upper = 200.0f;
|
|
const float lower = -100.0f;
|
|
|
|
alert_manager.setAltitudeThresholds(upper, lower);
|
|
|
|
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), upper);
|
|
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), lower);
|
|
|
|
// Verify that active alerts are reset
|
|
auto active_alerts = alert_manager.getActiveAlerts();
|
|
EXPECT_TRUE(active_alerts.empty());
|
|
}
|
|
|
|
// Test case: 边界值测试 - 上限等于下限(非法输入)
|
|
TEST_F(AlertManagerTest, testSetAltitudeThresholdsBoundaryEqual) {
|
|
const float upper = 100.0f;
|
|
const float lower = 100.0f;
|
|
|
|
// Capture stderr output
|
|
testing::internal::CaptureStderr();
|
|
alert_manager.setAltitudeThresholds(upper, lower);
|
|
string stderr_output = testing::internal::GetCapturedStderr();
|
|
|
|
EXPECT_NE(stderr_output.find("错误:上限阈值必须大于下限阈值"), string::npos);
|
|
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 100.0f); // Should not change
|
|
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -50.0f); // Default value
|
|
}
|
|
|
|
// Test case: 异常输入测试 - 上限小于下限(非法输入)
|
|
TEST_F(AlertManagerTest, testSetAltitudeThresholdsInvalidInput) {
|
|
const float upper = 50.0f;
|
|
const float lower = 100.0f;
|
|
|
|
// Capture stderr output
|
|
testing::internal::CaptureStderr();
|
|
alert_manager.setAltitudeThresholds(upper, lower);
|
|
string stderr_output = testing::internal::GetCapturedStderr();
|
|
|
|
EXPECT_NE(stderr_output.find("错误:上限阈值必须大于下限阈值"), string::npos);
|
|
EXPECT_FLOAT_EQ(alert_manager.getUpperThreshold(), 100.0f); // Should remain unchanged
|
|
EXPECT_FLOAT_EQ(alert_manager.getLowerThreshold(), -50.0f);
|
|
}
|
|
|
|
// Test case: 特殊场景测试 - 阈值更新后,高度越界触发预警
|
|
TEST_F(AlertManagerTest, testSetAltitudeThresholdsAndTriggerAlert) {
|
|
const float upper = 150.0f;
|
|
const float lower = -80.0f;
|
|
const float altitude = 160.0f; // Exceeds upper threshold
|
|
|
|
alert_manager.setAltitudeThresholds(upper, lower);
|
|
|
|
// Simulate check
|
|
mock_timestamp += 100;
|
|
alert_manager.checkAltitudeAlert(altitude, mock_timestamp);
|
|
|
|
auto active_alerts = alert_manager.getActiveAlerts();
|
|
EXPECT_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, mock_timestamp);
|
|
EXPECT_TRUE(active_alerts[0].description.find("超过上限阈值") != string::npos);
|
|
}
|
|
|
|
// Test case: 正常输入测试 - 获取活动预警信息
|
|
TEST_F(AlertManagerTest, testGetActiveAlertsNormalInput) {
|
|
const float upper = 100.0f;
|
|
const float lower = -50.0f;
|
|
const float altitude = 120.0f; // Above upper threshold
|
|
|
|
alert_manager.setAltitudeThresholds(upper, lower);
|
|
mock_timestamp += 100;
|
|
alert_manager.checkAltitudeAlert(altitude, mock_timestamp);
|
|
|
|
auto active_alerts = alert_manager.getActiveAlerts();
|
|
|
|
EXPECT_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, mock_timestamp);
|
|
}
|
|
|
|
// Test case: 边界值测试 - 无活动预警时获取空列表
|
|
TEST_F(AlertManagerTest, testGetActiveAlertsNoActiveAlerts) {
|
|
auto active_alerts = alert_manager.getActiveAlerts();
|
|
|
|
EXPECT_TRUE(active_alerts.empty());
|
|
}
|
|
|
|
// Test case: 特殊场景测试 - 多个预警同时存在
|
|
TEST_F(AlertManagerTest, testGetActiveAlertsMultipleAlerts) {
|
|
const float upper = 100.0f;
|
|
const float lower = -50.0f;
|
|
const float altitude_high = 120.0f; // Above upper
|
|
const float altitude_low = -70.0f; // Below lower
|
|
|
|
alert_manager.setAltitudeThresholds(upper, lower);
|
|
|
|
mock_timestamp += 100;
|
|
alert_manager.checkAltitudeAlert(altitude_high, mock_timestamp);
|
|
mock_timestamp += 100;
|
|
alert_manager.checkAltitudeAlert(altitude_low, mock_timestamp);
|
|
|
|
auto active_alerts = alert_manager.getActiveAlerts();
|
|
|
|
EXPECT_EQ(active_alerts.size(), 2);
|
|
EXPECT_EQ(active_alerts[0].type, AlertType::ALTITUDE_UPPER);
|
|
EXPECT_EQ(active_alerts[1].type, AlertType::ALTITUDE_LOWER);
|
|
EXPECT_EQ(active_alerts[0].status, AlertStatus::ACTIVE);
|
|
EXPECT_EQ(active_alerts[1].status, AlertStatus::ACTIVE);
|
|
}
|
|
|
|
// Test case: 异常输入测试 - 空值处理(虽然函数无参数,但验证状态)
|
|
TEST_F(AlertManagerTest, testGetActiveAlertsEmptyState) {
|
|
// Ensure no prior state
|
|
alert_manager.resetAllAlerts();
|
|
auto active_alerts = alert_manager.getActiveAlerts();
|
|
|
|
EXPECT_TRUE(active_alerts.empty());
|
|
}
|
|
|
|
// Test case: 特殊场景测试 - 预警解除后不再返回
|
|
TEST_F(AlertManagerTest, testGetActiveAlertsAfterResolution) {
|
|
const float upper = 100.0f;
|
|
const float lower = -50.0f;
|
|
const float altitude = 120.0f;
|
|
|
|
alert_manager.setAltitudeThresholds(upper, lower);
|
|
mock_timestamp += 100;
|
|
alert_manager.checkAltitudeAlert(altitude, mock_timestamp);
|
|
|
|
// Now simulate normal altitude
|
|
mock_timestamp += 100;
|
|
alert_manager.checkAltitudeAlert(90.0f, mock_timestamp);
|
|
|
|
auto active_alerts = alert_manager.getActiveAlerts();
|
|
|
|
EXPECT_TRUE(active_alerts.empty());
|
|
} |