/**************************************************************************** * * (c) 2009-2016 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ #include "MissionCommandTreeTest.h" #include "QGCApplication.h" #include "MissionCommandUIInfo.h" #include "MissionCommandList.h" #include "FactMetaData.h" MissionCommandTreeTest::MissionCommandTreeTest(void) { } void MissionCommandTreeTest::init(void) { _commandTree = new MissionCommandTree(qgcApp(), qgcApp()->toolbox(), true /* unitTest */); _commandTree->setToolbox(qgcApp()->toolbox()); } void MissionCommandTreeTest::cleanup(void) { delete _commandTree; } QString MissionCommandTreeTest::_rawName(int id) { return QString("UNITTEST_%1").arg(id); } QString MissionCommandTreeTest::_friendlyName(int id) { return QString("Unit Test %1").arg(id); } QString MissionCommandTreeTest::_paramLabel(int index) { return QString("param%1").arg(index); } /// Verifies that all values have been set void MissionCommandTreeTest::_checkFullInfoMap(const MissionCommandUIInfo* uiInfo) { QVERIFY(uiInfo->_infoMap.contains(MissionCommandUIInfo::_rawNameJsonKey)); QVERIFY(uiInfo->_infoMap.contains(MissionCommandUIInfo::_categoryJsonKey)); QVERIFY(uiInfo->_infoMap.contains(MissionCommandUIInfo::_descriptionJsonKey)); QVERIFY(uiInfo->_infoMap.contains(MissionCommandUIInfo::_friendlyEditJsonKey)); QVERIFY(uiInfo->_infoMap.contains(MissionCommandUIInfo::_friendlyNameJsonKey)); QVERIFY(uiInfo->_infoMap.contains(MissionCommandUIInfo::_standaloneCoordinateJsonKey)); QVERIFY(uiInfo->_infoMap.contains(MissionCommandUIInfo::_specifiesCoordinateJsonKey)); } // Verifies that values match settings for base tree void MissionCommandTreeTest::_checkBaseValues(const MissionCommandUIInfo* uiInfo, int command) { QVERIFY(uiInfo != NULL); _checkFullInfoMap(uiInfo); QCOMPARE(uiInfo->command(), (MAV_CMD)command); QCOMPARE(uiInfo->rawName(), _rawName(command)); QCOMPARE(uiInfo->category(), QStringLiteral("category")); QCOMPARE(uiInfo->description(), QStringLiteral("description")); QCOMPARE(uiInfo->friendlyEdit(), true); QCOMPARE(uiInfo->friendlyName(), _friendlyName(command)); QCOMPARE(uiInfo->isStandaloneCoordinate(), true); QCOMPARE(uiInfo->specifiesCoordinate(), true); for (int i=1; i<=7; i++) { bool showUI; const MissionCmdParamInfo* paramInfo = uiInfo->getParamInfo(i, showUI); QVERIFY(showUI); QVERIFY(paramInfo); QCOMPARE(paramInfo->decimalPlaces(), 1); QCOMPARE(paramInfo->defaultValue(), 1.0); QCOMPARE(paramInfo->enumStrings().count(), 2); QCOMPARE(paramInfo->enumStrings()[0], QStringLiteral("1")); QCOMPARE(paramInfo->enumStrings()[1], QStringLiteral("2")); QCOMPARE(paramInfo->enumValues().count(), 2); QCOMPARE(paramInfo->enumValues()[0].toDouble(), 1.0); QCOMPARE(paramInfo->enumValues()[1].toDouble(), 2.0); QCOMPARE(paramInfo->label(), _paramLabel(i)); QCOMPARE(paramInfo->param(), i); QCOMPARE(paramInfo->units(), QStringLiteral("units")); } } // Verifies that values match settings for an override void MissionCommandTreeTest::_checkOverrideParamValues(const MissionCommandUIInfo* uiInfo, int command, int paramIndex) { QString overrideString = QString("override fw %1 %2").arg(command).arg(paramIndex); bool showUI; const MissionCmdParamInfo* paramInfo = uiInfo->getParamInfo(paramIndex, showUI); QVERIFY(showUI); QVERIFY(paramInfo); QCOMPARE(paramInfo->decimalPlaces(), 1); QCOMPARE(paramInfo->defaultValue(), 1.0); QCOMPARE(paramInfo->enumStrings().count(), 2); QCOMPARE(paramInfo->enumStrings()[0], QStringLiteral("1")); QCOMPARE(paramInfo->enumStrings()[1], QStringLiteral("2")); QCOMPARE(paramInfo->enumValues().count(), 2); QCOMPARE(paramInfo->enumValues()[0].toDouble(), 1.0); QCOMPARE(paramInfo->enumValues()[1].toDouble(), 2.0); QCOMPARE(paramInfo->label(), overrideString); QCOMPARE(paramInfo->param(), paramIndex); QCOMPARE(paramInfo->units(), overrideString); } // Verifies that values match settings for an override void MissionCommandTreeTest::_checkOverrideValues(const MissionCommandUIInfo* uiInfo, int command) { bool showUI; QString overrideString = QString("override fw %1").arg(command); QVERIFY(uiInfo != NULL); _checkFullInfoMap(uiInfo); QCOMPARE(uiInfo->command(), (MAV_CMD)command); QCOMPARE(uiInfo->rawName(), _rawName(command)); QCOMPARE(uiInfo->category(), overrideString); QCOMPARE(uiInfo->description(), overrideString); QCOMPARE(uiInfo->friendlyEdit(), true); QCOMPARE(uiInfo->friendlyName(), _friendlyName(command)); QCOMPARE(uiInfo->isStandaloneCoordinate(), false); QCOMPARE(uiInfo->specifiesCoordinate(), false); QVERIFY(uiInfo->getParamInfo(2, showUI)); QCOMPARE(showUI, false); QVERIFY(uiInfo->getParamInfo(4, showUI)); QCOMPARE(showUI, false); QVERIFY(uiInfo->getParamInfo(6, showUI)); QCOMPARE(showUI, false); _checkOverrideParamValues(uiInfo, command, 1); _checkOverrideParamValues(uiInfo, command, 3); _checkOverrideParamValues(uiInfo, command, 5); } void MissionCommandTreeTest::testJsonLoad(void) { bool showUI; // Test loading from the bad command list MissionCommandList* commandList = _commandTree->_staticCommandTree[MAV_AUTOPILOT_GENERIC][MAV_TYPE_GENERIC]; QVERIFY(commandList != NULL); // Command 1 should have all values defaulted, no params MissionCommandUIInfo* uiInfo = commandList->getUIInfo((MAV_CMD)1); QVERIFY(uiInfo != NULL); _checkFullInfoMap(uiInfo); QCOMPARE(uiInfo->command(), (MAV_CMD)1); QCOMPARE(uiInfo->rawName(), _rawName(1)); QVERIFY(uiInfo->category() == MissionCommandUIInfo::_advancedCategory); QVERIFY(uiInfo->description().isEmpty()); QCOMPARE(uiInfo->friendlyEdit(), false); QCOMPARE(uiInfo->friendlyName(), uiInfo->rawName()); QCOMPARE(uiInfo->isStandaloneCoordinate(), false); QCOMPARE(uiInfo->specifiesCoordinate(), false); for (int i=1; i<=7; i++) { QVERIFY(uiInfo->getParamInfo(i, showUI) == NULL); QCOMPARE(showUI, false); } // Command 2 should all values defaulted for param 1 uiInfo = commandList->getUIInfo((MAV_CMD)2); QVERIFY(uiInfo != NULL); const MissionCmdParamInfo* paramInfo = uiInfo->getParamInfo(1, showUI); QVERIFY(paramInfo); QCOMPARE(showUI, true); QCOMPARE(paramInfo->decimalPlaces(), -1); QCOMPARE(paramInfo->defaultValue(), 0.0); QCOMPARE(paramInfo->enumStrings().count(), 0); QCOMPARE(paramInfo->enumValues().count(), 0); QCOMPARE(paramInfo->label(), _paramLabel(1)); QCOMPARE(paramInfo->param(), 1); QVERIFY(paramInfo->units().isEmpty()); for (int i=2; i<=7; i++) { QVERIFY(uiInfo->getParamInfo(i, showUI) == NULL); QCOMPARE(showUI, false); } // Command 3 should have all values set _checkBaseValues(commandList->getUIInfo((MAV_CMD)3), 3); } void MissionCommandTreeTest::testOverride(void) { // Generic/Generic should not have any overrides Vehicle* vehicle = new Vehicle(MAV_AUTOPILOT_GENERIC, MAV_TYPE_GENERIC, qgcApp()->toolbox()->firmwarePluginManager()); _checkBaseValues(_commandTree->getUIInfo(vehicle, (MAV_CMD)4), 4); delete vehicle; // Generic/FixedWing should have overrides vehicle = new Vehicle(MAV_AUTOPILOT_GENERIC, MAV_TYPE_FIXED_WING, qgcApp()->toolbox()->firmwarePluginManager()); _checkOverrideValues(_commandTree->getUIInfo(vehicle, (MAV_CMD)4), 4); delete vehicle; } void MissionCommandTreeTest::testAllTrees(void) { QList firmwareList; QList vehicleList; firmwareList << MAV_AUTOPILOT_GENERIC << MAV_AUTOPILOT_PX4 << MAV_AUTOPILOT_ARDUPILOTMEGA; vehicleList << MAV_TYPE_GENERIC << MAV_TYPE_QUADROTOR << MAV_TYPE_FIXED_WING << MAV_TYPE_GROUND_ROVER << MAV_TYPE_SUBMARINE << MAV_TYPE_VTOL_QUADROTOR; // This will cause all of the variants of collapsed trees to be built for(MAV_AUTOPILOT firmwareType: firmwareList) { for (MAV_TYPE vehicleType: vehicleList) { if (firmwareType == MAV_AUTOPILOT_ARDUPILOTMEGA && vehicleType == MAV_TYPE_VTOL_QUADROTOR) { // VTOL in ArduPilot shows up as plane so we can test this pair continue; } qDebug() << firmwareType << vehicleType; Vehicle* vehicle = new Vehicle(firmwareType, vehicleType, qgcApp()->toolbox()->firmwarePluginManager()); QVERIFY(qgcApp()->toolbox()->missionCommandTree()->getUIInfo(vehicle, MAV_CMD_NAV_WAYPOINT) != NULL); delete vehicle; } } }