15 changed files with 448 additions and 118 deletions
@ -0,0 +1,91 @@
@@ -0,0 +1,91 @@
|
||||
/****************************************************************************
|
||||
* |
||||
* (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 "CameraCalcTest.h" |
||||
#include "QGCApplication.h" |
||||
|
||||
CameraCalcTest::CameraCalcTest(void) |
||||
: _offlineVehicle(NULL) |
||||
{ |
||||
|
||||
} |
||||
|
||||
void CameraCalcTest::init(void) |
||||
{ |
||||
UnitTest::init(); |
||||
|
||||
_offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), this); |
||||
_cameraCalc = new CameraCalc(_offlineVehicle, this); |
||||
|
||||
_rgSignals[cameraNameChangedIndex] = SIGNAL(cameraNameChanged(QString)); |
||||
_rgSignals[dirtyChangedIndex] = SIGNAL(dirtyChanged(bool)); |
||||
_rgSignals[imageFootprintSideChangedIndex] = SIGNAL(imageFootprintSideChanged(double)); |
||||
_rgSignals[imageFootprintFrontalChangedIndex] = SIGNAL(imageFootprintFrontalChanged(double)); |
||||
_rgSignals[distanceToSurfaceRelativeChangedIndex] = SIGNAL(distanceToSurfaceRelativeChanged(bool)); |
||||
|
||||
_multiSpy = new MultiSignalSpy(); |
||||
QCOMPARE(_multiSpy->init(_cameraCalc, _rgSignals, _cSignals), true); |
||||
} |
||||
|
||||
void CameraCalcTest::cleanup(void) |
||||
{ |
||||
delete _cameraCalc; |
||||
delete _offlineVehicle; |
||||
delete _multiSpy; |
||||
} |
||||
|
||||
void CameraCalcTest::_testDirty(void) |
||||
{ |
||||
QVERIFY(!_cameraCalc->dirty()); |
||||
_cameraCalc->setDirty(false); |
||||
QVERIFY(!_cameraCalc->dirty()); |
||||
QVERIFY(_multiSpy->checkNoSignals()); |
||||
|
||||
_cameraCalc->setDirty(true); |
||||
QVERIFY(_cameraCalc->dirty()); |
||||
QVERIFY(_multiSpy->checkOnlySignalByMask(dirtyChangedMask)); |
||||
QVERIFY(_multiSpy->pullBoolFromSignalIndex(dirtyChangedIndex)); |
||||
_multiSpy->clearAllSignals(); |
||||
|
||||
_cameraCalc->setDirty(false); |
||||
QVERIFY(!_cameraCalc->dirty()); |
||||
QVERIFY(_multiSpy->checkOnlySignalByMask(dirtyChangedMask)); |
||||
_multiSpy->clearAllSignals(); |
||||
|
||||
// These facts should set dirty when changed
|
||||
QList<Fact*> rgFacts; |
||||
rgFacts << _cameraCalc->valueSetIsDistance() |
||||
<< _cameraCalc->distanceToSurface() |
||||
<< _cameraCalc->imageDensity() |
||||
<< _cameraCalc->frontalOverlap () |
||||
<< _cameraCalc->sideOverlap () |
||||
<< _cameraCalc->adjustedFootprintSide() |
||||
<< _cameraCalc->adjustedFootprintFrontal(); |
||||
foreach(Fact* fact, rgFacts) { |
||||
qDebug() << fact->name(); |
||||
QVERIFY(!_cameraCalc->dirty()); |
||||
if (fact->typeIsBool()) { |
||||
fact->setRawValue(!fact->rawValue().toBool()); |
||||
} else { |
||||
fact->setRawValue(fact->rawValue().toDouble() + 1); |
||||
} |
||||
QVERIFY(_multiSpy->checkSignalByMask(dirtyChangedMask)); |
||||
_cameraCalc->setDirty(false); |
||||
_multiSpy->clearAllSignals(); |
||||
} |
||||
rgFacts.clear(); |
||||
|
||||
_cameraCalc->setCameraName(_cameraCalc->customCameraName()); |
||||
QVERIFY(_cameraCalc->dirty()); |
||||
_multiSpy->clearAllSignals(); |
||||
|
||||
_cameraCalc->setDistanceToSurfaceRelative(!_cameraCalc->distanceToSurfaceRelative()); |
||||
QVERIFY(_cameraCalc->dirty()); |
||||
_multiSpy->clearAllSignals(); |
||||
} |
@ -0,0 +1,56 @@
@@ -0,0 +1,56 @@
|
||||
/****************************************************************************
|
||||
* |
||||
* (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 "CameraCalc.h" |
||||
|
||||
#include <QGeoCoordinate> |
||||
|
||||
class CameraCalcTest : public UnitTest |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
CameraCalcTest(void); |
||||
|
||||
protected: |
||||
void init(void) final; |
||||
void cleanup(void) final; |
||||
|
||||
private slots: |
||||
void _testDirty(void); |
||||
|
||||
private: |
||||
enum { |
||||
cameraNameChangedIndex = 0, |
||||
dirtyChangedIndex, |
||||
imageFootprintSideChangedIndex, |
||||
imageFootprintFrontalChangedIndex, |
||||
distanceToSurfaceRelativeChangedIndex, |
||||
maxSignalIndex |
||||
}; |
||||
|
||||
enum { |
||||
cameraNameChangedMask = 1 << cameraNameChangedIndex, |
||||
dirtyChangedMask = 1 << dirtyChangedIndex, |
||||
imageFootprintSideChangedMask = 1 << imageFootprintSideChangedIndex, |
||||
imageFootprintFrontalChangedMask = 1 << imageFootprintFrontalChangedIndex, |
||||
distanceToSurfaceRelativeChangedMask = 1 << distanceToSurfaceRelativeChangedIndex, |
||||
}; |
||||
|
||||
static const size_t _cSignals = maxSignalIndex; |
||||
const char* _rgSignals[_cSignals]; |
||||
|
||||
Vehicle* _offlineVehicle; |
||||
MultiSignalSpy* _multiSpy; |
||||
CameraCalc* _cameraCalc; |
||||
}; |
@ -0,0 +1,118 @@
@@ -0,0 +1,118 @@
|
||||
/****************************************************************************
|
||||
* |
||||
* (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 "TransectStyleComplexItemTest.h" |
||||
#include "QGCApplication.h" |
||||
|
||||
TransectStyleComplexItemTest::TransectStyleComplexItemTest(void) |
||||
: _offlineVehicle(NULL) |
||||
{ |
||||
_linePoints << QGeoCoordinate(47.633550640000003, -122.08982199) |
||||
<< QGeoCoordinate(47.634129020000003, -122.08887249) |
||||
<< QGeoCoordinate(47.633619320000001, -122.08811074); |
||||
} |
||||
|
||||
void TransectStyleComplexItemTest::init(void) |
||||
{ |
||||
UnitTest::init(); |
||||
|
||||
_offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), this); |
||||
_transectStyleItem = new TransectStyleItem(_offlineVehicle, this); |
||||
|
||||
_rgSignals[cameraShotsChangedIndex] = SIGNAL(cameraShotsChanged()); |
||||
_rgSignals[timeBetweenShotsChangedIndex] = SIGNAL(timeBetweenShotsChanged()); |
||||
_rgSignals[cameraMinTriggerIntervalChangedIndex] = SIGNAL(cameraMinTriggerIntervalChanged(double)); |
||||
_rgSignals[transectPointsChangedIndex] = SIGNAL(transectPointsChanged()); |
||||
_rgSignals[coveredAreaChangedIndex] = SIGNAL(coveredAreaChanged()); |
||||
_rgSignals[dirtyChangedIndex] = SIGNAL(dirtyChanged(bool)); |
||||
_rgSignals[complexDistanceChangedIndex] = SIGNAL(complexDistanceChanged()); |
||||
_rgSignals[greatestDistanceToChangedIndex] = SIGNAL(greatestDistanceToChanged()); |
||||
_rgSignals[additionalTimeDelayChangedIndex] = SIGNAL(additionalTimeDelayChanged()); |
||||
|
||||
_multiSpy = new MultiSignalSpy(); |
||||
QCOMPARE(_multiSpy->init(_transectStyleItem, _rgSignals, _cSignals), true); |
||||
} |
||||
|
||||
void TransectStyleComplexItemTest::cleanup(void) |
||||
{ |
||||
delete _transectStyleItem; |
||||
delete _offlineVehicle; |
||||
delete _multiSpy; |
||||
} |
||||
|
||||
void TransectStyleComplexItemTest::_testDirty(void) |
||||
{ |
||||
QVERIFY(!_transectStyleItem->dirty()); |
||||
_transectStyleItem->setDirty(false); |
||||
QVERIFY(!_transectStyleItem->dirty()); |
||||
QVERIFY(_multiSpy->checkNoSignals()); |
||||
|
||||
_transectStyleItem->setDirty(true); |
||||
QVERIFY(_transectStyleItem->dirty()); |
||||
QVERIFY(_multiSpy->checkOnlySignalByMask(dirtyChangedMask)); |
||||
QVERIFY(_multiSpy->pullBoolFromSignalIndex(dirtyChangedIndex)); |
||||
_multiSpy->clearAllSignals(); |
||||
|
||||
_transectStyleItem->setDirty(false); |
||||
QVERIFY(!_transectStyleItem->dirty()); |
||||
QVERIFY(_multiSpy->checkOnlySignalByMask(dirtyChangedMask)); |
||||
_multiSpy->clearAllSignals(); |
||||
|
||||
// These facts should set dirty when changed
|
||||
QList<Fact*> rgFacts; |
||||
rgFacts << _transectStyleItem->turnAroundDistance() |
||||
<< _transectStyleItem->cameraTriggerInTurnAround() |
||||
<< _transectStyleItem->hoverAndCapture() |
||||
<< _transectStyleItem->refly90Degrees(); |
||||
foreach(Fact* fact, rgFacts) { |
||||
qDebug() << fact->name(); |
||||
QVERIFY(!_transectStyleItem->dirty()); |
||||
if (fact->typeIsBool()) { |
||||
fact->setRawValue(!fact->rawValue().toBool()); |
||||
} else { |
||||
fact->setRawValue(fact->rawValue().toDouble() + 1); |
||||
} |
||||
QVERIFY(_multiSpy->checkSignalByMask(dirtyChangedMask)); |
||||
_transectStyleItem->setDirty(false); |
||||
_multiSpy->clearAllSignals(); |
||||
} |
||||
rgFacts.clear(); |
||||
|
||||
_setPolyline(); |
||||
QVERIFY(_transectStyleItem->dirty()); |
||||
_transectStyleItem->setDirty(false); |
||||
QVERIFY(!_transectStyleItem->surveyAreaPolygon()->dirty()); |
||||
_multiSpy->clearAllSignals(); |
||||
|
||||
_transectStyleItem->cameraCalc()->distanceToSurface()->setRawValue(_transectStyleItem->cameraCalc()->distanceToSurface()->rawValue().toDouble() + 1); |
||||
QVERIFY(_transectStyleItem->dirty()); |
||||
_transectStyleItem->setDirty(false); |
||||
QVERIFY(!_transectStyleItem->cameraCalc()->dirty()); |
||||
_multiSpy->clearAllSignals(); |
||||
} |
||||
|
||||
void TransectStyleComplexItemTest::_setPolyline(void) |
||||
{ |
||||
for (int i=0; i<_linePoints.count(); i++) { |
||||
QGeoCoordinate& vertex = _linePoints[i]; |
||||
_transectStyleItem->surveyAreaPolygon()->appendVertex(vertex); |
||||
} |
||||
} |
||||
|
||||
TransectStyleItem::TransectStyleItem(Vehicle* vehicle, QObject* parent) |
||||
: TransectStyleComplexItem (vehicle, QStringLiteral("UnitTestTransect"), parent) |
||||
, _rebuildTransectsCalled (false) |
||||
{ |
||||
|
||||
} |
||||
|
||||
void TransectStyleItem::_rebuildTransects(void) |
||||
{ |
||||
_rebuildTransectsCalled = true; |
||||
} |
@ -0,0 +1,99 @@
@@ -0,0 +1,99 @@
|
||||
/****************************************************************************
|
||||
* |
||||
* (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 "CorridorScanComplexItem.h" |
||||
|
||||
#include <QGeoCoordinate> |
||||
|
||||
class TransectStyleItem; |
||||
|
||||
class TransectStyleComplexItemTest : public UnitTest |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
TransectStyleComplexItemTest(void); |
||||
|
||||
protected: |
||||
void init(void) final; |
||||
void cleanup(void) final; |
||||
|
||||
private slots: |
||||
void _testDirty(void); |
||||
|
||||
private: |
||||
void _setPolyline(void); |
||||
|
||||
enum { |
||||
// These signals are from TransectStyleComplexItem
|
||||
cameraShotsChangedIndex = 0, |
||||
timeBetweenShotsChangedIndex, |
||||
cameraMinTriggerIntervalChangedIndex, |
||||
transectPointsChangedIndex, |
||||
coveredAreaChangedIndex, |
||||
// These signals are from ComplexItem
|
||||
dirtyChangedIndex, |
||||
complexDistanceChangedIndex, |
||||
greatestDistanceToChangedIndex, |
||||
additionalTimeDelayChangedIndex, |
||||
maxSignalIndex |
||||
}; |
||||
|
||||
enum { |
||||
// These signals are from TransectStyleComplexItem
|
||||
cameraShotsChangedMask = 1 << cameraShotsChangedIndex, |
||||
timeBetweenShotsChangedMask = 1 << timeBetweenShotsChangedIndex, |
||||
cameraMinTriggerIntervalChangedMask = 1 << cameraMinTriggerIntervalChangedIndex, |
||||
transectPointsChangedMask = 1 << transectPointsChangedIndex, |
||||
coveredAreaChangedMask = 1 << coveredAreaChangedIndex, |
||||
// These signals are from ComplexItem
|
||||
dirtyChangedMask = 1 << dirtyChangedIndex, |
||||
complexDistanceChangedMask = 1 << complexDistanceChangedIndex, |
||||
greatestDistanceToChangedMask = 1 << greatestDistanceToChangedIndex, |
||||
additionalTimeDelayChangedMask = 1 << additionalTimeDelayChangedIndex, |
||||
}; |
||||
|
||||
static const size_t _cSignals = maxSignalIndex; |
||||
const char* _rgSignals[_cSignals]; |
||||
|
||||
Vehicle* _offlineVehicle; |
||||
MultiSignalSpy* _multiSpy; |
||||
QList<QGeoCoordinate> _linePoints; |
||||
TransectStyleItem* _transectStyleItem; |
||||
}; |
||||
|
||||
class TransectStyleItem : public TransectStyleComplexItem |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
TransectStyleItem(Vehicle* vehicle, QObject* parent = NULL); |
||||
|
||||
// Overrides from ComplexMissionItem
|
||||
int lastSequenceNumber (void) const final { return _sequenceNumber; } |
||||
QString mapVisualQML (void) const final { return QString(); } |
||||
bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final { Q_UNUSED(complexObject); Q_UNUSED(sequenceNumber); Q_UNUSED(errorString); return false; } |
||||
|
||||
// Overrides from VisualMissionItem
|
||||
void save (QJsonArray& missionItems) final { Q_UNUSED(missionItems); } |
||||
bool specifiesCoordinate (void) const final { return true; } |
||||
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final { Q_UNUSED(items); Q_UNUSED(missionItemParent); } |
||||
void applyNewAltitude (double newAltitude) final { Q_UNUSED(newAltitude); } |
||||
|
||||
private slots: |
||||
// Overrides from TransectStyleComplexItem
|
||||
void _rebuildTransects (void) final; |
||||
|
||||
private: |
||||
bool _rebuildTransectsCalled; |
||||
}; |
Loading…
Reference in new issue