/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtTest 1.0 import QtPositioning 5.5 import QtLocation 5.6 import QtLocation.Test 5.6 Item { id: page x: 0; y: 0; width: 240 height: 240 Plugin { id: testPlugin name : "qmlgeo.test.plugin" allowExperimental: true parameters: [ PluginParameter { name: "finishRequestImmediately"; value: true}] } property variant mapDefaultCenter: QtPositioning.coordinate(20, 20) property variant datelineCoordinate: QtPositioning.coordinate(20, 180) property variant datelineCoordinateLeft: QtPositioning.coordinate(20, 170) property variant datelineCoordinateRight: QtPositioning.coordinate(20, -170) MapPolygon { id: extMapPolygon color: 'darkgrey' path: [ { latitude: 25, longitude: 5 }, { latitude: 20, longitude: 10 } ] MouseArea { anchors.fill: parent drag.target: parent SignalSpy { id: extMapPolygonClicked; target: parent; signalName: "clicked" } } SignalSpy {id: extMapPolygonPathChanged; target: parent; signalName: "pathChanged"} SignalSpy {id: extMapPolygonColorChanged; target: parent; signalName: "colorChanged"} SignalSpy {id: extMapPolygonBorderWidthChanged; target: parent.border; signalName: "widthChanged"} SignalSpy {id: extMapPolygonBorderColorChanged; target: parent.border; signalName: "colorChanged"} } property variant polyCoordinate: QtPositioning.coordinate(15, 6) MapPolygon { id: extMapPolygon0 color: 'darkgrey' } MapPolyline { id: extMapPolyline0 } MapPolyline { id: extMapPolyline path: [ { latitude: 25, longitude: 5 }, { latitude: 20, longitude: 10 } ] SignalSpy {id: extMapPolylineColorChanged; target: parent.line; signalName: "colorChanged"} SignalSpy {id: extMapPolylineWidthChanged; target: parent.line; signalName: "widthChanged"} SignalSpy {id: extMapPolylinePathChanged; target: parent; signalName: "pathChanged"} } MapRectangle { id: extMapRectDateline color: 'darkcyan' topLeft { latitude: 20 longitude: 175 } bottomRight { latitude: 10 longitude: -175 } MouseArea { anchors.fill: parent drag.target: parent preventStealing: true } } MapCircle { id: extMapCircleDateline color: 'darkmagenta' center { latitude: 20 longitude: 180 } radius: 400000 MouseArea { anchors.fill: parent drag.target: parent preventStealing: true } } MapQuickItem { id: extMapQuickItemDateline MouseArea { anchors.fill: parent drag.target: parent preventStealing: true } coordinate { latitude: 20 longitude: 175 } sourceItem: Rectangle { color: 'darkgreen' width: 20 height: 20 } } MapPolygon { id: extMapPolygonDateline color: 'darkmagenta' path: [ { latitude: 20, longitude: 175 }, { latitude: 20, longitude: -175 }, { latitude: 10, longitude: -175 }, { latitude: 10, longitude: 175 } ] MouseArea { anchors.fill: parent drag.target: parent preventStealing: true } } MapPolyline { id: polylineForSetpath line.width: 3 path: [ { latitude: 20, longitude: 175 }, { latitude: 20, longitude: -175 }, { latitude: 10, longitude: -175 }, { latitude: 10, longitude: 175 } ] } MapPolyline { id: extMapPolylineDateline line.width : 3 path: [ { latitude: 20, longitude: 175 }, { latitude: 25, longitude: -175 } ] MouseArea { anchors.fill: parent drag.target: parent } } MapRoute { id: extMapRouteDateline line.color: 'yellow' route: Route { path: [ { latitude: 25, longitude: 175 }, { latitude: 20, longitude: -175 } ] } } MapRectangle { id: extMapRectEdge color: 'darkcyan' topLeft { latitude: 20 longitude: -15 } bottomRight { latitude: 10 longitude: -5 } MouseArea { anchors.fill: parent drag.target: parent } } MapCircle { id: extMapCircleEdge color: 'darkmagenta' center { latitude: 20 longitude: -15 } radius: 400000 MouseArea { anchors.fill: parent drag.target: parent } } MapQuickItem { id: extMapQuickItemEdge MouseArea { anchors.fill: parent drag.target: parent } coordinate { latitude: 20 longitude: -15 } sourceItem: Rectangle { color: 'darkgreen' width: 20 height: 20 } } MapPolygon { id: extMapPolygonEdge color: 'darkmagenta' path: [ { latitude: 20, longitude: -15 }, { latitude: 20, longitude: -5 }, { latitude: 10, longitude: -5 }, { latitude: 10, longitude: -15 } ] MouseArea { anchors.fill: parent drag.target: parent } } MapPolyline { id: extMapPolylineEdge line.width : 3 path: [ { latitude: 20, longitude: -15 }, { latitude: 25, longitude: -5 } ] MouseArea { anchors.fill: parent drag.target: parent } } MapRoute { id: extMapRouteEdge line.color: 'yellow' route: Route { path: [ { latitude: 25, longitude: -15 }, { latitude: 20, longitude: -5 } ] } } Map { id: map; x: 20; y: 20; width: 200; height: 200 center: mapDefaultCenter plugin: testPlugin; } Text {id: progressText} TestCase { name: "MapItemDetails" when: windowShown && map.mapReady /* (0,0) ---------------------------------------------------- (240,0) | no map | | (20,20) | (0,20) | ------------------------------------------ | (240,20) | | | | | | map | | | | | | | | | | | | | | | | (lat 20, lon 20) | | | | x | | | | | | | | | | | | | | | | | | | | | | | ------------------------------------------ | | | (0,240) ---------------------------------------------------- (240,240) */ function initTestCase() { // sanity check that the coordinate conversion works var mapcenter = map.fromCoordinate(map.center) verify (fuzzy_compare(mapcenter.x, 100, 2)) verify (fuzzy_compare(mapcenter.y, 100, 2)) } function init() { map.clearMapItems() map.zoomLevel = 3 extMapPolygon.border.width = 1.0 extMapPolygonClicked.clear() extMapPolylineColorChanged.clear() extMapPolylineWidthChanged.clear() extMapPolylinePathChanged.clear() extMapPolygonPathChanged.clear() extMapPolygonColorChanged.clear() extMapPolygonBorderColorChanged.clear() extMapPolygonBorderWidthChanged.clear() } function test_polygon() { map.center = extMapPolygon.path[1] var point = map.fromCoordinate(extMapPolygon.path[1]) map.addMapItem(extMapPolygon) verify(LocationTestHelper.waitForPolished(map)) verify(extMapPolygon.path.length == 2) mouseClick(map, point.x - 5, point.y) compare(extMapPolygonClicked.count, 0) map.addMapItem(extMapPolygon0) // mustn't crash or ill-behave verify(extMapPolygon0.path.length == 0) extMapPolygon.addCoordinate(polyCoordinate) verify(extMapPolygon.path.length == 3) verify(LocationTestHelper.waitForPolished(map)) mouseClick(map, point.x - 5, point.y) tryCompare(extMapPolygonClicked, "count", 1) extMapPolygon.path[0].latitude = 10 verify(extMapPolygon.path[0].latitude, 10) extMapPolygon.path[0].latitude = polyCoordinate.latitude verify(extMapPolygon.path[0].latitude, 15) extMapPolygon.path[0].longitude = 2 verify(extMapPolygon.path[0].longitude, 2) extMapPolygon.path[0].longitude = polyCoordinate.longitude verify(extMapPolygon.path[0].longitude, 6) extMapPolygon.removeCoordinate(polyCoordinate) verify(extMapPolygon.path.length == 2) extMapPolygon.removeCoordinate(extMapPolygon.path[1]) verify(extMapPolygon.path.length == 1) extMapPolygon.removeCoordinate(extMapPolygon.path[0]) verify(extMapPolygon.path.length == 0) } function test_polyline() { compare (extMapPolyline.line.width, 1.0) var point = map.fromCoordinate(extMapPolyline.path[1]) map.addMapItem(extMapPolyline0) // mustn't crash or ill-behave verify(extMapPolyline0.path.length == 0) map.addMapItem(extMapPolyline) verify(extMapPolyline.path.length == 2) extMapPolyline.addCoordinate(polyCoordinate) verify(extMapPolyline.path.length == 3) extMapPolyline.addCoordinate(extMapPolyline.path[0]) verify(extMapPolyline.path.length == 4) extMapPolyline.path[0].latitude = 10 verify(extMapPolyline.path[0].latitude, 10) extMapPolyline.path[0].latitude = polyCoordinate.latitude verify(extMapPolyline.path[0].latitude, 15) extMapPolyline.path[0].longitude = 2 verify(extMapPolyline.path[0].longitude, 2) extMapPolyline.path[0].longitude = polyCoordinate.longitude verify(extMapPolyline.path[0].longitude, 6) // TODO when line rendering is ready //mouseClick(map, point.x - 5, point.y) //compare(extMapPolylineClicked.count, 1) extMapPolyline.removeCoordinate(extMapPolyline.path[0]) verify(extMapPolyline.path.length == 3) extMapPolyline.removeCoordinate(polyCoordinate) verify(extMapPolyline.path.length == 2) extMapPolyline.removeCoordinate(extMapPolyline.path[1]) verify(extMapPolyline.path.length == 1) extMapPolyline.removeCoordinate(extMapPolyline.path[0]) verify(extMapPolyline.path.length == 0) } function test_polyline_setpath() { compare (polylineForSetpath.line.width, 3.0) verify(polylineForSetpath.path.length == 4) compare(polylineForSetpath.path[0], QtPositioning.coordinate(20, 175)) compare(polylineForSetpath.path[3], QtPositioning.coordinate(10, 175)) var originalPath = QtPositioning.shapeToPath(polylineForSetpath.geoShape) var geoPath = QtPositioning.path([ { latitude: 20, longitude: -15 }, { latitude: 20, longitude: -5 }, { latitude: 10, longitude: -5 }, { latitude: 10, longitude: -15 }, { latitude: 10, longitude: -105 } ], 50) polylineForSetpath.setPath(geoPath) verify(polylineForSetpath.path.length == 5) compare(polylineForSetpath.path[0], QtPositioning.coordinate(20, -15)) compare(polylineForSetpath.path[3], QtPositioning.coordinate(10, -15)) polylineForSetpath.setPath(originalPath) verify(polylineForSetpath.path.length == 4) compare(polylineForSetpath.path[0], QtPositioning.coordinate(20, 175)) compare(polylineForSetpath.path[3], QtPositioning.coordinate(10, 175)) } /* (0,0) ---------------------------------------------------- (600,0) | no map | | (20,20) | (0,20) | ------------------------------------------ | (600,20) | | | | | | map | | | | | | | | | | | | | | | | (lat 20, lon 180) | | | | x | | | | | | | | | | | | | | | | | | | | | | | ------------------------------------------ | | | (0,240) ---------------------------------------------------- (600,240) */ function test_dateline() { map.center = datelineCoordinate map.zoomLevel = 2.2 var inspectionTime = 0 // change this to inspect the behavior. // rectangle // item spanning across dateline map.addMapItem(extMapRectDateline) verify(extMapRectDateline.topLeft.longitude == 175) verify(extMapRectDateline.bottomRight.longitude == -175) var point = map.fromCoordinate(extMapRectDateline.topLeft) verify(point.x < map.width / 2.0) point = map.fromCoordinate(extMapRectDateline.bottomRight) verify(point.x > map.width / 2.0) // move item away from dataline by directly setting its coords extMapRectDateline.bottomRight.longitude = datelineCoordinateRight.longitude point = map.fromCoordinate(extMapRectDateline.bottomRight) verify(point.x > map.width / 2.0) // move item edge onto dateline extMapRectDateline.topLeft.longitude = datelineCoordinate.longitude point = map.fromCoordinate(extMapRectDateline.topLeft) compare(point.x, map.width / 2.0) // drag item back onto dateline verify(LocationTestHelper.waitForPolished(map)) visualInspectionPoint(inspectionTime) mousePress(map, point.x + 5, point.y + 5) var i for (i=0; i < 20; i += 2) { wait(1) mouseMove(map, point.x + 5 - i, point.y + 5 ) } mouseRelease(map, point.x + 5 - i, point.y + 5) verify(LocationTestHelper.waitForPolished(map)) visualInspectionPoint(inspectionTime) point = map.fromCoordinate(extMapRectDateline.topLeft) verify(point.x < map.width / 2.0) point = map.fromCoordinate(extMapRectDateline.bottomRight) verify(point.x > map.width / 2.0) map.removeMapItem(extMapRectDateline) // circle map.addMapItem(extMapCircleDateline) verify(extMapCircleDateline.center.longitude === 180) map.center = datelineCoordinate point = map.fromCoordinate(extMapCircleDateline.center) compare(point.x, map.width / 2.0) // center of the screen visualInspectionPoint() extMapCircleDateline.center.longitude = datelineCoordinateRight.longitude // -170, moving the circle to the right point = map.fromCoordinate(extMapCircleDateline.center) verify(LocationTestHelper.waitForPolished(map)) verify(point.x > map.width / 2.0) visualInspectionPoint(inspectionTime) mousePress(map, point.x, point.y) for (i=0; i < 50; i += 4) { wait(1) mouseMove(map, point.x - i, point.y) } mouseRelease(map, point.x - i, point.y) verify(LocationTestHelper.waitForPolished(map)) visualInspectionPoint(inspectionTime) point = map.fromCoordinate(extMapCircleDateline.center) visualInspectionPoint() verify(point.x < map.width / 2.0) map.removeMapItem(extMapCircleDateline) // quickitem map.addMapItem(extMapQuickItemDateline) map.center = datelineCoordinate verify(extMapQuickItemDateline.coordinate.longitude === 175) point = map.fromCoordinate(extMapQuickItemDateline.coordinate) verify(point.x < map.width / 2.0) visualInspectionPoint() extMapQuickItemDateline.coordinate.longitude = datelineCoordinateRight.longitude point = map.fromCoordinate(extMapQuickItemDateline.coordinate) verify(point.x > map.width / 2.0) verify(LocationTestHelper.waitForPolished(map)) visualInspectionPoint(inspectionTime) mousePress(map, point.x + 5, point.y + 5) for (i=0; i < 64; i += 5) { wait(1) mouseMove(map, point.x + 5 - i, point.y + 5 ) } mouseRelease(map, point.x + 5 - i, point.y + 5) verify(LocationTestHelper.waitForPolished(map)) visualInspectionPoint(inspectionTime) point = map.fromCoordinate(extMapQuickItemDateline.coordinate) visualInspectionPoint() verify(point.x < map.width / 2.0) map.removeMapItem(extMapQuickItemDateline) // polygon map.addMapItem(extMapPolygonDateline) map.center = datelineCoordinate verify(extMapPolygonDateline.path[0].longitude == 175) verify(extMapPolygonDateline.path[1].longitude == -175) verify(extMapPolygonDateline.path[2].longitude == -175) verify(extMapPolygonDateline.path[3].longitude == 175) point = map.fromCoordinate(extMapPolygonDateline.path[0]) verify(point.x < map.width / 2.0) point = map.fromCoordinate(extMapPolygonDateline.path[1]) verify(point.x > map.width / 2.0) point = map.fromCoordinate(extMapPolygonDateline.path[2]) verify(point.x > map.width / 2.0) point = map.fromCoordinate(extMapPolygonDateline.path[3]) verify(point.x < map.width / 2.0) extMapPolygonDateline.path[1].longitude = datelineCoordinateRight.longitude point = map.fromCoordinate(extMapPolygonDateline.path[1]) verify(point.x > map.width / 2.0) extMapPolygonDateline.path[2].longitude = datelineCoordinateRight.longitude point = map.fromCoordinate(extMapPolygonDateline.path[2]) verify(point.x > map.width / 2.0) var path = extMapPolygonDateline.path; path[0].longitude = datelineCoordinate.longitude; extMapPolygonDateline.path = path; point = map.fromCoordinate(extMapPolygonDateline.path[0]) compare(point.x, map.width / 2.0) path = extMapPolygonDateline.path; path[3].longitude = datelineCoordinate.longitude; extMapPolygonDateline.path = path; point = map.fromCoordinate(extMapPolygonDateline.path[3]) compare(point.x, map.width / 2.0) verify(LocationTestHelper.waitForPolished(map)) visualInspectionPoint(inspectionTime) mousePress(map, point.x + 5, point.y - 5) for (i=0; i < 16; i += 2) { wait(1) mouseMove(map, point.x + 5 - i, point.y - 5 ) } mouseRelease(map, point.x + 5 - i, point.y - 5) verify(LocationTestHelper.waitForPolished(map)) visualInspectionPoint(inspectionTime) point = map.fromCoordinate(extMapPolygonDateline.path[0]) verify(point.x < map.width / 2.0) point = map.fromCoordinate(extMapPolygonDateline.path[1]) verify(point.x > map.width / 2.0) point = map.fromCoordinate(extMapPolygonDateline.path[2]) verify(point.x > map.width / 2.0) point = map.fromCoordinate(extMapPolygonDateline.path[3]) verify(point.x < map.width / 2.0) map.removeMapItem(extMapPolygonDateline) // polyline map.addMapItem(extMapPolylineDateline) map.center = datelineCoordinate verify(extMapPolylineDateline.path[0].longitude == 175) verify(extMapPolylineDateline.path[1].longitude == -175) point = map.fromCoordinate(extMapPolylineDateline.path[0]) verify(point.x < map.width / 2.0) point = map.fromCoordinate(extMapPolylineDateline.path[1]) verify(point.x > map.width / 2.0) extMapPolylineDateline.path[1].longitude = datelineCoordinateRight.longitude point = map.fromCoordinate(extMapPolylineDateline.path[1]) verify(point.x > map.width / 2.0) var path = extMapPolygonDateline.path; path[0].longitude = datelineCoordinate.longitude; extMapPolylineDateline.path = path; point = map.fromCoordinate(extMapPolylineDateline.path[0]) compare(point.x, map.width / 2.0) map.removeMapItem(extMapPolylineDateline) // map route // (does not support setting of path coords) map.addMapItem(extMapRouteDateline) verify(extMapRouteDateline.route.path[0].longitude == 175) verify(extMapRouteDateline.route.path[1].longitude == -175) point = map.fromCoordinate(extMapRouteDateline.route.path[0]) verify(point.x < map.width / 2.0) point = map.fromCoordinate(extMapRouteDateline.route.path[1]) verify(point.x > map.width / 2.0) map.removeMapItem(extMapRouteDateline) } function fuzzy_compare(val, ref, tol) { var tolerance = 2 if (tol !== undefined) tolerance = tol if ((val >= ref - tolerance) && (val <= ref + tolerance)) return true; console.log('map fuzzy cmp returns false for value, ref, tolerance: ' + val + ', ' + ref + ', ' + tolerance) return false; } // call to visualInspectionPoint testcase (for dev time visual inspection) function visualInspectionPoint(time) { var waitTime = 0 // 300 if (time !== undefined) waitTime = time if (waitTime > 0) { console.log('halting for ' + waitTime + ' milliseconds') wait (waitTime) } } } }