9 changed files with 356 additions and 43 deletions
@ -0,0 +1,154 @@
@@ -0,0 +1,154 @@
|
||||
/****************************************************************************
|
||||
* |
||||
* (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 "StructureScanComplexItemTest.h" |
||||
#include "QGCApplication.h" |
||||
|
||||
StructureScanComplexItemTest::StructureScanComplexItemTest(void) |
||||
: _offlineVehicle(NULL) |
||||
{ |
||||
_polyPoints << QGeoCoordinate(47.633550640000003, -122.08982199) << QGeoCoordinate(47.634129020000003, -122.08887249) << |
||||
QGeoCoordinate(47.633619320000001, -122.08811074) << QGeoCoordinate(47.633189139999999, -122.08900124); |
||||
} |
||||
|
||||
void StructureScanComplexItemTest::init(void) |
||||
{ |
||||
UnitTest::init(); |
||||
|
||||
_rgSignals[dirtyChangedIndex] = SIGNAL(dirtyChanged(bool)); |
||||
|
||||
_offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), this); |
||||
_structureScanItem = new StructureScanComplexItem(_offlineVehicle, this); |
||||
_structureScanItem->setDirty(false); |
||||
|
||||
_multiSpy = new MultiSignalSpy(); |
||||
Q_CHECK_PTR(_multiSpy); |
||||
QCOMPARE(_multiSpy->init(_structureScanItem, _rgSignals, _cSignals), true); |
||||
} |
||||
|
||||
void StructureScanComplexItemTest::cleanup(void) |
||||
{ |
||||
delete _structureScanItem; |
||||
delete _offlineVehicle; |
||||
} |
||||
|
||||
void StructureScanComplexItemTest::_testDirty(void) |
||||
{ |
||||
QVERIFY(!_structureScanItem->dirty()); |
||||
_structureScanItem->setDirty(false); |
||||
QVERIFY(!_structureScanItem->dirty()); |
||||
QVERIFY(_multiSpy->checkNoSignals()); |
||||
|
||||
_structureScanItem->setDirty(true); |
||||
QVERIFY(_structureScanItem->dirty()); |
||||
QVERIFY(_multiSpy->checkOnlySignalByMask(dirtyChangedMask)); |
||||
QVERIFY(_multiSpy->pullBoolFromSignalIndex(dirtyChangedIndex)); |
||||
_multiSpy->clearAllSignals(); |
||||
|
||||
_structureScanItem->setDirty(false); |
||||
QVERIFY(!_structureScanItem->dirty()); |
||||
QVERIFY(_multiSpy->checkOnlySignalByMask(dirtyChangedMask)); |
||||
QVERIFY(!_multiSpy->pullBoolFromSignalIndex(dirtyChangedIndex)); |
||||
_multiSpy->clearAllSignals(); |
||||
|
||||
// These facts should set dirty when changed
|
||||
QList<Fact*> rgFacts; |
||||
rgFacts << _structureScanItem->gimbalPitch() << _structureScanItem->gimbalYaw() << _structureScanItem->altitude() << _structureScanItem->layers(); |
||||
foreach(Fact* fact, rgFacts) { |
||||
qDebug() << fact->name(); |
||||
QVERIFY(!_structureScanItem->dirty()); |
||||
if (fact->typeIsBool()) { |
||||
fact->setRawValue(!fact->rawValue().toBool()); |
||||
} else { |
||||
fact->setRawValue(fact->rawValue().toDouble() + 1); |
||||
} |
||||
QVERIFY(_multiSpy->checkSignalByMask(dirtyChangedMask)); |
||||
QVERIFY(_multiSpy->pullBoolFromSignalIndex(dirtyChangedIndex)); |
||||
_structureScanItem->setDirty(false); |
||||
_multiSpy->clearAllSignals(); |
||||
} |
||||
rgFacts.clear(); |
||||
|
||||
QVERIFY(!_structureScanItem->dirty()); |
||||
_structureScanItem->setAltitudeRelative(!_structureScanItem->altitudeRelative()); |
||||
QVERIFY(_multiSpy->checkSignalByMask(dirtyChangedMask)); |
||||
QVERIFY(_multiSpy->pullBoolFromSignalIndex(dirtyChangedIndex)); |
||||
_structureScanItem->setDirty(false); |
||||
_multiSpy->clearAllSignals(); |
||||
|
||||
QVERIFY(!_structureScanItem->dirty()); |
||||
_structureScanItem->setYawVehicleToStructure(!_structureScanItem->yawVehicleToStructure()); |
||||
QVERIFY(_multiSpy->checkSignalByMask(dirtyChangedMask)); |
||||
QVERIFY(_multiSpy->pullBoolFromSignalIndex(dirtyChangedIndex)); |
||||
_structureScanItem->setDirty(false); |
||||
_multiSpy->clearAllSignals(); |
||||
} |
||||
|
||||
void StructureScanComplexItemTest::_initItem(void) |
||||
{ |
||||
QGCMapPolygon* mapPolygon = _structureScanItem->structurePolygon(); |
||||
|
||||
for (int i=0; i<_polyPoints.count(); i++) { |
||||
QGeoCoordinate& vertex = _polyPoints[i]; |
||||
mapPolygon->appendVertex(vertex); |
||||
} |
||||
|
||||
_structureScanItem->cameraCalc()->setCameraSpecType(CameraCalc::CameraSpecNone); |
||||
_structureScanItem->gimbalPitch()->setCookedValue(45); |
||||
_structureScanItem->gimbalYaw()->setCookedValue(45); |
||||
_structureScanItem->layers()->setCookedValue(2); |
||||
_structureScanItem->setDirty(false); |
||||
|
||||
_validateItem(_structureScanItem); |
||||
} |
||||
|
||||
void StructureScanComplexItemTest::_validateItem(StructureScanComplexItem* item) |
||||
{ |
||||
QGCMapPolygon* mapPolygon = item->structurePolygon(); |
||||
|
||||
for (int i=0; i<_polyPoints.count(); i++) { |
||||
QGeoCoordinate& expectedVertex = _polyPoints[i]; |
||||
QGeoCoordinate actualVertex = mapPolygon->vertexCoordinate(i); |
||||
QCOMPARE(expectedVertex, actualVertex); |
||||
} |
||||
|
||||
QCOMPARE((int)item->cameraCalc()->cameraSpecType(), (int)CameraCalc::CameraSpecNone); |
||||
QCOMPARE(item->gimbalPitch()->cookedValue().toDouble(), 45.0); |
||||
QCOMPARE(item->gimbalYaw()->cookedValue().toDouble(), 45.0); |
||||
QCOMPARE(item->layers()->cookedValue().toInt(), 2); |
||||
|
||||
int seqNum = item->sequenceNumber(); |
||||
QCOMPARE(item->lastSequenceNumber(), seqNum + (5 /* 5 waypoints per layer */ * item->layers()->cookedValue().toInt()) + 1 /* gimbal command */); |
||||
} |
||||
|
||||
void StructureScanComplexItemTest::_testSaveLoad(void) |
||||
{ |
||||
_initItem(); |
||||
|
||||
QJsonArray items; |
||||
_structureScanItem->save(items); |
||||
|
||||
QString errorString; |
||||
StructureScanComplexItem* newItem = new StructureScanComplexItem(_offlineVehicle, this); |
||||
QVERIFY(newItem->load(items[0].toObject(), 10, errorString)); |
||||
QVERIFY(errorString.isEmpty()); |
||||
_validateItem(newItem); |
||||
newItem->deleteLater(); |
||||
} |
||||
|
||||
void StructureScanComplexItemTest::_testGimbalAngleUpdate(void) |
||||
{ |
||||
// This sets the item to CameraCalc::CameraSpecNone and non-standard gimbal angles
|
||||
_initItem(); |
||||
|
||||
// Switching to a camera specific setup should set gimbal angles to defaults surface scan
|
||||
_structureScanItem->cameraCalc()->setCameraSpecType(CameraCalc::CameraSpecCustom); |
||||
QCOMPARE(_structureScanItem->gimbalPitch()->cookedValue().toDouble(), 0.0); |
||||
QCOMPARE(_structureScanItem->gimbalYaw()->cookedValue().toDouble(), 90.0); |
||||
} |
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
/****************************************************************************
|
||||
* |
||||
* (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. |
||||
* |
||||
****************************************************************************/ |
||||
|
||||
#pragma once |
||||
|
||||
#include "UnitTest.h" |
||||
#include "MultiSignalSpy.h" |
||||
#include "StructureScanComplexItem.h" |
||||
|
||||
class StructureScanComplexItemTest : public UnitTest |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
StructureScanComplexItemTest(void); |
||||
|
||||
protected: |
||||
void init(void) final; |
||||
void cleanup(void) final; |
||||
|
||||
private slots: |
||||
void _testDirty(void); |
||||
void _testSaveLoad(void); |
||||
void _testGimbalAngleUpdate(void); |
||||
|
||||
private: |
||||
void _initItem(void); |
||||
void _validateItem(StructureScanComplexItem* item); |
||||
|
||||
enum { |
||||
dirtyChangedIndex, |
||||
maxSignalIndex |
||||
}; |
||||
|
||||
enum { |
||||
dirtyChangedMask = 1 << dirtyChangedIndex |
||||
}; |
||||
|
||||
static const size_t _cSignals = maxSignalIndex; |
||||
const char* _rgSignals[_cSignals]; |
||||
|
||||
Vehicle* _offlineVehicle; |
||||
MultiSignalSpy* _multiSpy; |
||||
StructureScanComplexItem* _structureScanItem; |
||||
QList<QGeoCoordinate> _polyPoints; |
||||
}; |
Loading…
Reference in new issue