aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-09-06 18:52:28 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-09-06 20:27:00 +0200
commit86180aed5008779b1b94731d9b4c6b1fdac8f3d3 (patch)
treec1c4ac6daa87042196fa66a92ea56737930c0920 /tests
parent9a55b34e292c725a4fa394a71e0a3d851e4e488f (diff)
parent9ae57848671419b2622e254af8642fef7b1b7c33 (diff)
Merge remote-tracking branch 'origin/5.7' into 5.8
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/controls/data/tst_popup.qml72
-rw-r--r--tests/auto/controls/data/tst_switch.qml138
-rw-r--r--tests/auto/controls/data/tst_textfield.qml19
-rw-r--r--tests/auto/drawer/data/applicationwindow-hover.qml (renamed from tests/auto/drawer/data/hover.qml)0
-rw-r--r--tests/auto/drawer/data/applicationwindow.qml7
-rw-r--r--tests/auto/drawer/data/multiple.qml85
-rw-r--r--tests/auto/drawer/data/window-hover.qml73
-rw-r--r--tests/auto/drawer/data/window.qml56
-rw-r--r--tests/auto/drawer/tst_drawer.cpp329
-rw-r--r--tests/auto/focus/tst_focus.cpp2
-rw-r--r--tests/auto/menu/tst_menu.cpp12
-rw-r--r--tests/auto/popup/data/applicationwindow-hover.qml (renamed from tests/auto/popup/data/hover.qml)0
-rw-r--r--tests/auto/popup/data/window-hover.qml70
-rw-r--r--tests/auto/popup/data/window.qml84
-rw-r--r--tests/auto/popup/tst_popup.cpp169
-rw-r--r--tests/auto/qquickmaterialstyle/data/tst_material.qml92
-rw-r--r--tests/auto/qquickmaterialstyleconf/tst_qquickmaterialstyleconf.cpp2
-rw-r--r--tests/auto/qquickuniversalstyleconf/tst_qquickuniversalstyleconf.cpp2
-rw-r--r--tests/auto/sanity/tst_sanity.cpp12
-rw-r--r--tests/auto/shared/visualtestutil.h8
-rw-r--r--tests/auto/snippets/tst_snippets.cpp2
-rw-r--r--tests/benchmarks/creationtime/tst_creationtime.cpp7
-rw-r--r--tests/benchmarks/objectcount/tst_objectcount.cpp11
-rw-r--r--tests/manual/gifs/eventcapturer.cpp3
-rw-r--r--tests/manual/gifs/tst_gifs.cpp3
25 files changed, 1019 insertions, 239 deletions
diff --git a/tests/auto/controls/data/tst_popup.qml b/tests/auto/controls/data/tst_popup.qml
index 52c24c86..a86e800e 100644
--- a/tests/auto/controls/data/tst_popup.qml
+++ b/tests/auto/controls/data/tst_popup.qml
@@ -1006,18 +1006,13 @@ TestCase {
ApplicationWindow {
property alias firstDrawer: firstDrawer
property alias secondDrawer: secondDrawer
- property alias upperDrawer: upperDrawer
property alias modalPopup: modalPopup
property alias modelessPopup: modelessPopup
property alias plainPopup: plainPopup
property alias modalPopupWithoutDim: modalPopupWithoutDim
visible: true
Drawer {
- z: 5
- id: upperDrawer
- }
- Drawer {
- z: 1
+ z: 0
id: firstDrawer
}
Drawer {
@@ -1073,52 +1068,41 @@ TestCase {
window.requestActivate()
tryCompare(window, "active", true)
- var countBefore = window.overlay.children.length
- compare(countBefore, 6) // 3 drawers + 3 overlays
+ compare(window.overlay.children.length, 0)
var firstOverlay = findOverlay(window, window.firstDrawer)
+ verify(!firstOverlay)
+ window.firstDrawer.open()
+ compare(window.overlay.children.length, 2) // 1 drawer + 1 overlay
+ firstOverlay = findOverlay(window, window.firstDrawer)
verify(firstOverlay)
- compare(firstOverlay.opacity, 0.0)
compare(firstOverlay.z, window.firstDrawer.z)
compare(indexOf(window.overlay.children, firstOverlay),
indexOf(window.overlay.children, window.firstDrawer.contentItem.parent) - 1)
+ tryCompare(firstOverlay, "opacity", 1.0)
var secondOverlay = findOverlay(window, window.secondDrawer)
+ verify(!secondOverlay)
+ window.secondDrawer.open()
+ compare(window.overlay.children.length, 4) // 2 drawers + 2 overlays
+ secondOverlay = findOverlay(window, window.secondDrawer)
verify(secondOverlay)
- compare(secondOverlay.opacity, 0.0)
compare(secondOverlay.z, window.secondDrawer.z)
compare(indexOf(window.overlay.children, secondOverlay),
indexOf(window.overlay.children, window.secondDrawer.contentItem.parent) - 1)
+ tryCompare(secondOverlay, "opacity", 1.0)
- var upperOverlay = findOverlay(window, window.upperDrawer)
- verify(upperOverlay)
- compare(upperOverlay.opacity, 0.0)
- compare(upperOverlay.z, window.upperDrawer.z)
- compare(indexOf(window.overlay.children, upperOverlay),
- indexOf(window.overlay.children, window.upperDrawer.contentItem.parent) - 1)
-
- window.firstDrawer.open()
- compare(firstOverlay.z, 1.0)
- tryCompare(firstOverlay, "opacity", 1.0)
window.firstDrawer.close()
- tryCompare(firstOverlay, "opacity", 0.0)
tryCompare(window.firstDrawer, "visible", false)
+ firstOverlay = findOverlay(window, window.firstDrawer)
+ verify(!firstOverlay)
+ compare(window.overlay.children.length, 2) // 1 drawer + 1 overlay
- window.secondDrawer.open()
- compare(secondOverlay.z, 1.0)
- tryCompare(secondOverlay, "opacity", 1.0)
window.secondDrawer.close()
- tryCompare(secondOverlay, "opacity", 0.0)
tryCompare(window.secondDrawer, "visible", false)
-
- window.firstDrawer.open()
- window.secondDrawer.open()
- tryCompare(firstOverlay, "opacity", 1.0)
- tryCompare(secondOverlay, "opacity", 1.0)
- window.firstDrawer.close()
- window.secondDrawer.close()
- tryCompare(firstOverlay, "opacity", 0.0)
- tryCompare(secondOverlay, "opacity", 0.0)
+ secondOverlay = findOverlay(window, window.secondDrawer)
+ verify(!secondOverlay)
+ compare(window.overlay.children.length, 0)
var modalOverlay = findOverlay(window, window.modalPopup)
verify(!modalOverlay)
@@ -1128,7 +1112,7 @@ TestCase {
compare(modalOverlay.z, window.modalPopup.z)
compare(window.modalPopup.visible, true)
tryCompare(modalOverlay, "opacity", 1.0)
- compare(window.overlay.children.length, countBefore + 2) // 1 popup + 1 overlay
+ compare(window.overlay.children.length, 2) // 1 popup + 1 overlay
var modelessOverlay = findOverlay(window, window.modelessPopup)
verify(!modelessOverlay)
@@ -1138,13 +1122,13 @@ TestCase {
compare(modelessOverlay.z, window.modelessPopup.z)
compare(window.modelessPopup.visible, true)
tryCompare(modelessOverlay, "opacity", 1.0)
- compare(window.overlay.children.length, countBefore + 4) // 2 popups + 2 overlays
+ compare(window.overlay.children.length, 4) // 2 popups + 2 overlays
window.modelessPopup.close()
tryCompare(window.modelessPopup, "visible", false)
modelessOverlay = findOverlay(window, window.modelessPopup)
verify(!modelessOverlay)
- compare(window.overlay.children.length, countBefore + 2) // 1 popup + 1 overlay
+ compare(window.overlay.children.length, 2) // 1 popup + 1 overlay
compare(window.modalPopup.visible, true)
compare(modalOverlay.opacity, 1.0)
@@ -1153,29 +1137,29 @@ TestCase {
tryCompare(window.modalPopup, "visible", false)
modalOverlay = findOverlay(window, window.modalPopup)
verify(!modalOverlay)
- compare(window.overlay.children.length, countBefore)
+ compare(window.overlay.children.length, 0)
window.plainPopup.open()
tryCompare(window.plainPopup, "visible", true)
- compare(window.overlay.children.length, countBefore + 1) // only popup added, no overlays involved
+ compare(window.overlay.children.length, 1) // only popup added, no overlays involved
window.plainPopup.modal = true
- compare(window.overlay.children.length, countBefore + 2) // overlay added
+ compare(window.overlay.children.length, 2) // overlay added
window.plainPopup.close()
tryCompare(window.plainPopup, "visible", false)
- compare(window.overlay.children.length, countBefore) // popup + overlay removed
+ compare(window.overlay.children.length, 0) // popup + overlay removed
window.modalPopupWithoutDim.open()
tryCompare(window.modalPopupWithoutDim, "visible", true)
- compare(window.overlay.children.length, countBefore + 1) // only popup added, no overlays involved
+ compare(window.overlay.children.length, 1) // only popup added, no overlays involved
window.modalPopupWithoutDim.dim = true
- compare(window.overlay.children.length, countBefore + 2) // overlay added
+ compare(window.overlay.children.length, 2) // overlay added
window.modalPopupWithoutDim.close()
tryCompare(window.modalPopupWithoutDim, "visible", false)
- compare(window.overlay.children.length, countBefore) // popup + overlay removed
+ compare(window.overlay.children.length, 0) // popup + overlay removed
window.destroy()
}
diff --git a/tests/auto/controls/data/tst_switch.qml b/tests/auto/controls/data/tst_switch.qml
index ec609ca6..6c145fc1 100644
--- a/tests/auto/controls/data/tst_switch.qml
+++ b/tests/auto/controls/data/tst_switch.qml
@@ -50,42 +50,16 @@ TestCase {
when: windowShown
name: "Switch"
- SignalSpy {
- id: checkedSpy
- signalName: "checkedChanged"
- }
-
- SignalSpy {
- id: pressedSpy
- signalName: "pressedChanged"
- }
-
- SignalSpy {
- id: clickedSpy
- signalName: "clicked"
- }
-
Component {
id: swtch
Switch { }
}
- function init() {
- verify(!checkedSpy.target)
- verify(!pressedSpy.target)
- verify(!clickedSpy.target)
- compare(checkedSpy.count, 0)
- compare(pressedSpy.count, 0)
- compare(clickedSpy.count, 0)
- }
-
- function cleanup() {
- checkedSpy.target = null
- pressedSpy.target = null
- clickedSpy.target = null
- checkedSpy.clear()
- pressedSpy.clear()
- clickedSpy.clear()
+ Component {
+ id: signalSequenceSpy
+ SignalSequenceSpy {
+ signals: ["pressed", "released", "canceled", "clicked", "pressedChanged", "checkedChanged"]
+ }
}
function test_text() {
@@ -105,19 +79,18 @@ TestCase {
var control = swtch.createObject(testCase)
verify(control)
- checkedSpy.target = control
- verify(checkedSpy.valid)
-
compare(control.checked, false)
- compare(checkedSpy.count, 0)
+ var spy = signalSequenceSpy.createObject(control, {target: control})
+ spy.expectedSequence = [["checkedChanged", { "checked": true }]]
control.checked = true
compare(control.checked, true)
- compare(checkedSpy.count, 1)
+ verify(spy.success)
+ spy.expectedSequence = [["checkedChanged", { "checked": false }]]
control.checked = false
compare(control.checked, false)
- compare(checkedSpy.count, 2)
+ verify(spy.success)
control.destroy()
}
@@ -126,71 +99,80 @@ TestCase {
var control = swtch.createObject(testCase)
verify(control)
- checkedSpy.target = control
- pressedSpy.target = control
- clickedSpy.target = control
- verify(checkedSpy.valid)
- verify(pressedSpy.valid)
- verify(clickedSpy.valid)
-
// check
+ var spy = signalSequenceSpy.createObject(control, {target: control})
+ spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false }],
+ "pressed"]
mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton)
- compare(pressedSpy.count, 1)
compare(control.pressed, true)
+ verify(spy.success)
+ spy.expectedSequence = [["pressedChanged", { "pressed": false, "checked": false }],
+ ["checkedChanged", { "pressed": false, "checked": true }],
+ "released",
+ "clicked"]
mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton)
- compare(clickedSpy.count, 1)
- compare(checkedSpy.count, 1)
- compare(pressedSpy.count, 2)
compare(control.checked, true)
compare(control.pressed, false)
+ verify(spy.success)
// uncheck
+ spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true }],
+ "pressed"]
mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton)
- compare(pressedSpy.count, 3)
compare(control.pressed, true)
+ verify(spy.success)
+ spy.expectedSequence = [["pressedChanged", { "pressed": false, "checked": true }],
+ ["checkedChanged", { "pressed": false, "checked": false }],
+ "released",
+ "clicked"]
mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton)
- compare(clickedSpy.count, 2)
- compare(checkedSpy.count, 2)
- compare(pressedSpy.count, 4)
compare(control.checked, false)
compare(control.pressed, false)
+ verify(spy.success)
// release on the right
+ spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false }],
+ "pressed"]
mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton)
- compare(pressedSpy.count, 5)
compare(control.pressed, true)
+ verify(spy.success)
mouseMove(control, control.width * 2, control.height / 2, 0, Qt.LeftButton)
compare(control.pressed, true)
+ spy.expectedSequence = [["pressedChanged", { "pressed": false, "checked": false }],
+ ["checkedChanged", { "pressed": false, "checked": true }],
+ "released",
+ "clicked"]
mouseRelease(control, control.width * 2, control.height / 2, Qt.LeftButton)
- compare(clickedSpy.count, 3)
- compare(checkedSpy.count, 3)
- compare(pressedSpy.count, 6)
compare(control.checked, true)
compare(control.pressed, false)
+ verify(spy.success)
// release on the left
+ spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true }],
+ "pressed"]
mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton)
- compare(pressedSpy.count, 7)
compare(control.pressed, true)
+ verify(spy.success)
mouseMove(control, -control.width, control.height / 2, 0, Qt.LeftButton)
compare(control.pressed, true)
+ spy.expectedSequence = [["pressedChanged", { "pressed": false, "checked": true }],
+ ["checkedChanged", { "pressed": false, "checked": false }],
+ "released",
+ "clicked"]
mouseRelease(control, -control.width, control.height / 2, Qt.LeftButton)
- compare(clickedSpy.count, 4)
- compare(checkedSpy.count, 4)
- compare(pressedSpy.count, 8)
compare(control.checked, false)
compare(control.pressed, false)
+ verify(spy.success)
// right button
+ spy.expectedSequence = []
mousePress(control, control.width / 2, control.height / 2, Qt.RightButton)
- compare(pressedSpy.count, 8)
compare(control.pressed, false)
+ verify(spy.success)
mouseRelease(control, control.width / 2, control.height / 2, Qt.RightButton)
- compare(clickedSpy.count, 4)
- compare(checkedSpy.count, 4)
- compare(pressedSpy.count, 8)
compare(control.checked, false)
compare(control.pressed, false)
+ verify(spy.success)
control.destroy()
}
@@ -199,33 +181,39 @@ TestCase {
var control = swtch.createObject(testCase)
verify(control)
- checkedSpy.target = control
- clickedSpy.target = control
- verify(checkedSpy.valid)
- verify(clickedSpy.valid)
-
control.forceActiveFocus()
verify(control.activeFocus)
// check
+ var spy = signalSequenceSpy.createObject(control, {target: control})
+ spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": false }],
+ "pressed",
+ ["pressedChanged", { "pressed": false, "checked": false }],
+ ["checkedChanged", { "pressed": false, "checked": true }],
+ "released",
+ "clicked"]
keyClick(Qt.Key_Space)
- compare(clickedSpy.count, 1)
- compare(checkedSpy.count, 1)
compare(control.checked, true)
+ verify(spy.success)
// uncheck
+ spy.expectedSequence = [["pressedChanged", { "pressed": true, "checked": true }],
+ "pressed",
+ ["pressedChanged", { "pressed": false, "checked": true }],
+ ["checkedChanged", { "pressed": false, "checked": false }],
+ "released",
+ "clicked"]
keyClick(Qt.Key_Space)
- compare(clickedSpy.count, 2)
- compare(checkedSpy.count, 2)
compare(control.checked, false)
+ verify(spy.success)
// no change
+ spy.expectedSequence = []
var keys = [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab]
for (var i = 0; i < keys.length; ++i) {
keyClick(keys[i])
- compare(clickedSpy.count, 2)
- compare(checkedSpy.count, 2)
compare(control.checked, false)
+ verify(spy.success)
}
control.destroy()
diff --git a/tests/auto/controls/data/tst_textfield.qml b/tests/auto/controls/data/tst_textfield.qml
index 1f1de748..5dc93287 100644
--- a/tests/auto/controls/data/tst_textfield.qml
+++ b/tests/auto/controls/data/tst_textfield.qml
@@ -72,6 +72,7 @@ TestCase {
var implicitWidthSpy = signalSpy.createObject(control, { target: control, signalName: "implicitWidthChanged"} )
var implicitHeightSpy = signalSpy.createObject(control, { target: control, signalName: "implicitHeightChanged"} )
+
control.background.implicitWidth = 400
control.background.implicitHeight = 200
compare(control.implicitWidth, 400)
@@ -79,6 +80,24 @@ TestCase {
compare(implicitWidthSpy.count, 1)
compare(implicitHeightSpy.count, 1)
+ control.background = null
+ compare(control.implicitWidth, control.leftPadding + control.rightPadding)
+ compare(control.implicitHeight, control.contentHeight + control.topPadding + control.bottomPadding)
+ compare(implicitWidthSpy.count, 2)
+ compare(implicitHeightSpy.count, 2)
+
+ control.text = "TextField"
+ compare(control.implicitWidth, control.contentWidth + control.leftPadding + control.rightPadding)
+ compare(control.implicitHeight, control.contentHeight + control.topPadding + control.bottomPadding)
+ compare(implicitWidthSpy.count, 3)
+ compare(implicitHeightSpy.count, 2)
+
+ control.placeholderText = "..."
+ verify(control.implicitWidth < control.contentWidth + control.leftPadding + control.rightPadding)
+ compare(control.implicitHeight, control.contentHeight + control.topPadding + control.bottomPadding)
+ compare(implicitWidthSpy.count, 4)
+ compare(implicitHeightSpy.count, 2)
+
control.destroy()
}
diff --git a/tests/auto/drawer/data/hover.qml b/tests/auto/drawer/data/applicationwindow-hover.qml
index 5ac41457..5ac41457 100644
--- a/tests/auto/drawer/data/hover.qml
+++ b/tests/auto/drawer/data/applicationwindow-hover.qml
diff --git a/tests/auto/drawer/data/applicationwindow.qml b/tests/auto/drawer/data/applicationwindow.qml
index a826efab..0aa4b34e 100644
--- a/tests/auto/drawer/data/applicationwindow.qml
+++ b/tests/auto/drawer/data/applicationwindow.qml
@@ -51,12 +51,5 @@ ApplicationWindow {
id: drawer
width: 200
height: 200
-
- MouseArea {
- // QTBUG-54629
- anchors.fill: parent
- anchors.margins: -Qt.styleHints.startDragDistance
- Rectangle { color: "red"; opacity: 0.25; anchors.fill: parent }
- }
}
}
diff --git a/tests/auto/drawer/data/multiple.qml b/tests/auto/drawer/data/multiple.qml
new file mode 100644
index 00000000..b2ef9781
--- /dev/null
+++ b/tests/auto/drawer/data/multiple.qml
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.6
+import QtQuick.Controls 2.0
+
+ApplicationWindow {
+ width: 400
+ height: 400
+
+ property alias leftDrawer: leftDrawer
+ property alias leftButton: leftButton
+
+ property alias rightDrawer: rightDrawer
+ property alias rightButton: rightButton
+
+ property alias contentButton: contentButton
+
+ Drawer {
+ id: leftDrawer
+ width: 300
+ height: 400
+ z: 1
+
+ contentItem: Button {
+ id: leftButton
+ text: "Left"
+ }
+ }
+
+ Button {
+ id: contentButton
+ text: "Content"
+ anchors.fill: parent
+ }
+
+ Drawer {
+ id: rightDrawer
+ width: 300
+ height: 400
+ edge: Qt.RightEdge
+
+ contentItem: Button {
+ id: rightButton
+ text: "Right"
+ }
+ }
+}
diff --git a/tests/auto/drawer/data/window-hover.qml b/tests/auto/drawer/data/window-hover.qml
new file mode 100644
index 00000000..872b934e
--- /dev/null
+++ b/tests/auto/drawer/data/window-hover.qml
@@ -0,0 +1,73 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.6
+import QtQuick.Window 2.2
+import QtQuick.Controls 2.0
+
+Window {
+ width: 400
+ height: 400
+
+ property alias drawer: drawer
+ property alias backgroundButton: backgroundButton
+ property alias drawerButton: drawerButton
+
+ Button {
+ id: backgroundButton
+ text: "Background"
+ anchors.fill: parent
+ }
+
+ Drawer {
+ id: drawer
+ width: 100
+ height: 400
+ topPadding: 2
+ leftPadding: 2
+ rightPadding: 2
+ bottomPadding: 2
+
+ contentItem: Button {
+ id: drawerButton
+ text: "Drawer"
+ }
+ }
+}
diff --git a/tests/auto/drawer/data/window.qml b/tests/auto/drawer/data/window.qml
new file mode 100644
index 00000000..47ef5cb0
--- /dev/null
+++ b/tests/auto/drawer/data/window.qml
@@ -0,0 +1,56 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.6
+import QtQuick.Window 2.2
+import QtQuick.Controls 2.0
+
+Window {
+ width: 400
+ height: 400
+
+ property alias drawer: drawer
+
+ Drawer {
+ id: drawer
+ width: 200
+ height: 200
+ }
+}
diff --git a/tests/auto/drawer/tst_drawer.cpp b/tests/auto/drawer/tst_drawer.cpp
index 0b334387..8f023c29 100644
--- a/tests/auto/drawer/tst_drawer.cpp
+++ b/tests/auto/drawer/tst_drawer.cpp
@@ -42,6 +42,7 @@
#include <QtGui/qstylehints.h>
#include <QtGui/qguiapplication.h>
#include <QtQuickTemplates2/private/qquickapplicationwindow_p.h>
+#include <QtQuickTemplates2/private/qquickoverlay_p.h>
#include <QtQuickTemplates2/private/qquickdrawer_p.h>
#include <QtQuickTemplates2/private/qquickbutton_p.h>
@@ -52,6 +53,11 @@ class tst_Drawer : public QQmlDataTest
Q_OBJECT
private slots:
+ void visible_data();
+ void visible();
+
+ void state();
+
void position_data();
void position();
@@ -62,8 +68,158 @@ private slots:
void hover_data();
void hover();
+
+ void multiple();
};
+void tst_Drawer::visible_data()
+{
+ QTest::addColumn<QString>("source");
+ QTest::newRow("Window") << "window.qml";
+ QTest::newRow("ApplicationWindow") << "applicationwindow.qml";
+}
+
+void tst_Drawer::visible()
+{
+ QFETCH(QString, source);
+ QQuickApplicationHelper helper(this, source);
+
+ QQuickWindow *window = helper.window;
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window));
+
+ QQuickDrawer *drawer = window->property("drawer").value<QQuickDrawer*>();
+ QVERIFY(drawer);
+ QQuickItem *popupItem = drawer->popupItem();
+
+ QCOMPARE(drawer->isVisible(), false);
+ QCOMPARE(drawer->position(), qreal(0.0));
+
+ QQuickOverlay *overlay = QQuickOverlay::overlay(window);
+ QVERIFY(overlay);
+ QVERIFY(!overlay->childItems().contains(popupItem));
+
+ drawer->open();
+ QVERIFY(drawer->isVisible());
+ QVERIFY(overlay->childItems().contains(popupItem));
+ QTRY_COMPARE(drawer->position(), qreal(1.0));
+
+ drawer->close();
+ QTRY_VERIFY(!drawer->isVisible());
+ QTRY_COMPARE(drawer->position(), qreal(0.0));
+ QVERIFY(!overlay->childItems().contains(popupItem));
+
+ drawer->setVisible(true);
+ QVERIFY(drawer->isVisible());
+ QVERIFY(overlay->childItems().contains(popupItem));
+ QTRY_COMPARE(drawer->position(), qreal(1.0));
+
+ drawer->setVisible(false);
+ QTRY_VERIFY(!drawer->isVisible());
+ QTRY_COMPARE(drawer->position(), qreal(0.0));
+ QTRY_VERIFY(!overlay->childItems().contains(popupItem));
+}
+
+void tst_Drawer::state()
+{
+ QQuickApplicationHelper helper(this, "applicationwindow.qml");
+
+ QQuickWindow *window = helper.window;
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window));
+
+ QQuickDrawer *drawer = window->property("drawer").value<QQuickDrawer*>();
+ QVERIFY(drawer);
+
+ QCOMPARE(drawer->isVisible(), false);
+
+ QSignalSpy visibleChangedSpy(drawer, SIGNAL(visibleChanged()));
+ QSignalSpy aboutToShowSpy(drawer, SIGNAL(aboutToShow()));
+ QSignalSpy aboutToHideSpy(drawer, SIGNAL(aboutToHide()));
+ QSignalSpy openedSpy(drawer, SIGNAL(opened()));
+ QSignalSpy closedSpy(drawer, SIGNAL(closed()));
+
+ QVERIFY(visibleChangedSpy.isValid());
+ QVERIFY(aboutToShowSpy.isValid());
+ QVERIFY(aboutToHideSpy.isValid());
+ QVERIFY(openedSpy.isValid());
+ QVERIFY(closedSpy.isValid());
+
+ int visibleChangedCount = 0;
+ int aboutToShowCount = 0;
+ int aboutToHideCount = 0;
+ int openedCount = 0;
+ int closedCount = 0;
+
+ // open programmatically...
+ drawer->open();
+ QCOMPARE(visibleChangedSpy.count(), ++visibleChangedCount);
+ QCOMPARE(aboutToShowSpy.count(), ++aboutToShowCount);
+ QCOMPARE(aboutToHideSpy.count(), aboutToHideCount);
+ QCOMPARE(openedSpy.count(), openedCount);
+ QCOMPARE(closedSpy.count(), closedCount);
+
+ // ...and wait until fully open
+ QVERIFY(openedSpy.wait());
+ QCOMPARE(visibleChangedSpy.count(), visibleChangedCount);
+ QCOMPARE(aboutToShowSpy.count(), aboutToShowCount);
+ QCOMPARE(aboutToHideSpy.count(), aboutToHideCount);
+ QCOMPARE(openedSpy.count(), ++openedCount);
+ QCOMPARE(closedSpy.count(), closedCount);
+
+ // close programmatically...
+ drawer->close();
+ QCOMPARE(visibleChangedSpy.count(), visibleChangedCount);
+ QCOMPARE(aboutToShowSpy.count(), aboutToShowCount);
+ QCOMPARE(aboutToHideSpy.count(), ++aboutToHideCount);
+ QCOMPARE(openedSpy.count(), openedCount);
+ QCOMPARE(closedSpy.count(), closedCount);
+
+ // ...and wait until fully closed
+ QVERIFY(closedSpy.wait());
+ QCOMPARE(visibleChangedSpy.count(), ++visibleChangedCount);
+ QCOMPARE(aboutToShowSpy.count(), aboutToShowCount);
+ QCOMPARE(aboutToHideSpy.count(), aboutToHideCount);
+ QCOMPARE(openedSpy.count(), openedCount);
+ QCOMPARE(closedSpy.count(), ++closedCount);
+
+ // open interactively...
+ QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(0, drawer->height() / 2));
+ QTest::mouseMove(window, QPoint(drawer->width() * 0.2, drawer->height() / 2), 16);
+ QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(drawer->width() * 0.8, drawer->height() / 2), 16);
+ QCOMPARE(visibleChangedSpy.count(), ++visibleChangedCount);
+ QCOMPARE(aboutToShowSpy.count(), ++aboutToShowCount);
+ QCOMPARE(aboutToHideSpy.count(), aboutToHideCount);
+ QCOMPARE(openedSpy.count(), openedCount);
+ QCOMPARE(closedSpy.count(), closedCount);
+
+ // ...and wait until fully open
+ QVERIFY(openedSpy.wait());
+ QCOMPARE(visibleChangedSpy.count(), visibleChangedCount);
+ QCOMPARE(aboutToShowSpy.count(), aboutToShowCount);
+ QCOMPARE(aboutToHideSpy.count(), aboutToHideCount);
+ QCOMPARE(openedSpy.count(), ++openedCount);
+ QCOMPARE(closedSpy.count(), closedCount);
+
+ // close interactively...
+ QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(drawer->width(), drawer->height() / 2));
+ QTest::mouseMove(window, QPoint(drawer->width() * 0.8, drawer->height() / 2), 16);
+ QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(drawer->width() * 0.2, drawer->height() / 2), 16);
+ QCOMPARE(visibleChangedSpy.count(), visibleChangedCount);
+ QCOMPARE(aboutToShowSpy.count(), aboutToShowCount);
+ QCOMPARE(aboutToHideSpy.count(), ++aboutToHideCount);
+ QCOMPARE(openedSpy.count(), openedCount);
+ QCOMPARE(closedSpy.count(), closedCount);
+
+ // ...and wait until fully closed
+ QVERIFY(closedSpy.wait());
+ QCOMPARE(visibleChangedSpy.count(), ++visibleChangedCount);
+ QCOMPARE(aboutToShowSpy.count(), aboutToShowCount);
+ QCOMPARE(aboutToHideSpy.count(), aboutToHideCount);
+ QCOMPARE(openedSpy.count(), openedCount);
+ QCOMPARE(closedSpy.count(), ++closedCount);
+}
+
void tst_Drawer::position_data()
{
QTest::addColumn<Qt::Edge>("edge");
@@ -86,12 +242,12 @@ void tst_Drawer::position()
QQuickApplicationHelper helper(this, QStringLiteral("applicationwindow.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationWindow *window = helper.appWindow;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
- QQuickDrawer *drawer = helper.window->property("drawer").value<QQuickDrawer*>();
+ QQuickDrawer *drawer = helper.appWindow->property("drawer").value<QQuickDrawer*>();
QVERIFY(drawer);
drawer->setEdge(edge);
@@ -113,8 +269,8 @@ void tst_Drawer::dragMargin_data()
QTest::newRow("left:0") << Qt::LeftEdge << qreal(0) << qreal(0) << qreal(0);
QTest::newRow("left:-1") << Qt::LeftEdge << qreal(-1) << qreal(0) << qreal(0);
- QTest::newRow("left:startDragDistance") << Qt::LeftEdge << qreal(QGuiApplication::styleHints()->startDragDistance()) << qreal(0.25) << qreal(0);
- QTest::newRow("left:startDragDistance*2") << Qt::LeftEdge << qreal(QGuiApplication::styleHints()->startDragDistance() * 2) << qreal(0.25) << qreal(0);
+ QTest::newRow("left:startDragDistance") << Qt::LeftEdge << qreal(QGuiApplication::styleHints()->startDragDistance()) << qreal(0.45) << qreal(0);
+ QTest::newRow("left:startDragDistance*2") << Qt::LeftEdge << qreal(QGuiApplication::styleHints()->startDragDistance() * 2) << qreal(0.45) << qreal(0);
QTest::newRow("right:0") << Qt::RightEdge << qreal(0) << qreal(0) << qreal(0);
QTest::newRow("right:-1") << Qt::RightEdge << qreal(-1) << qreal(0) << qreal(0);
@@ -131,84 +287,92 @@ void tst_Drawer::dragMargin()
QQuickApplicationHelper helper(this, QStringLiteral("applicationwindow.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationWindow *window = helper.appWindow;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
- QQuickDrawer *drawer = helper.window->property("drawer").value<QQuickDrawer*>();
+ QQuickDrawer *drawer = helper.appWindow->property("drawer").value<QQuickDrawer*>();
QVERIFY(drawer);
drawer->setEdge(edge);
drawer->setDragMargin(dragMargin);
// drag from the left
int leftX = qMax<int>(0, dragMargin);
+ int leftDistance = drawer->width() * 0.45;
+ QVERIFY(leftDistance > QGuiApplication::styleHints()->startDragDistance());
QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(leftX, drawer->height() / 2));
- QTest::mouseMove(window, QPoint(drawer->width() * 0.25, drawer->height() / 2));
+ QTest::mouseMove(window, QPoint(leftDistance, drawer->height() / 2));
QCOMPARE(drawer->position(), dragFromLeft);
- QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(drawer->width() * 0.25, drawer->height() / 2));
+ QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(leftDistance, drawer->height() / 2));
drawer->close();
QTRY_COMPARE(drawer->position(), qreal(0.0));
// drag from the right
int rightX = qMin<int>(window->width() - 1, window->width() - dragMargin);
+ int rightDistance = drawer->width() * 0.75;
+ QVERIFY(rightDistance > QGuiApplication::styleHints()->startDragDistance());
QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(rightX, drawer->height() / 2));
- QTest::mouseMove(window, QPoint(window->width() - drawer->width() * 0.75, drawer->height() / 2));
+ QTest::mouseMove(window, QPoint(window->width() - rightDistance, drawer->height() / 2));
QCOMPARE(drawer->position(), dragFromRight);
- QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(window->width() - drawer->width() * 0.75, drawer->height() / 2));
+ QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(window->width() - rightDistance, drawer->height() / 2));
}
void tst_Drawer::reposition()
{
QQuickApplicationHelper helper(this, QStringLiteral("applicationwindow.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationWindow *window = helper.appWindow;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
- QQuickDrawer *drawer = helper.window->property("drawer").value<QQuickDrawer*>();
+ QQuickDrawer *drawer = helper.appWindow->property("drawer").value<QQuickDrawer*>();
QVERIFY(drawer);
drawer->setEdge(Qt::RightEdge);
drawer->open();
QTRY_COMPARE(drawer->popupItem()->x(), window->width() - drawer->width());
- drawer->close();
- QTRY_COMPARE(drawer->popupItem()->x(), static_cast<qreal>(window->width()));
-
window->setWidth(window->width() + 100);
+ QTRY_COMPARE(drawer->popupItem()->x(), window->width() - drawer->width());
+
+ drawer->close();
QTRY_COMPARE(drawer->popupItem()->x(), static_cast<qreal>(window->width()));
}
void tst_Drawer::hover_data()
{
+ QTest::addColumn<QString>("source");
QTest::addColumn<bool>("modal");
- QTest::newRow("modal") << true;
- QTest::newRow("modeless") << false;
+ QTest::newRow("Window:modal") << "window-hover.qml" << true;
+ QTest::newRow("Window:modeless") << "window-hover.qml" << false;
+ QTest::newRow("ApplicationWindow:modal") << "applicationwindow-hover.qml" << true;
+ QTest::newRow("ApplicationWindow:modeless") << "applicationwindow-hover.qml" << false;
}
void tst_Drawer::hover()
{
+ QFETCH(QString, source);
QFETCH(bool, modal);
- QQuickApplicationHelper helper(this, QStringLiteral("hover.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationHelper helper(this, source);
+ QQuickWindow *window = helper.window;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
- QQuickDrawer *drawer = helper.window->property("drawer").value<QQuickDrawer*>();
+ QQuickDrawer *drawer = window->property("drawer").value<QQuickDrawer*>();
QVERIFY(drawer);
drawer->setModal(modal);
- QQuickButton *backgroundButton = helper.window->property("backgroundButton").value<QQuickButton*>();
+ QQuickButton *backgroundButton = window->property("backgroundButton").value<QQuickButton*>();
QVERIFY(backgroundButton);
backgroundButton->setHoverEnabled(true);
- QQuickButton *drawerButton = helper.window->property("drawerButton").value<QQuickButton*>();
+ QQuickButton *drawerButton = window->property("drawerButton").value<QQuickButton*>();
QVERIFY(drawerButton);
drawerButton->setHoverEnabled(true);
@@ -242,6 +406,127 @@ void tst_Drawer::hover()
QVERIFY(backgroundButton->isHovered());
}
+void tst_Drawer::multiple()
+{
+ QQuickApplicationHelper helper(this, QStringLiteral("multiple.qml"));
+ QQuickWindow *window = helper.window;
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window));
+
+ QQuickDrawer *leftDrawer = window->property("leftDrawer").value<QQuickDrawer*>();
+ QVERIFY(leftDrawer);
+ QQuickButton *leftButton = window->property("leftButton").value<QQuickButton*>();
+ QVERIFY(leftButton);
+ QSignalSpy leftClickSpy(leftButton, SIGNAL(clicked()));
+ QVERIFY(leftClickSpy.isValid());
+
+ QQuickDrawer *rightDrawer = window->property("rightDrawer").value<QQuickDrawer*>();
+ QVERIFY(rightDrawer);
+ QQuickButton *rightButton = window->property("rightButton").value<QQuickButton*>();
+ QVERIFY(rightButton);
+ QSignalSpy rightClickSpy(rightButton, SIGNAL(clicked()));
+ QVERIFY(rightClickSpy.isValid());
+
+ QQuickButton *contentButton = window->property("contentButton").value<QQuickButton*>();
+ QVERIFY(contentButton);
+ QSignalSpy contentClickSpy(contentButton, SIGNAL(clicked()));
+ QVERIFY(contentClickSpy.isValid());
+
+ // no drawers open, click the content
+ QTest::mouseClick(window, Qt::LeftButton);
+ QCOMPARE(contentClickSpy.count(), 1);
+ QCOMPARE(leftClickSpy.count(), 0);
+ QCOMPARE(rightClickSpy.count(), 0);
+
+ // drag the left drawer open
+ QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(0, window->height() / 2));
+ QTest::mouseMove(window, QPoint(leftDrawer->width() / 2, window->height() / 2));
+ QCOMPARE(leftDrawer->position(), 0.5);
+ QCOMPARE(rightDrawer->position(), 0.0);
+ QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(leftDrawer->width() / 2, window->height() / 2));
+ QTRY_COMPARE(leftDrawer->position(), 1.0);
+ QCOMPARE(rightDrawer->position(), 0.0);
+
+ // cannot drag the right drawer while the left drawer is open
+ QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(window->width() - 1, window->height() / 2));
+ QTest::mouseMove(window, QPoint(window->width() - leftDrawer->width() / 2, window->height() / 2));
+ QCOMPARE(leftDrawer->position(), 1.0);
+ QCOMPARE(rightDrawer->position(), 0.0);
+ QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(window->width() - leftDrawer->width() / 2, window->height() / 2));
+ QCOMPARE(rightDrawer->position(), 0.0);
+ QCOMPARE(leftDrawer->position(), 1.0);
+
+ // open the right drawer below the left drawer
+ rightDrawer->open();
+ QTRY_COMPARE(rightDrawer->position(), 1.0);
+
+ // click the left drawer's button
+ QTest::mouseClick(window, Qt::LeftButton);
+ QCOMPARE(contentClickSpy.count(), 1);
+ QCOMPARE(leftClickSpy.count(), 1);
+ QCOMPARE(rightClickSpy.count(), 0);
+
+ // click the left drawer's background (button disabled, don't leak through to the right drawer below)
+ leftButton->setEnabled(false);
+ QTest::mouseClick(window, Qt::LeftButton);
+ QCOMPARE(contentClickSpy.count(), 1);
+ QCOMPARE(leftClickSpy.count(), 1);
+ QCOMPARE(rightClickSpy.count(), 0);
+ leftButton->setEnabled(true);
+
+ // click the overlay of the left drawer (don't leak through to right drawer below)
+ QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, QPoint(window->width() - (window->width() - leftDrawer->width()) / 2, window->height() / 2));
+ QCOMPARE(contentClickSpy.count(), 1);
+ QCOMPARE(leftClickSpy.count(), 1);
+ QCOMPARE(rightClickSpy.count(), 0);
+ QTRY_VERIFY(!leftDrawer->isVisible());
+
+ // click the right drawer's button
+ QTest::mouseClick(window, Qt::LeftButton);
+ QCOMPARE(contentClickSpy.count(), 1);
+ QCOMPARE(leftClickSpy.count(), 1);
+ QCOMPARE(rightClickSpy.count(), 1);
+
+ // cannot drag the left drawer while the right drawer is open
+ QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(0, window->height() / 2));
+ QTest::mouseMove(window, QPoint(leftDrawer->width() / 2, window->height() / 2));
+ QCOMPARE(leftDrawer->position(), 0.0);
+ QCOMPARE(rightDrawer->position(), 1.0);
+ QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(leftDrawer->width() / 2, window->height() / 2));
+ QCOMPARE(leftDrawer->position(), 0.0);
+ QCOMPARE(rightDrawer->position(), 1.0);
+
+ // click the right drawer's background (button disabled, don't leak through to the content below)
+ rightButton->setEnabled(false);
+ QTest::mouseClick(window, Qt::LeftButton);
+ QCOMPARE(contentClickSpy.count(), 1);
+ QCOMPARE(leftClickSpy.count(), 1);
+ QCOMPARE(rightClickSpy.count(), 1);
+ rightButton->setEnabled(true);
+
+ // click the overlay of the right drawer (don't leak through to the content below)
+ QTest::mouseClick(window, Qt::LeftButton, Qt::NoModifier, QPoint((window->width() - rightDrawer->width()) / 2, window->height() / 2));
+ QCOMPARE(contentClickSpy.count(), 1);
+ QCOMPARE(leftClickSpy.count(), 1);
+ QCOMPARE(rightClickSpy.count(), 1);
+ QTRY_VERIFY(!rightDrawer->isVisible());
+
+ // no drawers open, click the content
+ QTest::mouseClick(window, Qt::LeftButton);
+ QCOMPARE(contentClickSpy.count(), 2);
+ QCOMPARE(leftClickSpy.count(), 1);
+ QCOMPARE(rightClickSpy.count(), 1);
+
+ // drag the right drawer open
+ QTest::mousePress(window, Qt::LeftButton, Qt::NoModifier, QPoint(window->width() - 1, window->height() / 2));
+ QTest::mouseMove(window, QPoint(window->width() - rightDrawer->width() / 2, window->height() / 2));
+ QCOMPARE(rightDrawer->position(), 0.5);
+ QCOMPARE(leftDrawer->position(), 0.0);
+ QTest::mouseRelease(window, Qt::LeftButton, Qt::NoModifier, QPoint(window->width() - rightDrawer->width() / 2, window->height() / 2));
+ QTRY_COMPARE(rightDrawer->position(), 1.0);
+ QCOMPARE(leftDrawer->position(), 0.0);
+}
+
QTEST_MAIN(tst_Drawer)
#include "tst_drawer.moc"
diff --git a/tests/auto/focus/tst_focus.cpp b/tests/auto/focus/tst_focus.cpp
index cab2625a..dec4fecd 100644
--- a/tests/auto/focus/tst_focus.cpp
+++ b/tests/auto/focus/tst_focus.cpp
@@ -107,7 +107,7 @@ void tst_focus::navigation()
QVERIFY(QTest::qWaitForWindowActive(&view));
QVERIFY(QGuiApplication::focusWindow() == &view);
- foreach (const QString &name, order) {
+ for (const QString &name : qAsConst(order)) {
QKeyEvent event(QEvent::KeyPress, key, Qt::NoModifier);
QGuiApplication::sendEvent(&view, &event);
QVERIFY(event.isAccepted());
diff --git a/tests/auto/menu/tst_menu.cpp b/tests/auto/menu/tst_menu.cpp
index 28882f04..0635ad81 100644
--- a/tests/auto/menu/tst_menu.cpp
+++ b/tests/auto/menu/tst_menu.cpp
@@ -73,7 +73,7 @@ void tst_menu::defaults()
{
QQuickApplicationHelper helper(this, QLatin1String("applicationwindow.qml"));
- QQuickMenu *emptyMenu = helper.window->property("emptyMenu").value<QQuickMenu*>();
+ QQuickMenu *emptyMenu = helper.appWindow->property("emptyMenu").value<QQuickMenu*>();
QCOMPARE(emptyMenu->isVisible(), false);
QCOMPARE(emptyMenu->contentItem()->property("currentIndex"), QVariant(-1));
}
@@ -82,7 +82,7 @@ void tst_menu::mouse()
{
QQuickApplicationHelper helper(this, QLatin1String("applicationwindow.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationWindow *window = helper.appWindow;
window->show();
QVERIFY(QTest::qWaitForWindowActive(window));
@@ -154,7 +154,7 @@ void tst_menu::contextMenuKeyboard()
QQuickApplicationHelper helper(this, QLatin1String("applicationwindow.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationWindow *window = helper.appWindow;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
@@ -232,7 +232,7 @@ void tst_menu::menuButton()
QQuickApplicationHelper helper(this, QLatin1String("applicationwindow.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationWindow *window = helper.appWindow;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
@@ -256,7 +256,7 @@ void tst_menu::menuButton()
void tst_menu::addItem()
{
QQuickApplicationHelper helper(this, QLatin1String("addItem.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationWindow *window = helper.appWindow;
window->show();
QVERIFY(QTest::qWaitForWindowActive(window));
@@ -277,7 +277,7 @@ void tst_menu::addItem()
void tst_menu::menuSeparator()
{
QQuickApplicationHelper helper(this, QLatin1String("menuSeparator.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickWindow *window = helper.window;
window->show();
QVERIFY(QTest::qWaitForWindowActive(window));
diff --git a/tests/auto/popup/data/hover.qml b/tests/auto/popup/data/applicationwindow-hover.qml
index 044d983c..044d983c 100644
--- a/tests/auto/popup/data/hover.qml
+++ b/tests/auto/popup/data/applicationwindow-hover.qml
diff --git a/tests/auto/popup/data/window-hover.qml b/tests/auto/popup/data/window-hover.qml
new file mode 100644
index 00000000..78d650fa
--- /dev/null
+++ b/tests/auto/popup/data/window-hover.qml
@@ -0,0 +1,70 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.6
+import QtQuick.Window 2.2
+import QtQuick.Controls 2.0
+
+Window {
+ width: 400
+ height: 400
+
+ property alias popup: popup
+ property alias parentButton: parentButton
+ property alias childButton: childButton
+
+ Button {
+ id: parentButton
+ text: "Parent"
+ anchors.fill: parent
+
+ Popup {
+ id: popup
+ x: 1
+ y: 1
+ padding: 1
+
+ Button {
+ id: childButton
+ text: "Child"
+ }
+ }
+ }
+}
diff --git a/tests/auto/popup/data/window.qml b/tests/auto/popup/data/window.qml
new file mode 100644
index 00000000..92bfbd70
--- /dev/null
+++ b/tests/auto/popup/data/window.qml
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.6
+import QtQuick.Window 2.2
+import QtQuick.Controls 2.0
+
+Window {
+ width: 400
+ height: 400
+
+ property alias popup: popup
+ property alias popup2: popup2
+ property alias button: button
+
+ Button {
+ id: button
+ text: "Open"
+ anchors.centerIn: parent
+ anchors.verticalCenterOffset: -height
+
+ Popup {
+ id: popup
+ y: parent.height
+
+ Text {
+ color: "white"
+ text: "Hello, world!"
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: popup.close()
+ }
+ }
+ }
+ }
+
+ Popup {
+ id: popup2
+ y: popup.y
+ z: 1
+ contentItem: Text {
+ text: "Popup2"
+ font.pixelSize: 36
+ }
+ }
+}
diff --git a/tests/auto/popup/tst_popup.cpp b/tests/auto/popup/tst_popup.cpp
index 1166b517..a6848fc8 100644
--- a/tests/auto/popup/tst_popup.cpp
+++ b/tests/auto/popup/tst_popup.cpp
@@ -51,8 +51,12 @@ class tst_popup : public QQmlDataTest
Q_OBJECT
private slots:
+ void visible_data();
void visible();
+ void state();
+ void overlay_data();
void overlay();
+ void zOrder_data();
void zOrder();
void windowChange();
void closePolicy_data();
@@ -64,46 +68,107 @@ private slots:
void parentDestroyed();
};
+void tst_popup::visible_data()
+{
+ QTest::addColumn<QString>("source");
+ QTest::newRow("Window") << "window.qml";
+ QTest::newRow("ApplicationWindow") << "applicationwindow.qml";
+}
+
void tst_popup::visible()
{
- QQuickApplicationHelper helper(this, QStringLiteral("applicationwindow.qml"));
+ QFETCH(QString, source);
+ QQuickApplicationHelper helper(this, source);
- QQuickApplicationWindow *window = helper.window;
+ QQuickWindow *window = helper.window;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
- QQuickPopup *popup = helper.window->property("popup").value<QQuickPopup*>();
+ QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
QVERIFY(popup);
QQuickItem *popupItem = popup->popupItem();
popup->open();
QVERIFY(popup->isVisible());
- QVERIFY(window->overlay()->childItems().contains(popupItem));
+
+ QQuickOverlay *overlay = QQuickOverlay::overlay(window);
+ QVERIFY(overlay);
+ QVERIFY(overlay->childItems().contains(popupItem));
popup->close();
QVERIFY(!popup->isVisible());
- QVERIFY(!window->overlay()->childItems().contains(popupItem));
+ QVERIFY(!overlay->childItems().contains(popupItem));
popup->setVisible(true);
QVERIFY(popup->isVisible());
- QVERIFY(window->overlay()->childItems().contains(popupItem));
+ QVERIFY(overlay->childItems().contains(popupItem));
popup->setVisible(false);
QVERIFY(!popup->isVisible());
- QVERIFY(!window->overlay()->childItems().contains(popupItem));
+ QVERIFY(!overlay->childItems().contains(popupItem));
+}
+
+void tst_popup::state()
+{
+ QQuickApplicationHelper helper(this, "applicationwindow.qml");
+
+ QQuickWindow *window = helper.window;
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window));
+
+ QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
+ QVERIFY(popup);
+
+ QCOMPARE(popup->isVisible(), false);
+
+ QSignalSpy visibleChangedSpy(popup, SIGNAL(visibleChanged()));
+ QSignalSpy aboutToShowSpy(popup, SIGNAL(aboutToShow()));
+ QSignalSpy aboutToHideSpy(popup, SIGNAL(aboutToHide()));
+ QSignalSpy openedSpy(popup, SIGNAL(opened()));
+ QSignalSpy closedSpy(popup, SIGNAL(closed()));
+
+ QVERIFY(visibleChangedSpy.isValid());
+ QVERIFY(aboutToShowSpy.isValid());
+ QVERIFY(aboutToHideSpy.isValid());
+ QVERIFY(openedSpy.isValid());
+ QVERIFY(closedSpy.isValid());
+
+ popup->open();
+ QCOMPARE(visibleChangedSpy.count(), 1);
+ QCOMPARE(aboutToShowSpy.count(), 1);
+ QCOMPARE(aboutToHideSpy.count(), 0);
+ QTRY_COMPARE(openedSpy.count(), 1);
+ QCOMPARE(closedSpy.count(), 0);
+
+ popup->close();
+ QCOMPARE(visibleChangedSpy.count(), 2);
+ QCOMPARE(aboutToShowSpy.count(), 1);
+ QCOMPARE(aboutToHideSpy.count(), 1);
+ QCOMPARE(openedSpy.count(), 1);
+ QTRY_COMPARE(closedSpy.count(), 1);
+}
+
+void tst_popup::overlay_data()
+{
+ QTest::addColumn<QString>("source");
+ QTest::newRow("Window") << "window.qml";
+ QTest::newRow("ApplicationWindow") << "applicationwindow.qml";
}
void tst_popup::overlay()
{
- QQuickApplicationHelper helper(this, QStringLiteral("applicationwindow.qml"));
+ QFETCH(QString, source);
+ QQuickApplicationHelper helper(this, source);
- QQuickApplicationWindow *window = helper.window;
+ QQuickWindow *window = helper.window;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
- QQuickItem *overlay = window->overlay();
+ QQuickOverlay *overlay = QQuickOverlay::overlay(window);
+ QVERIFY(overlay);
+
QSignalSpy overlayPressedSignal(overlay, SIGNAL(pressed()));
QSignalSpy overlayReleasedSignal(overlay, SIGNAL(released()));
QVERIFY(overlayPressedSignal.isValid());
@@ -115,10 +180,10 @@ void tst_popup::overlay()
QCOMPARE(overlayPressedSignal.count(), 0);
QCOMPARE(overlayReleasedSignal.count(), 0);
- QQuickPopup *popup = helper.window->property("popup").value<QQuickPopup*>();
+ QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
QVERIFY(popup);
- QQuickButton *button = helper.window->property("button").value<QQuickButton*>();
+ QQuickButton *button = window->property("button").value<QQuickButton*>();
QVERIFY(button);
popup->open();
@@ -156,20 +221,28 @@ void tst_popup::overlay()
QVERIFY(!overlay->isVisible());
}
+void tst_popup::zOrder_data()
+{
+ QTest::addColumn<QString>("source");
+ QTest::newRow("Window") << "window.qml";
+ QTest::newRow("ApplicationWindow") << "applicationwindow.qml";
+}
+
void tst_popup::zOrder()
{
- QQuickApplicationHelper helper(this, QStringLiteral("applicationwindow.qml"));
+ QFETCH(QString, source);
+ QQuickApplicationHelper helper(this, source);
- QQuickApplicationWindow *window = helper.window;
+ QQuickWindow *window = helper.window;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
- QQuickPopup *popup = helper.window->property("popup").value<QQuickPopup*>();
+ QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
QVERIFY(popup);
popup->setModal(true);
- QQuickPopup *popup2 = helper.window->property("popup2").value<QQuickPopup*>();
+ QQuickPopup *popup2 = window->property("popup2").value<QQuickPopup*>();
QVERIFY(popup2);
popup2->setModal(true);
@@ -220,32 +293,42 @@ void tst_popup::closePolicy_data()
{
qRegisterMetaType<QQuickPopup::ClosePolicy>();
+ QTest::addColumn<QString>("source");
QTest::addColumn<QQuickPopup::ClosePolicy>("closePolicy");
- QTest::newRow("NoAutoClose") << static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::NoAutoClose);
- QTest::newRow("CloseOnPressOutside") << static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutside);
- QTest::newRow("CloseOnPressOutsideParent") << static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutsideParent);
- QTest::newRow("CloseOnPressOutside|Parent") << static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
- QTest::newRow("CloseOnReleaseOutside") << static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnReleaseOutside);
- QTest::newRow("CloseOnReleaseOutside|Parent") << static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
- QTest::newRow("CloseOnEscape") << static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnEscape);
+ QTest::newRow("Window:NoAutoClose") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::NoAutoClose);
+ QTest::newRow("Window:CloseOnPressOutside") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutside);
+ QTest::newRow("Window:CloseOnPressOutsideParent") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutsideParent);
+ QTest::newRow("Window:CloseOnPressOutside|Parent") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
+ QTest::newRow("Window:CloseOnReleaseOutside") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnReleaseOutside);
+ QTest::newRow("Window:CloseOnReleaseOutside|Parent") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
+ QTest::newRow("Window:CloseOnEscape") << "window.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnEscape);
+
+ QTest::newRow("ApplicationWindow:NoAutoClose") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::NoAutoClose);
+ QTest::newRow("ApplicationWindow:CloseOnPressOutside") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutside);
+ QTest::newRow("ApplicationWindow:CloseOnPressOutsideParent") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutsideParent);
+ QTest::newRow("ApplicationWindow:CloseOnPressOutside|Parent") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
+ QTest::newRow("ApplicationWindow:CloseOnReleaseOutside") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnReleaseOutside);
+ QTest::newRow("ApplicationWindow:CloseOnReleaseOutside|Parent") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
+ QTest::newRow("ApplicationWindow:CloseOnEscape") << "applicationwindow.qml"<< static_cast<QQuickPopup::ClosePolicy>(QQuickPopup::CloseOnEscape);
}
void tst_popup::closePolicy()
{
+ QFETCH(QString, source);
QFETCH(QQuickPopup::ClosePolicy, closePolicy);
- QQuickApplicationHelper helper(this, QStringLiteral("applicationwindow.qml"));
+ QQuickApplicationHelper helper(this, source);
- QQuickApplicationWindow *window = helper.window;
+ QQuickWindow *window = helper.window;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
- QQuickPopup *popup = helper.window->property("popup").value<QQuickPopup*>();
+ QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
QVERIFY(popup);
- QQuickButton *button = helper.window->property("button").value<QQuickButton*>();
+ QQuickButton *button = window->property("button").value<QQuickButton*>();
QVERIFY(button);
popup->setModal(true);
@@ -308,15 +391,15 @@ void tst_popup::activeFocusOnClose1()
// Test that a popup that never sets focus: true (e.g. ToolTip) doesn't affect
// the active focus item when it closes.
QQuickApplicationHelper helper(this, QStringLiteral("activeFocusOnClose1.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationWindow *window = helper.appWindow;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
- QQuickPopup *focusedPopup = helper.window->property("focusedPopup").value<QQuickPopup*>();
+ QQuickPopup *focusedPopup = helper.appWindow->property("focusedPopup").value<QQuickPopup*>();
QVERIFY(focusedPopup);
- QQuickPopup *nonFocusedPopup = helper.window->property("nonFocusedPopup").value<QQuickPopup*>();
+ QQuickPopup *nonFocusedPopup = helper.appWindow->property("nonFocusedPopup").value<QQuickPopup*>();
QVERIFY(nonFocusedPopup);
focusedPopup->open();
@@ -338,18 +421,18 @@ void tst_popup::activeFocusOnClose2()
// calling forceActiveFocus() on another item) before it closes doesn't
// affect the active focus item when it closes.
QQuickApplicationHelper helper(this, QStringLiteral("activeFocusOnClose2.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationWindow *window = helper.appWindow;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
- QQuickPopup *popup1 = helper.window->property("popup1").value<QQuickPopup*>();
+ QQuickPopup *popup1 = helper.appWindow->property("popup1").value<QQuickPopup*>();
QVERIFY(popup1);
- QQuickPopup *popup2 = helper.window->property("popup2").value<QQuickPopup*>();
+ QQuickPopup *popup2 = helper.appWindow->property("popup2").value<QQuickPopup*>();
QVERIFY(popup2);
- QQuickButton *closePopup2Button = helper.window->property("closePopup2Button").value<QQuickButton*>();
+ QQuickButton *closePopup2Button = helper.appWindow->property("closePopup2Button").value<QQuickButton*>();
QVERIFY(closePopup2Button);
popup1->open();
@@ -369,31 +452,35 @@ void tst_popup::activeFocusOnClose2()
void tst_popup::hover_data()
{
+ QTest::addColumn<QString>("source");
QTest::addColumn<bool>("modal");
- QTest::newRow("modal") << true;
- QTest::newRow("modeless") << false;
+ QTest::newRow("Window:modal") << "window-hover.qml" << true;
+ QTest::newRow("Window:modeless") << "window-hover.qml" << false;
+ QTest::newRow("ApplicationWindow:modal") << "applicationwindow-hover.qml" << true;
+ QTest::newRow("ApplicationWindow:modeless") << "applicationwindow-hover.qml" << false;
}
void tst_popup::hover()
{
+ QFETCH(QString, source);
QFETCH(bool, modal);
- QQuickApplicationHelper helper(this, QStringLiteral("hover.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationHelper helper(this, source);
+ QQuickWindow *window = helper.window;
window->show();
window->requestActivate();
QVERIFY(QTest::qWaitForWindowActive(window));
- QQuickPopup *popup = helper.window->property("popup").value<QQuickPopup*>();
+ QQuickPopup *popup = window->property("popup").value<QQuickPopup*>();
QVERIFY(popup);
popup->setModal(modal);
- QQuickButton *parentButton = helper.window->property("parentButton").value<QQuickButton*>();
+ QQuickButton *parentButton = window->property("parentButton").value<QQuickButton*>();
QVERIFY(parentButton);
parentButton->setHoverEnabled(true);
- QQuickButton *childButton = helper.window->property("childButton").value<QQuickButton*>();
+ QQuickButton *childButton = window->property("childButton").value<QQuickButton*>();
QVERIFY(childButton);
childButton->setHoverEnabled(true);
diff --git a/tests/auto/qquickmaterialstyle/data/tst_material.qml b/tests/auto/qquickmaterialstyle/data/tst_material.qml
index 9411891f..63385a6e 100644
--- a/tests/auto/qquickmaterialstyle/data/tst_material.qml
+++ b/tests/auto/qquickmaterialstyle/data/tst_material.qml
@@ -606,27 +606,75 @@ TestCase {
window.destroy()
}
- function test_buttonBackground() {
- var appWindow = applicationWindow.createObject(testCase)
- verify(appWindow)
- appWindow.visible = true
-
- var childButton = button.createObject(appWindow)
- verify(childButton)
-
- var buttonBackgroundColor = childButton.background.color
- appWindow.Material.background = "red"
- // We wait the length of the color animation to be sure that it hasn't actually changed.
- wait(400)
- // We want childButton.Material.background to be equal to appWindow.Material.background,
- // because we want the color to propagate to items that might actually use it...
- // but Button doesn't use the background color unless explicitly set,
- // so we compare the actual background rect color instead.
- compare(childButton.background.color, buttonBackgroundColor)
-
- childButton.Material.background = "#0000ff"
- tryCompare(childButton.background, "color", "#0000ff")
-
- appWindow.destroy()
+ Component {
+ id: backgroundControls
+ ApplicationWindow {
+ id: window
+ property Button button: Button { }
+ property ComboBox combobox: ComboBox { }
+ property Drawer drawer: Drawer { }
+ property GroupBox groupbox: GroupBox { Material.elevation: 10 }
+ property Frame frame: Frame { Material.elevation: 10 }
+ property Menu menu: Menu { }
+ property Page page: Page { }
+ property Pane pane: Pane { }
+ property Popup popup: Popup { }
+ property TabBar tabbar: TabBar { }
+ property ToolBar toolbar: ToolBar { }
+ property ToolTip tooltip: ToolTip { }
+ }
+ }
+
+ function test_background_data() {
+ return [
+ { tag: "button", inherit: false, wait: 400 },
+ { tag: "combobox", inherit: false, wait: 400 },
+ { tag: "drawer", inherit: true },
+ { tag: "groupbox", inherit: true },
+ { tag: "frame", inherit: true },
+ { tag: "menu", inherit: true },
+ { tag: "page", inherit: true },
+ { tag: "pane", inherit: true },
+ { tag: "popup", inherit: true },
+ { tag: "tabbar", inherit: true },
+ { tag: "toolbar", inherit: false },
+ { tag: "tooltip", inherit: false }
+ ]
+ }
+
+ function test_background(data) {
+ var window = backgroundControls.createObject(testCase)
+ verify(window)
+
+ var control = window[data.tag]
+ verify(control)
+
+ control.parent = window.contentItem
+ control.visible = true
+
+ var defaultBackground = control.background.color
+
+ window.Material.background = "#ff0000"
+ compare(window.color, "#ff0000")
+
+ // For controls that have an animated background color, we wait the length
+ // of the color animation to be sure that the color hasn't actually changed.
+ if (data.wait)
+ wait(data.wait)
+
+ // We want the control's background color to be equal to the window's background
+ // color, because we want the color to propagate to items that might actually use
+ // it... Button, ComboBox, ToolBar and ToolTip have a special background color,
+ // so they don't use the generic background color unless explicitly set, so we
+ // compare the actual background rect color instead.
+ if (data.inherit)
+ compare(control.background.color, "#ff0000")
+ else
+ compare(control.background.color, defaultBackground)
+
+ control.Material.background = "#0000ff"
+ tryCompare(control.background, "color", "#0000ff")
+
+ window.destroy()
}
}
diff --git a/tests/auto/qquickmaterialstyleconf/tst_qquickmaterialstyleconf.cpp b/tests/auto/qquickmaterialstyleconf/tst_qquickmaterialstyleconf.cpp
index c7670c21..c0db7c49 100644
--- a/tests/auto/qquickmaterialstyleconf/tst_qquickmaterialstyleconf.cpp
+++ b/tests/auto/qquickmaterialstyleconf/tst_qquickmaterialstyleconf.cpp
@@ -55,7 +55,7 @@ void tst_qquickmaterialstyleconf::conf()
{
QQuickApplicationHelper helper(this, QLatin1String("applicationwindow.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationWindow *window = helper.appWindow;
window->show();
QVERIFY(QTest::qWaitForWindowExposed(window));
// We specified a custom background color, so the window should have it.
diff --git a/tests/auto/qquickuniversalstyleconf/tst_qquickuniversalstyleconf.cpp b/tests/auto/qquickuniversalstyleconf/tst_qquickuniversalstyleconf.cpp
index c676ae6d..ce018a05 100644
--- a/tests/auto/qquickuniversalstyleconf/tst_qquickuniversalstyleconf.cpp
+++ b/tests/auto/qquickuniversalstyleconf/tst_qquickuniversalstyleconf.cpp
@@ -55,7 +55,7 @@ void tst_qquickuniversalstyleconf::conf()
{
QQuickApplicationHelper helper(this, QLatin1String("applicationwindow.qml"));
- QQuickApplicationWindow *window = helper.window;
+ QQuickApplicationWindow *window = helper.appWindow;
window->show();
QVERIFY(QTest::qWaitForWindowExposed(window));
// We specified a custom background color, so the window should have it.
diff --git a/tests/auto/sanity/tst_sanity.cpp b/tests/auto/sanity/tst_sanity.cpp
index 6b9e05ba..10348ba4 100644
--- a/tests/auto/sanity/tst_sanity.cpp
+++ b/tests/auto/sanity/tst_sanity.cpp
@@ -114,7 +114,8 @@ public:
QQmlJS::Parser parser(&engine);
if (!parser.parse()) {
- foreach (const QQmlJS::DiagnosticMessage &msg, parser.diagnosticMessages())
+ const auto diagnosticMessages = parser.diagnosticMessages();
+ for (const QQmlJS::DiagnosticMessage &msg : diagnosticMessages)
m_errors += QString("%s:%d : %s").arg(m_fileName).arg(msg.loc.startLine).arg(msg.message);
return false;
}
@@ -267,11 +268,12 @@ static void addTestRows(QQmlEngine *engine, const QString &sourcePath, const QSt
// the engine's import path. This way we can use QQmlComponent to load each QML file
// for benchmarking.
- QFileInfoList entries = QDir(QQC2_IMPORT_PATH "/" + sourcePath).entryInfoList(QStringList("*.qml"), QDir::Files);
- foreach (const QFileInfo &entry, entries) {
+ const QFileInfoList entries = QDir(QQC2_IMPORT_PATH "/" + sourcePath).entryInfoList(QStringList("*.qml"), QDir::Files);
+ for (const QFileInfo &entry : entries) {
QString name = entry.baseName();
if (!skiplist.contains(name)) {
- foreach (const QString &importPath, engine->importPathList()) {
+ const auto importPathList = engine->importPathList();
+ for (const QString &importPath : importPathList) {
QString name = entry.dir().dirName() + "/" + entry.fileName();
QString filePath = importPath + "/" + targetPath + "/" + entry.fileName();
if (QFile::exists(filePath)) {
@@ -296,7 +298,7 @@ void tst_Sanity::attachedObjects()
QSet<QString> classNames;
QScopedPointer<QObject> object(component.create());
QVERIFY2(object.data(), qPrintable(component.errorString()));
- foreach (QObject *object, *qt_qobjects) {
+ for (QObject *object : qAsConst(*qt_qobjects)) {
if (object->parent() == &engine)
continue; // allow "global" instances
QString className = object->metaObject()->className();
diff --git a/tests/auto/shared/visualtestutil.h b/tests/auto/shared/visualtestutil.h
index c1cc9c7d..c67e5bdc 100644
--- a/tests/auto/shared/visualtestutil.h
+++ b/tests/auto/shared/visualtestutil.h
@@ -118,9 +118,10 @@ namespace QQuickVisualTestUtil
component.loadUrl(testCase->testFileUrl(testFilePath));
QObject *rootObject = component.create();
cleanup.reset(rootObject);
- QVERIFY2(rootObject, qPrintable(QString::fromLatin1("Failed to create ApplicationWindow: %1").arg(component.errorString())));
+ QVERIFY2(rootObject, qPrintable(QString::fromLatin1("Failed to create window: %1").arg(component.errorString())));
- window = qobject_cast<QQuickApplicationWindow*>(rootObject);
+ window = qobject_cast<QQuickWindow*>(rootObject);
+ appWindow = qobject_cast<QQuickApplicationWindow*>(rootObject);
QVERIFY(window);
QVERIFY(!window->isVisible());
}
@@ -128,7 +129,8 @@ namespace QQuickVisualTestUtil
QQmlEngine engine;
QQmlComponent component;
QScopedPointer<QObject> cleanup;
- QQuickApplicationWindow *window;
+ QQuickApplicationWindow *appWindow;
+ QQuickWindow *window;
};
}
diff --git a/tests/auto/snippets/tst_snippets.cpp b/tests/auto/snippets/tst_snippets.cpp
index fb581b90..6ca9e72c 100644
--- a/tests/auto/snippets/tst_snippets.cpp
+++ b/tests/auto/snippets/tst_snippets.cpp
@@ -101,7 +101,7 @@ void tst_Snippets::screenshots()
QVERIFY(QTest::qWaitForWindowActive(&view));
bool generateScreenshot = true;
- foreach (const QString &baseName, nonVisualSnippets) {
+ for (const QString &baseName : qAsConst(nonVisualSnippets)) {
if (input.contains(baseName)) {
generateScreenshot = false;
break;
diff --git a/tests/benchmarks/creationtime/tst_creationtime.cpp b/tests/benchmarks/creationtime/tst_creationtime.cpp
index 877cf273..3eec3825 100644
--- a/tests/benchmarks/creationtime/tst_creationtime.cpp
+++ b/tests/benchmarks/creationtime/tst_creationtime.cpp
@@ -78,11 +78,12 @@ static void addTestRows(QQmlEngine *engine, const QString &sourcePath, const QSt
// the engine's import path. This way we can use QQmlComponent to load each QML file
// for benchmarking.
- QFileInfoList entries = QDir(QQC2_IMPORT_PATH "/" + sourcePath).entryInfoList(QStringList("*.qml"), QDir::Files);
- foreach (const QFileInfo &entry, entries) {
+ const QFileInfoList entries = QDir(QQC2_IMPORT_PATH "/" + sourcePath).entryInfoList(QStringList("*.qml"), QDir::Files);
+ for (const QFileInfo &entry : entries) {
QString name = entry.baseName();
if (!skiplist.contains(name)) {
- foreach (const QString &importPath, engine->importPathList()) {
+ const auto importPathList = engine->importPathList();
+ for (const QString &importPath : importPathList) {
QString name = entry.dir().dirName() + "/" + entry.fileName();
QString filePath = importPath + "/" + targetPath + "/" + entry.fileName();
if (QFile::exists(filePath)) {
diff --git a/tests/benchmarks/objectcount/tst_objectcount.cpp b/tests/benchmarks/objectcount/tst_objectcount.cpp
index 91c17fcc..14a950f3 100644
--- a/tests/benchmarks/objectcount/tst_objectcount.cpp
+++ b/tests/benchmarks/objectcount/tst_objectcount.cpp
@@ -100,7 +100,7 @@ static void printItems(const QList<QQuickItem *> &items)
std::cout << " QQuickItems: " << items.count() << " (total of QObjects: " << qt_qobjects->count() << ")" << std::endl;
if (qt_verbose) {
- foreach (QObject *object, *qt_qobjects)
+ for (QObject *object : qAsConst(*qt_qobjects))
qInfo() << "\t" << object;
}
}
@@ -118,11 +118,12 @@ static void addTestRows(QQmlEngine *engine, const QString &sourcePath, const QSt
// the engine's import path. This way we can use QQmlComponent to load each QML file
// for benchmarking.
- QFileInfoList entries = QDir(QQC2_IMPORT_PATH "/" + sourcePath).entryInfoList(QStringList("*.qml"), QDir::Files);
- foreach (const QFileInfo &entry, entries) {
+ const QFileInfoList entries = QDir(QQC2_IMPORT_PATH "/" + sourcePath).entryInfoList(QStringList("*.qml"), QDir::Files);
+ for (const QFileInfo &entry : entries) {
QString name = entry.baseName();
if (!skiplist.contains(name)) {
- foreach (const QString &importPath, engine->importPathList()) {
+ const auto importPathList = engine->importPathList();
+ for (const QString &importPath : importPathList) {
QString name = entry.dir().dirName() + "/" + entry.fileName();
QString filePath = importPath + "/" + targetPath + "/" + entry.fileName();
if (QFile::exists(filePath)) {
@@ -148,7 +149,7 @@ static void doBenchmark(QQmlEngine *engine, const QUrl &url)
QVERIFY2(object.data(), qPrintable(component.errorString()));
QList<QQuickItem *> items;
- foreach (QObject *object, *qt_qobjects()) {
+ for (QObject *object : qAsConst(*qt_qobjects)) {
QQuickItem *item = qobject_cast<QQuickItem *>(object);
if (item)
items += item;
diff --git a/tests/manual/gifs/eventcapturer.cpp b/tests/manual/gifs/eventcapturer.cpp
index 83e1c76b..3c355f59 100644
--- a/tests/manual/gifs/eventcapturer.cpp
+++ b/tests/manual/gifs/eventcapturer.cpp
@@ -57,7 +57,8 @@
// interact with the view here, in order for the events to be captured
qDebug() << "\n";
- foreach (CapturedEvent event, eventCapturer.capturedEvents())
+ const auto capturedEvents = eventCapturer.capturedEvents();
+ for (CapturedEvent event : capturedEvents)
qDebug().noquote() << event.cppCommand();
\endcode
diff --git a/tests/manual/gifs/tst_gifs.cpp b/tests/manual/gifs/tst_gifs.cpp
index 94400e04..919ba104 100644
--- a/tests/manual/gifs/tst_gifs.cpp
+++ b/tests/manual/gifs/tst_gifs.cpp
@@ -191,7 +191,8 @@ void tst_Gifs::tumblerWrap()
gifRecorder.waitForFinish();
- foreach (CapturedEvent event, eventCapturer.capturedEvents())
+ const auto capturedEvents = eventCapturer.capturedEvents();
+ for (CapturedEvent event : capturedEvents)
qDebug().noquote() << event.cppCommand();
}