Commit de969afa authored by DonLakeFlyer's avatar DonLakeFlyer

Camera/Transects unit tests and fixes

parent 34931bf2
...@@ -22,6 +22,8 @@ void CameraCalcTest::init(void) ...@@ -22,6 +22,8 @@ void CameraCalcTest::init(void)
_offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), this); _offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), this);
_cameraCalc = new CameraCalc(_offlineVehicle, "CameraCalcUnitTest" /* settingsGroup */, this); _cameraCalc = new CameraCalc(_offlineVehicle, "CameraCalcUnitTest" /* settingsGroup */, this);
_cameraCalc->cameraName()->setRawValue(_cameraCalc->customCameraName());
_cameraCalc->setDirty(false);
_rgSignals[dirtyChangedIndex] = SIGNAL(dirtyChanged(bool)); _rgSignals[dirtyChangedIndex] = SIGNAL(dirtyChanged(bool));
_rgSignals[imageFootprintSideChangedIndex] = SIGNAL(imageFootprintSideChanged(double)); _rgSignals[imageFootprintSideChangedIndex] = SIGNAL(imageFootprintSideChanged(double));
...@@ -80,11 +82,52 @@ void CameraCalcTest::_testDirty(void) ...@@ -80,11 +82,52 @@ void CameraCalcTest::_testDirty(void)
} }
rgFacts.clear(); rgFacts.clear();
_cameraCalc->cameraName()->setRawValue(_cameraCalc->customCameraName());
_cameraCalc->setDistanceToSurfaceRelative(!_cameraCalc->distanceToSurfaceRelative());
QVERIFY(_cameraCalc->dirty()); QVERIFY(_cameraCalc->dirty());
_multiSpy->clearAllSignals(); _multiSpy->clearAllSignals();
_cameraCalc->setDistanceToSurfaceRelative(!_cameraCalc->distanceToSurfaceRelative()); _cameraCalc->cameraName()->setRawValue(_cameraCalc->manualCameraName());
QVERIFY(_cameraCalc->dirty()); QVERIFY(_cameraCalc->dirty());
_multiSpy->clearAllSignals(); _multiSpy->clearAllSignals();
} }
void CameraCalcTest::_testAdjustedFootprint(void)
{
double adjustedFootprintFrontal = _cameraCalc->adjustedFootprintFrontal()->rawValue().toDouble();
double adjustedFootprintSide = _cameraCalc->adjustedFootprintSide()->rawValue().toDouble();
_cameraCalc->valueSetIsDistance()->setRawValue(true);
changeFactValue(_cameraCalc->distanceToSurface());
QVERIFY(adjustedFootprintFrontal != _cameraCalc->adjustedFootprintFrontal()->rawValue().toDouble());
QVERIFY(adjustedFootprintSide != _cameraCalc->adjustedFootprintSide()->rawValue().toDouble());
adjustedFootprintFrontal = _cameraCalc->adjustedFootprintFrontal()->rawValue().toDouble();
adjustedFootprintSide = _cameraCalc->adjustedFootprintSide()->rawValue().toDouble();
_cameraCalc->valueSetIsDistance()->setRawValue(false);
changeFactValue(_cameraCalc->imageDensity());
QVERIFY(adjustedFootprintFrontal != _cameraCalc->adjustedFootprintFrontal()->rawValue().toDouble());
QVERIFY(adjustedFootprintSide != _cameraCalc->adjustedFootprintSide()->rawValue().toDouble());
adjustedFootprintFrontal = _cameraCalc->adjustedFootprintFrontal()->rawValue().toDouble();
_cameraCalc->valueSetIsDistance()->setRawValue(true);
changeFactValue(_cameraCalc->frontalOverlap());
QVERIFY(adjustedFootprintFrontal != _cameraCalc->adjustedFootprintFrontal()->rawValue().toDouble());
adjustedFootprintSide = _cameraCalc->adjustedFootprintSide()->rawValue().toDouble();
_cameraCalc->valueSetIsDistance()->setRawValue(false);
changeFactValue(_cameraCalc->sideOverlap());
QVERIFY(adjustedFootprintSide != _cameraCalc->adjustedFootprintSide()->rawValue().toDouble());
}
void CameraCalcTest::_testAltDensityRecalc(void)
{
_cameraCalc->valueSetIsDistance()->setRawValue(true);
double imageDensity = _cameraCalc->imageDensity()->rawValue().toDouble();
_cameraCalc->distanceToSurface()->setRawValue(_cameraCalc->distanceToSurface()->rawValue().toDouble() + 1);
QVERIFY(imageDensity != _cameraCalc->imageDensity()->rawValue().toDouble());
_cameraCalc->valueSetIsDistance()->setRawValue(false);
double distanceToSurface = _cameraCalc->distanceToSurface()->rawValue().toDouble();
_cameraCalc->imageDensity()->setRawValue(_cameraCalc->imageDensity()->rawValue().toDouble() + 1);
QVERIFY(distanceToSurface != _cameraCalc->distanceToSurface()->rawValue().toDouble());
}
...@@ -27,7 +27,9 @@ protected: ...@@ -27,7 +27,9 @@ protected:
void cleanup(void) final; void cleanup(void) final;
private slots: private slots:
void _testDirty(void); void _testDirty (void);
void _testAdjustedFootprint (void);
void _testAltDensityRecalc (void);
private: private:
enum { enum {
......
...@@ -480,3 +480,8 @@ bool CorridorScanComplexItem::readyForSave(void) const ...@@ -480,3 +480,8 @@ bool CorridorScanComplexItem::readyForSave(void) const
{ {
return TransectStyleComplexItem::readyForSave(); return TransectStyleComplexItem::readyForSave();
} }
double CorridorScanComplexItem::timeBetweenShots(void)
{
return _cruiseSpeed == 0 ? 0 : _cameraCalc.adjustedFootprintSide()->rawValue().toDouble() / _cruiseSpeed;
}
...@@ -33,15 +33,16 @@ public: ...@@ -33,15 +33,16 @@ public:
Q_INVOKABLE void rotateEntryPoint(void); Q_INVOKABLE void rotateEntryPoint(void);
// Overrides from ComplexMissionItem
bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final;
QString mapVisualQML (void) const final { return QStringLiteral("CorridorScanMapVisual.qml"); }
// Overrides from TransectStyleComplexItem // Overrides from TransectStyleComplexItem
void save (QJsonArray& planItems) final; void save (QJsonArray& planItems) final;
bool specifiesCoordinate (void) const final; bool specifiesCoordinate (void) const final;
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final; void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final;
void applyNewAltitude (double newAltitude) final; void applyNewAltitude (double newAltitude) final;
double timeBetweenShots (void) final;
// Overrides from ComplexMissionItem
bool load (const QJsonObject& complexObject, int sequenceNumber, QString& errorString) final;
QString mapVisualQML (void) const final { return QStringLiteral("CorridorScanMapVisual.qml"); }
// Overrides from VisualMissionionItem // Overrides from VisualMissionionItem
QString commandDescription (void) const final { return tr("Corridor Scan"); } QString commandDescription (void) const final { return tr("Corridor Scan"); }
......
...@@ -1433,3 +1433,9 @@ void SurveyComplexItem::rotateEntryPoint(void) ...@@ -1433,3 +1433,9 @@ void SurveyComplexItem::rotateEntryPoint(void)
setDirty(true); setDirty(true);
} }
double SurveyComplexItem::timeBetweenShots(void)
{
return _cruiseSpeed == 0 ? 0 : _cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble() / _cruiseSpeed;
}
...@@ -40,6 +40,7 @@ public: ...@@ -40,6 +40,7 @@ public:
bool specifiesCoordinate (void) const final { return true; } bool specifiesCoordinate (void) const final { return true; }
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final; void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final;
void applyNewAltitude (double newAltitude) final; void applyNewAltitude (double newAltitude) final;
double timeBetweenShots (void) final;
// Overrides from VisualMissionionItem // Overrides from VisualMissionionItem
QString commandDescription (void) const final { return tr("Survey"); } QString commandDescription (void) const final { return tr("Survey"); }
......
...@@ -309,11 +309,6 @@ void TransectStyleComplexItem::applyNewAltitude(double newAltitude) ...@@ -309,11 +309,6 @@ void TransectStyleComplexItem::applyNewAltitude(double newAltitude)
//_altitudeFact.setRawValue(newAltitude); //_altitudeFact.setRawValue(newAltitude);
} }
double TransectStyleComplexItem::timeBetweenShots(void)
{
return _cruiseSpeed == 0 ? 0 : _cameraCalc.adjustedFootprintSide()->rawValue().toDouble() / _cruiseSpeed;
}
void TransectStyleComplexItem::_updateCoordinateAltitudes(void) void TransectStyleComplexItem::_updateCoordinateAltitudes(void)
{ {
emit coordinateChanged(coordinate()); emit coordinateChanged(coordinate());
...@@ -383,6 +378,7 @@ void TransectStyleComplexItem::_rebuildTransects(void) ...@@ -383,6 +378,7 @@ void TransectStyleComplexItem::_rebuildTransects(void)
_rebuildTransectsPhase2(); _rebuildTransectsPhase2();
emit lastSequenceNumberChanged(lastSequenceNumber()); emit lastSequenceNumberChanged(lastSequenceNumber());
emit timeBetweenShotsChanged();
} }
void TransectStyleComplexItem::_queryTransectsPathHeightInfo(void) void TransectStyleComplexItem::_queryTransectsPathHeightInfo(void)
......
...@@ -59,12 +59,13 @@ public: ...@@ -59,12 +59,13 @@ public:
Fact* terrainAdjustMaxClimbRate (void) { return &_terrainAdjustMaxDescentRateFact; } Fact* terrainAdjustMaxClimbRate (void) { return &_terrainAdjustMaxDescentRateFact; }
int cameraShots (void) const { return _cameraShots; } int cameraShots (void) const { return _cameraShots; }
double timeBetweenShots (void);
double coveredArea (void) const; double coveredArea (void) const;
double cameraMinTriggerInterval(void) const { return _cameraMinTriggerInterval; } double cameraMinTriggerInterval(void) const { return _cameraMinTriggerInterval; }
bool hoverAndCaptureAllowed (void) const; bool hoverAndCaptureAllowed (void) const;
bool followTerrain (void) const { return _followTerrain; } bool followTerrain (void) const { return _followTerrain; }
virtual double timeBetweenShots (void) { return 0; } // Most be overridden. Implementation here is needed for unit testing.
void setFollowTerrain(bool followTerrain); void setFollowTerrain(bool followTerrain);
// Overrides from ComplexMissionItem // Overrides from ComplexMissionItem
......
...@@ -25,6 +25,10 @@ void TransectStyleComplexItemTest::init(void) ...@@ -25,6 +25,10 @@ void TransectStyleComplexItemTest::init(void)
_offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), this); _offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), this);
_transectStyleItem = new TransectStyleItem(_offlineVehicle, this); _transectStyleItem = new TransectStyleItem(_offlineVehicle, this);
_transectStyleItem->cameraTriggerInTurnAround()->setRawValue(false);
_transectStyleItem->cameraCalc()->cameraName()->setRawValue(_transectStyleItem->cameraCalc()->customCameraName());
_transectStyleItem->cameraCalc()->valueSetIsDistance()->setRawValue(true);
_transectStyleItem->cameraCalc()->distanceToSurface()->setRawValue(100);
_setSurveyAreaPolygon(); _setSurveyAreaPolygon();
_transectStyleItem->setDirty(false); _transectStyleItem->setDirty(false);
...@@ -107,36 +111,58 @@ void TransectStyleComplexItemTest::_setSurveyAreaPolygon(void) ...@@ -107,36 +111,58 @@ void TransectStyleComplexItemTest::_setSurveyAreaPolygon(void)
void TransectStyleComplexItemTest::_testRebuildTransects(void) void TransectStyleComplexItemTest::_testRebuildTransects(void)
{ {
// Changing the survey polygon should trigger: // Changing the survey polygon should trigger:
// _rebuildTransects call // _rebuildTransects calls
// coveredAreaChanged signal // coveredAreaChanged signal
// lastSequenceNumberChanged signal // lastSequenceNumberChanged signal
_adjustSurveAreaPolygon(); _adjustSurveAreaPolygon();
QVERIFY(_transectStyleItem->rebuildTransectsCalled); QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called);
QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called);
QVERIFY(_multiSpy->checkSignalsByMask(coveredAreaChangedMask | lastSequenceNumberChangedMask)); QVERIFY(_multiSpy->checkSignalsByMask(coveredAreaChangedMask | lastSequenceNumberChangedMask));
_transectStyleItem->rebuildTransectsCalled = false; _transectStyleItem->rebuildTransectsPhase1Called = false;
_transectStyleItem->rebuildTransectsPhase2Called = false;
_transectStyleItem->setDirty(false); _transectStyleItem->setDirty(false);
_multiSpy->clearAllSignals(); _multiSpy->clearAllSignals();
// Changes to these facts should trigger: // Changes to these facts should trigger:
// _rebuildTransects call // _rebuildTransects calls
// lastSequenceNumberChanged signal // lastSequenceNumberChanged signal
QList<Fact*> rgFacts; QList<Fact*> rgFacts;
rgFacts << _transectStyleItem->turnAroundDistance() rgFacts << _transectStyleItem->turnAroundDistance()
<< _transectStyleItem->cameraTriggerInTurnAround() << _transectStyleItem->cameraTriggerInTurnAround()
<< _transectStyleItem->hoverAndCapture() << _transectStyleItem->hoverAndCapture()
<< _transectStyleItem->refly90Degrees() << _transectStyleItem->refly90Degrees()
<< _transectStyleItem->cameraCalc()->adjustedFootprintSide() << _transectStyleItem->cameraCalc()->frontalOverlap()
<< _transectStyleItem->cameraCalc()->adjustedFootprintFrontal(); << _transectStyleItem->cameraCalc()->sideOverlap();
foreach(Fact* fact, rgFacts) { foreach(Fact* fact, rgFacts) {
qDebug() << fact->name(); qDebug() << fact->name();
changeFactValue(fact); changeFactValue(fact);
QVERIFY(_transectStyleItem->rebuildTransectsCalled); QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called);
QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called);
QVERIFY(_multiSpy->checkSignalsByMask(lastSequenceNumberChangedMask)); QVERIFY(_multiSpy->checkSignalsByMask(lastSequenceNumberChangedMask));
_transectStyleItem->setDirty(false); _transectStyleItem->setDirty(false);
_multiSpy->clearAllSignals(); _multiSpy->clearAllSignals();
_transectStyleItem->rebuildTransectsCalled = false; _transectStyleItem->rebuildTransectsPhase1Called = false;
_transectStyleItem->rebuildTransectsPhase2Called = false;
} }
rgFacts.clear(); rgFacts.clear();
_transectStyleItem->cameraCalc()->valueSetIsDistance()->setRawValue(false);
_transectStyleItem->rebuildTransectsPhase1Called = false;
_transectStyleItem->rebuildTransectsPhase2Called = false;
changeFactValue(_transectStyleItem->cameraCalc()->imageDensity());
QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called);
QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called);
QVERIFY(_multiSpy->checkSignalsByMask(lastSequenceNumberChangedMask));
_multiSpy->clearAllSignals();
_transectStyleItem->cameraCalc()->valueSetIsDistance()->setRawValue(true);
_transectStyleItem->rebuildTransectsPhase1Called = false;
_transectStyleItem->rebuildTransectsPhase2Called = false;
changeFactValue(_transectStyleItem->cameraCalc()->distanceToSurface());
QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called);
QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called);
QVERIFY(_multiSpy->checkSignalsByMask(lastSequenceNumberChangedMask));
_multiSpy->clearAllSignals();
} }
void TransectStyleComplexItemTest::_testDistanceSignalling(void) void TransectStyleComplexItemTest::_testDistanceSignalling(void)
...@@ -192,18 +218,19 @@ void TransectStyleComplexItemTest::_testAltMode(void) ...@@ -192,18 +218,19 @@ void TransectStyleComplexItemTest::_testAltMode(void)
} }
TransectStyleItem::TransectStyleItem(Vehicle* vehicle, QObject* parent) TransectStyleItem::TransectStyleItem(Vehicle* vehicle, QObject* parent)
: TransectStyleComplexItem (vehicle, false /* flyView */, QStringLiteral("UnitTestTransect"), parent) : TransectStyleComplexItem (vehicle, false /* flyView */, QStringLiteral("UnitTestTransect"), parent)
, rebuildTransectsCalled (false) , rebuildTransectsPhase1Called (false)
, rebuildTransectsPhase2Called (false)
{ {
} }
void TransectStyleItem::_rebuildTransectsPhase1(void) void TransectStyleItem::_rebuildTransectsPhase1(void)
{ {
rebuildTransectsCalled = true; rebuildTransectsPhase1Called = true;
} }
void TransectStyleItem::_rebuildTransectsPhase2(void) void TransectStyleItem::_rebuildTransectsPhase2(void)
{ {
rebuildTransectsPhase2Called = true;
} }
...@@ -29,10 +29,10 @@ protected: ...@@ -29,10 +29,10 @@ protected:
void cleanup(void) final; void cleanup(void) final;
private slots: private slots:
void _testDirty (void); void _testDirty (void);
void _testRebuildTransects (void); void _testRebuildTransects (void);
void _testDistanceSignalling (void); void _testDistanceSignalling(void);
void _testAltMode (void); void _testAltMode (void);
private: private:
void _setSurveyAreaPolygon (void); void _setSurveyAreaPolygon (void);
...@@ -97,7 +97,8 @@ public: ...@@ -97,7 +97,8 @@ public:
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final { Q_UNUSED(items); Q_UNUSED(missionItemParent); } void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final { Q_UNUSED(items); Q_UNUSED(missionItemParent); }
void applyNewAltitude (double newAltitude) final { Q_UNUSED(newAltitude); } void applyNewAltitude (double newAltitude) final { Q_UNUSED(newAltitude); }
bool rebuildTransectsCalled; bool rebuildTransectsPhase1Called;
bool rebuildTransectsPhase2Called;
private slots: private slots:
// Overrides from TransectStyleComplexItem // Overrides from TransectStyleComplexItem
......
...@@ -524,11 +524,14 @@ bool UnitTest::doubleNaNCompare(double value1, double value2) ...@@ -524,11 +524,14 @@ bool UnitTest::doubleNaNCompare(double value1, double value2)
} }
} }
void UnitTest::changeFactValue(Fact* fact) void UnitTest::changeFactValue(Fact* fact,double increment)
{ {
if (fact->typeIsBool()) { if (fact->typeIsBool()) {
fact->setRawValue(!fact->rawValue().toBool()); fact->setRawValue(!fact->rawValue().toBool());
} else { } else {
fact->setRawValue(fact->rawValue().toDouble() + 1); if (increment == 0) {
increment = 1;
}
fact->setRawValue(fact->rawValue().toDouble() + increment);
} }
} }
...@@ -98,7 +98,8 @@ public: ...@@ -98,7 +98,8 @@ public:
static bool doubleNaNCompare(double value1, double value2); static bool doubleNaNCompare(double value1, double value2);
/// Changes the Facts rawValue such that it emits a valueChanged signal. /// Changes the Facts rawValue such that it emits a valueChanged signal.
void changeFactValue(Fact* fact); /// @param increment 0 use standard increment, other increment by specified amount if double value
void changeFactValue(Fact* fact, double increment = 0);
protected slots: protected slots:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment