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/maptile.h"
30 #include "map/mapengine.h"
32 const int ZOOM_LEVEL = 14;
33 const SceneCoordinate DEFAULT_TEST_SCENECOORDINATE = SceneCoordinate(12345, 54321);
34 const SceneCoordinate NEW_TEST_SCENECOORDINATE = SceneCoordinate(50000, 40000);
35 const int MAP_FETCH_DELAY = 1000;
37 class TestMapEngine: public QObject
42 void convertTileNumberToSceneCoordinate();
43 void convertTileNumberToSceneCoordinate_data();
44 void setLocationNewTilesCount();
45 void setLocationRemovedTilesCount();
46 void zoomOutRemovedTilesCount();
47 void zoomInRemovedTilesCount();
48 void usingLastLocation();
51 void setCenterPosition(SceneCoordinate); // a way to call a private slot
55 * @brief Test converting tile numbers to scene coordinates
57 * Different zoom levels are also tested
59 void TestMapEngine::convertTileNumberToSceneCoordinate()
61 QFETCH(int, zoomLevel);
62 QFETCH(QPoint, tileNumber);
63 QFETCH(SceneCoordinate, expected);
65 SceneCoordinate result = MapTile::convertTileNumberToSceneCoordinate(zoomLevel, tileNumber);
66 QCOMPARE(result.x(), expected.x());
67 QCOMPARE(result.y(), expected.y());
70 void TestMapEngine::convertTileNumberToSceneCoordinate_data()
72 QTest::addColumn<int>("zoomLevel");
73 QTest::addColumn<QPoint>("tileNumber");
74 QTest::addColumn<SceneCoordinate>("expected");
76 QTest::newRow("data1") << 18 << QPoint(0, 0) << SceneCoordinate(0, 0);
77 QTest::newRow("data2") << 18 << QPoint(1, 2) << SceneCoordinate(256, 512);
78 QTest::newRow("data3") << 16 << QPoint(3, 4) << SceneCoordinate(3072, 4096);
81 void TestMapEngine::setLocationNewTilesCount()
84 engine.viewResized(QSize(800, 480));
85 connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
86 &engine, SLOT(setCenterPosition(SceneCoordinate)));
88 // set initial state for map engine
89 engine.setZoomLevel(ZOOM_LEVEL);
90 emit setCenterPosition(SceneCoordinate(0, 0));
91 QTest::qWait(MAP_FETCH_DELAY);
93 QSignalSpy fetchImageSpy(&engine, SIGNAL(fetchImage(int,int,int)));
95 // first test, target location in the scene is empty so all tiles should be downloaded
96 emit setCenterPosition(SceneCoordinate(1220*16, 1220*16));
97 QTest::qWait(MAP_FETCH_DELAY);
98 QCOMPARE(fetchImageSpy.count(), 5*4);
99 fetchImageSpy.clear();
101 // move one tile to east and south, only most right one column and most bottom one row tiles
102 // should be downloaded
103 emit setCenterPosition(SceneCoordinate((1220+OSM_TILE_SIZE_X)*16, (1220+OSM_TILE_SIZE_Y)*16));
104 QTest::qWait(MAP_FETCH_DELAY);
105 QCOMPARE(fetchImageSpy.count(), 4 + 4);
106 fetchImageSpy.clear();
109 void TestMapEngine::setLocationRemovedTilesCount()
112 engine.viewResized(QSize(800, 480));
113 connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
114 &engine, SLOT(setCenterPosition(SceneCoordinate)));
116 engine.setZoomLevel(OSM_MAX_ZOOM_LEVEL);
118 const int maxItemsCount = 40;
120 emit setCenterPosition(SceneCoordinate(1220*16, 1220*16));
121 QTest::qWait(MAP_FETCH_DELAY);
122 emit setCenterPosition(SceneCoordinate(2220*16, 2220*16));
123 QTest::qWait(MAP_FETCH_DELAY);
124 QVERIFY(engine.scene()->items().count() <= maxItemsCount);
126 emit setCenterPosition(SceneCoordinate(520*16, 2220*16));
127 QTest::qWait(MAP_FETCH_DELAY);
128 emit setCenterPosition(SceneCoordinate(2220*16, 520*16));
129 QTest::qWait(MAP_FETCH_DELAY);
130 QVERIFY(engine.scene()->items().count() <= maxItemsCount);
133 void TestMapEngine::zoomInRemovedTilesCount()
136 engine.viewResized(QSize(800, 480));
137 connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
138 &engine, SLOT(setCenterPosition(SceneCoordinate)));
140 engine.setZoomLevel(OSM_MAX_ZOOM_LEVEL);
142 const int maxItemsCount = 40;
144 emit setCenterPosition(SceneCoordinate(1220*16, 1220*16));
145 QTest::qWait(MAP_FETCH_DELAY);
146 QTest::qWait(MAP_FETCH_DELAY);
147 QVERIFY(engine.scene()->items().count() <= maxItemsCount);
149 emit setCenterPosition(SceneCoordinate(520*16, 2220*16));
150 QTest::qWait(MAP_FETCH_DELAY);
151 emit setCenterPosition(SceneCoordinate(2220*16, 520*16));
152 QTest::qWait(MAP_FETCH_DELAY);
153 QVERIFY(engine.scene()->items().count() <= maxItemsCount);
156 void TestMapEngine::zoomOutRemovedTilesCount()
159 engine.viewResized(QSize(800, 480));
160 connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
161 &engine, SLOT(setCenterPosition(SceneCoordinate)));
163 engine.setZoomLevel(OSM_MAX_ZOOM_LEVEL);
165 const int maxItemsCount = 40;
167 emit setCenterPosition(SceneCoordinate(1220*16, 1220.23*16));
168 QTest::qWait(MAP_FETCH_DELAY);
169 emit setCenterPosition(SceneCoordinate(2220*16, 2220.23*16));
170 QTest::qWait(MAP_FETCH_DELAY);
171 QVERIFY(engine.scene()->items().count() <= maxItemsCount);
173 emit setCenterPosition(SceneCoordinate(520*16, 2220*16));
174 QTest::qWait(MAP_FETCH_DELAY);
175 emit setCenterPosition(SceneCoordinate(2220*16, 520*16));
176 QTest::qWait(MAP_FETCH_DELAY);
177 QVERIFY(engine.scene()->items().count() <= maxItemsCount);
180 void TestMapEngine::usingLastLocation()
182 // Create mapengine and start monitoring zoomLevelChanged-signal
183 MapEngine *mapengine = new MapEngine;
184 QSignalSpy mapEngineSpy(mapengine, SIGNAL(zoomLevelChanged(int)));
185 connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
186 mapengine, SLOT(setCenterPosition(SceneCoordinate)));
187 QVERIFY (mapEngineSpy.isValid());
188 QCOMPARE (mapEngineSpy.count(), 0);
190 // Write new zoomlevel and location to settings
191 QSettings settings(DIRECTORY_NAME, FILE_NAME);
192 settings.setValue(MAP_LAST_ZOOMLEVEL, ZOOM_LEVEL);
193 settings.setValue(MAP_LAST_POSITION,
194 QVariant::fromValue(GeoCoordinate(DEFAULT_TEST_SCENECOORDINATE)));
196 // Call mapengines init() and verify that signal will be send
198 QCOMPARE (mapEngineSpy.count(), 1);
200 // Remove zoomlevel and location from settings, call init() again and check that
201 // signals are sent again
202 settings.remove(MAP_LAST_ZOOMLEVEL);
203 settings.remove(MAP_LAST_POSITION);
205 QCOMPARE(mapEngineSpy.count(), 2);
207 // Check parameters of sended signals
208 QList<QVariant> parameters = mapEngineSpy.takeFirst();
209 QVERIFY(parameters.at(0).toInt() == ZOOM_LEVEL);
211 // Call set location with know parameter to get location changed
212 // Store new location and zoomlevel to settings
213 emit setCenterPosition(NEW_TEST_SCENECOORDINATE);
216 // Read settings and verify that zoomlevel is correct
217 GeoCoordinate location =
218 settings.value(MAP_LAST_POSITION, ERROR_VALUE_NOT_FOUND_ON_SETTINGS).value<GeoCoordinate>();
219 QCOMPARE(location.latitude(), GeoCoordinate(NEW_TEST_SCENECOORDINATE).latitude());
220 QCOMPARE(location.longitude(), GeoCoordinate(NEW_TEST_SCENECOORDINATE).longitude());
223 QTEST_MAIN(TestMapEngine)
224 #include "testmapengine.moc"