diff options
author | Ian Chen <ian.1.chen@nokia.com> | 2012-03-21 14:59:51 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-03-26 04:57:03 +0200 |
commit | faabb19710f8379cd57e7349394e8f57c05495fe (patch) | |
tree | 22c5512694767856e2e4b24920203f7abeb793b5 /tests/auto | |
parent | 5f5bc2723df626124caabc52ca225a45c7972dc5 (diff) | |
download | qtlocation-faabb19710f8379cd57e7349394e8f57c05495fe.tar.gz |
Add qgeomapgeometry unit tests
Change-Id: I2a0c119753fa4b7734a96af075bc1168908f4d57
Reviewed-by: Alex Wilson <alex.wilson@nokia.com>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/auto.pro | 1 | ||||
-rw-r--r-- | tests/auto/qgeomapgeometry/qgeomapgeometry.pro | 8 | ||||
-rw-r--r-- | tests/auto/qgeomapgeometry/tst_qgeomapgeometry.cpp | 402 |
3 files changed, 411 insertions, 0 deletions
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index a8be1277..2f6f2ba3 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -43,6 +43,7 @@ SUBDIRS += geotestplugin \ qgeocoordinate \ qgeolocation \ qgeomaneuver \ + qgeomapgeometry \ qgeopositioninfo \ qgeopositioninfosource \ qgeoroute \ diff --git a/tests/auto/qgeomapgeometry/qgeomapgeometry.pro b/tests/auto/qgeomapgeometry/qgeomapgeometry.pro new file mode 100644 index 00000000..6c9d1a84 --- /dev/null +++ b/tests/auto/qgeomapgeometry/qgeomapgeometry.pro @@ -0,0 +1,8 @@ +CONFIG += testcase +TARGET = tst_qgeomapgeometry + +INCLUDEPATH += ../../../src/location/maps + +SOURCES += tst_qgeomapgeometry.cpp + +QT += location testlib diff --git a/tests/auto/qgeomapgeometry/tst_qgeomapgeometry.cpp b/tests/auto/qgeomapgeometry/tst_qgeomapgeometry.cpp new file mode 100644 index 00000000..a6226cdb --- /dev/null +++ b/tests/auto/qgeomapgeometry/tst_qgeomapgeometry.cpp @@ -0,0 +1,402 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this +** file. Please review the following information to ensure the GNU Lesser +** General Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU General +** Public License version 3.0 as published by the Free Software Foundation +** and appearing in the file LICENSE.GPL included in the packaging of this +** file. Please review the following information to ensure the GNU General +** Public License version 3.0 requirements will be met: +** http://www.gnu.org/copyleft/gpl.html. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +//TESTED_COMPONENT=src/location/maps + +#include "qgeotilespec.h" +#include "qgeomapgeometry_p.h" +#include "qgeocameratiles_p.h" +#include "qgeocameradata_p.h" +#include "qgeoprojection_p.h" +#include "qdoublevector2d_p.h" + +#include <qtest.h> + +#include <QList> +#include <QPair> +#include <QDebug> + +#include <cmath> + +QT_USE_NAMESPACE + +class tst_QGeoMapGeometry : public QObject +{ + Q_OBJECT + + private: + void row(QString name, double screenX, double screenY, double cameraCenterX, double cameraCenterY, + double zoom, int tileSize, int screenWidth, int screenHeight, double mercatorX, double mercatorY){ + + // expected behaviour of wrapping + if (mercatorX <= 0.0) + mercatorX += 1.0; + else if (mercatorX > 1.0) + mercatorX -= 1.0; + + QTest::newRow(qPrintable(name)) + << screenX << screenY + << cameraCenterX << cameraCenterY + << zoom << tileSize + << screenWidth << screenHeight + << mercatorX + << mercatorY; + } + + void screenPositions(QString name, double cameraCenterX, double cameraCenterY, double zoom, + int tileSize, int screenWidth, int screenHeight) + { + double screenX; + double screenY; + double mercatorX; + double mercatorY; + + double halfLength = 1 / (pow(2.0, zoom) * 2); + double scaleX = screenWidth / tileSize; + double scaleY = screenHeight / tileSize; + double scaledHalfLengthX = halfLength * scaleX; + double scaledHalfLengthY = halfLength * scaleY; + + // top left + screenX = 0.0; + screenY = 1.0 * screenHeight; + mercatorX = cameraCenterX - scaledHalfLengthX; + mercatorY = cameraCenterY + scaledHalfLengthY; + row (name + QString("_topLeftScreen"), screenX, screenY, cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight, mercatorX, mercatorY); + + // top + screenX = 0.5 * screenWidth; + screenY = 1.0 * screenHeight; + mercatorX = cameraCenterX; + mercatorY = cameraCenterY + scaledHalfLengthY; + row (name + QString("_topScreen"), screenX, screenY, cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight, mercatorX, mercatorY); + + // top right + screenX = 1.0 * screenWidth; + screenY = 1.0 * screenHeight; + mercatorX = cameraCenterX + scaledHalfLengthX; + mercatorY = cameraCenterY + scaledHalfLengthY; + row (name + QString("_topRightScreen"), screenX, screenY, cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight, mercatorX, mercatorY); + + // left + screenX = 0.0 * screenWidth; + screenY = 0.5 * screenHeight; + mercatorX = cameraCenterX - scaledHalfLengthX; + mercatorY = cameraCenterY; + row (name + QString("_leftScreen"), screenX, screenY, cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight, mercatorX, mercatorY); + + // center + screenX = 0.5 * screenWidth; + screenY = 0.5 * screenHeight; + mercatorX = cameraCenterX; + mercatorY = cameraCenterY; + row (name + QString("_centerScreen"), screenX, screenY, cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight, mercatorX, mercatorY); + + // right + screenX = 1.0 * screenWidth; + screenY = 0.5 * screenHeight; + mercatorX = cameraCenterX + scaledHalfLengthX; + mercatorY = cameraCenterY; + row (name + QString("_rightScreen"), screenX, screenY, cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight, mercatorX, mercatorY); + + // bottom left + screenX = 0.0; + screenY = 0.0; + mercatorX = cameraCenterX - scaledHalfLengthX; + mercatorY = cameraCenterY - scaledHalfLengthY; + row (name + QString("_bottomLeftrScreen"), screenX, screenY, cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight, mercatorX, mercatorY); + + // bottom + screenX = 0.5 * screenWidth; + screenY = 0.0; + mercatorX = cameraCenterX; + mercatorY = cameraCenterY - scaledHalfLengthY; + row (name + QString("_bottomScreen"), screenX, screenY, cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight, mercatorX, mercatorY); + + // bottom right + screenX = 1.0 * screenWidth; + screenY = 0.0; + mercatorX = cameraCenterX + scaledHalfLengthX; + mercatorY = cameraCenterY - scaledHalfLengthY; + row (name + QString("_bottomRightScreen"), screenX, screenY, cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight, mercatorX, mercatorY); + + } + + void screenCameraPositions(QString name, double zoom, int tileSize, + int screenWidth, int screenHeight) + { + double cameraCenterX; + double cameraCenterY; + + // top left + cameraCenterX = 0; + cameraCenterY = 1.0; + screenPositions(name + QString("_topLeftCamera"), cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight); + + // top + cameraCenterX = 0.5; + cameraCenterY = 1.0; + screenPositions(name + QString("_topCamera"), cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight); + // top right + cameraCenterX = 1.0; + cameraCenterY = 1.0; + screenPositions(name + QString("_topRightCamera"), cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight); + // left + cameraCenterX = 0.0; + cameraCenterY = 0.5; + screenPositions(name + QString("_leftCamera"), cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight); + // middle + cameraCenterX = 0.5; + cameraCenterY = 0.5; + screenPositions(name + QString("_middleCamera"), cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight); + // right + cameraCenterX = 1.0; + cameraCenterY = 0.5; + screenPositions(name + QString("_rightCamera"), cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight); + // bottom left + cameraCenterX = 0.0; + cameraCenterY = 0.0; + screenPositions(name + QString("_bottomLeftCamera"), cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight); + // bottom + cameraCenterX = 0.5; + cameraCenterY = 0.0; + screenPositions(name + QString("_bottomCamera"), cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight); + // bottom right + cameraCenterX = 1.0; + cameraCenterY = 0.0; + screenPositions(name + QString("_bottomRightCamera"), cameraCenterX, cameraCenterY, + zoom, tileSize, screenWidth, screenHeight); + } + + void populateScreenMercatorData(){ + QTest::addColumn<double>("screenX"); + QTest::addColumn<double>("screenY"); + QTest::addColumn<double>("cameraCenterX"); + QTest::addColumn<double>("cameraCenterY"); + QTest::addColumn<double>("zoom"); + QTest::addColumn<int>("tileSize"); + QTest::addColumn<int>("screenWidth"); + QTest::addColumn<int>("screenHeight"); + QTest::addColumn<double>("mercatorX"); + QTest::addColumn<double>("mercatorY"); + + int tileSize; + double zoom; + int screenWidth; + int screenHeight; + double screenX; + double screenY; + QString name; + screenX = 0; + screenY = 0; + tileSize = 16; + zoom = 4.0; + + /* + ScreenWidth = t + ScreenHeight = t + */ + screenWidth = tileSize; + screenHeight = tileSize; + name = QString("_(t x t)"); + screenCameraPositions(name, zoom, tileSize, screenWidth, screenHeight); + + /* + ScreenWidth = t * 2 + ScreenHeight = t + */ + screenWidth = tileSize * 2; + screenHeight = tileSize; + name = QString("_(2t x t)"); + screenCameraPositions(name, zoom, tileSize, screenWidth, screenHeight); + + /* + ScreenWidth = t + ScreenHeight = t * 2 + */ + screenWidth = tileSize; + screenHeight = tileSize * 2; + name = QString("_(2t x t)"); + screenCameraPositions(name, zoom, tileSize, screenWidth, screenHeight); + + /* + Screen Width = t * 2 + Screen Height = t * 2 + */ + screenWidth = tileSize * 2; + screenHeight = tileSize * 2; + name = QString("_(2t x t)"); + screenCameraPositions(name, zoom, tileSize, screenWidth, screenHeight); + } + + private slots: + + void useVerticalLock(){ + QGeoCameraData camera; + camera.setZoomLevel(4.0); + camera.setCenter(QGeoProjection::mercatorToCoord(QDoubleVector2D(0.0, 0.0))); + + QGeoCameraTiles ct; + ct.setMaximumZoomLevel(8); + ct.setTileSize(16); + ct.setCamera(camera); + ct.setScreenSize(QSize(16,16)); + + QGeoMapGeometry mapGeometry; + mapGeometry.setTileSize(16); + mapGeometry.setScreenSize(QSize(16,16*32)); + mapGeometry.setCameraData(camera); + QVERIFY(!mapGeometry.verticalLock()); + mapGeometry.setUseVerticalLock(true); + mapGeometry.setVisibleTiles(ct.tiles()); + QVERIFY(mapGeometry.verticalLock()); + + // Test the case when setting vertical lock has no effect + QGeoMapGeometry mapGeometry2; + mapGeometry2.setTileSize(16); + mapGeometry2.setScreenSize(QSize(16,16)); + mapGeometry2.setCameraData(camera); + QVERIFY(!mapGeometry2.verticalLock()); + mapGeometry2.setUseVerticalLock(true); + mapGeometry2.setVisibleTiles(ct.tiles()); + QVERIFY(!mapGeometry2.verticalLock()); + } + + void screenToMercatorPositions(){ + QFETCH(double, screenX); + QFETCH(double, screenY); + QFETCH(double, cameraCenterX); + QFETCH(double, cameraCenterY); + QFETCH(double, zoom); + QFETCH(int, tileSize); + QFETCH(int, screenWidth); + QFETCH(int, screenHeight); + QFETCH(double, mercatorX); + QFETCH(double, mercatorY); + + QGeoCameraData camera; + camera.setZoomLevel(zoom); + camera.setCenter(QGeoProjection::mercatorToCoord(QDoubleVector2D(cameraCenterX, cameraCenterY))); + + QGeoCameraTiles ct; + ct.setMaximumZoomLevel(8); + ct.setTileSize(tileSize); + ct.setCamera(camera); + ct.setScreenSize(QSize(screenWidth,screenHeight)); + + QGeoMapGeometry mapGeometry; + mapGeometry.setTileSize(tileSize); + mapGeometry.setScreenSize(QSize(screenWidth,screenHeight)); + mapGeometry.setCameraData(camera); + mapGeometry.setVisibleTiles(ct.tiles()); + + QPointF point(screenX,screenY); + QDoubleVector2D mecartorPos = mapGeometry.screenPositionToMercator(point); + + QCOMPARE(mecartorPos.x(),mercatorX); + QCOMPARE(mecartorPos.y(),mercatorY); + } + + void screenToMercatorPositions_data() + { + populateScreenMercatorData(); + } + + void mercatorToScreenPositions(){ + QFETCH(double, screenX); + QFETCH(double, screenY); + QFETCH(double, cameraCenterX); + QFETCH(double, cameraCenterY); + QFETCH(double, zoom); + QFETCH(int, tileSize); + QFETCH(int, screenWidth); + QFETCH(int, screenHeight); + QFETCH(double, mercatorX); + QFETCH(double, mercatorY); + + QGeoCameraData camera; + camera.setZoomLevel(zoom); + camera.setCenter(QGeoProjection::mercatorToCoord(QDoubleVector2D(cameraCenterX, cameraCenterY))); + + QGeoCameraTiles ct; + ct.setMaximumZoomLevel(8); + ct.setTileSize(tileSize); + ct.setCamera(camera); + ct.setScreenSize(QSize(screenWidth,screenHeight)); + + QGeoMapGeometry mapGeometry; + mapGeometry.setTileSize(tileSize); + mapGeometry.setScreenSize(QSize(screenWidth,screenHeight)); + mapGeometry.setCameraData(camera); + mapGeometry.setVisibleTiles(ct.tiles()); + + QDoubleVector2D mercatorPos(mercatorX, mercatorY); + QPointF point = mapGeometry.mercatorToScreenPosition(mercatorPos); + + QCOMPARE(point.x(), screenX); + QCOMPARE(point.y(), screenY); + } + + void mercatorToScreenPositions_data(){ + populateScreenMercatorData(); + } + +}; + +QTEST_GUILESS_MAIN(tst_QGeoMapGeometry) +#include "tst_qgeomapgeometry.moc" |