diff options
author | Michal Klocek <michal.klocek@theqtcompany.com> | 2015-07-03 15:20:46 +0200 |
---|---|---|
committer | Michal Klocek <michal.klocek@theqtcompany.com> | 2016-02-09 13:58:43 +0000 |
commit | 5fd9681a3563e2346c722bcd779e2b16cd4ac9fd (patch) | |
tree | 0d85e40638232803e25c0b42f0715e7d363a07ad /tests/auto/qgeotiledmap | |
parent | f5f23c4279b454e2465e7f9835b04cc80332f3a0 (diff) | |
download | qtlocation-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.pro | 9 | ||||
-rw-r--r-- | tests/auto/qgeotiledmap/tst_qgeotiledmap.cpp | 208 |
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" |