3 changed files with 397 additions and 2 deletions
@ -0,0 +1,306 @@ |
|||||||
|
/*=====================================================================
|
||||||
|
|
||||||
|
QGroundControl Open Source Ground Control Station |
||||||
|
|
||||||
|
(c) 2009 - 2014 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||||
|
|
||||||
|
This file is part of the QGROUNDCONTROL project |
||||||
|
|
||||||
|
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
======================================================================*/ |
||||||
|
|
||||||
|
#include "FlightModeConfigTest.h" |
||||||
|
#include "FlightModeConfig.h" |
||||||
|
#include "UASManager.h" |
||||||
|
#include "MockQGCUASParamManager.h" |
||||||
|
|
||||||
|
/// @file
|
||||||
|
/// @brief FlightModeConfig unit test
|
||||||
|
///
|
||||||
|
/// @author Don Gagne <don@thegagnes.com>
|
||||||
|
|
||||||
|
FlightModeConfigUnitTest::FlightModeConfigUnitTest(void) : |
||||||
|
_mockUASManager(NULL) |
||||||
|
{ |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::init(void) |
||||||
|
{ |
||||||
|
_mockUASManager = new MockUASManager(); |
||||||
|
Q_ASSERT(_mockUASManager); |
||||||
|
|
||||||
|
UASManager::setMockUASManager(_mockUASManager); |
||||||
|
|
||||||
|
_mockUAS = new MockUAS(); |
||||||
|
Q_ASSERT(_mockUAS); |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::cleanup(void) |
||||||
|
{ |
||||||
|
Q_ASSERT(_mockUAS); |
||||||
|
delete _mockUAS; |
||||||
|
|
||||||
|
UASManager::setMockUASManager(NULL); |
||||||
|
|
||||||
|
Q_ASSERT(_mockUASManager); |
||||||
|
delete _mockUASManager; |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_nullUAS_test(void) |
||||||
|
{ |
||||||
|
// When there is no UAS the widget should be disabled
|
||||||
|
FlightModeConfig* fmc = new FlightModeConfig(); |
||||||
|
QCOMPARE(fmc->isEnabled(), false); |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_validUAS_test(void) |
||||||
|
{ |
||||||
|
// With an active UAS widget should be enabled
|
||||||
|
_mockUASManager->setMockActiveUAS(_mockUAS); |
||||||
|
FlightModeConfig* fmc = new FlightModeConfig(); |
||||||
|
QCOMPARE(fmc->isEnabled(), true); |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_nullToValidUAS_test(void) |
||||||
|
{ |
||||||
|
// start with no UAS
|
||||||
|
FlightModeConfig* fmc = new FlightModeConfig(); |
||||||
|
|
||||||
|
// clear it out and validate widget gets disabled
|
||||||
|
_mockUASManager->setMockActiveUAS(NULL); |
||||||
|
QCOMPARE(fmc->isEnabled(), false); |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_simpleModeFixedWing_test(void) |
||||||
|
{ |
||||||
|
// Fixed wing does not have simple mode, all checkboxes should be disabled
|
||||||
|
_mockUAS->setMockSystemType(MAV_TYPE_FIXED_WING); |
||||||
|
_mockUASManager->setMockActiveUAS(_mockUAS); |
||||||
|
FlightModeConfig* fmc = new FlightModeConfig(); |
||||||
|
_findControls(fmc); |
||||||
|
|
||||||
|
for (size_t i=0; i<_cCombo; i++) { |
||||||
|
QCOMPARE(_rgSimpleModeCheckBox[i]->isEnabled(), false); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_simpleModeRover_test(void) |
||||||
|
{ |
||||||
|
// Rover does not have simple mode, all checkboxes should be disabled
|
||||||
|
_mockUAS->setMockSystemType(MAV_TYPE_GROUND_ROVER); |
||||||
|
_mockUASManager->setMockActiveUAS(_mockUAS); |
||||||
|
FlightModeConfig* fmc = new FlightModeConfig(); |
||||||
|
_findControls(fmc); |
||||||
|
|
||||||
|
for (size_t i=0; i<_cCombo; i++) { |
||||||
|
QCOMPARE(_rgSimpleModeCheckBox[i]->isEnabled(), false); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_simpleModeRotor_test(void) |
||||||
|
{ |
||||||
|
// Rotor has simple mode, all checkboxes should be enabled
|
||||||
|
_mockUAS->setMockSystemType(MAV_TYPE_QUADROTOR); |
||||||
|
_mockUASManager->setMockActiveUAS(_mockUAS); |
||||||
|
FlightModeConfig* fmc = new FlightModeConfig(); |
||||||
|
_findControls(fmc); |
||||||
|
|
||||||
|
for (size_t i=0; i<_cCombo; i++) { |
||||||
|
QCOMPARE(_rgSimpleModeCheckBox[i]->isEnabled(), true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_modeSwitchParam_test(void) |
||||||
|
{ |
||||||
|
_mockUAS->setMockSystemType(MAV_TYPE_QUADROTOR); |
||||||
|
_mockUASManager->setMockActiveUAS(_mockUAS); |
||||||
|
FlightModeConfig* fmc = new FlightModeConfig(); |
||||||
|
_findControls(fmc); |
||||||
|
|
||||||
|
const char* rgModeSwitchParam[_cCombo] = { "FLTMODE1", "FLTMODE2", "FLTMODE3", "FLTMODE4", "FLTMODE5", "FLTMODE6" }; |
||||||
|
const int rgModeSwitchValue[_cCombo] = { 0, 2, 4, 6, 8, 10 }; |
||||||
|
|
||||||
|
MockQGCUASParamManager::ParamMap_t mapParams; |
||||||
|
for (size_t i=0; i<_cCombo; i++) { |
||||||
|
mapParams[rgModeSwitchParam[i]] = QVariant(QChar(rgModeSwitchValue[i])); |
||||||
|
} |
||||||
|
|
||||||
|
int simpleModeBitMask = 21; |
||||||
|
mapParams["SIMPLE"] = QVariant(QChar(simpleModeBitMask)); |
||||||
|
_mockUAS->setMockParametersAndSignal(mapParams); |
||||||
|
|
||||||
|
// Check that the UI is showing the correct information
|
||||||
|
for (size_t i=0; i<_cCombo; i++) { |
||||||
|
QComboBox* combo = _rgCombo[i]; |
||||||
|
|
||||||
|
// Check for the correct selection in the combo boxes. Combo boxes store the mode
|
||||||
|
// in the item data, so use that to compare
|
||||||
|
QCOMPARE(combo->itemData(combo->currentIndex()), mapParams[rgModeSwitchParam[i]]); |
||||||
|
|
||||||
|
// Make sure the text for the current selection doesn't contain the text Unknown
|
||||||
|
// which means that it received an unsupported mode
|
||||||
|
QCOMPARE(combo->currentText().contains("unknown", Qt::CaseInsensitive), QBool(false)); |
||||||
|
|
||||||
|
// Check that the right simple mode check boxes are checked
|
||||||
|
QCOMPARE(_rgSimpleModeCheckBox[i]->isChecked(), !!((1 << i) & simpleModeBitMask)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// Click Save button and make sure we get the same values back through setParameter calls
|
||||||
|
QTest::mouseClick(_saveButton, Qt::LeftButton); |
||||||
|
MockQGCUASParamManager* paramMgr = _mockUAS->getMockQGCUASParamManager(); |
||||||
|
MockQGCUASParamManager::ParamMap_t mapParamsSet = paramMgr->getMockSetParameters(); |
||||||
|
QMapIterator<QString, QVariant> i(mapParams); |
||||||
|
while (i.hasNext()) { |
||||||
|
i.next(); |
||||||
|
QCOMPARE(mapParamsSet.contains(i.key()), true); |
||||||
|
int receivedValue = mapParamsSet[i.key()].toInt(); |
||||||
|
int expectedValue = i.value().toInt(); |
||||||
|
QCOMPARE(receivedValue, expectedValue); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_pwmTestWorker(int systemType, int modeSwitchChannel, const char* modeSwitchParam) |
||||||
|
{ |
||||||
|
_mockUAS->setMockSystemType(systemType); |
||||||
|
_mockUASManager->setMockActiveUAS(_mockUAS); |
||||||
|
FlightModeConfig* fmc = new FlightModeConfig(); |
||||||
|
_findControls(fmc); |
||||||
|
|
||||||
|
MockQGCUASParamManager::ParamMap_t mapParams; |
||||||
|
if (modeSwitchParam != NULL) { |
||||||
|
// Param is 1-based, code in here is all 0-base
|
||||||
|
mapParams[modeSwitchParam] = QVariant(QChar(modeSwitchChannel+1)); |
||||||
|
_mockUAS->setMockParametersAndSignal(mapParams); |
||||||
|
} |
||||||
|
|
||||||
|
const int pwmBoundary[] = { 1230, 1360, 1490, 1620, 1749, 1900 }; |
||||||
|
|
||||||
|
int lowerPWM = 0; |
||||||
|
for (size_t i=0; i<_cCombo; i++) { |
||||||
|
// emit a PWM value at the mid point of the switch position
|
||||||
|
int pwmMidPoint = ((pwmBoundary[i] - lowerPWM) / 2) + lowerPWM; |
||||||
|
_mockUAS->emitRemoteControlChannelRawChanged(modeSwitchChannel, pwmMidPoint); |
||||||
|
|
||||||
|
// Make sure that only the correct pwm label has a style set on it for highlight
|
||||||
|
for (size_t j=0; j<_cCombo; j++) { |
||||||
|
if (j == i) { |
||||||
|
QVERIFY(_rgPWMLabel[j]->styleSheet().length() > 0); |
||||||
|
} else { |
||||||
|
QCOMPARE(_rgPWMLabel[j]->styleSheet().length(), 0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
lowerPWM = pwmBoundary[i]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_pwmFixedWing_test(void) |
||||||
|
{ |
||||||
|
// FixedWing has mode switch channel on FLTMODE_CH param
|
||||||
|
_pwmTestWorker(MAV_TYPE_FIXED_WING, 7, "FLTMODE_CH"); |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_pwmRotor_test(void) |
||||||
|
{ |
||||||
|
// Rotor is hardwired to 0-based rc channel 4 for mode wsitch
|
||||||
|
_pwmTestWorker(MAV_TYPE_QUADROTOR, 4, NULL); |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_pwmRover_test(void) |
||||||
|
{ |
||||||
|
// Rover has mode switch channel on MODE_CH param
|
||||||
|
_pwmTestWorker(MAV_TYPE_GROUND_ROVER, 7, "MODE_CH"); |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_pwmInvalidChannel_test(void) |
||||||
|
{ |
||||||
|
// Rover has mode switch channel on MODE_CH param
|
||||||
|
_mockUAS->setMockSystemType(MAV_TYPE_GROUND_ROVER); |
||||||
|
_mockUASManager->setMockActiveUAS(_mockUAS); |
||||||
|
FlightModeConfig* fmc = new FlightModeConfig(); |
||||||
|
_findControls(fmc); |
||||||
|
|
||||||
|
int modeSwitchChannel = 7; |
||||||
|
MockQGCUASParamManager::ParamMap_t mapParams; |
||||||
|
mapParams["MODE_CH"] = QVariant(QChar(modeSwitchChannel+1)); // 1-based
|
||||||
|
_mockUAS->setMockParametersAndSignal(mapParams); |
||||||
|
|
||||||
|
const int pwmBoundary[] = { 1230, 1360, 1490, 1620, 1749, 1900 }; |
||||||
|
|
||||||
|
int lowerPWM = 0; |
||||||
|
for (size_t i=0; i<_cCombo; i++) { |
||||||
|
// emit a PWM value at the mid point of the switch position
|
||||||
|
int pwmMidPoint = ((pwmBoundary[i] - lowerPWM) / 2) + lowerPWM; |
||||||
|
// emit rc values on wrong channel
|
||||||
|
_mockUAS->emitRemoteControlChannelRawChanged(modeSwitchChannel-1, pwmMidPoint); |
||||||
|
|
||||||
|
// Make sure no label have a style set on it for highlight
|
||||||
|
for (size_t j=0; j<_cCombo; j++) { |
||||||
|
QCOMPARE(_rgPWMLabel[j]->styleSheet().length(), 0); |
||||||
|
} |
||||||
|
|
||||||
|
lowerPWM = pwmBoundary[i]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_unknownSystemType_test(void) |
||||||
|
{ |
||||||
|
// Set the system type to something we can't handle, make sure we are disabled
|
||||||
|
_mockUAS->setMockSystemType(MAV_TYPE_ENUM_END); |
||||||
|
_mockUASManager->setMockActiveUAS(_mockUAS); |
||||||
|
FlightModeConfig* fmc = new FlightModeConfig(); |
||||||
|
QCOMPARE(fmc->isEnabled(), false); |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_unknownMode_test(void) |
||||||
|
{ |
||||||
|
_mockUAS->setMockSystemType(MAV_TYPE_QUADROTOR); |
||||||
|
_mockUASManager->setMockActiveUAS(_mockUAS); |
||||||
|
FlightModeConfig* fmc = new FlightModeConfig(); |
||||||
|
_findControls(fmc); |
||||||
|
|
||||||
|
// Set an unknown mode
|
||||||
|
MockQGCUASParamManager::ParamMap_t mapParams; |
||||||
|
mapParams["FLTMODE1"] = QVariant(QChar(100)); |
||||||
|
_mockUAS->setMockParametersAndSignal(mapParams); |
||||||
|
|
||||||
|
// Check for the correct selection in the combo boxes. Combo boxes store the mode
|
||||||
|
// in the item data, so use that to compare
|
||||||
|
QCOMPARE(_rgCombo[0]->itemData(_rgCombo[0]->currentIndex()), mapParams["FLTMODE1"]); |
||||||
|
|
||||||
|
// Make sure the text for the current selection contains the text Unknown
|
||||||
|
QCOMPARE(_rgCombo[0]->currentText().contains("unknown", Qt::CaseInsensitive), QBool(true)); |
||||||
|
} |
||||||
|
|
||||||
|
void FlightModeConfigUnitTest::_findControls(QObject* fmc) |
||||||
|
{ |
||||||
|
// Find all the controls
|
||||||
|
for (size_t i=0; i<_cCombo; i++) { |
||||||
|
_rgLabel[i] = fmc->findChild<QLabel*>(QString("mode%1Label").arg(i)); |
||||||
|
_rgCombo[i] = fmc->findChild<QComboBox*>(QString("mode%1ComboBox").arg(i)); |
||||||
|
_rgSimpleModeCheckBox[i] = fmc->findChild<QCheckBox*>(QString("mode%1SimpleCheckBox").arg(i)); |
||||||
|
_rgPWMLabel[i] = fmc->findChild<QLabel*>(QString("mode%1PWMLabel").arg(i)); |
||||||
|
Q_ASSERT(_rgLabel[i]); |
||||||
|
Q_ASSERT(_rgCombo[i]); |
||||||
|
Q_ASSERT(_rgSimpleModeCheckBox[i]); |
||||||
|
Q_ASSERT(_rgPWMLabel[i]); |
||||||
|
} |
||||||
|
|
||||||
|
_saveButton = fmc->findChild<QPushButton*>("savePushButton"); |
||||||
|
Q_ASSERT(_saveButton); |
||||||
|
} |
||||||
|
|
@ -0,0 +1,87 @@ |
|||||||
|
/*=====================================================================
|
||||||
|
|
||||||
|
QGroundControl Open Source Ground Control Station |
||||||
|
|
||||||
|
(c) 2009 - 2014 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
|
||||||
|
|
||||||
|
This file is part of the QGROUNDCONTROL project |
||||||
|
|
||||||
|
QGROUNDCONTROL is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 3 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
QGROUNDCONTROL is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
======================================================================*/ |
||||||
|
|
||||||
|
#ifndef FLIGHTMODECONFIGTEST_H |
||||||
|
#define FLIGHTMODECONFIGTEST_H |
||||||
|
|
||||||
|
#include "AutoTest.h" |
||||||
|
#include "MockUASManager.h" |
||||||
|
#include "MockUAS.h" |
||||||
|
#include <QLabel> |
||||||
|
#include <QComboBox> |
||||||
|
#include <QCheckBox> |
||||||
|
#include <QLabel> |
||||||
|
#include <QPushButton> |
||||||
|
|
||||||
|
class FlightModeConfig; |
||||||
|
|
||||||
|
/// @file
|
||||||
|
/// @brief FlightModeConfig unit test
|
||||||
|
///
|
||||||
|
/// @author Don Gagne <don@thegagnes.com>
|
||||||
|
|
||||||
|
class FlightModeConfigUnitTest : public QObject |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
public: |
||||||
|
FlightModeConfigUnitTest(void); |
||||||
|
|
||||||
|
private slots: |
||||||
|
void init(void); |
||||||
|
void cleanup(void); |
||||||
|
|
||||||
|
void _nullUAS_test(void); |
||||||
|
void _validUAS_test(void); |
||||||
|
void _nullToValidUAS_test(void); |
||||||
|
void _simpleModeFixedWing_test(void); |
||||||
|
void _simpleModeRover_test(void); |
||||||
|
void _simpleModeRotor_test(void); |
||||||
|
void _modeSwitchParam_test(void); |
||||||
|
void _pwmFixedWing_test(void); |
||||||
|
void _pwmRotor_test(void); |
||||||
|
void _pwmRover_test(void); |
||||||
|
void _pwmInvalidChannel_test(void); |
||||||
|
void _unknownSystemType_test(void); |
||||||
|
void _unknownMode_test(void); |
||||||
|
|
||||||
|
private: |
||||||
|
void _findControls(QObject* fmc); |
||||||
|
void _pwmTestWorker(int systemType, int modeSwitchChannel, const char* modeSwitchParam); |
||||||
|
|
||||||
|
private: |
||||||
|
MockUASManager* _mockUASManager; |
||||||
|
MockUAS* _mockUAS; |
||||||
|
|
||||||
|
// FlightModeConfig ui elements
|
||||||
|
static const size_t _cCombo = 6; |
||||||
|
QLabel* _rgLabel[_cCombo]; |
||||||
|
QComboBox* _rgCombo[_cCombo]; |
||||||
|
QCheckBox* _rgSimpleModeCheckBox[_cCombo]; |
||||||
|
QLabel* _rgPWMLabel[_cCombo]; |
||||||
|
QPushButton* _saveButton; |
||||||
|
}; |
||||||
|
|
||||||
|
DECLARE_TEST(FlightModeConfigUnitTest) |
||||||
|
|
||||||
|
#endif |
Loading…
Reference in new issue