summaryrefslogtreecommitdiff
path: root/tests/auto/qgeotiledmap
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@theqtcompany.com>2015-07-03 15:20:46 +0200
committerMichal Klocek <michal.klocek@theqtcompany.com>2016-02-09 13:58:43 +0000
commit5fd9681a3563e2346c722bcd779e2b16cd4ac9fd (patch)
tree0d85e40638232803e25c0b42f0715e7d363a07ad /tests/auto/qgeotiledmap
parentf5f23c4279b454e2465e7f9835b04cc80332f3a0 (diff)
downloadqtlocation-5fd9681a3563e2346c722bcd779e2b16cd4ac9fd.tar.gz
Refactor prefetching tiles
Current implementation uses same QGeoCameraTiles object to calculate visible tiles and tiles which should be prefetched. This is semi optimal since frustum intersection algorithm uses bunch of different parameters. Simplify the logic and use separate objects, this way values in both cases are cached and calculation is done when required. This is important since prefetchData can be called anytime from map's API. Remove textured tiles from scene when clearCache called, this will force redownload of all the tiles. Add new unit test qgeotiledmap and move prefetch test due to refactoring. Change-Id: I6a906df405f212436cdd35ac76f95b559e6b7aae Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
Diffstat (limited to 'tests/auto/qgeotiledmap')
-rw-r--r--tests/auto/qgeotiledmap/qgeotiledmap.pro9
-rw-r--r--tests/auto/qgeotiledmap/tst_qgeotiledmap.cpp208
2 files changed, 217 insertions, 0 deletions
diff --git a/tests/auto/qgeotiledmap/qgeotiledmap.pro b/tests/auto/qgeotiledmap/qgeotiledmap.pro
new file mode 100644
index 00000000..b4850221
--- /dev/null
+++ b/tests/auto/qgeotiledmap/qgeotiledmap.pro
@@ -0,0 +1,9 @@
+TEMPLATE = app
+CONFIG += testcase
+TARGET = tst_qgeotiledmap
+INCLUDEPATH += ../geotestplugin
+
+SOURCES += tst_qgeotiledmap.cpp
+
+QT += location-private positioning-private testlib
+DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/qgeotiledmap/tst_qgeotiledmap.cpp b/tests/auto/qgeotiledmap/tst_qgeotiledmap.cpp
new file mode 100644
index 00000000..a8f053e9
--- /dev/null
+++ b/tests/auto/qgeotiledmap/tst_qgeotiledmap.cpp
@@ -0,0 +1,208 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** 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 http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qgeotiledmap_test.h"
+#include "qgeotilefetcher_test.h"
+#include "qgeotiledmappingmanagerengine_test.h"
+#include <QtCore/QString>
+#include <QtTest/QtTest>
+#include <QtTest/QSignalSpy>
+#include <QtLocation/QGeoServiceProvider>
+#include <QtLocation/private/qgeotiledmap_p.h>
+#include <QtLocation/private/qgeomappingmanager_p.h>
+#include <QtLocation/private/qgeomapcontroller_p.h>
+#include <QtLocation/private/qgeocameracapabilities_p.h>
+
+QT_USE_NAMESPACE
+
+Q_DECLARE_METATYPE(QGeoTiledMap::PrefetchStyle)
+
+class FetchTileCounter: public QObject
+{
+ Q_OBJECT
+public Q_SLOTS:
+ void tileFetched(const QGeoTileSpec& spec) {
+ m_tiles << spec;
+ }
+public:
+ QSet<QGeoTileSpec> m_tiles;
+};
+
+class tst_QGeoTiledMap : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QGeoTiledMap();
+ ~tst_QGeoTiledMap();
+
+private:
+ void waitForFetch(int count);
+
+private Q_SLOTS:
+ void initTestCase();
+ void fetchTiles();
+ void fetchTiles_data();
+
+private:
+ QScopedPointer<QGeoTiledMapTest> m_map;
+ QScopedPointer<FetchTileCounter> m_tilesCounter;
+ QGeoTileFetcherTest *m_fetcher;
+
+};
+
+tst_QGeoTiledMap::tst_QGeoTiledMap():
+ m_fetcher(0)
+{
+}
+
+tst_QGeoTiledMap::~tst_QGeoTiledMap()
+{
+}
+
+void tst_QGeoTiledMap::initTestCase()
+{
+ // Set custom path since CI doesn't install test plugins
+#ifdef Q_OS_WIN
+ QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() +
+ QStringLiteral("/../../../../plugins"));
+#else
+ QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath() +
+ QStringLiteral("/../../../plugins"));
+#endif
+ QVariantMap parameters;
+ parameters["tileSize"] = 16;
+ parameters["maxZoomLevel"] = 8;
+ parameters["finishRequestImmediately"] = true;
+ QGeoServiceProvider *provider = new QGeoServiceProvider("qmlgeo.test.plugin",parameters);
+ provider->setAllowExperimental(true);
+ QGeoMappingManager *mappingManager = provider->mappingManager();
+ QVERIFY2(provider->error() == QGeoServiceProvider::NoError, "Could not load plugin: " + provider->errorString().toLatin1());
+ m_map.reset(static_cast<QGeoTiledMapTest*>(mappingManager->createMap(this)));
+ QVERIFY(m_map);
+ m_map->resize(16, 16);
+ m_fetcher = static_cast<QGeoTileFetcherTest*>(m_map->m_engine->tileFetcher());
+ m_tilesCounter.reset(new FetchTileCounter());
+ connect(m_fetcher, SIGNAL(tileFetched(const QGeoTileSpec&)), m_tilesCounter.data(), SLOT(tileFetched(const QGeoTileSpec&)));
+}
+
+void tst_QGeoTiledMap::fetchTiles()
+{
+ QFETCH(double, zoomLevel);
+ QFETCH(int, visibleCount);
+ QFETCH(int, prefetchCount);
+ QFETCH(QGeoTiledMap::PrefetchStyle, style);
+ QFETCH(int, nearestNeighbourLayer);
+
+ m_map->setPrefetchStyle(style);
+
+ QGeoCameraData camera;
+ camera.setCenter(QGeoProjection::mercatorToCoord(QDoubleVector2D( 0.5 , 0.5 )));
+
+ //prev_visible
+ camera.setZoomLevel(zoomLevel-1);
+ m_map->clearData();
+ m_tilesCounter->m_tiles.clear();
+ m_map->setCameraData(camera);
+ waitForFetch(visibleCount);
+ QSet<QGeoTileSpec> prev_visible = m_tilesCounter->m_tiles;
+
+ //visible + prefetch
+ camera.setZoomLevel(zoomLevel);
+ m_map->clearData();
+ m_tilesCounter->m_tiles.clear();
+ m_map->setCameraData(camera);
+ waitForFetch(visibleCount);
+ QSet<QGeoTileSpec> visible = m_tilesCounter->m_tiles;
+ m_map->clearData();
+ m_tilesCounter->m_tiles.clear();
+ m_map->prefetchData();
+ waitForFetch(prefetchCount);
+ QSet<QGeoTileSpec> prefetched = m_tilesCounter->m_tiles;
+
+ //next visible
+ camera.setZoomLevel(zoomLevel + 1);
+ m_map->clearData();
+ m_tilesCounter->m_tiles.clear();
+ m_map->setCameraData(camera);
+ waitForFetch(visibleCount);
+ QSet<QGeoTileSpec> next_visible = m_tilesCounter->m_tiles;
+
+ QVERIFY2(visibleCount == visible.size(), "visible count incorrect");
+ QVERIFY2(prefetchCount == prefetched.size(), "prefetch count incorrect");
+ QSetIterator<QGeoTileSpec> i(visible);
+ while (i.hasNext())
+ QVERIFY2(prefetched.contains(i.next()),"visible tile missing from prefetched tiles");
+
+ //for zoomLevels wihtout fractions more tiles are fetched for current zoomlevel due to ViewExpansion
+ if (qCeil(zoomLevel) != zoomLevel && style == QGeoTiledMap::PrefetchNeighbourLayer && nearestNeighbourLayer < zoomLevel)
+ QVERIFY2(prefetched == prev_visible + visible, "wrongly prefetched tiles");
+
+ if (qCeil(zoomLevel) != zoomLevel && style == QGeoTiledMap::PrefetchNeighbourLayer && nearestNeighbourLayer > zoomLevel)
+ QVERIFY2(prefetched == next_visible + visible, "wrongly prefetched tiles");
+
+ if (qCeil(zoomLevel) != zoomLevel && style == QGeoTiledMap::PrefetchTwoNeighbourLayers)
+ QVERIFY2(prefetched == prev_visible + visible + next_visible, "wrongly prefetched tiles");
+}
+
+void tst_QGeoTiledMap::fetchTiles_data()
+{
+ QTest::addColumn<double>("zoomLevel");
+ QTest::addColumn<int>("visibleCount");
+ QTest::addColumn<int>("prefetchCount");
+ QTest::addColumn<QGeoTiledMap::PrefetchStyle>("style");
+ QTest::addColumn<int>("nearestNeighbourLayer");
+ QTest::newRow("zoomLevel: 4 , visible count: 4 : prefetch count: 16") << 4.0 << 4 << 4 + 16 << QGeoTiledMap::PrefetchNeighbourLayer << 3;
+ QTest::newRow("zoomLevel: 4.06 , visible count: 4 : prefetch count: 4") << 4.06 << 4 << 4 + 4 << QGeoTiledMap::PrefetchNeighbourLayer << 3;
+ QTest::newRow("zoomLevel: 4.1 , visible count: 4 : prefetch count: 4") << 4.1 << 4 << 4 + 4 << QGeoTiledMap::PrefetchNeighbourLayer << 3;
+ QTest::newRow("zoomLevel: 4.5 , visible count: 4 : prefetch count: 4") << 4.5 << 4 << 4 + 4 << QGeoTiledMap::PrefetchNeighbourLayer << 3;
+ QTest::newRow("zoomLevel: 4.6 , visible count: 4 : prefetch count: 4") << 4.6 << 4 << 4 + 4 << QGeoTiledMap::PrefetchNeighbourLayer << 5;
+ QTest::newRow("zoomLevel: 4.9 , visible count: 4 : prefetch count: 4") << 4.9 << 4 <<4 + 4 << QGeoTiledMap::PrefetchNeighbourLayer << 5;
+ QTest::newRow("zoomLevel: 4 , visible count: 4 : prefetch count: 4") << 4.0 << 4 << 16 + 4 + 4 << QGeoTiledMap::PrefetchTwoNeighbourLayers << 3;
+ QTest::newRow("zoomLevel: 4.1 , visible count: 4 : prefetch count: 4") << 4.1 << 4 << 4 + 4 + 4 << QGeoTiledMap::PrefetchTwoNeighbourLayers << 3;
+ QTest::newRow("zoomLevel: 4.6 ,visible count: 4 : prefetch count: 4") << 4.6 << 4 << 4 + 4 + 4 << QGeoTiledMap::PrefetchTwoNeighbourLayers << 5;
+}
+
+void tst_QGeoTiledMap::waitForFetch(int count)
+{
+ int timeout = 0;
+ while (m_tilesCounter->m_tiles.count() < count && timeout < count) {
+ //250ms for each tile fetch
+ QTest::qWait(250);
+ timeout++;
+ }
+}
+
+QTEST_MAIN(tst_QGeoTiledMap)
+
+#include "tst_qgeotiledmap.moc"