summaryrefslogtreecommitdiff
path: root/tests/auto
diff options
context:
space:
mode:
authorIan Chen <ian.1.chen@nokia.com>2012-03-21 14:59:51 +1000
committerQt by Nokia <qt-info@nokia.com>2012-03-26 04:57:03 +0200
commitfaabb19710f8379cd57e7349394e8f57c05495fe (patch)
tree22c5512694767856e2e4b24920203f7abeb793b5 /tests/auto
parent5f5bc2723df626124caabc52ca225a45c7972dc5 (diff)
downloadqtlocation-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.pro1
-rw-r--r--tests/auto/qgeomapgeometry/qgeomapgeometry.pro8
-rw-r--r--tests/auto/qgeomapgeometry/tst_qgeomapgeometry.cpp402
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"