地面站终端 App
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

223 lines
8.8 KiB

/****************************************************************************
*
* (c) 2009-2016 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* 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<MAV_AUTOPILOT> firmwareList;
QList<MAV_TYPE> 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;
}
}
}