Revision control
++ // Copyright (C) 2021 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++ #include <QtTest/QtTest>
++ #include <QtTest/private/qpropertytesthelper_p.h>
++ #include <QtPositioning/QGeoCircle>
++ #include <QtPositioning/QGeoRectangle>
++ #include <QtPositioningQuick/private/qdeclarativegeolocation_p.h>
++
++ QT_USE_NAMESPACE
++
++ class tst_DeclarativeGeoLocation : public QObject
++ {
++ Q_OBJECT
++
++ private slots:
++ void locationProperty();
++ void addressBinding();
++ void coordinateBinding();
++ void shapeBinding();
++ void attributesBinding();
++ };
++
++ void tst_DeclarativeGeoLocation::locationProperty()
++ {
++ // This test calls setLocation() with different preconditions, providing
++ // coverage for different branches of the setLocation() method.
++
++ QGeoAddress addr;
++ addr.setCountryCode("DEU");
++ addr.setCountry("Germany");
++ addr.setCity("Berlin");
++ addr.setStreet("Erich-Thilo-Str");
++ addr.setStreetNumber("10");
++ addr.setPostalCode("12489");
++
++ const QGeoCoordinate c(52.43, 13.53);
++
++ const QVariantMap attrs { { "string_proprty", "value" }, { "int_property", 5 } };
++
++ QGeoLocation loc1;
++ loc1.setAddress(addr);
++ loc1.setCoordinate(c);
++ loc1.setBoundingShape(QGeoCircle(c, 100));
++ loc1.setExtendedAttributes(attrs);
++
++ QDeclarativeGeoLocation location;
++ qsizetype addrChangedCount = 0;
++ qsizetype coordChangedCount = 0;
++ qsizetype shapeChangedCount = 0;
++ qsizetype attrChangedCount = 0;
++
++ auto addrChangedHandler = location.bindableAddress().onValueChanged(
++ [&addrChangedCount]() { ++addrChangedCount; });
++ Q_UNUSED(addrChangedHandler)
++ auto coordChangedHandler = location.bindableCoordinate().onValueChanged(
++ [&coordChangedCount]() { ++coordChangedCount; });
++ Q_UNUSED(coordChangedHandler)
++ auto shapeChangedHandler = location.bindableBoundingShape().onValueChanged(
++ [&shapeChangedCount]() { ++shapeChangedCount; });
++ Q_UNUSED(shapeChangedHandler)
++ auto attrChangedHandler = location.bindableExtendedAttributes().onValueChanged(
++ [&attrChangedCount]() { ++attrChangedCount; });
++ Q_UNUSED(attrChangedHandler)
++
++ // By default an empty m_address is created in the default constructor.
++ // So m_address contains a valid pointer, m_address->parent() == this.
++ location.setLocation(loc1);
++ QCOMPARE(addrChangedCount, 0); // the pointer didn't change
++ QCOMPARE(coordChangedCount, 1);
++ QCOMPARE(shapeChangedCount, 1);
++ QCOMPARE(attrChangedCount, 1);
++ QCOMPARE(location.location(), loc1);
++ QCOMPARE(location.address()->parent(), &location);
++
++ // m_address contains a nullptr
++ location.setAddress(nullptr);
++ QVERIFY(!location.address());
++ addrChangedCount = 0;
++ coordChangedCount = 0;
++ shapeChangedCount = 0;
++ attrChangedCount = 0;
++
++ location.setLocation(loc1);
++ QCOMPARE(addrChangedCount, 1); // only the pointer has changed
++ QCOMPARE(coordChangedCount, 0);
++ QCOMPARE(shapeChangedCount, 0);
++ QCOMPARE(attrChangedCount, 0);
++ QCOMPARE(location.location(), loc1);
++ QCOMPARE(location.address()->parent(), &location);
++
++ // m_address contains a valid pointer, m_address->parent() != this
++ QGeoAddress addr1;
++ addr1.setCountryCode("USA");
++ addr1.setCountry("United States");
++ addr1.setPostalCode("8900");
++ addr1.setState("Oregon");
++ addr1.setCity("Springfield");
++ addr1.setDistrict("Pressboard Estates");
++ addr1.setStreet("Evergreen Tce");
++ addr1.setStreetNumber("742");
++
++ QDeclarativeGeoAddress geoAddr(addr1);
++
++ location.setAddress(&geoAddr);
++ QVERIFY(location.address());
++ QCOMPARE(location.address()->parent(), nullptr);
++ addrChangedCount = 0;
++
++ location.setLocation(loc1);
++ QCOMPARE(addrChangedCount, 1); // only the pointer has changed
++ QCOMPARE(coordChangedCount, 0);
++ QCOMPARE(shapeChangedCount, 0);
++ QCOMPARE(attrChangedCount, 0);
++ QCOMPARE(location.location(), loc1);
++ QCOMPARE(location.address()->parent(), &location);
++ }
++
++ void tst_DeclarativeGeoLocation::addressBinding()
++ {
++ QDeclarativeGeoLocation location;
++ QDeclarativeGeoAddress addr1;
++ QDeclarativeGeoAddress addr2;
++ QTestPrivate::testReadWritePropertyBasics<QDeclarativeGeoLocation, QDeclarativeGeoAddress *>(
++ location, &addr1, &addr2, "address");
++ }
++
++ void tst_DeclarativeGeoLocation::coordinateBinding()
++ {
++ QDeclarativeGeoLocation location;
++ const QGeoCoordinate c1(2.0, 1.0);
++ const QGeoCoordinate c2(1.0, 2.0);
++ QTestPrivate::testReadWritePropertyBasics<QDeclarativeGeoLocation, QGeoCoordinate>(
++ location, c1, c2, "coordinate");
++ }
++
++ void tst_DeclarativeGeoLocation::shapeBinding()
++ {
++ QDeclarativeGeoLocation location;
++ const QGeoCircle circle(QGeoCoordinate(2.0, 1.0), 10);
++ const QGeoRectangle rectangle(QGeoCoordinate(2.0, 1.0), QGeoCoordinate(1.0, 2.0));
++ QTestPrivate::testReadWritePropertyBasics<QDeclarativeGeoLocation, QGeoShape>(
++ location, circle, rectangle, "boundingShape");
++ }
++
++ void tst_DeclarativeGeoLocation::attributesBinding()
++ {
++ QDeclarativeGeoLocation location;
++ const QVariantMap m1 { { "string_proprty", "value" }, { "int_property", 5 } };
++ const QVariantMap m2 { { "int_property", 10 }, { "double_property", 15.5 } };
++ QTestPrivate::testReadWritePropertyBasics<QDeclarativeGeoLocation, QVariantMap>(
++ location, m1, m2, "extendedAttributes");
++ }
++
++ QTEST_APPLESS_MAIN(tst_DeclarativeGeoLocation)
++
++ #include "tst_qdeclarativegeolocation.moc"