// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 import QtQuick import QtTest import QtLocation import QtPositioning /* MouseArea setup for this test case. Map dimensions are 100 * 100 Item containing mapView 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 } MapView { id: mapView x: 0; y: 0; width: 100; height: 100 map.center { latitude: 20 longitude: 20 } map.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: (mouse) => page.setMouseData(mouseUpper, mouse) onDoubleClicked: (mouse) => page.setMouseData(mouseUpper, mouse) onPressed: (mouse) => page.setMouseData(mouseUpper, mouse) onReleased: (mouse) => page.setMouseData(mouseUpper, mouse) onPositionChanged: (mouse) => page.setMouseData(mouseUpper, mouse) onPressAndHold: (mouse) => 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: (mouse) => page.setMouseData(mouseLower, mouse) onDoubleClicked: (mouse) => page.setMouseData(mouseLower, mouse) onPressed: (mouse) => page.setMouseData(mouseLower, mouse) onReleased: (mouse) => page.setMouseData(mouseLower, mouse) onPositionChanged: (mouse) => page.setMouseData(mouseLower, mouse) onPressAndHold: (mouse) => 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: (mouse) => page.setMouseData(mouseOverlapper, mouse) onDoubleClicked: (mouse) => page.setMouseData(mouseOverlapper, mouse) onPressed: (mouse) => page.setMouseData(mouseOverlapper, mouse) onReleased: (mouse) => page.setMouseData(mouseOverlapper, mouse) onPositionChanged: (mouse) => page.setMouseData(mouseOverlapper, mouse) onPressAndHold: (mouse) => page.setMouseData(mouseOverlapper, mouse) } } TestCase { name: "MouseArea" when: windowShown && mapView.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) { mouseDoubleClickSequence(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(mapView, 5, 25) compare(mouseUpperClickedSpy.count, 0) mouseUpper.enabled = true mouseClick(mapView, 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(mapView, 55, 25) tryCompare(mouseUpperClickedSpy, "count", 1) compare(mouseOverlapperClickedSpy.count, 1) mouseOverlapper.enabled = false compare(mouseOverlapperEnabledChangedSpy.count, 1) compare(mouseOverlapper.enabled, false) mouseClick(mapView, 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(mapView, 55, 25) tryCompare(mouseOverlapperClickedSpy, "count", 2) // should consume again compare(mouseUpperClickedSpy.count, 2) } function test_wheel() { clear_data() wait(500); // on mapView but without mouse area var startZoomLevel = 6.20 mapView.map.zoomLevel = startZoomLevel mouseWheel(mapView, 5, 5, 15, 5 /* dy */, Qt.LeftButton, Qt.NoModifiers) // see WheelHandler in MapView.qml var endZoomLevel = startZoomLevel + 5 / 120 compare(mapView.map.zoomLevel,endZoomLevel) mapView.map.zoomLevel = startZoomLevel mouseWheel(mapView, 5, 5, -15, -5, Qt.LeftButton, Qt.NoModifiers) // see WheelHandler in MapView.qml endZoomLevel = startZoomLevel - 5 / 120 compare(mapView.map.zoomLevel,endZoomLevel) // on mapView on top of mouse area mapView.map.zoomLevel = startZoomLevel mouseWheel(mapView, 55, 75, -30, -2, Qt.LeftButton, Qt.NoModifiers) endZoomLevel = startZoomLevel - 2 / 120 compare(mapView.map.zoomLevel,endZoomLevel) // outside of mapView mapView.map.zoomLevel = startZoomLevel mouseWheel(mapView, -100, -100, 40, 4, Qt.LeftButton, Qt.NoModifiers) compare(mapView.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(mapView, 5, 25) compare(mouseUpperClickedSpy.count, 0) // left button not accepted mouseUpper.acceptedButtons = Qt.LeftButton compare(mouseUpperAcceptedButtonsChangedSpy.count, 2) mouseClick(mapView, 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(mapView, 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(mapView, 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(mapView, 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 mapView mouseMove(mapView, 2, 2, 0) wait(1) compare(mouseUpperExitedSpy.count, 1) compare(mouseUpperPositionChangedSpy.count, 3) compare(mouseUpper.mouseX, 2) compare(mouseUpper.mouseY, -18) // come back to mapView mouseMove(mapView, 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(mapView, -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(mapView, 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(mapView, 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(mapView, 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(mapView, 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(mapView, 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(mapView, 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(mapView, 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(mapView, 5, 5) compare(mouseUpperPressedSpy.count, 0) compare(mouseLowerPressedSpy.count, 0) compare(mouseOverlapperPressedSpy.count, 0) mouseRelease(mapView, 5, 5) compare(mouseUpperReleasedSpy.count, 0) compare(mouseLowerReleasedSpy.count, 0) compare(mouseOverlapperReleasedSpy.count, 0) // send to upper mouse area mousePress(mapView, 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(mapView, 5, 25) compare(mouseUpperPressedSpy.count, 1) compare(mouseUpperReleasedSpy.count, 1) compare(mouseLowerPressedSpy.count, 0) compare(mouseLowerReleasedSpy.count, 0) mousePress(mapView, 5, 26) compare(mouseUpperPressedSpy.count, 2) compare(mouseLowerPressedSpy.count, 0) compare(mouseOverlapperPressedSpy.count, 0) mouseRelease(mapView, 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(mapView, 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(mapView, 5, 75) compare(mouseUpperPressedSpy.count, 2) compare(mouseUpperReleasedSpy.count, 2) compare(mouseLowerPressedSpy.count, 1) compare(mouseLowerReleasedSpy.count, 1) compare(mouseOverlapperPressedSpy.count, 0) mousePress(mapView, 55, 75) compare(mouseUpperPressedSpy.count, 2) compare(mouseLowerPressedSpy.count, 1) compare(mouseOverlapperPressedSpy.count, 1) compare(mouseOverlapperReleasedSpy.count, 0) mouseMove(mapView, 55, 25) mouseRelease(mapView, 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 mapView should steal events. compare(mouseOverlapperReleasedSpy.count, 0) } function test_basic_click() { clear_data(); wait(500); mouseClick(mapView, 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(mapView, 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(mapView, 5, 25, Qt.RightButton, Qt.AltModifier) tryCompare(mouseUpperClickedSpy, "count", 1) compare(mouseLowerClickedSpy.count, 0) compare(mouseOverlapperClickedSpy.count, 0) mouseClick(mapView, 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(mapView, 5, 55) tryCompare(mouseUpperClickedSpy, "count", 2) compare(mouseLowerClickedSpy.count, 1) compare(mouseOverlapperClickedSpy.count, 0) mouseClick(mapView, 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(mapView, 55, 25) tryCompare(mouseUpperClickedSpy, "count", 2) compare(mouseLowerClickedSpy.count, 2) compare(mouseOverlapperClickedSpy.count, 1) mouseClick(mapView, 55, 75) tryCompare(mouseUpperClickedSpy, "count", 2) compare(mouseLowerClickedSpy.count, 2) compare(mouseOverlapperClickedSpy.count, 2) real_click(mapView, 55, 25) tryCompare(mouseUpperClickedSpy, "count", 2) compare(mouseLowerClickedSpy.count, 2) compare(mouseOverlapperClickedSpy.count, 3) real_click(mapView, 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(mapView, 5, 5) compare(mouseUpperDoubleClickedSpy.count, 0) compare(mouseLowerDoubleClickedSpy.count, 0) compare(mouseOverlapperDoubleClickedSpy.count, 0) real_double_click(mapView, 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(mapView, 5, 25) tryCompare(mouseUpperDoubleClickedSpy, "count", 2) compare(mouseLowerDoubleClickedSpy.count, 0) compare(mouseOverlapperDoubleClickedSpy.count, 0) real_double_click(mapView, 5, 55) tryCompare(mouseUpperDoubleClickedSpy, "count", 2) compare(mouseLowerDoubleClickedSpy.count, 1) compare(mouseOverlapperDoubleClickedSpy.count, 0) real_double_click(mapView, 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(mapView, 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(mapView, 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(mapView, 55, 25) tryCompare(mouseUpperDoubleClickedSpy, "count", 3) compare(mouseLowerDoubleClickedSpy.count, 2) compare(mouseOverlapperDoubleClickedSpy.count, 2) real_double_click(mapView, 55, 75) tryCompare(mouseUpperDoubleClickedSpy, "count", 3) compare(mouseLowerDoubleClickedSpy.count, 3) compare(mouseOverlapperDoubleClickedSpy.count, 2) mouseOverlapper.enabled = true real_double_click(mapView, 55, 25) tryCompare(mouseUpperDoubleClickedSpy, "count", 3) compare(mouseLowerDoubleClickedSpy.count, 3) compare(mouseOverlapperDoubleClickedSpy.count, 3) real_double_click(mapView, 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(mapView, 55, 75) compare(mouseOverlapperPressedSpy.count, 1) mouseRelease(mapView, 55, 25) compare(mouseOverlapperReleasedSpy.count, 1) mouseClick(mapView, 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(mapView, 5, 5) compare(mouseUpperPressAndHoldSpy.count, 0) compare(mouseLowerPressAndHoldSpy.count, 0) compare(mouseOverlapperPressAndHoldSpy.count, 0) mousePress(mapView,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(mapView,5,25) real_press_and_hold(mapView, 5, 55) tryCompare(mouseUpperPressAndHoldSpy, "count", 1) compare(mouseLowerPressAndHoldSpy.count, 1) compare(mouseOverlapperPressAndHoldSpy.count, 0) real_press_and_hold(mapView, 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(mapView, 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(mapView, 55, 25) tryCompare(mouseUpperPressAndHoldSpy, "count", 1) compare(mouseLowerPressAndHoldSpy.count, 1) compare(mouseOverlapperPressAndHoldSpy.count, 2) } } }