生成 C++ 代码工程
This commit is contained in:
parent
69455b9c6c
commit
0c20483f87
|
|
@ -0,0 +1,329 @@
|
|||
#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;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue