Fixed unit tests
[situare] / tests / map / mapengine / testmapengine.cpp
index 3cdb973..5676d3d 100644 (file)
 */
 
 #include <QGraphicsScene>
+#include <QGraphicsView>
 #include <QtTest/QtTest>
 
 #include "common.h"
+#include "coordinates/scenecoordinate.h"
 #include "map/mapcommon.h"
+#include "map/maptile.h"
+
 #include "map/mapengine.h"
 
-const int DEFAULT_TEST_ZOOMLEVEL = 5;
-const QPoint DEFAULT_TEST_SCENECOORDINATE = QPoint(12345,54321);
-const QPoint NEW_TEST_SCENECOORDINATE = QPoint(50000,40000);
+const int ZOOM_LEVEL = 14;
+const SceneCoordinate DEFAULT_TEST_SCENECOORDINATE = SceneCoordinate(12345, 54321);
+const SceneCoordinate NEW_TEST_SCENECOORDINATE = SceneCoordinate(50000, 40000);
+const int MAP_FETCH_DELAY = 1000;
 
 class TestMapEngine: public QObject
 {
@@ -36,16 +41,15 @@ class TestMapEngine: public QObject
 
 private slots:
     void convertTileNumberToSceneCoordinate();
-    void convertLatLonToSceneCoordinate_data();
-    void convertLatLonToSceneCoordinate();
+    void convertTileNumberToSceneCoordinate_data();
     void setLocationNewTilesCount();
     void setLocationRemovedTilesCount();
-    void zoomOutRemovedTilesCount();
-    void zoomInRemovedTilesCount();
     void usingLastLocation();
+    void zoomInRemovedTilesCount();
+    void zoomOutRemovedTilesCount();
 
 signals:
-    void setCenterPosition(QPoint); // a way to call a private slot
+    void setCenterPosition(SceneCoordinate); // a way to call a private slot
 };
 
 /**
@@ -55,58 +59,52 @@ signals:
 */
 void TestMapEngine::convertTileNumberToSceneCoordinate()
 {
-    QCOMPARE(MapEngine::convertTileNumberToSceneCoordinate(18, QPoint(0,0)), QPoint(0,0));
-    QCOMPARE(MapEngine::convertTileNumberToSceneCoordinate(18, QPoint(1,2)), QPoint(256,512));
-    QCOMPARE(MapEngine::convertTileNumberToSceneCoordinate(16, QPoint(3,4)), QPoint(3072,4096));
-}
+    QFETCH(int, zoomLevel);
+    QFETCH(QPoint, tileNumber);
+    QFETCH(SceneCoordinate, expected);
 
-/**
-  * @brief Test data for converting latitude and longitude coordinates to scene coordinates
-  */
-void TestMapEngine::convertLatLonToSceneCoordinate_data()
-{
-    QTest::addColumn<QPointF>("coordinate");
-    QTest::addColumn<QPoint>("result");
-
-    QTest::newRow("top left") << QPointF(MIN_LONGITUDE, MAX_LATITUDE) << QPoint(0, 0);
-
-    int x = (1 << MAX_MAP_ZOOM_LEVEL) * TILE_SIZE_X;
-    int y = (1 << MAX_MAP_ZOOM_LEVEL) * TILE_SIZE_Y;
-    QTest::newRow("bottom right") << QPointF(MAX_LONGITUDE, MIN_LATITUDE) << QPoint(x, y);
+    SceneCoordinate result = MapTile::convertTileNumberToSceneCoordinate(zoomLevel, tileNumber);
+    QCOMPARE(result.x(), expected.x());
+    QCOMPARE(result.y(), expected.y());
 }
 
-/**
-* @brief Test converting real world cordinates to scene coordinates
-* @todo Implement
-*/
-void TestMapEngine::convertLatLonToSceneCoordinate()
+void TestMapEngine::convertTileNumberToSceneCoordinate_data()
 {
-    QFETCH(QPointF, coordinate);
-    QFETCH(QPoint, result);
+    QTest::addColumn<int>("zoomLevel");
+    QTest::addColumn<QPoint>("tileNumber");
+    QTest::addColumn<SceneCoordinate>("expected");
 
-    QCOMPARE(MapEngine::convertLatLonToSceneCoordinate(coordinate), result);
+    QTest::newRow("data1") << 18 << QPoint(0, 0) << SceneCoordinate(0, 0);
+    QTest::newRow("data2") << 18 << QPoint(1, 2) << SceneCoordinate(256, 512);
+    QTest::newRow("data3") << 16 << QPoint(3, 4) << SceneCoordinate(3072, 4096);
 }
 
 void TestMapEngine::setLocationNewTilesCount()
 {
     MapEngine engine;
+    QGraphicsView view;
+    view.setScene(engine.scene());
     engine.viewResized(QSize(800, 480));
-    connect(this, SIGNAL(setCenterPosition(QPoint)), &engine, SLOT(setCenterPosition(QPoint)));
+    connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
+            &engine, SLOT(setCenterPosition(SceneCoordinate)));
+
+    // set initial state for map engine
+    engine.setZoomLevel(ZOOM_LEVEL);
+    emit setCenterPosition(SceneCoordinate(0, 0));
+    QTest::qWait(MAP_FETCH_DELAY);
 
     QSignalSpy fetchImageSpy(&engine, SIGNAL(fetchImage(int,int,int)));
-    QTest::qWait(1000);
-    fetchImageSpy.clear();
 
-    // first test, scene is empty so all tiles should be downloaded
-    emit setCenterPosition(QPoint(1220*16, 1220*16));
-    QTest::qWait(1000);
+    // first test, target location in the scene is empty so all tiles should be downloaded
+    emit setCenterPosition(SceneCoordinate(1220*16, 1220*16));
+    QTest::qWait(MAP_FETCH_DELAY);
     QCOMPARE(fetchImageSpy.count(), 5*4);
     fetchImageSpy.clear();
 
     // move one tile to east and south, only most right one column and most bottom one row tiles
     // should be downloaded
-    emit setCenterPosition(QPoint((1220+TILE_SIZE_X)*16, (1220+TILE_SIZE_Y)*16));
-    QTest::qWait(1000);
+    emit setCenterPosition(SceneCoordinate((1220+OSM_TILE_SIZE_X)*16, (1220+OSM_TILE_SIZE_Y)*16));
+    QTest::qWait(MAP_FETCH_DELAY);
     QCOMPARE(fetchImageSpy.count(), 4 + 4);
     fetchImageSpy.clear();
 }
@@ -114,65 +112,77 @@ void TestMapEngine::setLocationNewTilesCount()
 void TestMapEngine::setLocationRemovedTilesCount()
 {
     MapEngine engine;
+    QGraphicsView view;
+    view.setScene(engine.scene());
     engine.viewResized(QSize(800, 480));
-    connect(this, SIGNAL(setCenterPosition(QPoint)), &engine, SLOT(setCenterPosition(QPoint)));
+    connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
+            &engine, SLOT(setCenterPosition(SceneCoordinate)));
+
+    engine.setZoomLevel(OSM_MAX_ZOOM_LEVEL);
 
     const int maxItemsCount = 40;
 
-    emit setCenterPosition(QPoint(1220*16, 1220*16));
-    QTest::qWait(1000);
-    emit setCenterPosition(QPoint(2220*16, 2220*16));
-    QTest::qWait(1000);
+    emit setCenterPosition(SceneCoordinate(1220*16, 1220*16));
+    QTest::qWait(MAP_FETCH_DELAY);
+    emit setCenterPosition(SceneCoordinate(2220*16, 2220*16));
+    QTest::qWait(MAP_FETCH_DELAY);
     QVERIFY(engine.scene()->items().count() <= maxItemsCount);
 
-    emit setCenterPosition(QPoint(520*16, 2220*16));
-    QTest::qWait(1000);
-    emit setCenterPosition(QPoint(2220*16, 520*16));
-    QTest::qWait(1000);
-
+    emit setCenterPosition(SceneCoordinate(520*16, 2220*16));
+    QTest::qWait(MAP_FETCH_DELAY);
+    emit setCenterPosition(SceneCoordinate(2220*16, 520*16));
+    QTest::qWait(MAP_FETCH_DELAY);
     QVERIFY(engine.scene()->items().count() <= maxItemsCount);
 }
 
 void TestMapEngine::zoomInRemovedTilesCount()
 {
     MapEngine engine;
+    QGraphicsView view;
+    view.setScene(engine.scene());
     engine.viewResized(QSize(800, 480));
-    connect(this, SIGNAL(setCenterPosition(QPoint)), &engine, SLOT(setCenterPosition(QPoint)));
+    connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
+            &engine, SLOT(setCenterPosition(SceneCoordinate)));
+
+    engine.setZoomLevel(OSM_MAX_ZOOM_LEVEL);
 
     const int maxItemsCount = 40;
 
-    emit setCenterPosition(QPoint(1220*16, 1220*16));
-    QTest::qWait(1000);
-    QTest::qWait(1000);
+    emit setCenterPosition(SceneCoordinate(1220*16, 1220*16));
+    QTest::qWait(MAP_FETCH_DELAY);
+    QTest::qWait(MAP_FETCH_DELAY);
     QVERIFY(engine.scene()->items().count() <= maxItemsCount);
 
-    emit setCenterPosition(QPoint(520*16, 2220*16));
-    QTest::qWait(1000);
-    emit setCenterPosition(QPoint(2220*16, 520*16));
-    QTest::qWait(1000);
-
+    emit setCenterPosition(SceneCoordinate(520*16, 2220*16));
+    QTest::qWait(MAP_FETCH_DELAY);
+    emit setCenterPosition(SceneCoordinate(2220*16, 520*16));
+    QTest::qWait(MAP_FETCH_DELAY);
     QVERIFY(engine.scene()->items().count() <= maxItemsCount);
 }
 
 void TestMapEngine::zoomOutRemovedTilesCount()
 {
     MapEngine engine;
+    QGraphicsView view;
+    view.setScene(engine.scene());
     engine.viewResized(QSize(800, 480));
-    connect(this, SIGNAL(setCenterPosition(QPoint)), &engine, SLOT(setCenterPosition(QPoint)));
+    connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
+            &engine, SLOT(setCenterPosition(SceneCoordinate)));
+
+    engine.setZoomLevel(OSM_MAX_ZOOM_LEVEL);
 
     const int maxItemsCount = 40;
 
-    emit setCenterPosition(QPoint(1220*16, 1220.23*16));
-    QTest::qWait(1000);
-    emit setCenterPosition(QPoint(2220*16, 2220.23*16));
-    QTest::qWait(1000);
+    emit setCenterPosition(SceneCoordinate(1220*16, 1220.23*16));
+    QTest::qWait(MAP_FETCH_DELAY);
+    emit setCenterPosition(SceneCoordinate(2220*16, 2220.23*16));
+    QTest::qWait(MAP_FETCH_DELAY);
     QVERIFY(engine.scene()->items().count() <= maxItemsCount);
 
-    emit setCenterPosition(QPoint(520*16, 2220*16));
-    QTest::qWait(1000);
-    emit setCenterPosition(QPoint(2220*16, 520*16));
-    QTest::qWait(1000);
-
+    emit setCenterPosition(SceneCoordinate(520*16, 2220*16));
+    QTest::qWait(MAP_FETCH_DELAY);
+    emit setCenterPosition(SceneCoordinate(2220*16, 520*16));
+    QTest::qWait(MAP_FETCH_DELAY);
     QVERIFY(engine.scene()->items().count() <= maxItemsCount);
 }
 
@@ -180,24 +190,26 @@ void TestMapEngine::usingLastLocation()
 {
     // Create mapengine and start monitoring zoomLevelChanged-signal
     MapEngine *mapengine = new MapEngine;
+    QGraphicsView view;
+    view.setScene(mapengine->scene());
     QSignalSpy mapEngineSpy(mapengine, SIGNAL(zoomLevelChanged(int)));
-    connect(this, SIGNAL(setCenterPosition(QPoint)), mapengine, SLOT(setCenterPosition(QPoint)));
+    connect(this, SIGNAL(setCenterPosition(SceneCoordinate)),
+            mapengine, SLOT(setCenterPosition(SceneCoordinate)));
     QVERIFY (mapEngineSpy.isValid());
     QCOMPARE (mapEngineSpy.count(), 0);
 
     // Write new zoomlevel and location to settings
-    QSettings settings(DIRECTORY_NAME, FILE_NAME);
-    settings.setValue(MAP_LAST_ZOOMLEVEL, DEFAULT_TEST_ZOOMLEVEL);
+    QSettings settings(SETTINGS_ORGANIZATION_NAME, SETTINGS_APPLICATION_NAME);
+    settings.setValue(MAP_LAST_ZOOMLEVEL, ZOOM_LEVEL);
     settings.setValue(MAP_LAST_POSITION,
-                      mapengine->convertSceneCoordinateToLatLon(DEFAULT_TEST_ZOOMLEVEL,
-                                                                DEFAULT_TEST_SCENECOORDINATE));
+                      QVariant::fromValue(GeoCoordinate(DEFAULT_TEST_SCENECOORDINATE)));
 
     // Call mapengines init() and verify that signal will be send
     mapengine->init();
     QCOMPARE (mapEngineSpy.count(), 1);
 
     // Remove zoomlevel and location from settings, call init() again and check that
-    // signals is send again
+    // signals are sent again
     settings.remove(MAP_LAST_ZOOMLEVEL);
     settings.remove(MAP_LAST_POSITION);
     mapengine->init();
@@ -205,10 +217,7 @@ void TestMapEngine::usingLastLocation()
 
     // Check parameters of sended signals
     QList<QVariant> parameters = mapEngineSpy.takeFirst();
-    QVERIFY(parameters.at(0).toInt() == DEFAULT_TEST_ZOOMLEVEL);
-
-    parameters = mapEngineSpy.takeFirst();
-    QVERIFY(parameters.at(0).toInt() == DEFAULT_START_ZOOM_LEVEL);
+    QVERIFY(parameters.at(0).toInt() == ZOOM_LEVEL);
 
     // Call set location with know parameter to get location changed
     // Store new location and zoomlevel to settings
@@ -216,11 +225,10 @@ void TestMapEngine::usingLastLocation()
     delete mapengine;
 
     // Read settings and verify that zoomlevel is correct
-    MapEngine testengine;// = new mapEngine;
-    QPointF LatLonLocation =
-            settings.value(MAP_LAST_POSITION, ERROR_VALUE_NOT_FOUND_ON_SETTINGS).toPointF();
-    QCOMPARE(LatLonLocation, testengine.convertSceneCoordinateToLatLon(DEFAULT_TEST_ZOOMLEVEL,
-                                                                      NEW_TEST_SCENECOORDINATE));
+    GeoCoordinate location =
+        settings.value(MAP_LAST_POSITION, ERROR_VALUE_NOT_FOUND_ON_SETTINGS).value<GeoCoordinate>();
+    QCOMPARE(location.latitude(), GeoCoordinate(NEW_TEST_SCENECOORDINATE).latitude());
+    QCOMPARE(location.longitude(), GeoCoordinate(NEW_TEST_SCENECOORDINATE).longitude());
 }
 
 QTEST_MAIN(TestMapEngine)