From 3b328f36c43afbcd32d6b9aaefa0ea15fabf320d Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Thu, 11 Dec 2014 22:12:32 -0800 Subject: [PATCH] New FactSystem unit test --- files/qml/FactTextInput.qml | 2 +- qgroundcontrol.pro | 8 +- qgroundcontrol.qrc | 1 + src/FactSystem/FactSystemTest.cc | 194 ++++++++++++++++++++++++++++++ src/FactSystem/FactSystemTest.h | 58 +++++++++ src/FactSystem/FactSystemTest.qml | 16 +++ 6 files changed, 274 insertions(+), 5 deletions(-) create mode 100644 src/FactSystem/FactSystemTest.cc create mode 100644 src/FactSystem/FactSystemTest.h create mode 100644 src/FactSystem/FactSystemTest.qml diff --git a/files/qml/FactTextInput.qml b/files/qml/FactTextInput.qml index 560ff0d6a..41212c082 100644 --- a/files/qml/FactTextInput.qml +++ b/files/qml/FactTextInput.qml @@ -1,4 +1,4 @@ -import QtQuick 2.0 +import QtQuick 2.2 import QtQuick.Controls 1.2 import QGroundControl.FactSystem 1.0 diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 20ab90558..846c8945c 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -484,7 +484,6 @@ HEADERS += \ src/uas/QGCUASParamManagerInterface.h \ src/uas/QGCUASFileManager.h \ src/ui/QGCUASFileView.h \ - src/uas/QGCUASWorker.h \ src/CmdLineOptParser.h \ src/uas/QGXPX4UAS.h \ src/QGCFileDialog.h \ @@ -625,7 +624,6 @@ SOURCES += \ src/ui/menuactionhelper.cpp \ src/uas/QGCUASFileManager.cc \ src/ui/QGCUASFileView.cc \ - src/uas/QGCUASWorker.cc \ src/CmdLineOptParser.cc \ src/uas/QGXPX4UAS.cc \ src/QGCFileDialog.cc \ @@ -670,7 +668,8 @@ HEADERS += \ src/qgcunittest/LinkManagerTest.h \ src/qgcunittest/MainWindowTest.h \ src/AutoPilotPlugins/PX4/Tests/FlightModeConfigTest.h \ - src/qgcunittest/MavlinkLogTest.h + src/qgcunittest/MavlinkLogTest.h \ + src/FactSystem/FactSystemTest.h SOURCES += \ src/qgcunittest/UnitTest.cc \ @@ -691,7 +690,8 @@ SOURCES += \ src/qgcunittest/LinkManagerTest.cc \ src/qgcunittest/MainWindowTest.cc \ src/AutoPilotPlugins/PX4/Tests/FlightModeConfigTest.cc \ - src/qgcunittest/MavlinkLogTest.cc + src/qgcunittest/MavlinkLogTest.cc \ + src/FactSystem/FactSystemTest.cc } # diff --git a/qgroundcontrol.qrc b/qgroundcontrol.qrc index 30f19bf62..e86f2173b 100644 --- a/qgroundcontrol.qrc +++ b/qgroundcontrol.qrc @@ -230,6 +230,7 @@ src/qgcunittest/MockLink.param + src/FactSystem/FactSystemTest.qml files/QLoggingCategory/qtlogging.ini diff --git a/src/FactSystem/FactSystemTest.cc b/src/FactSystem/FactSystemTest.cc new file mode 100644 index 000000000..c64b92727 --- /dev/null +++ b/src/FactSystem/FactSystemTest.cc @@ -0,0 +1,194 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2014 QGROUNDCONTROL PROJECT + + 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 . + + ======================================================================*/ + +/// @file +/// @author Don Gagne + +#include "FactSystemTest.h" +#include "LinkManager.h" +#include "MockLink.h" +#include "AutoPilotPluginManager.h" +#include "UASManager.h" +#include "QGCApplication.h" +#include "QGCQuickWidget.h" + +#include + +UT_REGISTER_TEST(FactSystemTest) + +/// FactSystem Unit Test +FactSystemTest::FactSystemTest(void) +{ + +} + +void FactSystemTest::init(void) +{ + UnitTest::init(); + + LinkManager* _linkMgr = LinkManager::instance(); + + MockLink* link = new MockLink(); + _linkMgr->addLink(link); + _linkMgr->connectLink(link); + + // Wait for the uas to work it's way through the various threads + + QSignalSpy spyUas(UASManager::instance(), SIGNAL(activeUASSet(UASInterface*))); + QCOMPARE(spyUas.wait(5000), true); + + _uas = UASManager::instance()->getActiveUAS(); + Q_ASSERT(_uas); + + _paramMgr = _uas->getParamManager(); + Q_ASSERT(_paramMgr); + + // Get the plugin for the uas + + AutoPilotPluginManager* pluginMgr = AutoPilotPluginManager::instance(); + Q_ASSERT(pluginMgr); + + _plugin = pluginMgr->getInstanceForAutoPilotPlugin(_uas); + Q_ASSERT(_plugin); + + // Wait for the plugin to be ready + + QSignalSpy spyPlugin(_plugin, SIGNAL(pluginReady())); + if (!_plugin->pluginIsReady()) { + QCOMPARE(spyPlugin.wait(5000), true); + } + Q_ASSERT(_plugin->pluginIsReady()); +} + +void FactSystemTest::cleanup(void) +{ + UnitTest::cleanup(); +} + +/// Basic test of parameter values in Fact System +void FactSystemTest::_parameter_test(void) +{ + // Get the parameter facts from the AutoPilot + + AutoPilotPluginManager* pluginMgr = AutoPilotPluginManager::instance(); + Q_ASSERT(pluginMgr); + + AutoPilotPlugin* plugin = pluginMgr->getInstanceForAutoPilotPlugin(_uas); + Q_ASSERT(plugin); + + QObject* parameterFacts = plugin->parameterFacts(); + QVERIFY(parameterFacts != NULL); + + // Compare the value in the Parameter Manager with the value from the FactSystem + + QVariant factVariant = parameterFacts->property("RC_MAP_THROTTLE"); + Fact* fact = factVariant.value(); + QVERIFY(fact != NULL); + QVariant factValue = fact->value(); + QCOMPARE(factValue.isValid(), true); + + QVariant paramValue; + Q_ASSERT(_paramMgr->getParameterValue(_paramMgr->getDefaultComponentId(), "RC_MAP_THROTTLE", paramValue)); + + QCOMPARE(factValue.toInt(), paramValue.toInt()); +} + +/// Test that QML can reference a Fact +void FactSystemTest::_qml_test(void) +{ + QGCQuickWidget* widget = new QGCQuickWidget; + + widget->setSource(QUrl::fromUserInput("qrc:unittest/FactSystemTest.qml")); + + QQuickItem* rootObject = widget->rootObject(); + QObject* control = rootObject->findChild("testControl"); + QVERIFY(control != NULL); + QVariant qmlValue = control->property("text").toInt(); + + QVariant paramMgrValue; + Q_ASSERT(_paramMgr->getParameterValue(_paramMgr->getDefaultComponentId(), "RC_MAP_THROTTLE", paramMgrValue)); + + QCOMPARE(qmlValue.toInt(), paramMgrValue.toInt()); +} + +// Test correct behavior when the Param Manager gets a parameter update +void FactSystemTest::_paramMgrSignal_test(void) +{ + // Get the parameter Fact from the AutoPilot + + AutoPilotPluginManager* pluginMgr = AutoPilotPluginManager::instance(); + Q_ASSERT(pluginMgr); + + AutoPilotPlugin* plugin = pluginMgr->getInstanceForAutoPilotPlugin(_uas); + Q_ASSERT(plugin); + + QObject* parameterFacts = plugin->parameterFacts(); + QVERIFY(parameterFacts != NULL); + + QVariant factVariant = parameterFacts->property("RC_MAP_THROTTLE"); + Fact* fact = factVariant.value(); + QVERIFY(fact != NULL); + + // Setting a new value into the parameter should trigger a valueChanged signal on the Fact + + QSignalSpy spyFact(fact, SIGNAL(valueChanged(QVariant))); + + QVariant paramValue = 12; + _paramMgr->setParameter(_paramMgr->getDefaultComponentId(), "RC_MAP_THROTTLE", paramValue); + _paramMgr->sendPendingParameters(true, false); + + // Wait for the Fact::valueChanged signal to come through + QCOMPARE(spyFact.wait(5000), true); + + // Make sure the signal has the right value + QList arguments = spyFact.takeFirst(); + qDebug() << arguments.at(0).type(); + QCOMPARE(arguments.at(0).toInt(), 12); + + // Make sure the Fact has the new value + QCOMPARE(fact->value().toInt(), 12); +} + +/// Test QML getting an updated Fact value +void FactSystemTest::_qmlUpdate_test(void) +{ + QGCQuickWidget* widget = new QGCQuickWidget; + + widget->setSource(QUrl::fromUserInput("qrc:unittest/FactSystemTest.qml")); + + // Change the value using param manager + + QVariant paramValue = 12; + _paramMgr->setParameter(_paramMgr->getDefaultComponentId(), "RC_MAP_THROTTLE", paramValue); + _paramMgr->sendPendingParameters(true, false); + + QTest::qWait(500); // Let the signals flow through + + // Make sure the qml has the right value + + QQuickItem* rootObject = widget->rootObject(); + QObject* control = rootObject->findChild("testControl"); + QVERIFY(control != NULL); + QCOMPARE(control->property("text").toInt(), 12); +} + diff --git a/src/FactSystem/FactSystemTest.h b/src/FactSystem/FactSystemTest.h new file mode 100644 index 000000000..07d43f2d0 --- /dev/null +++ b/src/FactSystem/FactSystemTest.h @@ -0,0 +1,58 @@ +/*===================================================================== + + QGroundControl Open Source Ground Control Station + + (c) 2009 - 2014 QGROUNDCONTROL PROJECT + + 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 . + + ======================================================================*/ + +/// @file +/// @author Don Gagne + +#ifndef FactSystemTest_H +#define FactSystemTest_H + +#include "UnitTest.h" +#include "UASInterface.h" +#include "AutoPilotPlugin.h" + +// Unit Test for Fact System +class FactSystemTest : public UnitTest +{ + Q_OBJECT + +public: + FactSystemTest(void); + +private slots: + void init(void); + void cleanup(void); + + void _parameter_test(void); + void _qml_test(void); + void _paramMgrSignal_test(void); + void _qmlUpdate_test(void); + +private: + UASInterface* _uas; + QGCUASParamManagerInterface* _paramMgr; + AutoPilotPlugin* _plugin; + LinkManager* _linkMgr; +}; + +#endif diff --git a/src/FactSystem/FactSystemTest.qml b/src/FactSystem/FactSystemTest.qml new file mode 100644 index 000000000..6559a3ec0 --- /dev/null +++ b/src/FactSystem/FactSystemTest.qml @@ -0,0 +1,16 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import QGroundControl.FactSystem 1.0 +import QGroundControlFactControls 1.0 + +Item { + TextInput { + objectName: "testControl" + text: parameterFacts.RC_MAP_THROTTLE.value + font.family: "Helvetica" + font.pointSize: 24 + color: "red" + focus: true + onAccepted: { parameterFacts.RC_MAP_THROTTLE.value = text; } + } +} \ No newline at end of file -- 2.22.0