TabbedPanel now emits panelOpened/Closed signals after the animation has stopped.
[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/maptile.h"
29
30 #include "map/mapengine.h"
31
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;
36
37 class TestMapEngine: public QObject
38 {
39     Q_OBJECT
40
41 private slots:
42     void convertTileNumberToSceneCoordinate();
43     void convertTileNumberToSceneCoordinate_data();
44     void setLocationNewTilesCount();
45     void setLocationRemovedTilesCount();
46     void zoomOutRemovedTilesCount();
47     void zoomInRemovedTilesCount();
48     void usingLastLocation();
49
50 signals:
51     void setCenterPosition(SceneCoordinate); // a way to call a private slot
52 };
53
54 /**
55 * @brief Test converting tile numbers to scene coordinates
56 *
57 * Different zoom levels are also tested
58 */
59 void TestMapEngine::convertTileNumberToSceneCoordinate()
60 {
61     QFETCH(int, zoomLevel);
62     QFETCH(QPoint, tileNumber);
63     QFETCH(SceneCoordinate, expected);
64
65     SceneCoordinate result = MapTile::convertTileNumberToSceneCoordinate(zoomLevel, tileNumber);
66     QCOMPARE(result.x(), expected.x());
67     QCOMPARE(result.y(), expected.y());
68 }
69
70 void TestMapEngine::convertTileNumberToSceneCoordinate_data()
71 {
72     QTest::addColumn<int>("zoomLevel");
73     QTest::addColumn<QPoint>("tileNumber");
74     QTest::addColumn<SceneCoordinate>("expected");
75
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);
79 }
80
81 void TestMapEngine::setLocationNewTilesCount()
82 {
83     MapEngine engine;
84     engine.viewResized(QSize(800, 480));
85     connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
86             &engine, SLOT(setCenterPosition(SceneCoordinate)));
87
88     // set initial state for map engine
89     engine.setZoomLevel(ZOOM_LEVEL);
90     emit setCenterPosition(SceneCoordinate(0, 0));
91     QTest::qWait(MAP_FETCH_DELAY);
92
93     QSignalSpy fetchImageSpy(&engine, SIGNAL(fetchImage(int,int,int)));
94
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();
100
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();
107 }
108
109 void TestMapEngine::setLocationRemovedTilesCount()
110 {
111     MapEngine engine;
112     engine.viewResized(QSize(800, 480));
113     connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
114             &engine, SLOT(setCenterPosition(SceneCoordinate)));
115
116     engine.setZoomLevel(OSM_MAX_ZOOM_LEVEL);
117
118     const int maxItemsCount = 40;
119
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);
125
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);
131 }
132
133 void TestMapEngine::zoomInRemovedTilesCount()
134 {
135     MapEngine engine;
136     engine.viewResized(QSize(800, 480));
137     connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
138             &engine, SLOT(setCenterPosition(SceneCoordinate)));
139
140     engine.setZoomLevel(OSM_MAX_ZOOM_LEVEL);
141
142     const int maxItemsCount = 40;
143
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);
148
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);
154 }
155
156 void TestMapEngine::zoomOutRemovedTilesCount()
157 {
158     MapEngine engine;
159     engine.viewResized(QSize(800, 480));
160     connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
161             &engine, SLOT(setCenterPosition(SceneCoordinate)));
162
163     engine.setZoomLevel(OSM_MAX_ZOOM_LEVEL);
164
165     const int maxItemsCount = 40;
166
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);
172
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);
178 }
179
180 void TestMapEngine::usingLastLocation()
181 {
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);
189
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)));
195
196     // Call mapengines init() and verify that signal will be send
197     mapengine->init();
198     QCOMPARE (mapEngineSpy.count(), 1);
199
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);
204     mapengine->init();
205     QCOMPARE(mapEngineSpy.count(), 2);
206
207     // Check parameters of sended signals
208     QList<QVariant> parameters = mapEngineSpy.takeFirst();
209     QVERIFY(parameters.at(0).toInt() == ZOOM_LEVEL);
210
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);
214     delete mapengine;
215
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());
221 }
222
223 QTEST_MAIN(TestMapEngine)
224 #include "testmapengine.moc"