From 0c20483f87f2cc0119188e7727db7a0394815a63 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 17 Apr 2026 17:22:17 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90=20C++=20=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/basic_test.cpp | 329 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100644 tests/basic_test.cpp diff --git a/tests/basic_test.cpp b/tests/basic_test.cpp new file mode 100644 index 0000000..a446546 --- /dev/null +++ b/tests/basic_test.cpp @@ -0,0 +1,329 @@ +#include +#include +#include +#include + +#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; + } +} \ No newline at end of file