8 #include <QCoreApplication>
10 #include <QElapsedTimer>
12 #include <QScopedPointer>
41 using namespace swift::misc::aviation;
42 using namespace swift::misc::geo;
43 using namespace swift::misc::physical_quantities;
44 using namespace swift::misc::simulation;
55 void basicInterpolatorTests();
67 void CTestInterpolatorLinear::basicInterpolatorTests()
72 interpolator.markAsUnitTest();
75 const qint64 ts = 1425000000000;
76 const qint64 deltaT = 5000;
77 const qint64 offset = 5000;
78 for (
int i = IRemoteAircraftProvider::MaxSituationsPerCallsign - 1; i >= 0; i--)
83 CLength hag = (s.getAltitude() - s.getGroundElevation());
84 QVERIFY2(s.getHeightAboveGround() == hag,
"Wrong elevation");
88 constexpr
int partsCount = 10;
89 for (
int i = partsCount - 1; i >= 0; i--)
100 double latOld = 360.0;
101 double lngOld = 360.0;
103 qint64 from = ts - 2 * deltaT + offset;
105 qint64 step = deltaT / 20;
106 for (qint64 currentTime = from; currentTime < to; currentTime += step)
115 const double latDeg = currentSituation.getPosition().latitude().valueRounded(CAngleUnit::deg(), 5);
116 const double lngDeg = currentSituation.getPosition().longitude().valueRounded(CAngleUnit::deg(), 5);
117 QVERIFY2(latDeg < latOld && lngDeg < lngOld, QStringLiteral(
"Values shall decrease: %1/%2 %3/%4")
123 QVERIFY2(latDeg >= 0 && latDeg <= IRemoteAircraftProvider::MaxSituationsPerCallsign,
124 "Values shall be in range");
131 int interpolationNo = 0;
132 const qint64 startTimeMsSinceEpoch = ts - 2 * deltaT;
139 interpolator.resetLastInterpolation();
140 interpolator.markAsUnitTest();
141 for (
int loops = 0; loops < 20; loops++)
143 from = startTimeMsSinceEpoch + offset;
147 for (qint64 currentTime = from; currentTime < to; currentTime += step)
155 QVERIFY2(!currentSituation.getCallsign().isEmpty(),
"Empty callsign");
156 QVERIFY2(currentSituation.getCallsign() == cs,
"Wrong callsign");
157 const double latDeg = currentSituation.getPosition().latitude().valueRounded(CAngleUnit::deg(), 5);
158 const double lngDeg = currentSituation.getPosition().longitude().valueRounded(CAngleUnit::deg(), 5);
168 QVERIFY2(timeMs < interpolationNo * 1.5, "Interpolation > 1.5ms
");
169 qDebug() << timeMs << "ms
"
170 << "for" << interpolationNo << "interpolations
";
172 int fetchedParts = 0;
174 for (qint64 currentTime = ts - 2 * deltaT; currentTime < ts; currentTime += 250)
176 const CInterpolationResult result = interpolator.getInterpolation(currentTime, setup, 0);
178 QVERIFY2(result.getPartsStatus().isSupportingParts(), "Parts not supported
");
180 timeMs = timer.elapsed();
181 qDebug() << timeMs << "ms
"
182 << "for" << fetchedParts << "fetched parts
";
185 CAircraftSituation CTestInterpolatorLinear::getTestSituation(const CCallsign &callsign, int number, qint64 ts,
186 qint64 deltaT, qint64 offset)
188 const CAltitude alt(number, CAltitude::MeanSeaLevel, CLengthUnit::m());
189 const CLatitude lat(number, CAngleUnit::deg());
190 const CLongitude lng(180.0 + number, CAngleUnit::deg());
191 const CHeading heading(number * 10, CHeading::True, CAngleUnit::deg());
192 const CAngle bank(number, CAngleUnit::deg());
193 const CAngle pitch(number, CAngleUnit::deg());
194 const CSpeed gs(number * 10, CSpeedUnit::km_h());
195 const CAltitude gndElev({ 0, CLengthUnit::m() }, CAltitude::MeanSeaLevel);
196 const CCoordinateGeodetic c(lat, lng, alt);
197 CAircraftSituation s(callsign, c, heading, pitch, bank, gs);
198 s.setGroundElevation(gndElev, CAircraftSituation::Test);
199 s.setMSecsSinceEpoch(ts - deltaT * number); // values in past
200 s.setTimeOffsetMs(offset);
204 CAircraftParts CTestInterpolatorLinear::getTestParts(int number, qint64 ts, qint64 deltaT)
206 CAircraftLights l(true, false, true, false, true, false);
207 CAircraftEngineList e({ CAircraftEngine(1, true), CAircraftEngine(2, false), CAircraftEngine(3, true) });
208 CAircraftParts p(l, true, 20, true, e, false);
209 p.setMSecsSinceEpoch(ts - deltaT * number); // values in past
212 } // namespace MiscTest
215 SWIFTTEST_MAIN(MiscTest::CTestInterpolatorLinear);
217 #include "testinterpolatorlinear.moc
"
Interpolator classes basic tests.
Value object encapsulating information of aircraft's parts.
Value object encapsulating information of an aircraft's situation.
Value object encapsulating information of a callsign.
Physical unit length (length)
Value object for interpolator and rendering per callsign.
const CInterpolationStatus & getInterpolationStatus() const
Get status.
bool isInterpolated() const
Did interpolation succeed?
Linear interpolator, calculation inbetween positions.
Dummy implementation for testing purpose.
void insertNewSituation(const aviation::CAircraftSituation &situation)
For testing, add new situation and fire signals.
void insertNewAircraftParts(const aviation::CCallsign &callsign, const aviation::CAircraftParts &parts, bool removeOutdatedParts)
For testing, add new situation and fire signals.
Free functions in swift::misc.
void processEvents(QEventLoop::ProcessEventsFlags flags)
qint64 elapsed() const const
QVERIFY2(condition, message)