diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | tests/auto/auto.pro | 1 | ||||
-rw-r--r-- | tests/auto/controls/data/PressAndHoldTests.qml | 139 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_textarea.qml | 14 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_textfield.qml | 17 | ||||
-rw-r--r-- | tests/auto/pressandhold/pressandhold.pro | 9 | ||||
-rw-r--r-- | tests/auto/pressandhold/tst_pressandhold.cpp | 197 |
7 files changed, 208 insertions, 170 deletions
@@ -16,6 +16,7 @@ /tests/auto/applicationwindow/tst_applicationwindow /tests/auto/calendar/tst_calendar /tests/auto/controls/tst_controls +/tests/auto/pressandhold/tst_pressandhold /tests/auto/sanity/tst_sanity /tests/auto/snippets/tst_snippets /tests/auto/theme/tst_theme diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index ff3d32e1..6cf2045f 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -5,6 +5,7 @@ SUBDIRS += \ applicationwindow \ calendar \ controls \ + pressandhold \ sanity \ snippets \ theme diff --git a/tests/auto/controls/data/PressAndHoldTests.qml b/tests/auto/controls/data/PressAndHoldTests.qml deleted file mode 100644 index 6be627cc..00000000 --- a/tests/auto/controls/data/PressAndHoldTests.qml +++ /dev/null @@ -1,139 +0,0 @@ -/**************************************************************************** -** -** 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 QtTest 1.0 - -QtObject { - - property SignalSpy pressAndHoldSpy: SignalSpy { - signalName: "pressAndHold" - } - - function basicPressAndHold(control) { - control.width = 200 - pressAndHoldSpy.target = control - - mouseClick(control) - compare(pressAndHoldSpy.count, 0) - var interval = Qt.styleHints.mousePressAndHoldInterval - - // Short press duration => nothing happens - mousePress(control) - wait(interval * 0.3) - mouseRelease(control) - compare(pressAndHoldSpy.count, 0) - - // Long enough press duration => signal emitted - mousePress(control, 10, 10) - // Add 20% extra time to allow the control to - // receive the timer event before we come back here - wait(interval * 1.2) - compare(pressAndHoldSpy.count, 1) - mouseRelease(control) - compare(pressAndHoldSpy.count, 1) - - // Long enough, but move in between => nothing happens - pressAndHoldSpy.clear() - mousePress(control) - wait(interval * 0.6) - mouseMove(control, 5, 5, Qt.LeftButton) - wait(interval * 0.6) - compare(pressAndHoldSpy.count, 0) - mouseRelease(control) - compare(pressAndHoldSpy.count, 0) - - // Long enough, but 2nd press in between => nothing happens - pressAndHoldSpy.clear() - mousePress(control, 10, 10) - wait(interval * 0.6) - mousePress(control, 10, 10, Qt.RightButton) - wait(interval * 0.6) - compare(pressAndHoldSpy.count, 0) - mouseRelease(control, 10, 10, Qt.LeftButton|Qt.RightButton) - compare(pressAndHoldSpy.count, 0) - } - - function pressAndHoldKeepsSelection(control) { - control.width = 200 - control.text = "Cool stuff" - control.selectAll() - compare(control.selectedText, control.text) - - mouseClick(control) - compare(control.selectedText, "") - - control.selectAll() - compare(control.selectedText, control.text) - - var interval = Qt.styleHints.mousePressAndHoldInterval - pressAndHoldSpy.target = control - mousePress(control, 10, 10) - // Add 20% extra time to allow the control to - // receive the timer event before we come back here - wait(interval * 1.2) - mouseRelease(control) - compare(pressAndHoldSpy.count, 1) - compare(control.selectedText, control.text) - pressAndHoldSpy.clear() - - // Pre-timeout canceled pressAndHold should clear as usual - mousePress(control, 10, 10) - wait(interval * 0.5) - mouseRelease(control) - compare(pressAndHoldSpy.count, 0) - compare(control.selectedText, "") - - control.selectAll() - compare(control.selectedText, control.text) - - // Second button canceled pressAndHold should clear as usual - mousePress(control, 10, 10) - wait(interval * 0.6) - mouseRelease(control) - mousePress(control, 10, 10, Qt.RightButton) - compare(control.selectedText, "") - wait(interval * 0.6) - compare(pressAndHoldSpy.count, 0) - mouseRelease(control, 10, 10, Qt.LeftButton|Qt.RightButton) - compare(pressAndHoldSpy.count, 0) - compare(control.selectedText, "") - } -} diff --git a/tests/auto/controls/data/tst_textarea.qml b/tests/auto/controls/data/tst_textarea.qml index 286a32ce..b1225493 100644 --- a/tests/auto/controls/data/tst_textarea.qml +++ b/tests/auto/controls/data/tst_textarea.qml @@ -61,20 +61,6 @@ TestCase { control.destroy() } - PressAndHoldTests { id: pah } - - function test_pressAndHold() { - var control = textArea.createObject(testCase) - pah.basicPressAndHold(control) - control.destroy() - } - - function test_pressAndHoldKeepsSelection() { - var control = textArea.createObject(testCase) - pah.pressAndHoldKeepsSelection(control) - control.destroy() - } - function test_implicitSize() { var control = textArea.createObject(testCase) control.background.implicitWidth = 400 diff --git a/tests/auto/controls/data/tst_textfield.qml b/tests/auto/controls/data/tst_textfield.qml index 38bb7297..57675659 100644 --- a/tests/auto/controls/data/tst_textfield.qml +++ b/tests/auto/controls/data/tst_textfield.qml @@ -61,23 +61,6 @@ TestCase { control.destroy() } - PressAndHoldTests { id: pah } - - function test_pressAndHold() { - if (Qt.platform.os === "osx") - skip("QTBUG-47963"); - - var control = textField.createObject(testCase) - pah.basicPressAndHold(control) - control.destroy() - } - - function test_pressAndHoldKeepsSelection() { - var control = textField.createObject(testCase) - pah.pressAndHoldKeepsSelection(control) - control.destroy() - } - function test_implicitSize() { var control = textField.createObject(testCase) verify(control.implicitWidth > control.leftPadding + control.rightPadding) diff --git a/tests/auto/pressandhold/pressandhold.pro b/tests/auto/pressandhold/pressandhold.pro new file mode 100644 index 00000000..ca76b74a --- /dev/null +++ b/tests/auto/pressandhold/pressandhold.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +TARGET = tst_pressandhold + +QT += quick testlib +CONFIG += testcase +osx:CONFIG -= app_bundle + +SOURCES += \ + $$PWD/tst_pressandhold.cpp diff --git a/tests/auto/pressandhold/tst_pressandhold.cpp b/tests/auto/pressandhold/tst_pressandhold.cpp new file mode 100644 index 00000000..33d93cc0 --- /dev/null +++ b/tests/auto/pressandhold/tst_pressandhold.cpp @@ -0,0 +1,197 @@ +/**************************************************************************** +** +** 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:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest> +#include <QtQuick> + +// TODO: add QStyleHints::setMousePressAndHoldInterval() to speedup the test + +class tst_PressAndHold : public QObject +{ + Q_OBJECT + +private slots: + void pressAndHold_data(); + void pressAndHold(); + + void keepSelection_data(); + void keepSelection(); +}; + +void tst_PressAndHold::pressAndHold_data() +{ + QTest::addColumn<QByteArray>("data"); + + QTest::newRow("TextField") << QByteArray("import Qt.labs.controls 1.0; TextField { text: 'TextField' }"); + QTest::newRow("TextArea") << QByteArray("import Qt.labs.controls 1.0; TextArea { text: 'TextArea' }"); +} + +void tst_PressAndHold::pressAndHold() +{ + QFETCH(QByteArray, data); + + QQmlEngine engine; + QQmlComponent component(&engine); + component.setData(data, QUrl()); + + QScopedPointer<QObject> control(component.create()); + QScopedPointer<QObject> waitControl(component.create()); + QVERIFY(!control.isNull() && !waitControl.isNull()); + + QSignalSpy spy(control.data(), SIGNAL(pressAndHold(QQuickMouseEvent*))); + QSignalSpy waitSpy(waitControl.data(), SIGNAL(pressAndHold(QQuickMouseEvent*))); + QVERIFY(spy.isValid() && waitSpy.isValid()); + + int startDragDistance = QGuiApplication::styleHints()->startDragDistance(); + QMouseEvent press(QEvent::MouseButtonPress, QPointF(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent press2(QEvent::MouseButtonPress, QPointF(), Qt::RightButton, Qt::RightButton, Qt::NoModifier); + QMouseEvent move(QEvent::MouseMove, QPointF(2 * startDragDistance, 2 * startDragDistance), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent release(QEvent::MouseButtonRelease, QPointF(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + + // pressAndHold() emitted + QGuiApplication::sendEvent(control.data(), &press); + QTRY_COMPARE(spy.count(), 1); + QGuiApplication::sendEvent(control.data(), &release); + QCOMPARE(spy.count(), 1); + spy.clear(); + + // pressAndHold() canceled by release + QGuiApplication::sendEvent(control.data(), &press); + QGuiApplication::processEvents(); + QGuiApplication::sendEvent(control.data(), &release); + QCOMPARE(spy.count(), 0); + + // pressAndHold() canceled by move + QGuiApplication::sendEvent(control.data(), &press); + QGuiApplication::sendEvent(control.data(), &move); // cancels pressAndHold() + QGuiApplication::sendEvent(waitControl.data(), &press); + // by the time the second control emits pressAndHold(), we can reliably + // assume that the first control would have emitted pressAndHold() if it + // wasn't canceled as appropriate by the move event above + QTRY_COMPARE(waitSpy.count(), 1); + QCOMPARE(spy.count(), 0); + QGuiApplication::sendEvent(control.data(), &release); + QGuiApplication::sendEvent(waitControl.data(), &release); + QCOMPARE(waitSpy.count(), 1); + QCOMPARE(spy.count(), 0); + waitSpy.clear(); + + // pressAndHold() canceled by 2nd press + QGuiApplication::sendEvent(control.data(), &press); + QGuiApplication::sendEvent(control.data(), &press2); // cancels pressAndHold() + QGuiApplication::sendEvent(waitControl.data(), &press); + // by the time the second control emits pressAndHold(), we can reliably + // assume that the first control would have emitted pressAndHold() if it + // wasn't canceled as appropriate by the 2nd press event above + QTRY_COMPARE(waitSpy.count(), 1); + QCOMPARE(spy.count(), 0); + QGuiApplication::sendEvent(control.data(), &release); + QGuiApplication::sendEvent(waitControl.data(), &release); + QCOMPARE(waitSpy.count(), 1); + QCOMPARE(spy.count(), 0); + waitSpy.clear(); +} + +void tst_PressAndHold::keepSelection_data() +{ + QTest::addColumn<QByteArray>("data"); + + QTest::newRow("TextField") << QByteArray("import Qt.labs.controls 1.0; TextField { text: 'TextField' }"); + QTest::newRow("TextArea") << QByteArray("import Qt.labs.controls 1.0; TextArea { text: 'TextArea' }"); +} + +void tst_PressAndHold::keepSelection() +{ + QFETCH(QByteArray, data); + + QQmlEngine engine; + QQmlComponent component(&engine); + component.setData(data, QUrl()); + + QScopedPointer<QObject> control(component.create()); + QScopedPointer<QObject> waitControl(component.create()); + QVERIFY(!control.isNull() && !waitControl.isNull()); + + QSignalSpy spy(control.data(), SIGNAL(pressAndHold(QQuickMouseEvent*))); + QSignalSpy waitSpy(waitControl.data(), SIGNAL(pressAndHold(QQuickMouseEvent*))); + QVERIFY(spy.isValid() && waitSpy.isValid()); + + QMouseEvent press(QEvent::MouseButtonPress, QPointF(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + QMouseEvent press2(QEvent::MouseButtonPress, QPointF(), Qt::RightButton, Qt::RightButton, Qt::NoModifier); + QMouseEvent release(QEvent::MouseButtonRelease, QPointF(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + + QVERIFY(!control->property("text").toString().isEmpty()); + QVERIFY(QMetaObject::invokeMethod(control.data(), "selectAll")); + QCOMPARE(control->property("selectedText"), control->property("text")); + + // pressAndHold() emitted => selection remains + QGuiApplication::sendEvent(control.data(), &press); + QTRY_COMPARE(spy.count(), 1); + QGuiApplication::sendEvent(control.data(), &release); + QCOMPARE(spy.count(), 1); + QCOMPARE(control->property("selectedText"), control->property("text")); + spy.clear(); + + // pressAndHold() canceled by release => selection cleared + QGuiApplication::sendEvent(control.data(), &press); + QGuiApplication::processEvents(); + QGuiApplication::sendEvent(control.data(), &release); + QCOMPARE(spy.count(), 0); + QVERIFY(control->property("selectedText").toString().isEmpty()); + + QVERIFY(QMetaObject::invokeMethod(control.data(), "selectAll")); + QCOMPARE(control->property("selectedText"), control->property("text")); + + // pressAndHold() canceled by 2nd press => selection cleared + QGuiApplication::sendEvent(control.data(), &press); + QGuiApplication::sendEvent(control.data(), &press2); // cancels pressAndHold() + QGuiApplication::sendEvent(waitControl.data(), &press); + // by the time the second control emits pressAndHold(), we can reliably + // assume that the first control would have emitted pressAndHold() if it + // wasn't canceled as appropriate by the move event above + QTRY_COMPARE(waitSpy.count(), 1); + QCOMPARE(spy.count(), 0); + QGuiApplication::sendEvent(control.data(), &release); + QGuiApplication::sendEvent(waitControl.data(), &release); + QCOMPARE(waitSpy.count(), 1); + QCOMPARE(spy.count(), 0); + QVERIFY(control->property("selectedText").toString().isEmpty()); + waitSpy.clear(); +} + +QTEST_MAIN(tst_PressAndHold) + +#include "tst_pressandhold.moc" |