Commit de969afa authored by DonLakeFlyer's avatar DonLakeFlyer

Camera/Transects unit tests and fixes

parent 34931bf2
......@@ -22,6 +22,8 @@ void CameraCalcTest::init(void)
_offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), this);
_cameraCalc = new CameraCalc(_offlineVehicle, "CameraCalcUnitTest" /* settingsGroup */, this);
_cameraCalc->cameraName()->setRawValue(_cameraCalc->customCameraName());
_cameraCalc->setDirty(false);
_rgSignals[dirtyChangedIndex] = SIGNAL(dirtyChanged(bool));
_rgSignals[imageFootprintSideChangedIndex] = SIGNAL(imageFootprintSideChanged(double));
......@@ -80,11 +82,52 @@ void CameraCalcTest::_testDirty(void)
}
rgFacts.clear();
_cameraCalc->cameraName()->setRawValue(_cameraCalc->customCameraName());
_cameraCalc->setDistanceToSurfaceRelative(!_cameraCalc->distanceToSurfaceRelative());
QVERIFY(_cameraCalc->dirty());
_multiSpy->clearAllSignals();
_cameraCalc->setDistanceToSurfaceRelative(!_cameraCalc->distanceToSurfaceRelative());
_cameraCalc->cameraName()->setRawValue(_cameraCalc->manualCameraName());
QVERIFY(_cameraCalc->dirty());
_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:
void cleanup(void) final;
private slots:
void _testDirty(void);
void _testDirty (void);
void _testAdjustedFootprint (void);
void _testAltDensityRecalc (void);
private:
enum {
......
......@@ -480,3 +480,8 @@ bool CorridorScanComplexItem::readyForSave(void) const
{
return TransectStyleComplexItem::readyForSave();
}
double CorridorScanComplexItem::timeBetweenShots(void)
{
return _cruiseSpeed == 0 ? 0 : _cameraCalc.adjustedFootprintSide()->rawValue().toDouble() / _cruiseSpeed;
}
......@@ -33,15 +33,16 @@ public:
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
void save (QJsonArray& planItems) final;
bool specifiesCoordinate (void) const final;
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) 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
QString commandDescription (void) const final { return tr("Corridor Scan"); }
......
......@@ -1433,3 +1433,9 @@ void SurveyComplexItem::rotateEntryPoint(void)
setDirty(true);
}
double SurveyComplexItem::timeBetweenShots(void)
{
return _cruiseSpeed == 0 ? 0 : _cameraCalc.adjustedFootprintFrontal()->rawValue().toDouble() / _cruiseSpeed;
}
......@@ -40,6 +40,7 @@ public:
bool specifiesCoordinate (void) const final { return true; }
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final;
void applyNewAltitude (double newAltitude) final;
double timeBetweenShots (void) final;
// Overrides from VisualMissionionItem
QString commandDescription (void) const final { return tr("Survey"); }
......
......@@ -309,11 +309,6 @@ void TransectStyleComplexItem::applyNewAltitude(double newAltitude)
//_altitudeFact.setRawValue(newAltitude);
}
double TransectStyleComplexItem::timeBetweenShots(void)
{
return _cruiseSpeed == 0 ? 0 : _cameraCalc.adjustedFootprintSide()->rawValue().toDouble() / _cruiseSpeed;
}
void TransectStyleComplexItem::_updateCoordinateAltitudes(void)
{
emit coordinateChanged(coordinate());
......@@ -383,6 +378,7 @@ void TransectStyleComplexItem::_rebuildTransects(void)
_rebuildTransectsPhase2();
emit lastSequenceNumberChanged(lastSequenceNumber());
emit timeBetweenShotsChanged();
}
void TransectStyleComplexItem::_queryTransectsPathHeightInfo(void)
......
......@@ -59,12 +59,13 @@ public:
Fact* terrainAdjustMaxClimbRate (void) { return &_terrainAdjustMaxDescentRateFact; }
int cameraShots (void) const { return _cameraShots; }
double timeBetweenShots (void);
double coveredArea (void) const;
double cameraMinTriggerInterval(void) const { return _cameraMinTriggerInterval; }
bool hoverAndCaptureAllowed (void) const;
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);
// Overrides from ComplexMissionItem
......
......@@ -25,6 +25,10 @@ void TransectStyleComplexItemTest::init(void)
_offlineVehicle = new Vehicle(MAV_AUTOPILOT_PX4, MAV_TYPE_QUADROTOR, qgcApp()->toolbox()->firmwarePluginManager(), 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();
_transectStyleItem->setDirty(false);
......@@ -107,36 +111,58 @@ void TransectStyleComplexItemTest::_setSurveyAreaPolygon(void)
void TransectStyleComplexItemTest::_testRebuildTransects(void)
{
// Changing the survey polygon should trigger:
// _rebuildTransects call
// _rebuildTransects calls
// coveredAreaChanged signal
// lastSequenceNumberChanged signal
_adjustSurveAreaPolygon();
QVERIFY(_transectStyleItem->rebuildTransectsCalled);
QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called);
QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called);
QVERIFY(_multiSpy->checkSignalsByMask(coveredAreaChangedMask | lastSequenceNumberChangedMask));
_transectStyleItem->rebuildTransectsCalled = false;
_transectStyleItem->rebuildTransectsPhase1Called = false;
_transectStyleItem->rebuildTransectsPhase2Called = false;
_transectStyleItem->setDirty(false);
_multiSpy->clearAllSignals();
// Changes to these facts should trigger:
// _rebuildTransects call
// _rebuildTransects calls
// lastSequenceNumberChanged signal
QList<Fact*> rgFacts;
rgFacts << _transectStyleItem->turnAroundDistance()
<< _transectStyleItem->cameraTriggerInTurnAround()
<< _transectStyleItem->hoverAndCapture()
<< _transectStyleItem->refly90Degrees()
<< _transectStyleItem->cameraCalc()->adjustedFootprintSide()
<< _transectStyleItem->cameraCalc()->adjustedFootprintFrontal();
<< _transectStyleItem->cameraCalc()->frontalOverlap()
<< _transectStyleItem->cameraCalc()->sideOverlap();
foreach(Fact* fact, rgFacts) {
qDebug() << fact->name();
changeFactValue(fact);
QVERIFY(_transectStyleItem->rebuildTransectsCalled);
QVERIFY(_transectStyleItem->rebuildTransectsPhase1Called);
QVERIFY(_transectStyleItem->rebuildTransectsPhase2Called);
QVERIFY(_multiSpy->checkSignalsByMask(lastSequenceNumberChangedMask));
_transectStyleItem->setDirty(false);
_multiSpy->clearAllSignals();
_transectStyleItem->rebuildTransectsCalled = false;
_transectStyleItem->rebuildTransectsPhase1Called = false;
_transectStyleItem->rebuildTransectsPhase2Called = false;
}
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)
......@@ -192,18 +218,19 @@ void TransectStyleComplexItemTest::_testAltMode(void)
}
TransectStyleItem::TransectStyleItem(Vehicle* vehicle, QObject* parent)
: TransectStyleComplexItem (vehicle, false /* flyView */, QStringLiteral("UnitTestTransect"), parent)
, rebuildTransectsCalled (false)
: TransectStyleComplexItem (vehicle, false /* flyView */, QStringLiteral("UnitTestTransect"), parent)
, rebuildTransectsPhase1Called (false)
, rebuildTransectsPhase2Called (false)
{
}
void TransectStyleItem::_rebuildTransectsPhase1(void)
{
rebuildTransectsCalled = true;
rebuildTransectsPhase1Called = true;
}
void TransectStyleItem::_rebuildTransectsPhase2(void)
{
rebuildTransectsPhase2Called = true;
}
......@@ -29,10 +29,10 @@ protected:
void cleanup(void) final;
private slots:
void _testDirty (void);
void _testRebuildTransects (void);
void _testDistanceSignalling (void);
void _testAltMode (void);
void _testDirty (void);
void _testRebuildTransects (void);
void _testDistanceSignalling(void);
void _testAltMode (void);
private:
void _setSurveyAreaPolygon (void);
......@@ -97,7 +97,8 @@ public:
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final { Q_UNUSED(items); Q_UNUSED(missionItemParent); }
void applyNewAltitude (double newAltitude) final { Q_UNUSED(newAltitude); }
bool rebuildTransectsCalled;
bool rebuildTransectsPhase1Called;
bool rebuildTransectsPhase2Called;
private slots:
// Overrides from TransectStyleComplexItem
......
......@@ -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()) {
fact->setRawValue(!fact->rawValue().toBool());
} else {
fact->setRawValue(fact->rawValue().toDouble() + 1);
if (increment == 0) {
increment = 1;
}
fact->setRawValue(fact->rawValue().toDouble() + increment);
}
}
......@@ -98,7 +98,8 @@ public:
static bool doubleNaNCompare(double value1, double value2);
/// 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:
......
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