void tst_QNmeaPositionInfoSource::requestUpdate_waitForValidDateTime() { QFETCH(QByteArray, bytes); QFETCH(QList<QDateTime>, dateTimes); QNmeaPositionInfoSource source(m_mode); QNmeaPositionInfoSourceProxyFactory factory; QNmeaPositionInfoSourceProxy *proxy = static_cast<QNmeaPositionInfoSourceProxy*>(factory.createProxy(&source)); QSignalSpy spy(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); proxy->source()->requestUpdate(); proxy->feedBytes(bytes); QTRY_COMPARE(spy.count(), 1); QCOMPARE(spy[0][0].value<QGeoPositionInfo>().timestamp(), dateTimes[0]); }
void tst_QNmeaPositionInfoSource::startUpdates_waitForValidDateTime() { // Tests that the class does not emit an update until it receives a // sentences with a valid date *and* time. All sentences before this // should be ignored, and any sentences received after this that do // not have a date should use the known date. QFETCH(QByteArray, bytes); QFETCH(QList<QDateTime>, dateTimes); QFETCH(QList<bool>, expectHorizontalAccuracy); QFETCH(QList<bool>, expectVerticalAccuracy); QNmeaPositionInfoSource source(m_mode); source.setUserEquivalentRangeError(5.1); QNmeaPositionInfoSourceProxyFactory factory; QNmeaPositionInfoSourceProxy *proxy = static_cast<QNmeaPositionInfoSourceProxy*>(factory.createProxy(&source)); QSignalSpy spy(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); proxy->source()->startUpdates(); proxy->feedBytes(bytes); QTRY_COMPARE(spy.count(), dateTimes.count()); for (int i=0; i<spy.count(); i++) { QGeoPositionInfo pInfo = spy[i][0].value<QGeoPositionInfo>(); QCOMPARE(pInfo.timestamp(), dateTimes[i]); // Generated GGA/GSA sentences have hard coded HDOP of 3.5, which corrisponds to a // horizontal accuracy of 35.7, for the user equivalent range error of 5.1 set above. QCOMPARE(pInfo.hasAttribute(QGeoPositionInfo::HorizontalAccuracy), expectHorizontalAccuracy[i]); if (pInfo.hasAttribute(QGeoPositionInfo::HorizontalAccuracy)) QVERIFY(qFuzzyCompare(pInfo.attribute(QGeoPositionInfo::HorizontalAccuracy), 35.7)); // Generate GSA sentences have hard coded VDOP of 4.0, which corrisponds to a vertical // accuracy of 40.8, for the user equivalent range error of 5.1 set above. QCOMPARE(pInfo.hasAttribute(QGeoPositionInfo::VerticalAccuracy), expectVerticalAccuracy[i]); if (pInfo.hasAttribute(QGeoPositionInfo::VerticalAccuracy)) QVERIFY(qFuzzyCompare(pInfo.attribute(QGeoPositionInfo::VerticalAccuracy), 40.8)); } }
void tst_QNmeaPositionInfoSource::testWithBadNmea() { QFETCH(QByteArray, bytes); QFETCH(QList<QDateTime>, dateTimes); QFETCH(UpdateTriggerMethod, trigger); QNmeaPositionInfoSource source(m_mode); QNmeaPositionInfoSourceProxyFactory factory; QNmeaPositionInfoSourceProxy *proxy = static_cast<QNmeaPositionInfoSourceProxy*>(factory.createProxy(&source)); QSignalSpy spy(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); if (trigger == StartUpdatesMethod) proxy->source()->startUpdates(); else proxy->source()->requestUpdate(); proxy->feedBytes(bytes); QTRY_COMPARE(spy.count(), dateTimes.count()); for (int i=0; i<dateTimes.count(); i++) QCOMPARE(spy[i][0].value<QGeoPositionInfo>().timestamp(), dateTimes[i]); }
void tst_QNmeaPositionInfoSource::startUpdates_waitForValidDateTime() { // Tests that the class does not emit an update until it receives a // sentences with a valid date *and* time. All sentences before this // should be ignored, and any sentences received after this that do // not have a date should use the known date. QFETCH(QByteArray, bytes); QFETCH(QList<QDateTime>, dateTimes); QNmeaPositionInfoSource source(m_mode); QNmeaPositionInfoSourceProxyFactory factory; QNmeaPositionInfoSourceProxy *proxy = static_cast<QNmeaPositionInfoSourceProxy*>(factory.createProxy(&source)); QSignalSpy spy(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); proxy->source()->startUpdates(); proxy->feedBytes(bytes); QTRY_COMPARE(spy.count(), dateTimes.count()); for (int i=0; i<spy.count(); i++) QCOMPARE(spy[i][0].value<QGeoPositionInfo>().timestamp(), dateTimes[i]); }
void tst_QNmeaPositionInfoSource::startUpdates_withTimeout() { QNmeaPositionInfoSource source(m_mode); QNmeaPositionInfoSourceProxyFactory factory; QNmeaPositionInfoSourceProxy *proxy = static_cast<QNmeaPositionInfoSourceProxy*>(factory.createProxy(&source)); QSignalSpy spyUpdate(proxy->source(), SIGNAL(positionUpdated(QGeoPositionInfo))); QSignalSpy spyTimeout(proxy->source(), SIGNAL(updateTimeout())); proxy->source()->setUpdateInterval(1000); proxy->source()->startUpdates(); QDateTime dt = QDateTime::currentDateTime().toUTC(); if (m_mode == QNmeaPositionInfoSource::SimulationMode) { // the first sentence primes the simulation proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt).toLatin1()); proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addMSecs(10)).toLatin1()); proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addMSecs(1100)).toLatin1()); proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addMSecs(2200)).toLatin1()); proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addSecs(9)).toLatin1()); QTime t; t.start(); for (int j = 1; j < 4; ++j) { QTRY_COMPARE(spyUpdate.count(), j); QCOMPARE(spyTimeout.count(), 0); int time = t.elapsed(); QVERIFY((time > j*1000 - 300) && (time < j*1000 + 300)); } spyUpdate.clear(); QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.count() == 0) && (spyTimeout.count() == 1), 7500); spyTimeout.clear(); QTRY_VERIFY_WITH_TIMEOUT((spyUpdate.count() == 1) && (spyTimeout.count() == 0), 7500); } else { // dt + 900 QTRY_VERIFY(spyUpdate.count() == 0 && spyTimeout.count() == 0); proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addSecs(1)).toLatin1()); // dt + 1200 QTRY_VERIFY(spyUpdate.count() == 1 && spyTimeout.count() == 0); spyUpdate.clear(); // dt + 1900 QTRY_VERIFY(spyUpdate.count() == 0 && spyTimeout.count() == 0); proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addSecs(2)).toLatin1()); // dt + 2200 QTRY_VERIFY(spyUpdate.count() == 1 && spyTimeout.count() == 0); spyUpdate.clear(); // dt + 2900 QTRY_VERIFY(spyUpdate.count() == 0 && spyTimeout.count() == 0); proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addSecs(3)).toLatin1()); // dt + 3200 QTRY_VERIFY(spyUpdate.count() == 1 && spyTimeout.count() == 0); spyUpdate.clear(); // dt + 6900 QTRY_VERIFY(spyUpdate.count() == 0 && spyTimeout.count() == 1); spyTimeout.clear(); proxy->feedBytes(QLocationTestUtils::createRmcSentence(dt.addSecs(7)).toLatin1()); // dt + 7200 QTRY_VERIFY(spyUpdate.count() == 1 && spyTimeout.count() == 0); spyUpdate.clear(); } }