CppGenerate/tests/basic_test.cpp

329 lines
11 KiB
C++
Raw Permalink Normal View History

2026-04-17 09:22:17 +00:00
#include <iostream>
#include <cassert>
#include <cmath>
#include <string>
#include "app.hpp"
#include "altitude_calculator.hpp"
#include "data_logger.hpp"
#include "sensor_simulator.hpp"
#include "alert_manager.hpp"
/**
* @brief
*/
void testAltitudeCalculator() {
std::cout << "测试高度计算器..." << std::endl;
// 1. 测试构造函数和默认值
AltitudeCalculator calc1;
assert(calc1.getSeaLevelPressure() == 1013.25f);
// 2. 测试自定义海平面气压
AltitudeCalculator calc2(1020.0f);
assert(std::fabs(calc2.getSeaLevelPressure() - 1020.0f) < 0.001f);
// 3. 测试高度计算(已知值测试)
// 在标准大气压下1013.25 hPa 应该对应0米高度
float altitude1 = calc1.calculateAltitude(1013.25f);
assert(std::fabs(altitude1) < 1.0f); // 允许1米误差
// 4. 测试相对高度计算
float relative1 = AltitudeCalculator::calculateRelativeHeight(100.0f, 50.0f);
assert(std::fabs(relative1 - 50.0f) < 0.001f);
float relative2 = AltitudeCalculator::calculateRelativeHeight(50.0f, 100.0f);
assert(std::fabs(relative2 + 50.0f) < 0.001f); // 负值
// 5. 测试单位转换
float meters = 100.0f;
float feet = AltitudeCalculator::metersToFeet(meters);
float meters_back = AltitudeCalculator::feetToMeters(feet);
assert(std::fabs(meters - meters_back) < 0.001f);
// 6. 测试气压有效性检查
assert(AltitudeCalculator::isValidPressure(1013.25f) == true);
assert(AltitudeCalculator::isValidPressure(500.0f) == true);
assert(AltitudeCalculator::isValidPressure(200.0f) == false); // 太低
assert(AltitudeCalculator::isValidPressure(1200.0f) == false); // 太高
// 7. 测试高度有效性检查
assert(AltitudeCalculator::isValidAltitude(0.0f) == true);
assert(AltitudeCalculator::isValidAltitude(1000.0f) == true);
assert(AltitudeCalculator::isValidAltitude(10000.0f) == false); // 太高
assert(AltitudeCalculator::isValidAltitude(-600.0f) == false); // 太低
std::cout << "高度计算器测试通过!" << std::endl;
}
/**
* @brief
*/
void testDataLogger() {
std::cout << "\n测试数据记录器..." << std::endl;
// 1. 测试构造函数
DataLogger logger(10); // 小容量便于测试
assert(logger.getCapacity() == 10);
assert(logger.getRecordCount() == 0);
assert(logger.isFull() == false);
assert(logger.getAvailableSpace() == 10);
// 2. 测试添加记录
uint32_t timestamp1 = 1234567890;
float altitude1 = 100.5f;
bool added1 = logger.addRecord(timestamp1, altitude1, 'm', 0);
assert(added1 == true);
assert(logger.getRecordCount() == 1);
assert(logger.getAvailableSpace() == 9);
// 3. 测试获取记录
const HSM_Record_t* record1 = logger.getRecord(0);
assert(record1 != nullptr);
assert(record1->timestamp == timestamp1);
assert(std::fabs(record1->altitude - altitude1) < 0.001f);
assert(record1->unit == 'm');
assert(record1->status == 0);
// 4. 测试添加更多记录
for (int i = 0; i < 9; ++i) {
bool added = logger.addRecord(timestamp1 + i + 1, altitude1 + i + 1, 'm', 0);
assert(added == true);
}
assert(logger.getRecordCount() == 10);
assert(logger.isFull() == true);
assert(logger.getAvailableSpace() == 0);
// 5. 测试环形缓冲区特性添加第11条记录应该覆盖第一条
bool added11 = logger.addRecord(timestamp1 + 10, altitude1 + 10, 'm', 0);
assert(added11 == true);
assert(logger.getRecordCount() == 10); // 仍然是10条
assert(logger.isFull() == true);
// 6. 测试获取最近记录
auto recent = logger.getRecentRecords(3);
assert(recent.size() == 3);
// 最近的三条记录应该是最后添加的
if (recent.size() >= 3) {
assert(recent[0].timestamp == timestamp1 + 10);
assert(recent[1].timestamp == timestamp1 + 9);
assert(recent[2].timestamp == timestamp1 + 8);
}
// 7. 测试按时间范围获取记录
auto range_records = logger.getRecordsByTimeRange(timestamp1 + 5, timestamp1 + 8);
assert(range_records.size() == 4); // 时间戳5,6,7,8
// 8. 测试清空
logger.clear();
assert(logger.getRecordCount() == 0);
assert(logger.getAvailableSpace() == 10);
std::cout << "数据记录器测试通过!" << std::endl;
}
/**
* @brief
*/
void testSensorSimulator() {
std::cout << "\n测试传感器模拟器..." << std::endl;
// 1. 测试构造函数和初始化
SensorSimulator sensor(1013.25f, 0.1f);
assert(sensor.initialize() == true);
assert(sensor.isSensorNormal() == true);
assert(sensor.getBufferSize() == 100);
assert(sensor.getDataCount() == 0);
// 2. 测试读取传感器数据
auto data1 = sensor.readSensor();
assert(sensor.getDataCount() == 1);
assert(data1.pressure > 0.0f);
assert(data1.timestamp_ms > 0);
// 3. 测试获取当前气压
float pressure1 = sensor.getCurrentPressure();
assert(pressure1 > 0.0f);
// 4. 测试获取缓冲区数据
// 先读取几次数据
for (int i = 0; i < 5; ++i) {
sensor.readSensor();
}
assert(sensor.getDataCount() == 6); // 包括第一次
auto buffer_data = sensor.getBufferData(3);
assert(buffer_data.size() == 3);
// 5. 测试设置传感器状态
sensor.setSensorStatus(false);
assert(sensor.isSensorNormal() == false);
sensor.setSensorStatus(true);
assert(sensor.isSensorNormal() == true);
// 6. 测试设置基础气压
float new_base = 1000.0f;
sensor.setBasePressure(new_base);
// 7. 测试设置噪声水平
float new_noise = 1.0f;
sensor.setNoiseLevel(new_noise);
// 8. 测试清空缓冲区
sensor.clearBuffer();
assert(sensor.getDataCount() == 0);
std::cout << "传感器模拟器测试通过!" << std::endl;
}
/**
* @brief
*/
void testAlertManager() {
std::cout << "\n测试预警管理器..." << std::endl;
// 1. 测试构造函数和初始化
AlertManager alertManager;
alertManager.initialize();
assert(alertManager.getUpperThreshold() == 100.0f);
assert(alertManager.getLowerThreshold() == -50.0f);
assert(alertManager.hasActiveAlerts() == false);
assert(alertManager.hasUnacknowledgedAlerts() == false);
assert(alertManager.isSensorNormal() == true);
// 2. 测试设置预警阈值
alertManager.setAltitudeThresholds(200.0f, -100.0f);
assert(std::fabs(alertManager.getUpperThreshold() - 200.0f) < 0.001f);
assert(std::fabs(alertManager.getLowerThreshold() + 100.0f) < 0.001f);
// 3. 测试高度预警
uint32_t timestamp = 1234567890;
// 测试上限预警
alertManager.checkAltitudeAlert(250.0f, timestamp); // 超过上限
assert(alertManager.hasActiveAlerts() == true);
auto active_alerts1 = alertManager.getActiveAlerts();
assert(active_alerts1.size() >= 1);
// 测试恢复正常
alertManager.checkAltitudeAlert(150.0f, timestamp + 1); // 恢复正常
// 预警应该被标记为已解决
// 测试下限预警
alertManager.checkAltitudeAlert(-150.0f, timestamp + 2); // 低于下限
assert(alertManager.hasActiveAlerts() == true);
// 4. 测试传感器故障预警
alertManager.triggerSensorFailure(timestamp + 3);
assert(alertManager.isSensorNormal() == false);
// 5. 测试预警确认
assert(alertManager.hasUnacknowledgedAlerts() == true);
alertManager.acknowledgeAllAlerts(timestamp + 4);
auto active_alerts2 = alertManager.getActiveAlerts();
for (const auto& alert : active_alerts2) {
assert(alert.status == AlertStatus::ACKNOWLEDGED ||
alert.status == AlertStatus::RESOLVED);
}
// 6. 测试获取预警历史
auto history = alertManager.getAlertHistory(5);
assert(history.size() > 0);
// 7. 测试重置预警
alertManager.resetAllAlerts();
assert(alertManager.hasActiveAlerts() == false);
// 8. 测试低电量预警
alertManager.triggerLowBattery(timestamp + 5, 15.0f);
assert(alertManager.hasActiveAlerts() == true);
// 9. 测试通信错误预警
alertManager.triggerCommunicationError(timestamp + 6);
// 10. 测试清空历史
alertManager.clearHistory();
std::cout << "预警管理器测试通过!" << std::endl;
}
/**
* @brief
*/
void testApp() {
std::cout << "\n测试应用主类..." << std::endl;
// 1. 测试构造函数和初始化
HeightMeasurementApp app;
assert(app.isRunning() == false);
bool init_result = app.initialize();
assert(init_result == true);
// 2. 测试启动和停止
app.start();
assert(app.isRunning() == true);
// 3. 测试获取高度应该是0因为还没执行零点归位
float altitude1 = app.getCurrentAltitude();
// 注意由于传感器模拟实际值可能不是0但应该在合理范围内
assert(std::fabs(altitude1) < 1000.0f);
// 4. 测试零点归位
bool zero_result = app.performZeroReset();
assert(zero_result == true);
// 5. 测试设置预警阈值
app.setAlertThresholds(150.0f, -80.0f);
// 6. 测试测量循环
bool measure_result = app.measureCycle();
assert(measure_result == true);
// 7. 测试获取相对高度
float relative = app.getRelativeHeight();
// 相对高度应该在合理范围内
// 8. 测试获取状态信息
std::string status = app.getStatus();
assert(status.length() > 0);
assert(status.find("高度测量系统状态") != std::string::npos);
// 9. 测试停止
app.stop();
assert(app.isRunning() == false);
std::cout << "应用主类测试通过!" << std::endl;
}
/**
* @brief
*/
int main() {
std::cout << "=== 高度测量系统基本功能测试 ===\n" << std::endl;
try {
testAltitudeCalculator();
testDataLogger();
testSensorSimulator();
testAlertManager();
testApp();
std::cout << "\n=== 所有测试通过! ===" << std::endl;
return 0;
} catch (const std::exception& e) {
std::cerr << "\n测试失败,异常信息: " << e.what() << std::endl;
return 1;
} catch (...) {
std::cerr << "\n测试失败,未知异常" << std::endl;
return 1;
}
}