#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; } }