/****************************************************************************
**
** 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

    /*
     MouseArea setup for this test case.
     Map dimensions are 100 * 100
     Item containing map is 120,120

                                         (50,50)
     (0,0)   ---------------------------------------------------- (100,0)
             | no mouse area            | mouse area overlapper |
             |                          |                       |
     (0,20)  ---------------------------------------------------- (100,20)
             | mouse area upper         | mouse area upper,     |
             |                          | mouse area overlapper |
             |                          |                       |
             |                          |                       |
             |                          |                       |
     (0,50)  ---------------------------------------------------- (100,50)
             | mouse area lower         | mouse area lower,     |
             |                          | mouse area overlapper |
             |                          |                       |
             |                          |                       |
             |                          |                       |
             |                          |                       |
             |                          |                       |
             |                          |                       |
     (0,100) ---------------------------------------------------- (100,100)    |
                                                                               |
                                                                               |
                                                                      ----------(120, 120)

     */

Item {
    id: page
    x: 0; y: 0;
    width: 120
    height: 120
    // General-purpose elements for the test:
    Plugin { id: testPlugin; name : "qmlgeo.test.plugin"; allowExperimental: true }

    function setMouseData(ma, me)
    {
        ma.lastX = me.x
        ma.lastY = me.y
        ma.lastButton = me.button
        ma.lastButtons = me.buttons
        ma.lastModifiers = me.modifiers
        ma.lastWasHeld = me.wasHeld
        ma.lastIsClick = me.isClick
        ma.lastAccepted = me.accepted
    }

    Map {
        id: map;
        x: 0; y: 0; width: 100; height: 100
        center {
            latitude: 20
            longitude: 20
        }

        plugin: testPlugin;

        MouseArea {
            id: mouseUpper
            objectName: "mouseUpper"
            x: 0; y: 20; width: 100; height: 29
            property int lastX: -1
            property int lastY: -1
            property int lastButton: Qt.NoButton
            property int lastButtons: Qt.NoButton
            property int lastModifiers: Qt.NoModifier
            property bool lastWasHeld: false;
            property bool lastIsClick: false
            property bool lastAccepted: false;

            preventStealing: true

            onClicked: page.setMouseData(mouseUpper, mouse)
            onDoubleClicked: page.setMouseData(mouseUpper, mouse)
            onPressed: page.setMouseData(mouseUpper, mouse)
            onReleased: page.setMouseData(mouseUpper, mouse)
            onPositionChanged: page.setMouseData(mouseUpper, mouse)
            onPressAndHold: page.setMouseData(mouseUpper, mouse)
        }
        MouseArea {
            id: mouseLower
            objectName: "mouseLower"
            x: 0; y: 50; width: 100; height: 50
            property int lastX: -1
            property int lastY: -1
            property int lastButton: Qt.NoButton
            property int lastButtons: Qt.NoButton
            property int lastModifiers: Qt.NoModifier
            property bool lastWasHeld: false;
            property bool lastIsClick: false
            property bool lastAccepted: false;

            onClicked: page.setMouseData(mouseLower, mouse)
            onDoubleClicked: page.setMouseData(mouseLower, mouse)
            onPressed: page.setMouseData(mouseLower, mouse)
            onReleased: page.setMouseData(mouseLower, mouse)
            onPositionChanged: page.setMouseData(mouseLower, mouse)
            onPressAndHold: page.setMouseData(mouseLower, mouse)
        }
        MouseArea {
            id: mouseOverlapper
            objectName: "mouseOverlapper"
            x: 50; y: 0; width: 50; height: 100
            property int lastX: -1
            property int lastY: -1
            property int lastButton: Qt.NoButton
            property int lastButtons: Qt.NoButton
            property int lastModifiers: Qt.NoModifier
            property bool lastWasHeld: false;
            property bool lastIsClick: false
            property bool lastAccepted: false;

            onClicked: page.setMouseData(mouseOverlapper, mouse)
            onDoubleClicked: page.setMouseData(mouseOverlapper, mouse)
            onPressed: page.setMouseData(mouseOverlapper, mouse)
            onReleased: page.setMouseData(mouseOverlapper, mouse)
            onPositionChanged: page.setMouseData(mouseOverlapper, mouse)
            onPressAndHold: page.setMouseData(mouseOverlapper, mouse)
        }
    }

    TestCase {
        name: "MouseArea"
        when: windowShown && map.mapReady
        SignalSpy {id: mouseUpperClickedSpy; target: mouseUpper; signalName: "clicked"}
        SignalSpy {id: mouseLowerClickedSpy; target: mouseLower; signalName: "clicked"}
        SignalSpy {id: mouseOverlapperClickedSpy; target: mouseOverlapper; signalName: "clicked"}
        SignalSpy {id: mouseUpperDoubleClickedSpy; target: mouseUpper; signalName: "doubleClicked"}
        SignalSpy {id: mouseLowerDoubleClickedSpy; target: mouseLower; signalName: "doubleClicked"}
        SignalSpy {id: mouseOverlapperDoubleClickedSpy; target: mouseOverlapper; signalName: "doubleClicked"}
        SignalSpy {id: mouseUpperPressedSpy; target: mouseUpper; signalName: "onPressed"}
        SignalSpy {id: mouseLowerPressedSpy; target: mouseLower; signalName: "onPressed"}
        SignalSpy {id: mouseOverlapperPressedSpy; target: mouseOverlapper; signalName: "onPressed"}
        SignalSpy {id: mouseUpperReleasedSpy; target: mouseUpper; signalName: "released"}
        SignalSpy {id: mouseLowerReleasedSpy; target: mouseLower; signalName: "released"}
        SignalSpy {id: mouseOverlapperReleasedSpy; target: mouseOverlapper; signalName: "released"}
        SignalSpy {id: mouseUpperPositionChangedSpy; target: mouseUpper; signalName: "positionChanged"}
        SignalSpy {id: mouseLowerPositionChangedSpy; target: mouseLower; signalName: "positionChanged"}
        SignalSpy {id: mouseOverlapperPositionChangedSpy; target: mouseOverlapper; signalName: "positionChanged"}
        SignalSpy {id: mouseUpperPressAndHoldSpy; target: mouseUpper; signalName: "pressAndHold"}
        SignalSpy {id: mouseLowerPressAndHoldSpy; target: mouseLower; signalName: "pressAndHold"}
        SignalSpy {id: mouseOverlapperPressAndHoldSpy; target: mouseOverlapper; signalName: "pressAndHold"}
        SignalSpy {id: mouseUpperEnteredSpy; target: mouseUpper; signalName: "entered"}
        SignalSpy {id: mouseLowerEnteredSpy; target: mouseLower; signalName: "entered"}
        SignalSpy {id: mouseOverlapperEnteredSpy; target: mouseOverlapper; signalName: "entered"}
        SignalSpy {id: mouseUpperExitedSpy; target: mouseUpper; signalName: "exited"}
        SignalSpy {id: mouseLowerExitedSpy; target: mouseLower; signalName: "exited"}
        SignalSpy {id: mouseOverlapperExitedSpy; target: mouseOverlapper; signalName: "exited"}

        SignalSpy {id: mouseUpperEnabledChangedSpy; target: mouseUpper; signalName: "enabledChanged"}
        SignalSpy {id: mouseUpperAcceptedButtonsChangedSpy; target: mouseUpper; signalName: "acceptedButtonsChanged"}
        SignalSpy {id: mouseUpperPressedButtonsChangedSpy; target: mouseUpper; signalName: "pressedChanged"}
        SignalSpy {id: mouseUpperHoveredChangedSpy; target: mouseUpper; signalName: "hoveredChanged"}
        SignalSpy {id: mouseUpperPressedChangedSpy; target: mouseUpper; signalName: "pressedChanged"}

        SignalSpy {id: mouseOverlapperEnabledChangedSpy; target: mouseOverlapper; signalName: "enabledChanged"}

        function clear_data() {
            mouseUpperClickedSpy.clear()
            mouseLowerClickedSpy.clear()
            mouseOverlapperClickedSpy.clear()
            mouseUpperDoubleClickedSpy.clear()
            mouseLowerDoubleClickedSpy.clear()
            mouseOverlapperDoubleClickedSpy.clear()
            mouseUpperPressedSpy.clear()
            mouseLowerPressedSpy.clear()
            mouseOverlapperPressedSpy.clear()
            mouseUpperReleasedSpy.clear()
            mouseLowerReleasedSpy.clear()
            mouseOverlapperReleasedSpy.clear()
            mouseUpperPositionChangedSpy.clear()
            mouseLowerPositionChangedSpy.clear()
            mouseOverlapperPositionChangedSpy.clear()
            mouseUpperPressAndHoldSpy.clear()
            mouseLowerPressAndHoldSpy.clear()
            mouseOverlapperPressAndHoldSpy.clear()
            mouseUpperEnteredSpy.clear()
            mouseLowerEnteredSpy.clear()
            mouseOverlapperEnteredSpy.clear()
            mouseUpperExitedSpy.clear()
            mouseLowerExitedSpy.clear()
            mouseOverlapperExitedSpy.clear()

            mouseUpperEnabledChangedSpy.clear()
            mouseUpperAcceptedButtonsChangedSpy.clear()
            mouseUpperPressedButtonsChangedSpy.clear()
            mouseUpperHoveredChangedSpy.clear()
            mouseUpperPressedChangedSpy.clear()
            mouseUpperPositionChangedSpy.clear()

            mouseOverlapperEnabledChangedSpy.clear()
        }
        // these 'real_' prefixed functions do sequences as
        // it would occur on real app (e.g. doubleclick is in fact
        // a sequence of press, release, doubleclick, release).
        // (they were recorded as seen on test app). mouseClick() works ok
        // because testlib internally converts it to mousePress + mouseRelease events
        function real_click (target, x, y) {
            mousePress(target, x,y)
            mouseRelease(target, x, y)
        }
        function real_double_click (target, x, y) {
            mousePress(target, x,y)
            mouseRelease(target, x, y)
            mousePress(target, x, y)
            mouseDoubleClick(target, x, y)
            mouseRelease(target, x, y)
        }
        function real_press_and_hold(target, x,y) {
            mousePress(target,x,y)
            wait(1000) // threshold is 800 ms
            mouseRelease(target,x, y)
        }

        function test_enabled() {
            clear_data()
            // check that disabling overlapping mouse areas let events flow through
            mouseUpper.enabled = false
            compare(mouseUpperEnabledChangedSpy.count, 1)
            compare(mouseUpperClickedSpy.count, 0)
            mouseClick(map, 5, 25)
            compare(mouseUpperClickedSpy.count, 0)
            mouseUpper.enabled = true
            mouseClick(map, 5, 25)
            tryCompare(mouseUpperClickedSpy, "count", 1)
            compare(mouseUpperEnabledChangedSpy.count, 2)
            // when overlapping are is disabled, the event should flow through
            compare(mouseOverlapperClickedSpy.count, 0)
            mouseClick(map, 55, 25)
            tryCompare(mouseUpperClickedSpy, "count", 1)
            compare(mouseOverlapperClickedSpy.count, 1)
            mouseOverlapper.enabled = false
            compare(mouseOverlapperEnabledChangedSpy.count, 1)
            compare(mouseOverlapper.enabled, false)
            mouseClick(map, 55, 25)
            tryCompare(mouseOverlapperClickedSpy, "count", 1)
            compare(mouseUpperClickedSpy.count, 2)
            // re-enable and verify that still works
            mouseOverlapper.enabled = true
            compare(mouseOverlapperEnabledChangedSpy.count, 2)
            compare(mouseOverlapper.enabled, true)
            mouseClick(map, 55, 25)
            tryCompare(mouseOverlapperClickedSpy, "count", 2) // should consume again
            compare(mouseUpperClickedSpy.count, 2)
        }

        function test_wheel() {
            clear_data()
            wait(500);
            // on map but without mouse area
            var startZoomLevel = 6.20
            map.zoomLevel = startZoomLevel
            mouseWheel(map, 5, 5, 15, 5, Qt.LeftButton, Qt.NoModifiers)
            //see QDeclarativeGeoMapGestureArea::handleWheelEvent
            var endZoomLevel = startZoomLevel + 5 * 0.001
            compare(map.zoomLevel,endZoomLevel)

            map.zoomLevel = startZoomLevel
            mouseWheel(map, 5, 5, -15, -5, Qt.LeftButton, Qt.NoModifiers)
            //see QDeclarativeGeoMapGestureArea::handleWheelEvent
            endZoomLevel = startZoomLevel - 5 * 0.001
            compare(map.zoomLevel,endZoomLevel)

            // on map on top of mouse area
            map.zoomLevel = startZoomLevel
            mouseWheel(map, 55, 75, -30, -2, Qt.LeftButton, Qt.NoModifiers)
            endZoomLevel = startZoomLevel - 2 * 0.001
            compare(map.zoomLevel,endZoomLevel)

            // outside of map
            map.zoomLevel = startZoomLevel
            mouseWheel(map, -100, -100, 40, 4, Qt.LeftButton, Qt.NoModifiers)
            compare(map.zoomLevel,startZoomLevel)
        }

        function test_aaa_basic_properties() // _aaa_ to ensure execution first
        {
            clear_data()
            wait(50)
            // default values
            compare(mouseUpper.containsMouse, false)
            compare(mouseUpper.pressed, false)
            compare(mouseUpper.enabled, true)
            compare(mouseUpper.pressedButtons, 0)
            compare(mouseUpper.acceptedButtons, Qt.LeftButton)
            // accepted buttons
            compare(mouseUpperAcceptedButtonsChangedSpy.count, 0)
            mouseUpper.acceptedButtons = Qt.RightButton  | Qt.MiddleButton
            compare(mouseUpper.acceptedButtons, Qt.RightButton | Qt.MiddleButton)
            compare(mouseUpperAcceptedButtonsChangedSpy.count, 1)
            mouseClick(map, 5, 25)
            compare(mouseUpperClickedSpy.count, 0) // left button not accepted
            mouseUpper.acceptedButtons = Qt.LeftButton
            compare(mouseUpperAcceptedButtonsChangedSpy.count, 2)
            mouseClick(map, 5, 25)
            tryCompare(mouseUpperClickedSpy, "count", 1)
        }

        function test_basic_position_changed() {
            // tests basic position changed/move when button is being pressed
            clear_data();
            wait(500);
            mousePress(map, 5, 25)
            compare(mouseUpperPressedSpy.count, 1)
            compare(mouseUpper.lastAccepted, true)
            compare(mouseUpper.lastButton, Qt.LeftButton)
            compare(mouseUpper.lastButtons, Qt.LeftButton)
            compare(mouseUpper.lastModifiers, Qt.NoModifier)
            // moves within the mouse area
            mouseMove(map, 5, 26, 0, Qt.LeftButton) // '0' is 'delay'
            wait(1) // mouseMove event goes one extra eventloop round in the test lib
            compare(mouseUpperEnteredSpy.count, 1)
            compare(mouseUpperPositionChangedSpy.count, 1)
            compare(mouseUpper.mouseX, 5)
            compare(mouseUpper.mouseY, 6) // 20 offset, mouseXY is relative to the mouse area
            compare(mouseUpper.lastAccepted, true)
            compare(mouseUpper.lastButton, Qt.NoButton)
            compare(mouseUpper.lastButtons, Qt.LeftButton) // buttons being pressed whilst movin'
            compare(mouseUpper.lastModifiers, Qt.NoModifier)
            compare(mouseUpper.lastWasHeld, false) // testfunction won't take required 800 ms
            compare(mouseUpper.lastX, 5)
            compare(mouseUpper.lastY, 6) // remember 20 offset of the mouse area

            mouseMove(map, 6, 27, 0, Qt.LeftButton | Qt.RightButton)
            wait(1)
            compare(mouseUpperEnteredSpy.count, 1) // no re-entry
            compare(mouseUpperPositionChangedSpy.count, 2)
            compare(mouseUpper.mouseX, 6)
            compare(mouseUpper.mouseY, 7)
            compare(mouseUpper.lastAccepted, true)
            compare(mouseUpper.lastButton, Qt.NoButton)
            compare(mouseUpper.lastButtons, Qt.LeftButton | Qt.RightButton) // buttons being pressed whilst movin'
            compare(mouseUpper.lastModifiers, Qt.NoModifier)
            compare(mouseUpper.lastWasHeld, false) // testfunction won't take required 800 ms
            compare(mouseUpper.lastX, 6)
            compare(mouseUpper.lastY, 7) // remember 20 offset of the mouse area

            // moves outside of mouse but within map
            mouseMove(map, 2, 2, 0)
            wait(1)
            compare(mouseUpperExitedSpy.count, 1)
            compare(mouseUpperPositionChangedSpy.count, 3)
            compare(mouseUpper.mouseX, 2)
            compare(mouseUpper.mouseY, -18)
            // come back to map
            mouseMove(map, 7, 28, 0)
            wait(1)
            compare(mouseUpperEnteredSpy.count, 2)
            compare(mouseUpperExitedSpy.count, 1)
            compare(mouseUpperPositionChangedSpy.count, 4)
            compare(mouseUpper.mouseX, 7)
            compare(mouseUpper.mouseY, 8)

            // move outside of widget area (left). make sure that other mouse areas won't get the events
            mouseMove(map, -10, 10, 0)
            wait(1)
            compare(mouseUpperPositionChangedSpy.count, 5)
            compare(mouseUpperExitedSpy.count, 2)
            compare(mouseUpper.mouseX, -10)
            compare(mouseUpper.mouseY, -10)

            // back in and then on top of the widget
            mouseMove(map, 5, 25, 0)
            wait(1)
            compare(mouseUpperPositionChangedSpy.count, 6)
            compare(mouseUpperExitedSpy.count, 2)
            compare(mouseUpperEnteredSpy.count, 3)
            compare(mouseUpper.mouseX, 5)
            compare(mouseUpper.mouseY, 5)
            mouseMove(map, 5, -25, 0)
            wait(1)
            compare(mouseUpperPositionChangedSpy.count, 7)
            compare(mouseUpperExitedSpy.count, 3)
            compare(mouseUpperEnteredSpy.count, 3)
            compare(mouseUpper.mouseX, 5)
            compare(mouseUpper.mouseY, -45)

            // back in then float on top of other mouse areas
            mouseMove(map, 5, 25, 0)
            wait(1)
            compare(mouseUpperPositionChangedSpy.count, 8)
            compare(mouseUpperExitedSpy.count, 3)
            compare(mouseUpperEnteredSpy.count, 4)
            compare(mouseUpper.mouseX, 5)
            compare(mouseUpper.mouseY, 5)
            mouseMove(map, 5, 75, 0)
            wait(1)
            compare(mouseUpperPositionChangedSpy.count, 9)
            compare(mouseUpperExitedSpy.count, 4)
            compare(mouseUpperEnteredSpy.count, 4)
            compare(mouseUpper.mouseX, 5)
            compare(mouseUpper.mouseY, 55) // remember the 20 offset of upper mouse area
            mouseMove(map, 75, 75, 0)
            wait(1)
            compare(mouseUpperPositionChangedSpy.count, 10)
            compare(mouseUpperExitedSpy.count, 4)
            compare(mouseUpperEnteredSpy.count, 4)
            compare(mouseUpper.mouseX, 75)
            compare(mouseUpper.mouseY, 55)
            // finally back in
            mouseMove(map, 5, 25, 0)
            wait(1)
            compare(mouseUpperPositionChangedSpy.count, 11)
            compare(mouseUpperExitedSpy.count, 4)
            compare(mouseUpperEnteredSpy.count, 5)
            compare(mouseUpper.mouseX, 5)
            compare(mouseUpper.mouseY, 5)

            // check that these fellas didn't get any stupid ideas
            compare(mouseLowerEnteredSpy.count, 0)
            compare(mouseLowerPositionChangedSpy.count, 0)
            compare(mouseOverlapperEnteredSpy.count, 0)
            compare(mouseOverlapperPositionChangedSpy.count, 0)
            // release mouse
            mouseRelease(map, 5, 25)
            // TODO enable these!
            compare(mouseUpperEnteredSpy.count, 5)
            compare(mouseUpperExitedSpy.count, 5) // release triggers one more exited()
        }

        function test_basic_press_release() {
            clear_data()
            wait(500);
            // send to emptiness
            mousePress(map, 5, 5)
            compare(mouseUpperPressedSpy.count, 0)
            compare(mouseLowerPressedSpy.count, 0)
            compare(mouseOverlapperPressedSpy.count, 0)
            mouseRelease(map, 5, 5)
            compare(mouseUpperReleasedSpy.count, 0)
            compare(mouseLowerReleasedSpy.count, 0)
            compare(mouseOverlapperReleasedSpy.count, 0)
            // send to upper mouse area
            mousePress(map, 5, 25)
            compare(mouseUpperPressedSpy.count, 1)
            compare(mouseLowerPressedSpy.count, 0)
            compare(mouseOverlapperPressedSpy.count, 0)

            compare(mouseUpper.lastAccepted, true)
            compare(mouseUpper.lastButton, Qt.LeftButton)
            compare(mouseUpper.lastModifiers, Qt.NoModifier)
            compare(mouseUpper.lastWasHeld, false)
            compare(mouseUpper.lastX, 5)
            compare(mouseUpper.lastY, 5) // remember 20 offset of the mouse area

            mouseRelease(map, 5, 25)
            compare(mouseUpperPressedSpy.count, 1)
            compare(mouseUpperReleasedSpy.count, 1)
            compare(mouseLowerPressedSpy.count, 0)
            compare(mouseLowerReleasedSpy.count, 0)

            mousePress(map, 5, 26)
            compare(mouseUpperPressedSpy.count, 2)
            compare(mouseLowerPressedSpy.count, 0)
            compare(mouseOverlapperPressedSpy.count, 0)

            mouseRelease(map, 5, 26)
            compare(mouseUpperPressedSpy.count, 2)
            compare(mouseUpperReleasedSpy.count, 2)
            compare(mouseLowerPressedSpy.count, 0)
            compare(mouseLowerReleasedSpy.count, 0)
            compare(mouseUpper.lastAccepted, true)
            compare(mouseUpper.lastButton, Qt.LeftButton)
            compare(mouseUpper.lastModifiers, Qt.NoModifier)
            compare(mouseUpper.lastWasHeld, false)
            compare(mouseUpper.lastX, 5)
            compare(mouseUpper.lastY, 6) // remember 20 offset of the mouse area

            mousePress(map, 5, 75)
            compare(mouseUpperPressedSpy.count, 2)
            compare(mouseLowerPressedSpy.count, 1)
            compare(mouseOverlapperPressedSpy.count, 0)
            compare(mouseLower.lastAccepted, true)
            compare(mouseLower.lastButton, Qt.LeftButton)
            compare(mouseLower.lastModifiers, Qt.NoModifier)
            compare(mouseLower.lastWasHeld, false)
            compare(mouseLower.lastX, 5)
            compare(mouseLower.lastY, 25) // remember 50 offset of the mouse area

            mouseRelease(map, 5, 75)
            compare(mouseUpperPressedSpy.count, 2)
            compare(mouseUpperReleasedSpy.count, 2)
            compare(mouseLowerPressedSpy.count, 1)
            compare(mouseLowerReleasedSpy.count, 1)
            compare(mouseOverlapperPressedSpy.count, 0)

            mousePress(map, 55, 75)
            compare(mouseUpperPressedSpy.count, 2)
            compare(mouseLowerPressedSpy.count, 1)
            compare(mouseOverlapperPressedSpy.count, 1)
            compare(mouseOverlapperReleasedSpy.count, 0)

            mouseMove(map, 55, 25)
            mouseRelease(map, 55, 25)
            compare(mouseUpperPressedSpy.count, 2)
            compare(mouseUpperReleasedSpy.count, 2)
            compare(mouseLowerPressedSpy.count, 1)
            compare(mouseLowerReleasedSpy.count, 1)
            //this should follow the same logic as Flickable, after the gesture is detected, the map should steal events.
            compare(mouseOverlapperReleasedSpy.count, 0)
        }

        function test_basic_click() {
            clear_data();
            wait(500);

            mouseClick(map, 5, 5, Qt.RightButton, Qt.AltModifier)
            compare(mouseUpperClickedSpy.count, 0)
            compare(mouseLowerClickedSpy.count, 0)
            compare(mouseOverlapperClickedSpy.count, 0)
            mouseUpper.acceptedButtons = Qt.LeftButton | Qt.RightButton
            // TC sending click event to upper mouse area 5,25
            mouseClick(map, 5, 25, Qt.RightButton, Qt.AltModifier)
            tryCompare(mouseUpperClickedSpy, "count", 1)
            // TC done and clicked was received
            //compare(mouseUpperClickedSpy.count, 1)
            compare(mouseLowerClickedSpy.count, 0)
            compare(mouseOverlapperClickedSpy.count, 0)
            compare(mouseUpper.lastAccepted, true)
            compare(mouseUpper.lastButton, Qt.RightButton)
            compare(mouseUpper.lastModifiers, Qt.AltModifier)
            compare(mouseUpper.lastWasHeld, false)
            compare(mouseUpper.lastX, 5)
            compare(mouseUpper.lastY, 5) // remember 20 offset of the mouse area
            // check we get valid geocoordinates (would be NaN if something was wrong)
            // todo
            //verify(mouseUpper.lastMouseEvent.coordinate.longitude > -180 && mouseUpper.lastMouseEvent.coordinate.longitude < 180)
            //verify(mouseUpper.lastMouseEvent.coordinate.longitude > -90 && mouseUpper.lastMouseEvent.coordinate.latitude < 90)

            // mouse click with unaccepted buttons should not cause click
            mouseUpper.acceptedButtons = Qt.LeftButton
            mouseClick(map, 5, 25, Qt.RightButton, Qt.AltModifier)
            tryCompare(mouseUpperClickedSpy, "count", 1)
            compare(mouseLowerClickedSpy.count, 0)
            compare(mouseOverlapperClickedSpy.count, 0)

            mouseClick(map, 5, 25)
            tryCompare(mouseUpperClickedSpy, "count", 2)
            compare(mouseLowerClickedSpy.count, 0)
            compare(mouseOverlapperClickedSpy.count, 0)
            compare(mouseUpper.lastModifiers, Qt.NoModifier)
            compare(mouseUpper.lastButton, Qt.LeftButton)
            mouseClick(map, 5, 55)
            tryCompare(mouseUpperClickedSpy, "count", 2)
            compare(mouseLowerClickedSpy.count, 1)
            compare(mouseOverlapperClickedSpy.count, 0)
            mouseClick(map, 5, 55)
            tryCompare(mouseUpperClickedSpy,"count", 2)
            compare(mouseLowerClickedSpy.count, 2)
            compare(mouseOverlapperClickedSpy.count, 0)
            // declaration order counts on overlap case; overlapping area
            // declared later will get the events
            mouseClick(map, 55, 25)
            tryCompare(mouseUpperClickedSpy, "count", 2)
            compare(mouseLowerClickedSpy.count, 2)
            compare(mouseOverlapperClickedSpy.count, 1)
            mouseClick(map, 55, 75)
            tryCompare(mouseUpperClickedSpy, "count", 2)
            compare(mouseLowerClickedSpy.count, 2)
            compare(mouseOverlapperClickedSpy.count, 2)
            real_click(map, 55, 25)
            tryCompare(mouseUpperClickedSpy, "count", 2)
            compare(mouseLowerClickedSpy.count, 2)
            compare(mouseOverlapperClickedSpy.count, 3)
            real_click(map, 55, 75)
            tryCompare(mouseUpperClickedSpy, "count", 2)
            compare(mouseLowerClickedSpy.count, 2)
            compare(mouseOverlapperClickedSpy.count, 4)
        }

        function test_basic_double_click() {
            clear_data();
            wait(500);
            real_double_click(map, 5, 5)

            compare(mouseUpperDoubleClickedSpy.count, 0)
            compare(mouseLowerDoubleClickedSpy.count, 0)
            compare(mouseOverlapperDoubleClickedSpy.count, 0)
            real_double_click(map, 5, 25)
            tryCompare(mouseUpper, "lastAccepted", true)
            compare(mouseUpper.lastButton, Qt.LeftButton)
            compare(mouseUpper.lastModifiers, Qt.NoModifier)
            compare(mouseUpper.lastWasHeld, false)
            compare(mouseUpper.lastX, 5)
            compare(mouseUpper.lastY, 5) // remember 20 offset of the mouse area

            compare(mouseUpperDoubleClickedSpy.count, 1)
            compare(mouseLowerDoubleClickedSpy.count, 0)
            compare(mouseOverlapperDoubleClickedSpy.count, 0)
            real_double_click(map, 5, 25)
            tryCompare(mouseUpperDoubleClickedSpy, "count", 2)
            compare(mouseLowerDoubleClickedSpy.count, 0)
            compare(mouseOverlapperDoubleClickedSpy.count, 0)
            real_double_click(map, 5, 55)
            tryCompare(mouseUpperDoubleClickedSpy, "count", 2)
            compare(mouseLowerDoubleClickedSpy.count, 1)
            compare(mouseOverlapperDoubleClickedSpy.count, 0)
            real_double_click(map, 5, 55)
            tryCompare(mouseUpperDoubleClickedSpy, "count", 2)
            compare(mouseLowerDoubleClickedSpy.count, 2)
            compare(mouseOverlapperDoubleClickedSpy.count, 0)
            // declaration order counts on overlap case; overlapping area declared later will get the events
            real_double_click(map, 55, 25)
            tryCompare(mouseUpperDoubleClickedSpy, "count", 2)
            compare(mouseLowerDoubleClickedSpy.count, 2)
            compare(mouseOverlapperDoubleClickedSpy.count, 1)
            compare(mouseOverlapperPressedSpy.count, 2)
            compare(mouseOverlapperReleasedSpy.count, 2)
            real_double_click(map, 55, 75)
            tryCompare(mouseUpperDoubleClickedSpy, "count", 2)
            compare(mouseLowerDoubleClickedSpy.count, 2)
            compare(mouseOverlapperDoubleClickedSpy.count, 2)
            compare(mouseOverlapperPressedSpy.count, 4)
            compare(mouseOverlapperReleasedSpy.count, 4)
            // disable overlapping area and check event is delivered to the ones beneath
            mouseOverlapper.enabled = false
            real_double_click(map, 55, 25)
            tryCompare(mouseUpperDoubleClickedSpy, "count", 3)
            compare(mouseLowerDoubleClickedSpy.count, 2)
            compare(mouseOverlapperDoubleClickedSpy.count, 2)
            real_double_click(map, 55, 75)
            tryCompare(mouseUpperDoubleClickedSpy, "count", 3)
            compare(mouseLowerDoubleClickedSpy.count, 3)
            compare(mouseOverlapperDoubleClickedSpy.count, 2)
            mouseOverlapper.enabled = true
            real_double_click(map, 55, 25)
            tryCompare(mouseUpperDoubleClickedSpy, "count", 3)
            compare(mouseLowerDoubleClickedSpy.count, 3)
            compare(mouseOverlapperDoubleClickedSpy.count, 3)
            real_double_click(map, 55, 75)
            tryCompare(mouseUpperDoubleClickedSpy, "count", 3)
            compare(mouseLowerDoubleClickedSpy.count, 3)
            compare(mouseOverlapperDoubleClickedSpy.count, 4)
        }

        function test_release_does_not_block_clicked() { // QTBUG-66534
            clear_data()
            mousePress(map, 55, 75)
            compare(mouseOverlapperPressedSpy.count, 1)
            mouseRelease(map, 55, 25)
            compare(mouseOverlapperReleasedSpy.count, 1)
            mouseClick(map, 25, 25)
            compare(mouseUpperClickedSpy.count, 1)
        }

        function test_zzz_basic_press_and_hold() { // _zzz_ to ensure execution last (takes time)
            clear_data();
            wait(1000);
            real_press_and_hold(map, 5, 5)
            compare(mouseUpperPressAndHoldSpy.count, 0)
            compare(mouseLowerPressAndHoldSpy.count, 0)
            compare(mouseOverlapperPressAndHoldSpy.count, 0)

            mousePress(map,5,25)
            wait(1000) // threshold is 800 ms
            compare(mouseUpperPressAndHoldSpy.count, 1)
            compare(mouseLowerPressAndHoldSpy.count, 0)
            compare(mouseOverlapperPressAndHoldSpy.count, 0)
            compare(mouseUpper.lastAccepted, true)
            compare(mouseUpper.lastButton, Qt.LeftButton)
            compare(mouseUpper.lastModifiers, Qt.NoModifier)
            compare(mouseUpper.lastWasHeld, true) // notable part
            compare(mouseUpper.lastX, 5)
            compare(mouseUpper.lastY, 5) // remember 20 offset of the mouse area
            mouseRelease(map,5,25)
            real_press_and_hold(map, 5, 55)
            tryCompare(mouseUpperPressAndHoldSpy, "count", 1)
            compare(mouseLowerPressAndHoldSpy.count, 1)
            compare(mouseOverlapperPressAndHoldSpy.count, 0)
            real_press_and_hold(map, 55, 75)
            tryCompare(mouseUpperPressAndHoldSpy, "count", 1)
            compare(mouseLowerPressAndHoldSpy.count, 1)
            compare(mouseOverlapperPressAndHoldSpy.count, 1)
            compare(mouseOverlapper.lastAccepted, true)
            compare(mouseOverlapper.lastButton, Qt.LeftButton)
            compare(mouseOverlapper.lastModifiers, Qt.NoModifier)
            compare(mouseOverlapper.lastWasHeld, true)
            compare(mouseOverlapper.lastX, 5)
            compare(mouseOverlapper.lastY, 75)
            // make sure that the wasHeld is cleared
            mouseClick(map, 55, 75)
            tryCompare(mouseOverlapper, "lastAccepted", true)
            compare(mouseOverlapper.lastButton, Qt.LeftButton)
            compare(mouseOverlapper.lastModifiers, Qt.NoModifier)
            compare(mouseOverlapper.lastWasHeld, false)
            compare(mouseOverlapper.lastX, 5)
            compare(mouseOverlapper.lastY, 75)
            real_press_and_hold(map, 55, 25)
            tryCompare(mouseUpperPressAndHoldSpy, "count", 1)
            compare(mouseLowerPressAndHoldSpy.count, 1)
            compare(mouseOverlapperPressAndHoldSpy.count, 2)
        }
    }
}
