summaryrefslogtreecommitdiff
path: root/tests/auto/qdeclarativepositionsource/tst_qdeclarativepositionsource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qdeclarativepositionsource/tst_qdeclarativepositionsource.cpp')
-rw-r--r--tests/auto/qdeclarativepositionsource/tst_qdeclarativepositionsource.cpp533
1 files changed, 0 insertions, 533 deletions
diff --git a/tests/auto/qdeclarativepositionsource/tst_qdeclarativepositionsource.cpp b/tests/auto/qdeclarativepositionsource/tst_qdeclarativepositionsource.cpp
deleted file mode 100644
index cd556ab4..00000000
--- a/tests/auto/qdeclarativepositionsource/tst_qdeclarativepositionsource.cpp
+++ /dev/null
@@ -1,533 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2021 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include <QtTest/QtTest>
-#include <QtTest/private/qpropertytesthelper_p.h>
-#include <QtPositioningQuick/private/qdeclarativepositionsource_p.h>
-
-QT_USE_NAMESPACE
-
-class tst_DeclarativePositionSource : public QObject
-{
- Q_OBJECT
-
-private slots:
- void init();
-
- void nameBinding();
- void supportedMethodsBinding();
- void sourceErrorBinding();
- void validBinding();
- void positionBinding();
- void activeBinding();
- void startBreaksActiveBinding();
- void activeBindingBreak();
-
- void intervalOnSourceDependency();
- void preferredMethodsOnSourceDependency();
-
- void updateAfterStart();
- void startAfterUpdate();
- void stopAfterUpdate();
- void startStopAfterUpdate();
- void updateTimedOut();
- void updateWithStartTimedOut();
- void startUpdateStopWithNoIntervals();
-
-private:
- std::unique_ptr<QDeclarativePositionSource> m_positionSource = nullptr;
-};
-
-void tst_DeclarativePositionSource::init()
-{
- // create a fresh instance of QDeclarativePositionSource before each test
- m_positionSource.reset(new QDeclarativePositionSource);
- m_positionSource->componentComplete(); // simulate QML loading
-}
-
-void tst_DeclarativePositionSource::nameBinding()
-{
- m_positionSource->setName("test.source");
- QTestPrivate::testReadWritePropertyBasics<QDeclarativePositionSource, QString>(
- *m_positionSource.get(), "invalid source", "test.source", "name");
-}
-
-void tst_DeclarativePositionSource::supportedMethodsBinding()
-{
- // Invalid source has no positioning methods.
- // "test.source" has all positioning methods.
- m_positionSource->setName("invalid name");
- QTestPrivate::testReadOnlyPropertyBasics<QDeclarativePositionSource,
- QDeclarativePositionSource::PositioningMethods>(
- *m_positionSource.get(), QDeclarativePositionSource::NoPositioningMethods,
- QDeclarativePositionSource::AllPositioningMethods, "supportedPositioningMethods",
- [&]() { m_positionSource->setName("test.source"); });
-}
-
-void tst_DeclarativePositionSource::sourceErrorBinding()
-{
- // "dummy.source" has a minimum update interval of 100, and calling
- // update() with a smaller timeout immediately result in a timeout error
- m_positionSource->setName("dummy.source");
- QTestPrivate::testReadOnlyPropertyBasics<QDeclarativePositionSource,
- QDeclarativePositionSource::SourceError>(
- *m_positionSource.get(), QDeclarativePositionSource::NoError,
- QDeclarativePositionSource::UpdateTimeoutError, "sourceError",
- [&]() { m_positionSource->update(10); });
- if (QTest::currentTestFailed())
- return;
-
- // Test that we can't bind sourceError to smth, as it's read-only
- QProperty<QDeclarativePositionSource::SourceError> errorSetter;
- m_positionSource->bindableSourceError().setBinding(Qt::makePropertyBinding(errorSetter));
- QCOMPARE(m_positionSource->bindableSourceError().hasBinding(), false);
-}
-
-void tst_DeclarativePositionSource::validBinding()
-{
- // Invalid source name results in no position source -> invalid object.
- // Setting the name to "test.source" results in creating a new position
- // source -> valid object
- m_positionSource->setName("invalid name");
- QTestPrivate::testReadOnlyPropertyBasics<QDeclarativePositionSource, bool>(
- *m_positionSource.get(), false, true, "valid",
- [&]() { m_positionSource->setName("test.source"); });
-}
-
-static char *printPosition(const QDeclarativePosition *position)
-{
- // For this test we need to print only coordinate, so that we get a nice
- // error message if the below test fails.
- QString str;
- QDebug dbg(&str);
- dbg << position->coordinate();
- const auto dataArray = str.toLatin1();
- const auto msgSize = dataArray.size() + 1;
- char *msg = new char[msgSize];
- memset(msg, 0, msgSize);
- qsnprintf(msg, msgSize, "%s", dataArray.constData());
- return msg;
-}
-
-void tst_DeclarativePositionSource::positionBinding()
-{
- // "test.source" udpates its position, starting from (0, 0) coordinate, and
- // adding 0.1 lat and 0.1 log at every step
- m_positionSource->setName("test.source");
- m_positionSource->setUpdateInterval(200);
- const QGeoCoordinate c1(0, 0);
- const QGeoCoordinate c2(0.1, 0.1, 0);
- QCOMPARE(m_positionSource->position()->coordinate(), c1);
-
- QGeoPositionInfo posInfo;
- posInfo.setCoordinate(c1);
- QDeclarativePosition pos1;
- pos1.setPosition(posInfo);
-
- posInfo.setCoordinate(c2);
- QDeclarativePosition pos2;
- pos2.setPosition(posInfo);
-
- QTestPrivate::testReadOnlyPropertyBasics<QDeclarativePositionSource, QDeclarativePosition *>(
- *m_positionSource.get(), &pos1, &pos2, "position",
- [&]() {
- QSignalSpy spy(m_positionSource.get(),
- &QDeclarativePositionSource::positionChanged);
- m_positionSource->update();
- // Wait for the update to happen. It should take around 200 ms,
- // but we want to be on a safe side in case of high CI load.
- QTRY_COMPARE_WITH_TIMEOUT(spy.count(), 1, 5000);
- },
- [](const QDeclarativePosition *p1, const QDeclarativePosition *p2) {
- return p1->coordinate() == p2->coordinate();
- },
- printPosition);
- if (QTest::currentTestFailed())
- return;
-
- QProperty<QDeclarativePosition *> prop(nullptr);
- m_positionSource->bindablePosition().setBinding(Qt::makePropertyBinding(prop));
- // We can't have bindings on read-only properties
- QCOMPARE(m_positionSource->bindablePosition().hasBinding(), false);
-}
-
-void tst_DeclarativePositionSource::activeBinding()
-{
- // we can't use a common templated method to test active property, because
- // setActive() uses QTimer::singleShot() to actually update the property
- // state.
- m_positionSource->setName("test.source");
-
- QProperty<bool> activeObserver;
- activeObserver.setBinding(m_positionSource->bindableActive().makeBinding());
-
- QProperty<bool> activeLambdaObserver;
- activeLambdaObserver.setBinding([&]() { return m_positionSource->isActive(); });
-
- QSignalSpy activeSpy(m_positionSource.get(), &QDeclarativePositionSource::activeChanged);
-
- QCOMPARE(activeSpy.count(), 0);
- QCOMPARE(activeObserver.value(), false);
- QCOMPARE(activeLambdaObserver.value(), false);
-
- QProperty<bool> activeSetter(false);
- m_positionSource->bindableActive().setBinding(Qt::makePropertyBinding(activeSetter));
-
- activeSetter = true;
- QTest::qWait(0); // to trigger singleShot timer in setActive
-
- QCOMPARE(activeSpy.count(), 1);
- QCOMPARE(activeObserver.value(), true);
- QCOMPARE(activeLambdaObserver.value(), true);
-
- activeSetter = false;
-
- QCOMPARE(activeSpy.count(), 2);
- QCOMPARE(activeObserver.value(), false);
- QCOMPARE(activeLambdaObserver.value(), false);
-
- // calling update() does not break the binding
- m_positionSource->update(50);
- QCOMPARE(activeSpy.count(), 3);
- QCOMPARE(activeObserver.value(), true);
- QCOMPARE(activeLambdaObserver.value(), true);
-
- QTRY_COMPARE_WITH_TIMEOUT(m_positionSource->sourceError(),
- QDeclarativePositionSource::UpdateTimeoutError, 5000);
-
- QCOMPARE(activeSpy.count(), 4);
- QCOMPARE(activeObserver.value(), false);
- QCOMPARE(activeLambdaObserver.value(), false);
-
- activeSetter = true;
- QTest::qWait(0); // to trigger singleShot timer in setActive
-
- QCOMPARE(activeSpy.count(), 5);
- QCOMPARE(activeObserver.value(), true);
- QCOMPARE(activeLambdaObserver.value(), true);
-
- // calling stop() will break the binding
- m_positionSource->stop();
-
- QCOMPARE(activeSpy.count(), 6);
- QCOMPARE(m_positionSource->isActive(), false);
- QCOMPARE(activeObserver.value(), false);
- QCOMPARE(activeLambdaObserver.value(), false);
-
- activeSetter = false;
- activeSetter = true;
- QTest::qWait(0); // to trigger singleShot timer in setActive
-
- // nothing changed, as the binding is broken
- QCOMPARE(activeSpy.count(), 6);
- QCOMPARE(m_positionSource->isActive(), false);
- QCOMPARE(activeObserver.value(), false);
- QCOMPARE(activeLambdaObserver.value(), false);
-}
-
-void tst_DeclarativePositionSource::startBreaksActiveBinding()
-{
- m_positionSource->setName("test.source");
- QSignalSpy activeSpy(m_positionSource.get(), &QDeclarativePositionSource::activeChanged);
-
- QProperty<bool> activeSetter(true);
- m_positionSource->bindableActive().setBinding(Qt::makePropertyBinding(activeSetter));
-
- QTest::qWait(0); // to trigger singleShot timer in setActive
-
- QCOMPARE(m_positionSource->isActive(), true);
- QCOMPARE(activeSpy.count(), 1);
- QVERIFY(m_positionSource->bindableActive().hasBinding());
-
- // Call start() explicitly, which should break the binding for 'active'
- // property.
- m_positionSource->start();
- activeSetter = false; // this should have no effect
- QTest::qWait(0); // to trigger singleShot timer in setActive
-
- QCOMPARE(m_positionSource->isActive(), true);
- QCOMPARE(activeSpy.count(), 1);
- QVERIFY(!m_positionSource->bindableActive().hasBinding());
-}
-
-void tst_DeclarativePositionSource::activeBindingBreak()
-{
- // This test checks a tricky scenario of breaking the binding for
- // 'active' property.
- // 0. active has a binding to some property Prop.
- // 1. Prop is set to true => active = true => start getting position info.
- // 2. Calling update() for a single update => the binding of active is not
- // broken.
- // 3. Calling stop() explicitly before the update() call is finished =>
- // the active binding is supposed to be broken, but the active state
- // should still be true, because we have a pending update.
- // 4. The pending update finishes => the active is set to false.
-
- m_positionSource->setName("test.source");
-
- QProperty<bool> setter(false);
- m_positionSource->bindableActive().setBinding(Qt::makePropertyBinding(setter));
- QVERIFY(m_positionSource->bindableActive().hasBinding());
-
- setter = true;
- QTest::qWait(0); // to trigger singleShot timer in setActive
- QCOMPARE(m_positionSource->isActive(), true);
-
- QSignalSpy posSpy(m_positionSource.get(), &QDeclarativePositionSource::positionChanged);
- QSignalSpy errSpy(m_positionSource.get(), &QDeclarativePositionSource::sourceErrorChanged);
- m_positionSource->update(210);
-
- m_positionSource->stop();
- QVERIFY(!m_positionSource->bindableActive().hasBinding());
- QCOMPARE(m_positionSource->isActive(), true);
-
- // Wait for the single update to complete. It can be either position update
- // or timeout.
- QTRY_VERIFY_WITH_TIMEOUT(posSpy.count() > 0 || errSpy.count() > 0, 5000);
-
- QCOMPARE(m_positionSource->isActive(), false);
- QVERIFY(!m_positionSource->bindableActive().hasBinding());
-}
-
-void tst_DeclarativePositionSource::intervalOnSourceDependency()
-{
- // updateInterval can be modified if the new source does not support that
- // large one, or implements some calculation
- m_positionSource->setName("invalid_source"); // reset the source
-
- QSignalSpy intervalSpy(m_positionSource.get(),
- &QDeclarativePositionSource::updateIntervalChanged);
-
- m_positionSource->setUpdateInterval(100);
- QCOMPARE(m_positionSource->updateInterval(), 100);
- QCOMPARE(intervalSpy.count(), 1);
-
- // "test.source" has a minimum update interval of 200
- m_positionSource->setName("test.source");
- QCOMPARE(m_positionSource->updateInterval(), 200);
- QCOMPARE(intervalSpy.count(), 2);
-
- // "dummy.source" has a minimum update interval of 100, so we expect our
- // desired interval to be applied
- m_positionSource->setName("dummy.source");
- QCOMPARE(m_positionSource->updateInterval(), 100);
- QCOMPARE(intervalSpy.count(), 3);
-}
-
-void tst_DeclarativePositionSource::preferredMethodsOnSourceDependency()
-{
- m_positionSource->setName("invalid_source"); // reset the source
-
- QSignalSpy methodsSpy(m_positionSource.get(),
- &QDeclarativePositionSource::preferredPositioningMethodsChanged);
-
- m_positionSource->setPreferredPositioningMethods(
- QDeclarativePositionSource::SatellitePositioningMethods);
- QCOMPARE(m_positionSource->preferredPositioningMethods(),
- QDeclarativePositionSource::SatellitePositioningMethods);
- QCOMPARE(methodsSpy.count(), 1);
-
- // "dummy.source" has only non-satellite methods, so they will be used
- m_positionSource->setName("dummy.source");
- QCOMPARE(m_positionSource->preferredPositioningMethods(),
- QDeclarativePositionSource::NonSatellitePositioningMethods);
- QCOMPARE(methodsSpy.count(), 2);
-
- // "test.source" has all positioning methods, so satellite will be used,
- // as we initially wanted
- m_positionSource->setName("test.source");
- QCOMPARE(m_positionSource->preferredPositioningMethods(),
- QDeclarativePositionSource::SatellitePositioningMethods);
- QCOMPARE(methodsSpy.count(), 3);
-}
-
-void tst_DeclarativePositionSource::updateAfterStart()
-{
- // When update() is called after start(), it should not invalidate any
- // state. The active state must still be true when the single update() is
- // completed.
-
- m_positionSource->setName("test.source");
-
- QCOMPARE(m_positionSource->isActive(), false);
-
- m_positionSource->start();
- QCOMPARE(m_positionSource->isActive(), true);
-
- QSignalSpy posSpy(m_positionSource.get(), &QDeclarativePositionSource::positionChanged);
- QSignalSpy errSpy(m_positionSource.get(), &QDeclarativePositionSource::sourceErrorChanged);
- m_positionSource->update(210);
- // Wait for the single update to complete. It can be either position update
- // or timeout.
- QTRY_VERIFY_WITH_TIMEOUT(posSpy.count() > 0 || errSpy.count() > 0, 5000);
- QCOMPARE(m_positionSource->isActive(), true);
-
- m_positionSource->stop();
- QCOMPARE(m_positionSource->isActive(), false);
-}
-
-void tst_DeclarativePositionSource::startAfterUpdate()
-{
- // When start() is called after update(), the position source should remain
- // active even when the signle update is completed.
-
- m_positionSource->setName("test.source");
-
- QCOMPARE(m_positionSource->isActive(), false);
-
- QSignalSpy posSpy(m_positionSource.get(), &QDeclarativePositionSource::positionChanged);
- QSignalSpy errSpy(m_positionSource.get(), &QDeclarativePositionSource::sourceErrorChanged);
- m_positionSource->update(210);
- QCOMPARE(m_positionSource->isActive(), true);
-
- m_positionSource->start();
- // Wait for the single update to complete. It can be either position update
- // or timeout.
- QTRY_VERIFY_WITH_TIMEOUT(posSpy.count() > 0 || errSpy.count() > 0, 5000);
- QCOMPARE(m_positionSource->isActive(), true);
-
- m_positionSource->stop();
- QCOMPARE(m_positionSource->isActive(), false);
-}
-
-void tst_DeclarativePositionSource::stopAfterUpdate()
-{
- // When stop() is called after update(), and the update() is still in
- // progress, the position source should remain active until the update()
- // is completed.
-
- m_positionSource->setName("test.source");
-
- QCOMPARE(m_positionSource->isActive(), false);
-
- QSignalSpy posSpy(m_positionSource.get(), &QDeclarativePositionSource::positionChanged);
- QSignalSpy errSpy(m_positionSource.get(), &QDeclarativePositionSource::sourceErrorChanged);
- m_positionSource->update(210);
- QCOMPARE(m_positionSource->isActive(), true);
-
- m_positionSource->stop();
- QCOMPARE(m_positionSource->isActive(), true);
-
- // Wait for the single update to complete. It can be either position update
- // or timeout.
- QTRY_VERIFY_WITH_TIMEOUT(posSpy.count() > 0 || errSpy.count() > 0, 5000);
- QCOMPARE(m_positionSource->isActive(), false);
-}
-
-void tst_DeclarativePositionSource::startStopAfterUpdate()
-{
- // Quite artificial example. Calling start() and stop() after update(),
- // while still waiting for the update() to complete, should still result in
- // the position source to be active until the update() is completed.
-
- m_positionSource->setName("test.source");
-
- QCOMPARE(m_positionSource->isActive(), false);
-
- QSignalSpy posSpy(m_positionSource.get(), &QDeclarativePositionSource::positionChanged);
- QSignalSpy errSpy(m_positionSource.get(), &QDeclarativePositionSource::sourceErrorChanged);
- m_positionSource->update(210);
- QCOMPARE(m_positionSource->isActive(), true);
-
- m_positionSource->start();
- m_positionSource->stop();
-
- QCOMPARE(m_positionSource->isActive(), true);
-
- // Wait for the single update to complete. It can be either position update
- // or timeout.
- QTRY_VERIFY_WITH_TIMEOUT(posSpy.count() > 0 || errSpy.count() > 0, 5000);
- QCOMPARE(m_positionSource->isActive(), false);
-}
-
-void tst_DeclarativePositionSource::updateTimedOut()
-{
- // This test checks that we reset to inactive state when the single update()
- // request times out without providing the position info
-
- m_positionSource->setName("test.source");
-
- QCOMPARE(m_positionSource->isActive(), false);
-
- m_positionSource->update(50); // too small timeout -> will return an error
- QCOMPARE(m_positionSource->isActive(), true);
-
- QTRY_COMPARE_WITH_TIMEOUT(m_positionSource->sourceError(),
- QDeclarativePositionSource::UpdateTimeoutError, 5000);
- QCOMPARE(m_positionSource->isActive(), false);
-}
-
-void tst_DeclarativePositionSource::updateWithStartTimedOut()
-{
- // This test checks that if single update() times out, but the regular
- // updates are running, we still remain in active state.
-
- m_positionSource->setName("test.source");
-
- QCOMPARE(m_positionSource->isActive(), false);
-
- m_positionSource->start();
-
- m_positionSource->update(50); // too small timeout -> will return an error
- QCOMPARE(m_positionSource->isActive(), true);
-
- QTRY_COMPARE_WITH_TIMEOUT(m_positionSource->sourceError(),
- QDeclarativePositionSource::UpdateTimeoutError, 5000);
- QCOMPARE(m_positionSource->isActive(), true);
-
- m_positionSource->stop();
- QCOMPARE(m_positionSource->isActive(), false);
-}
-
-void tst_DeclarativePositionSource::startUpdateStopWithNoIntervals()
-{
- // This test checks that a sequence of calls start() -> update() -> stop()
- // without any waits between them will result in expected behavior.
- // Specifically, the position source should remain active until it gets
- // the position response.
-
- m_positionSource->setName("test.source");
-
- QCOMPARE(m_positionSource->isActive(), false);
-
- m_positionSource->start();
- QSignalSpy posSpy(m_positionSource.get(), &QDeclarativePositionSource::positionChanged);
- QSignalSpy errSpy(m_positionSource.get(), &QDeclarativePositionSource::sourceErrorChanged);
- m_positionSource->update(210);
- QCOMPARE(m_positionSource->isActive(), true);
- m_positionSource->stop();
- QCOMPARE(m_positionSource->isActive(), true);
-
- // Wait for the single update to complete. It can be either position update
- // or timeout.
- QTRY_VERIFY_WITH_TIMEOUT(posSpy.count() > 0 || errSpy.count() > 0, 5000);
- QCOMPARE(m_positionSource->isActive(), false);
-}
-
-QTEST_MAIN(tst_DeclarativePositionSource)
-
-#include "tst_qdeclarativepositionsource.moc"