2 Situare - A location system for Facebook
3 Copyright (C) 2010 Ixonos Plc. Authors:
5 Sami Rämö - sami.ramo@ixonos.com
7 Situare is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 version 2 as published by the Free Software Foundation.
11 Situare is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with Situare; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
22 #include <QGraphicsScene>
23 #include <QtTest/QtTest>
26 #include "coordinates/scenecoordinate.h"
27 #include "map/mapcommon.h"
28 #include "map/mapengine.h"
30 const int DEFAULT_TEST_ZOOMLEVEL = 5;
31 const SceneCoordinate DEFAULT_TEST_SCENECOORDINATE = SceneCoordinate(12345, 54321);
32 const SceneCoordinate NEW_TEST_SCENECOORDINATE = SceneCoordinate(50000, 40000);
34 class TestMapEngine: public QObject
39 void convertTileNumberToSceneCoordinate();
40 void convertTileNumberToSceneCoordinate_data();
41 void setLocationNewTilesCount();
42 void setLocationRemovedTilesCount();
43 void zoomOutRemovedTilesCount();
44 void zoomInRemovedTilesCount();
45 void usingLastLocation();
48 void setCenterPosition(SceneCoordinate); // a way to call a private slot
52 * @brief Test converting tile numbers to scene coordinates
54 * Different zoom levels are also tested
56 void TestMapEngine::convertTileNumberToSceneCoordinate()
58 QFETCH(int, zoomLevel);
59 QFETCH(QPoint, tileNumber);
60 QFETCH(SceneCoordinate, expected);
62 SceneCoordinate result = MapEngine::convertTileNumberToSceneCoordinate(zoomLevel, tileNumber);
63 QCOMPARE(result.x(), expected.x());
64 QCOMPARE(result.y(), expected.y());
67 void TestMapEngine::convertTileNumberToSceneCoordinate_data()
69 QTest::addColumn<int>("zoomLevel");
70 QTest::addColumn<QPoint>("tileNumber");
71 QTest::addColumn<SceneCoordinate>("expected");
73 QTest::newRow("data1") << 18 << QPoint(0, 0) << SceneCoordinate(0, 0);
74 QTest::newRow("data2") << 18 << QPoint(1, 2) << SceneCoordinate(256, 512);
75 QTest::newRow("data3") << 16 << QPoint(3, 4) << SceneCoordinate(3072, 4096);
78 void TestMapEngine::setLocationNewTilesCount()
81 engine.viewResized(QSize(800, 480));
82 connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
83 &engine, SLOT(setCenterPosition(SceneCoordinate)));
85 QSignalSpy fetchImageSpy(&engine, SIGNAL(fetchImage(int,int,int)));
87 fetchImageSpy.clear();
89 // first test, scene is empty so all tiles should be downloaded
90 emit setCenterPosition(SceneCoordinate(1220*16, 1220*16));
92 QCOMPARE(fetchImageSpy.count(), 5*4);
93 fetchImageSpy.clear();
95 // move one tile to east and south, only most right one column and most bottom one row tiles
96 // should be downloaded
97 emit setCenterPosition(SceneCoordinate((1220+OSM_TILE_SIZE_X)*16, (1220+OSM_TILE_SIZE_Y)*16));
99 QCOMPARE(fetchImageSpy.count(), 4 + 4);
100 fetchImageSpy.clear();
103 void TestMapEngine::setLocationRemovedTilesCount()
106 engine.viewResized(QSize(800, 480));
107 connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
108 &engine, SLOT(setCenterPosition(SceneCoordinate)));
110 const int maxItemsCount = 40;
112 emit setCenterPosition(SceneCoordinate(1220*16, 1220*16));
114 emit setCenterPosition(SceneCoordinate(2220*16, 2220*16));
116 QVERIFY(engine.scene()->items().count() <= maxItemsCount);
118 emit setCenterPosition(SceneCoordinate(520*16, 2220*16));
120 emit setCenterPosition(SceneCoordinate(2220*16, 520*16));
123 QVERIFY(engine.scene()->items().count() <= maxItemsCount);
126 void TestMapEngine::zoomInRemovedTilesCount()
129 engine.viewResized(QSize(800, 480));
130 connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
131 &engine, SLOT(setCenterPosition(SceneCoordinate)));
133 const int maxItemsCount = 40;
135 emit setCenterPosition(SceneCoordinate(1220*16, 1220*16));
138 QVERIFY(engine.scene()->items().count() <= maxItemsCount);
140 emit setCenterPosition(SceneCoordinate(520*16, 2220*16));
142 emit setCenterPosition(SceneCoordinate(2220*16, 520*16));
145 QVERIFY(engine.scene()->items().count() <= maxItemsCount);
148 void TestMapEngine::zoomOutRemovedTilesCount()
151 engine.viewResized(QSize(800, 480));
152 connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
153 &engine, SLOT(setCenterPosition(SceneCoordinate)));
155 const int maxItemsCount = 40;
157 emit setCenterPosition(SceneCoordinate(1220*16, 1220.23*16));
159 emit setCenterPosition(SceneCoordinate(2220*16, 2220.23*16));
161 QVERIFY(engine.scene()->items().count() <= maxItemsCount);
163 emit setCenterPosition(SceneCoordinate(520*16, 2220*16));
165 emit setCenterPosition(SceneCoordinate(2220*16, 520*16));
168 QVERIFY(engine.scene()->items().count() <= maxItemsCount);
171 void TestMapEngine::usingLastLocation()
173 // Create mapengine and start monitoring zoomLevelChanged-signal
174 MapEngine *mapengine = new MapEngine;
175 QSignalSpy mapEngineSpy(mapengine, SIGNAL(zoomLevelChanged(int)));
176 connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
177 mapengine, SLOT(setCenterPosition(SceneCoordinate)));
178 QVERIFY (mapEngineSpy.isValid());
179 QCOMPARE (mapEngineSpy.count(), 0);
181 // Write new zoomlevel and location to settings
182 QSettings settings(DIRECTORY_NAME, FILE_NAME);
183 settings.setValue(MAP_LAST_ZOOMLEVEL, DEFAULT_TEST_ZOOMLEVEL);
184 settings.setValue(MAP_LAST_POSITION,
185 QVariant::fromValue(GeoCoordinate(DEFAULT_TEST_SCENECOORDINATE)));
187 // Call mapengines init() and verify that signal will be send
189 QCOMPARE (mapEngineSpy.count(), 1);
191 // Remove zoomlevel and location from settings, call init() again and check that
192 // signals is send again
193 settings.remove(MAP_LAST_ZOOMLEVEL);
194 settings.remove(MAP_LAST_POSITION);
196 QCOMPARE(mapEngineSpy.count(), 2);
198 // Check parameters of sended signals
199 QList<QVariant> parameters = mapEngineSpy.takeFirst();
200 QVERIFY(parameters.at(0).toInt() == DEFAULT_TEST_ZOOMLEVEL);
202 parameters = mapEngineSpy.takeFirst();
203 QVERIFY(parameters.at(0).toInt() == MAP_DEFAULT_ZOOM_LEVEL);
205 // Call set location with know parameter to get location changed
206 // Store new location and zoomlevel to settings
207 emit setCenterPosition(NEW_TEST_SCENECOORDINATE);
210 // Read settings and verify that zoomlevel is correct
211 GeoCoordinate location =
212 settings.value(MAP_LAST_POSITION, ERROR_VALUE_NOT_FOUND_ON_SETTINGS).value<GeoCoordinate>();
213 QCOMPARE(location.latitude(), GeoCoordinate(NEW_TEST_SCENECOORDINATE).latitude());
214 QCOMPARE(location.longitude(), GeoCoordinate(NEW_TEST_SCENECOORDINATE).longitude());
217 QTEST_MAIN(TestMapEngine)
218 #include "testmapengine.moc"