blob: 8d1ee42bda9eca16639f207750f94b7df48f376f [file] [log] [blame]
/****************************************************************************
**
** 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 QtLocation 5.6
import QtPositioning 5.5
import QtLocation.Test 5.5
/*
(0,0) ---------------------------------------------------- (296,0)
| no map |
| (20,20) |
(0,20) | ------------------------------------------ | (296,20)
| | | |
| | map | |
| | | |
| | | |
| | | |
| | (lat 20, lon 20) | |
| | x | |
| | | |
| | | |
| | | |
| | | |
| | | |
| ------------------------------------------ |
| |
(0,296) ---------------------------------------------------- (296,296)
*/
Item {
id: page
x: 0; y: 0;
width: 296
height: 296
Plugin { id: testPlugin; name : "qmlgeo.test.plugin"; allowExperimental: true }
property variant mapDefaultCenter: QtPositioning.coordinate(20, 20)
property variant preMapRectangleDefaultTopLeft: QtPositioning.coordinate(20, 20)
property variant preMapRectangleDefaultBottomRight: QtPositioning.coordinate(10, 30)
property variant preMapCircleDefaultCenter: QtPositioning.coordinate(10, 30)
property variant preMapQuickItemDefaultCoordinate: QtPositioning.coordinate(35, 3)
property variant preMapPolygonDefaultPath: [
{ latitude: 25, longitude: 5 },
{ latitude: 20, longitude: 10 },
{ latitude: 15, longitude: 6 }
]
property variant preMapPolylineDefaultPath: [
{ latitude: 25, longitude: 15 },
{ latitude: 20, longitude: 19 },
{ latitude: 15, longitude: 16 }
]
property variant preMapRouteDefaultPath: [
{ latitude: 25, longitude: 14 },
{ latitude: 20, longitude: 18 },
{ latitude: 15, longitude: 15 }
]
property variant mapCircleTopLeft: QtPositioning.coordinate(0, 0)
property variant mapCircleBottomRight: QtPositioning.coordinate(0, 0)
property variant mapQuickItemTopLeft: QtPositioning.coordinate(0, 0)
property variant mapQuickItemBottomRight: QtPositioning.coordinate(0, 0)
property variant mapPolygonTopLeft: QtPositioning.coordinate(0, 0)
property variant mapPolygonBottomRight: QtPositioning.coordinate(0, 0)
property variant mapPolylineTopLeft: QtPositioning.coordinate(0, 0)
property variant mapPolylineBottomRight: QtPositioning.coordinate(0, 0)
property variant mapRouteTopLeft: QtPositioning.coordinate(0, 0)
property variant mapRouteBottomRight: QtPositioning.coordinate(0, 0)
property variant fitRect: QtPositioning.rectangle(QtPositioning.coordinate(80, 80),
QtPositioning.coordinate(78, 82))
property variant fitEmptyRect: QtPositioning.rectangle(QtPositioning.coordinate(79, 79),-1, -1)
property variant fitCircle: QtPositioning.circle(QtPositioning.coordinate(-50, -100), 1500)
property variant fitInvalidShape: QtPositioning.shape()
property variant fitCircleTopLeft: QtPositioning.coordinate(0, 0)
property variant fitCircleBottomRight: QtPositioning.coordinate(0, 0)
Map {
id: map;
x: 20; y: 20; width: 256; height: 256
zoomLevel: 3
center: mapDefaultCenter
plugin: testPlugin;
MapRectangle {
id: preMapRect
color: 'darkcyan'
border.width: 0
topLeft: preMapRectangleDefaultTopLeft
bottomRight: preMapRectangleDefaultBottomRight
MouseArea {
id: preMapRectMa
anchors.fill: parent
drag.target: parent
SignalSpy { id: preMapRectClicked; target: parent; signalName: "clicked" }
SignalSpy { id: preMapRectActiveChanged; target: parent.drag; signalName: "activeChanged" }
}
SignalSpy {id: preMapRectTopLeftChanged; target: parent; signalName: "topLeftChanged" }
SignalSpy {id: preMapRectBottomRightChanged; target: parent; signalName: "bottomRightChanged" }
SignalSpy {id: preMapRectColorChanged; target: parent; signalName: "colorChanged"}
}
MapCircle {
id: preMapCircle
color: 'darkmagenta'
border.width: 0
center: preMapCircleDefaultCenter
radius: 400000
MouseArea {
anchors.fill: parent
drag.target: parent
SignalSpy { id: preMapCircleClicked; target: parent; signalName: "clicked" }
SignalSpy { id: preMapCircleActiveChanged; target: parent.drag; signalName: "activeChanged" }
}
SignalSpy {id: preMapCircleCenterChanged; target: parent; signalName: "centerChanged"}
SignalSpy {id: preMapCircleColorChanged; target: parent; signalName: "colorChanged"}
SignalSpy {id: preMapCircleRadiusChanged; target: parent; signalName: "radiusChanged"}
SignalSpy {id: preMapCircleBorderColorChanged; target: parent.border; signalName: "colorChanged"}
SignalSpy {id: preMapCircleBorderWidthChanged; target: parent.border; signalName: "widthChanged"}
}
MapQuickItem {
id: preMapQuickItem
MouseArea {
anchors.fill: parent
drag.target: parent
SignalSpy { id: preMapQuickItemClicked; target: parent; signalName: "clicked" }
SignalSpy { id: preMapQuickItemActiveChanged; target: parent.drag; signalName: "activeChanged" }
}
coordinate: preMapQuickItemDefaultCoordinate
sourceItem: Rectangle {
color: 'darkgreen'
width: 20
height: 20
}
SignalSpy { id: preMapQuickItemCoordinateChanged; target: parent; signalName: "coordinateChanged"}
SignalSpy { id: preMapQuickItemAnchorPointChanged; target: parent; signalName: "anchorPointChanged"}
SignalSpy { id: preMapQuickItemZoomLevelChanged; target: parent; signalName: "zoomLevelChanged"}
SignalSpy { id: preMapQuickItemSourceItemChanged; target: parent; signalName: "sourceItemChanged"}
}
MapPolygon {
id: preMapPolygon
color: 'darkgrey'
border.width: 0
path: [
{ latitude: 25, longitude: 5 },
{ latitude: 20, longitude: 10 },
{ latitude: 15, longitude: 6 }
]
MouseArea {
anchors.fill: parent
drag.target: parent
SignalSpy { id: preMapPolygonClicked; target: parent; signalName: "clicked" }
}
SignalSpy {id: preMapPolygonPathChanged; target: parent; signalName: "pathChanged"}
SignalSpy {id: preMapPolygonColorChanged; target: parent; signalName: "colorChanged"}
SignalSpy {id: preMapPolygonBorderWidthChanged; target: parent.border; signalName: "widthChanged"}
SignalSpy {id: preMapPolygonBorderColorChanged; target: parent.border; signalName: "colorChanged"}
}
MapPolyline {
id: preMapPolyline
line.color: 'darkred'
path: [
{ latitude: 25, longitude: 15 },
{ latitude: 20, longitude: 19 },
{ latitude: 15, longitude: 16 }
]
SignalSpy {id: preMapPolylineColorChanged; target: parent.line; signalName: "colorChanged"}
SignalSpy {id: preMapPolylineWidthChanged; target: parent.line; signalName: "widthChanged"}
SignalSpy {id: preMapPolylinePathChanged; target: parent; signalName: "pathChanged"}
}
MapRoute {
id: preMapRoute
line.color: 'yellow'
// don't try this at home - route is not user instantiable
route: Route {
path: [
{ latitude: 25, longitude: 14 },
{ latitude: 20, longitude: 18 },
{ latitude: 15, longitude: 15 }
]
}
SignalSpy {id: preMapRouteRouteChanged; target: parent; signalName: "routeChanged"}
SignalSpy {id: preMapRouteLineWidthChanged; target: parent.line; signalName: "widthChanged"}
SignalSpy {id: preMapRouteLineColorChanged; target: parent.line; signalName: "colorChanged"}
}
}
TestCase {
name: "MapItemsFitViewport"
when: windowShown && map.mapReady
function initTestCase()
{
// sanity check that the coordinate conversion works
var mapcenter = map.fromCoordinate(map.center)
verify (fuzzy_compare(mapcenter.x, 128, 2))
verify (fuzzy_compare(mapcenter.y, 128, 2))
}
function init()
{
preMapRect.topLeft.latitude = 20
preMapRect.topLeft.longitude = 20
preMapRect.bottomRight.latitude = 10
preMapRect.bottomRight.longitude = 30
preMapCircle.center.latitude = 10
preMapCircle.center.longitude = 30
preMapQuickItem.coordinate.latitude = 35
preMapQuickItem.coordinate.longitude = 3
var i
for (i = 0; i < preMapPolygon.path.length; ++i) {
preMapPolygon.path[i].latitude = preMapPolygonDefaultPath[i].latitude
preMapPolygon.path[i].longitude = preMapPolygonDefaultPath[i].longitude
}
for (i = 0; i < preMapPolyline.path.length; ++i) {
preMapPolyline.path[i].latitude = preMapPolylineDefaultPath[i].latitude
preMapPolyline.path[i].longitude = preMapPolylineDefaultPath[i].longitude
}
for (i = 0; i < preMapRoute.route.path.length; ++i) {
preMapRoute.route.path[i].latitude = preMapRouteDefaultPath[i].latitude
preMapRoute.route.path[i].longitude = preMapRouteDefaultPath[i].longitude
}
// remove items
map.clearMapItems()
//clear_data()
compare (map.mapItems.length, 0)
// reset map
map.center.latitude = 20
map.center.longitude = 20
map.zoomLevel = 3
// re-add items and verify they are back (without needing to pan map etc.)
map.addMapItem(preMapRect)
map.addMapItem(preMapCircle)
map.addMapItem(preMapQuickItem)
map.addMapItem(preMapPolygon)
map.addMapItem(preMapPolyline)
map.addMapItem(preMapRoute)
compare (map.mapItems.length, 6)
calculate_bounds()
}
function test_visible_itmes()
{
// normal case - fit viewport to items which are all already visible
verify_visibility_all_items()
map.fitViewportToMapItems()
visualInspectionPoint()
verify_visibility_all_items()
}
function test_visible_zoom_in()
{
// zoom in (clipping also occurs)
var z = map.zoomLevel
for (var i = (z + 1); i < map.maximumZoomLevel; ++i ) {
map.zoomLevel = i
visualInspectionPoint()
map.fitViewportToMapItems()
visualInspectionPoint()
verify_visibility_all_items()
}
}
function test_visible_zoom_out()
{
// zoom out
for (var i = (z - 1); i >= 0; --i ) {
map.zoomLevel = i
visualInspectionPoint()
verify_visibility_all_items()
map.fitViewportToMapItems()
visualInspectionPoint()
verify_visibility_all_items()
}
}
function test_visible_map_move() {
// move map so all items are out of screen
// then fit viewport
var xDir = 1
var yDir = 0
var xDirChange = -1
var yDirChange = 1
var dir = 0
for (dir = 0; dir < 4; dir++) {
verify_visibility_all_items()
var i = 0
var panX = map.width * xDir * 0.5
var panY = map.height * yDir * 0.5
map.pan(panX, panY)
map.pan(panX, panY)
visualInspectionPoint()
// check all items are indeed not within screen bounds
calculate_bounds()
verify(!is_coord_on_screen(preMapRect.topLeft))
verify(!is_coord_on_screen(preMapRect.bottomRight))
verify(!is_coord_on_screen(mapCircleTopLeft))
verify(!is_coord_on_screen(mapCircleBottomRight))
verify(!is_coord_on_screen(mapPolygonTopLeft))
verify(!is_coord_on_screen(mapPolygonBottomRight))
verify(!is_coord_on_screen(mapQuickItemTopLeft))
verify(!is_coord_on_screen(mapQuickItemBottomRight))
verify(!is_coord_on_screen(mapPolylineTopLeft))
verify(!is_coord_on_screen(mapPolylineBottomRight))
verify(!is_coord_on_screen(mapRouteTopLeft))
verify(!is_coord_on_screen(mapRouteBottomRight))
// fit viewport and verify that all items are visible again
map.fitViewportToMapItems()
visualInspectionPoint()
verify_visibility_all_items()
if (dir == 2)
xDirChange *= -1
if (dir == 1)
yDirChange *= -1
xDir += xDirChange
yDir += yDirChange
}
}
function test_fit_to_geoshape() {
visualInspectionPoint()
calculate_fit_circle_bounds()
//None should be visible
verify(!is_coord_on_screen(fitCircleTopLeft))
verify(!is_coord_on_screen(fitCircleBottomRight))
verify(!is_coord_on_screen(fitRect.topLeft))
verify(!is_coord_on_screen(fitRect.bottomRight))
map.visibleRegion = fitRect
visualInspectionPoint()
calculate_fit_circle_bounds()
//Rectangle should be visible, not circle
verify(!is_coord_on_screen(fitCircleTopLeft))
verify(!is_coord_on_screen(fitCircleBottomRight))
verify(is_coord_on_screen(fitRect.topLeft))
verify(is_coord_on_screen(fitRect.bottomRight))
map.visibleRegion = fitCircle
visualInspectionPoint()
calculate_fit_circle_bounds()
//Circle should be visible, not rectangle
verify(is_coord_on_screen(fitCircleTopLeft))
verify(is_coord_on_screen(fitCircleBottomRight))
verify(!is_coord_on_screen(fitRect.topLeft))
verify(!is_coord_on_screen(fitRect.bottomRight))
map.visibleRegion = fitInvalidShape
visualInspectionPoint()
calculate_fit_circle_bounds()
//Invalid shape, map should be in the same position as before
verify(is_coord_on_screen(fitCircleTopLeft))
verify(is_coord_on_screen(fitCircleBottomRight))
verify(!is_coord_on_screen(fitRect.topLeft))
verify(!is_coord_on_screen(fitRect.bottomRight))
map.visibleRegion = fitEmptyRect
visualInspectionPoint()
calculate_fit_circle_bounds()
//Empty shape, map should change centerlocation, empty rect visible
verify(!is_coord_on_screen(fitCircleTopLeft))
verify(!is_coord_on_screen(fitCircleBottomRight))
verify(is_coord_on_screen(fitEmptyRect.topLeft))
verify(is_coord_on_screen(fitEmptyRect.bottomRight))
// Test if this can be reset
map.visibleRegion = fitRect
verify(is_coord_on_screen(fitRect.topLeft))
verify(is_coord_on_screen(fitRect.bottomRight))
// move map
map.center = QtPositioning.coordinate(0,0)
verify(!is_coord_on_screen(fitRect.topLeft))
verify(!is_coord_on_screen(fitRect.bottomRight))
// recheck
map.visibleRegion = fitRect
verify(is_coord_on_screen(fitRect.topLeft))
verify(is_coord_on_screen(fitRect.bottomRight))
//zoom map
map.zoomLevel++
verify(!is_coord_on_screen(fitRect.topLeft))
verify(!is_coord_on_screen(fitRect.bottomRight))
// recheck
map.visibleRegion = fitRect
verify(is_coord_on_screen(fitRect.topLeft))
verify(is_coord_on_screen(fitRect.bottomRight))
}
// checks that circles belongs to the view port
function circle_in_viewport(center, radius, visible)
{
for (var i = 0; i < 128; ++i) {
var azimuth = 360.0 * i / 128.0;
var coord = center.atDistanceAndAzimuth(radius,azimuth)
if (coord.isValid)
verify(is_coord_on_screen(coord) === visible, visible ?
"circle not visible" : "circle visible")
}
}
function test_fit_circle_to_viewport(data)
{
verify(!is_coord_on_screen(data.center))
circle_in_viewport(data.center, data.radius, false)
map.visibleRegion = QtPositioning.circle(data.center, data.radius)
circle_in_viewport(data.center, data.radius, true)
}
function test_fit_circle_to_viewport_data()
{
return [
{ tag: "circle 1", center:
QtPositioning.coordinate(70,70), radius: 10 },
{ tag: "circle 2", center:
QtPositioning.coordinate(80,30), radius: 2000000 },
{ tag: "circle 3", center:
QtPositioning.coordinate(-82,30), radius: 2000000 },
{ tag: "circle 4", center:
QtPositioning.coordinate(60,179), radius: 20000 },
{ tag: "circle 5", center:
QtPositioning.coordinate(60,-179), radius: 20000 },
]
}
function test_fit_rectangle_to_viewport(data)
{
verify(!is_coord_on_screen(data.topLeft),"rectangle visible")
verify(!is_coord_on_screen(data.bottomRight),"rectangle visible")
map.visibleRegion = QtPositioning.rectangle(data.topLeft,data.bottomRight)
verify(is_coord_on_screen(data.topLeft),"rectangle not visible")
verify(is_coord_on_screen(data.bottomRight),"rectangle not visible")
}
function test_fit_rectangle_to_viewport_data()
{
return [
{ tag: "rectangle 1",
topLeft: QtPositioning.coordinate(80, 80),
bottomRight: QtPositioning.coordinate(78, 82) },
{ tag: "rectangle 2",
topLeft: QtPositioning.coordinate(30,-130),
bottomRight: QtPositioning.coordinate(0,-100)}
]
}
/*function test_ad_visible_items_move() {
// move different individual items out of screen
// then fit viewport
var xDir = 1
var yDir = 0
var xDirChange = -1
var yDirChange = 1
var dir = 0
var move = 50
for (dir = 0; dir < 4; dir++) {
// move rect out of screen
reset()
verify_visibility_all_items()
preMapRect.topLeft.longitude += move * xDir
preMapRect.topLeft.latitude += move * yDir
preMapRect.bottomRight.longitude += move * xDir
preMapRect.bottomRight.latitude += move * yDir
calculate_bounds()
verify(!is_coord_on_screen(preMapRect.topLeft))
verify(!is_coord_on_screen(preMapRect.bottomRight))
map.fitViewportToMapItems()
visualInspectionPoint()
verify_visibility_all_items()
// move circle out of screen
reset()
verify_visibility_all_items()
preMapCircle.center.longitude += move * xDir
preMapCircle.center.latitude += move * yDir
calculate_bounds()
verify(!is_coord_on_screen(mapCircleTopLeft))
verify(!is_coord_on_screen(mapCircleBottomRight))
map.fitViewportToMapItems()
visualInspectionPoint()
verify_visibility_all_items()
// move quick item out of screen
reset()
verify_visibility_all_items()
preMapQuickItem.coordinate.longitude += move * xDir
preMapQuickItem.coordinate.latitude += move * yDir
calculate_bounds()
verify(!is_coord_on_screen(mapQuickItemTopLeft))
verify(!is_coord_on_screen(mapQuickItemBottomRight))
map.fitViewportToMapItems()
visualInspectionPoint()
verify_visibility_all_items()
// move map polygon out of screen
reset()
verify_visibility_all_items()
var i
for (i = 0; i < preMapPolygonDefaultPath.length; ++i) {
preMapPolygon.path[i].longitude += move * xDir
preMapPolygon.path[i].latitude += move * yDir
}
calculate_bounds()
verify(!is_coord_on_screen(mapPolygonTopLeft))
verify(!is_coord_on_screen(mapPolygonBottomRight))
map.fitViewportToMapItems()
visualInspectionPoint()
verify_visibility_all_items()
if (dir == 2)
xDirChange *= -1
if (dir == 1)
yDirChange *= -1
xDir += xDirChange
yDir += yDirChange
}
}*/
function clear_data() {
preMapRectClicked.clear()
preMapCircleClicked.clear()
preMapQuickItemClicked.clear()
preMapPolygonClicked.clear()
preMapCircleCenterChanged.clear()
preMapCircleColorChanged.clear()
preMapCircleRadiusChanged.clear()
preMapCircleBorderColorChanged.clear()
preMapCircleBorderWidthChanged.clear()
preMapRectTopLeftChanged.clear()
preMapRectBottomRightChanged.clear()
preMapRectColorChanged.clear()
preMapPolylineColorChanged.clear()
preMapPolylineWidthChanged.clear()
preMapPolylinePathChanged.clear()
preMapPolygonPathChanged.clear()
preMapPolygonColorChanged.clear()
preMapPolygonBorderColorChanged.clear()
preMapPolygonBorderWidthChanged.clear()
preMapRouteRouteChanged.clear()
preMapRouteLineColorChanged.clear()
preMapRouteLineWidthChanged.clear()
preMapQuickItemCoordinateChanged.clear()
preMapQuickItemAnchorPointChanged.clear()
preMapQuickItemZoomLevelChanged.clear()
preMapQuickItemSourceItemChanged.clear()
}
function calculate_fit_circle_bounds() {
var circleDiagonal = Math.sqrt(2) * fitCircle.radius
fitCircleTopLeft = fitCircle.center.atDistanceAndAzimuth(circleDiagonal,-45)
fitCircleBottomRight = fitCircle.center.atDistanceAndAzimuth(circleDiagonal,135)
}
function calculate_bounds(){
var circleDiagonal = Math.sqrt(2) * preMapCircle.radius
var itemTopLeft = preMapCircle.center.atDistanceAndAzimuth(circleDiagonal,-45)
var itemBottomRight = preMapCircle.center.atDistanceAndAzimuth(circleDiagonal,135)
mapCircleTopLeft = itemTopLeft;
mapCircleBottomRight = itemBottomRight;
itemTopLeft = preMapQuickItem.coordinate
var preMapQuickItemScreenPosition = map.fromCoordinate(preMapQuickItem.coordinate)
preMapQuickItemScreenPosition.x += preMapQuickItem.sourceItem.width
preMapQuickItemScreenPosition.y += preMapQuickItem.sourceItem.height
itemBottomRight = map.toCoordinate(preMapQuickItemScreenPosition)
mapQuickItemTopLeft = itemTopLeft;
mapQuickItemBottomRight = itemBottomRight;
var bounds = min_max_bounds_from_list(preMapPolygon.path)
mapPolygonTopLeft = bounds.topLeft;
mapPolygonBottomRight = bounds.bottomRight;
bounds = min_max_bounds_from_list(preMapPolyline.path)
mapPolylineTopLeft = bounds.topLeft;
mapPolylineBottomRight = bounds.bottomRight;
bounds = min_max_bounds_from_list(preMapRoute.route.path)
mapRouteTopLeft = bounds.topLeft;
mapRouteBottomRight = bounds.bottomRight;
}
function min_max_bounds_from_list(coorindates){
var i = 0
var point = map.fromCoordinate(coorindates[0])
var minX = point.x
var minY = point.y
var maxX = point.x
var maxY = point.y
for (i=1; i < coorindates.length; ++i) {
point = map.fromCoordinate(coorindates[i])
if (point.x < minX)
minX = point.x
if (point.x > maxX)
maxX = point.x
if (point.y < minY)
minY = point.y
if (point.y > maxY)
maxY = point.y
}
point.x = minX
point.y = minY
var itemTopLeft = map.toCoordinate(point)
point.x = maxX
point.y = maxY
var itemBottomRight = map.toCoordinate(point)
return QtPositioning.rectangle(itemTopLeft, itemBottomRight);
}
function verify_visibility_all_items(){
calculate_bounds()
verify(is_coord_on_screen(preMapRect.topLeft))
verify(is_coord_on_screen(preMapRect.bottomRight))
verify(is_coord_on_screen(mapCircleTopLeft))
verify(is_coord_on_screen(mapCircleBottomRight))
verify(is_coord_on_screen(mapPolygonTopLeft))
verify(is_coord_on_screen(mapPolygonBottomRight))
verify(is_coord_on_screen(mapQuickItemTopLeft))
verify(is_coord_on_screen(mapQuickItemBottomRight))
verify(is_coord_on_screen(mapPolylineTopLeft))
verify(is_coord_on_screen(mapPolylineBottomRight))
verify(is_coord_on_screen(mapRouteTopLeft))
verify(is_coord_on_screen(mapRouteBottomRight))
}
function is_coord_on_screen(coord) {
return is_point_on_screen(map.fromCoordinate(coord))
}
function is_point_on_screen(point) {
if (point.x >= 0 && point.x <= (map.x + map.width)
&& point.y >=0 && point.y <= (map.y + map.height) )
return true;
else
return false;
}
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)
}
}
}
}