Unit tests re-factoring for new coordinates on-going...
[situare] / tests / map / mapengine / testmapengine.cpp
1 /*
2     Situare - A location system for Facebook
3     Copyright (C) 2010  Ixonos Plc. Authors:
4
5         Sami Rämö - sami.ramo@ixonos.com
6
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.
10
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.
15
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,
19     USA.
20 */
21
22 #include <QGraphicsScene>
23 #include <QtTest/QtTest>
24
25 #include "common.h"
26 #include "coordinates/scenecoordinate.h"
27 #include "map/mapcommon.h"
28 #include "map/mapengine.h"
29
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);
33
34 class TestMapEngine: public QObject
35 {
36     Q_OBJECT
37
38 private slots:
39     void convertTileNumberToSceneCoordinate();
40     void convertTileNumberToSceneCoordinate_data();
41     void setLocationNewTilesCount();
42     void setLocationRemovedTilesCount();
43     void zoomOutRemovedTilesCount();
44     void zoomInRemovedTilesCount();
45     void usingLastLocation();
46
47 signals:
48     void setCenterPosition(SceneCoordinate); // a way to call a private slot
49 };
50
51 /**
52 * @brief Test converting tile numbers to scene coordinates
53 *
54 * Different zoom levels are also tested
55 */
56 void TestMapEngine::convertTileNumberToSceneCoordinate()
57 {
58     QFETCH(int, zoomLevel);
59     QFETCH(QPoint, tileNumber);
60     QFETCH(SceneCoordinate, expected);
61
62     SceneCoordinate result = MapEngine::convertTileNumberToSceneCoordinate(zoomLevel, tileNumber);
63     QCOMPARE(result.x(), expected.x());
64     QCOMPARE(result.y(), expected.y());
65 }
66
67 void TestMapEngine::convertTileNumberToSceneCoordinate_data()
68 {
69     QTest::addColumn<int>("zoomLevel");
70     QTest::addColumn<QPoint>("tileNumber");
71     QTest::addColumn<SceneCoordinate>("expected");
72
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);
76 }
77
78 void TestMapEngine::setLocationNewTilesCount()
79 {
80     MapEngine engine;
81     engine.viewResized(QSize(800, 480));
82     connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
83             &engine, SLOT(setCenterPosition(SceneCoordinate)));
84
85     QSignalSpy fetchImageSpy(&engine, SIGNAL(fetchImage(int,int,int)));
86     QTest::qWait(1000);
87     fetchImageSpy.clear();
88
89     // first test, scene is empty so all tiles should be downloaded
90     emit setCenterPosition(SceneCoordinate(1220*16, 1220*16));
91     QTest::qWait(1000);
92     QCOMPARE(fetchImageSpy.count(), 5*4);
93     fetchImageSpy.clear();
94
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));
98     QTest::qWait(1000);
99     QCOMPARE(fetchImageSpy.count(), 4 + 4);
100     fetchImageSpy.clear();
101 }
102
103 void TestMapEngine::setLocationRemovedTilesCount()
104 {
105     MapEngine engine;
106     engine.viewResized(QSize(800, 480));
107     connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
108             &engine, SLOT(setCenterPosition(SceneCoordinate)));
109
110     const int maxItemsCount = 40;
111
112     emit setCenterPosition(SceneCoordinate(1220*16, 1220*16));
113     QTest::qWait(1000);
114     emit setCenterPosition(SceneCoordinate(2220*16, 2220*16));
115     QTest::qWait(1000);
116     QVERIFY(engine.scene()->items().count() <= maxItemsCount);
117
118     emit setCenterPosition(SceneCoordinate(520*16, 2220*16));
119     QTest::qWait(1000);
120     emit setCenterPosition(SceneCoordinate(2220*16, 520*16));
121     QTest::qWait(1000);
122
123     QVERIFY(engine.scene()->items().count() <= maxItemsCount);
124 }
125
126 void TestMapEngine::zoomInRemovedTilesCount()
127 {
128     MapEngine engine;
129     engine.viewResized(QSize(800, 480));
130     connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
131             &engine, SLOT(setCenterPosition(SceneCoordinate)));
132
133     const int maxItemsCount = 40;
134
135     emit setCenterPosition(SceneCoordinate(1220*16, 1220*16));
136     QTest::qWait(1000);
137     QTest::qWait(1000);
138     QVERIFY(engine.scene()->items().count() <= maxItemsCount);
139
140     emit setCenterPosition(SceneCoordinate(520*16, 2220*16));
141     QTest::qWait(1000);
142     emit setCenterPosition(SceneCoordinate(2220*16, 520*16));
143     QTest::qWait(1000);
144
145     QVERIFY(engine.scene()->items().count() <= maxItemsCount);
146 }
147
148 void TestMapEngine::zoomOutRemovedTilesCount()
149 {
150     MapEngine engine;
151     engine.viewResized(QSize(800, 480));
152     connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
153             &engine, SLOT(setCenterPosition(SceneCoordinate)));
154
155     const int maxItemsCount = 40;
156
157     emit setCenterPosition(SceneCoordinate(1220*16, 1220.23*16));
158     QTest::qWait(1000);
159     emit setCenterPosition(SceneCoordinate(2220*16, 2220.23*16));
160     QTest::qWait(1000);
161     QVERIFY(engine.scene()->items().count() <= maxItemsCount);
162
163     emit setCenterPosition(SceneCoordinate(520*16, 2220*16));
164     QTest::qWait(1000);
165     emit setCenterPosition(SceneCoordinate(2220*16, 520*16));
166     QTest::qWait(1000);
167
168     QVERIFY(engine.scene()->items().count() <= maxItemsCount);
169 }
170
171 void TestMapEngine::usingLastLocation()
172 {
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);
180
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)));
186
187     // Call mapengines init() and verify that signal will be send
188     mapengine->init();
189     QCOMPARE (mapEngineSpy.count(), 1);
190
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);
195     mapengine->init();
196     QCOMPARE(mapEngineSpy.count(), 2);
197
198     // Check parameters of sended signals
199     QList<QVariant> parameters = mapEngineSpy.takeFirst();
200     QVERIFY(parameters.at(0).toInt() == DEFAULT_TEST_ZOOMLEVEL);
201
202     parameters = mapEngineSpy.takeFirst();
203     QVERIFY(parameters.at(0).toInt() == MAP_DEFAULT_ZOOM_LEVEL);
204
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);
208     delete mapengine;
209
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());
215 }
216
217 QTEST_MAIN(TestMapEngine)
218 #include "testmapengine.moc"