/**************************************************************************** ** ** Copyright (C) 2018 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 "qgeotiledmap_test.h" #include "qgeotilefetcher_test.h" #include "qgeotiledmappingmanagerengine_test.h" #include #include #include #include #include #include #include #include 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 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 m_map; QScopedPointer m_tilesCounter; QGeoTileFetcherTest *m_fetcher; }; tst_QGeoTiledMap::tst_QGeoTiledMap(): m_fetcher(0) { } tst_QGeoTiledMap::~tst_QGeoTiledMap() { } void tst_QGeoTiledMap::initTestCase() { #if QT_CONFIG(library) // 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 #endif QVariantMap parameters; parameters["tileSize"] = 256; 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(mappingManager->createMap(this))); QVERIFY(m_map); m_map->setViewportSize(QSize(256, 256)); m_map->setActiveMapType(m_map->m_engine->supportedMapTypes().first()); m_fetcher = static_cast(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(QWebMercator::mercatorToCoord(QDoubleVector2D( 0.5 , 0.5 ))); //prev_visible camera.setZoomLevel(zoomLevel-1); // Delay needed on slow targets (e.g. Qemu) QTest::qWait(10); m_map->clearData(); m_tilesCounter->m_tiles.clear(); m_map->setCameraData(camera); waitForFetch(visibleCount); QSet prev_visible = m_tilesCounter->m_tiles; //visible + prefetch camera.setZoomLevel(zoomLevel); // Delay needed on slow targets (e.g. Qemu) QTest::qWait(10); m_map->clearData(); m_tilesCounter->m_tiles.clear(); m_map->setCameraData(camera); waitForFetch(visibleCount); QSet visible = m_tilesCounter->m_tiles; m_map->clearData(); m_tilesCounter->m_tiles.clear(); m_map->prefetchData(); waitForFetch(prefetchCount); QSet prefetched = m_tilesCounter->m_tiles; //next visible camera.setZoomLevel(zoomLevel + 1); // Delay needed on slow targets (e.g. Qemu) QTest::qWait(10); m_map->clearData(); m_tilesCounter->m_tiles.clear(); m_map->setCameraData(camera); waitForFetch(visibleCount); QSet next_visible = m_tilesCounter->m_tiles; QVERIFY2(visibleCount == visible.size(), "visible count incorrect"); QVERIFY2(prefetchCount == prefetched.size(), "prefetch count incorrect"); QSetIterator 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("zoomLevel"); QTest::addColumn("visibleCount"); QTest::addColumn("prefetchCount"); QTest::addColumn("style"); QTest::addColumn("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"