diff options
Diffstat (limited to 'tests/auto/quick/qquicktextinput')
-rw-r--r-- | tests/auto/quick/qquicktextinput/BLACKLIST | 4 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/CMakeLists.txt | 22 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/data/checkCursorDelegateWhenPaddingChanged.qml | 16 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/data/cursorTest.qml | 2 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/data/cursorTestExternal.qml | 2 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/data/cursorTestInline.qml | 2 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/data/focusReason.qml | 39 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/data/mouseselection_old_default.qml (renamed from tests/auto/quick/qquicktextinput/data/mouseselection_true.qml) | 1 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/data/mouseselectionmode_default.qml | 3 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/data/twoInAColumn.qml | 14 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp | 877 |
11 files changed, 637 insertions, 345 deletions
diff --git a/tests/auto/quick/qquicktextinput/BLACKLIST b/tests/auto/quick/qquicktextinput/BLACKLIST index 7f3128d7fc..2af586c68a 100644 --- a/tests/auto/quick/qquicktextinput/BLACKLIST +++ b/tests/auto/quick/qquicktextinput/BLACKLIST @@ -9,3 +9,7 @@ macos ci # QTQAINFRA-4127 [passwordCharacter] ci b2qt 32bit + +# QTBUG-103256 +[copyAndPasteKeySequence] +android diff --git a/tests/auto/quick/qquicktextinput/CMakeLists.txt b/tests/auto/quick/qquicktextinput/CMakeLists.txt index 6e8d855a58..70003a63b8 100644 --- a/tests/auto/quick/qquicktextinput/CMakeLists.txt +++ b/tests/auto/quick/qquicktextinput/CMakeLists.txt @@ -1,9 +1,18 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + # Generated from qquicktextinput.pro. ##################################################################### ## tst_qquicktextinput Test: ##################################################################### +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qquicktextinput LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + # Collect test data file(GLOB_RECURSE test_data_glob RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} @@ -12,17 +21,14 @@ list(APPEND test_data ${test_data_glob}) qt_internal_add_test(tst_qquicktextinput SOURCES - ../../shared/testhttpserver.cpp ../../shared/testhttpserver.h - ../../shared/util.cpp ../../shared/util.h tst_qquicktextinput.cpp - INCLUDE_DIRECTORIES - ../../shared - PUBLIC_LIBRARIES + LIBRARIES Qt::CorePrivate Qt::Gui Qt::GuiPrivate Qt::QmlPrivate Qt::QuickPrivate + Qt::QuickTestUtilsPrivate TESTDATA ${test_data} ) @@ -30,16 +36,16 @@ qt_internal_add_test(tst_qquicktextinput ##################################################################### qt_internal_extend_target(tst_qquicktextinput CONDITION MACOS - PUBLIC_LIBRARIES + LIBRARIES ${FWAppKit} ) qt_internal_extend_target(tst_qquicktextinput CONDITION ANDROID OR IOS DEFINES - QT_QMLTEST_DATADIR=\\\":/data\\\" + QT_QMLTEST_DATADIR=":/data" ) qt_internal_extend_target(tst_qquicktextinput CONDITION NOT ANDROID AND NOT IOS DEFINES - QT_QMLTEST_DATADIR=\\\"${CMAKE_CURRENT_SOURCE_DIR}/data\\\" + QT_QMLTEST_DATADIR="${CMAKE_CURRENT_SOURCE_DIR}/data" ) diff --git a/tests/auto/quick/qquicktextinput/data/checkCursorDelegateWhenPaddingChanged.qml b/tests/auto/quick/qquicktextinput/data/checkCursorDelegateWhenPaddingChanged.qml new file mode 100644 index 0000000000..e6f07b4687 --- /dev/null +++ b/tests/auto/quick/qquicktextinput/data/checkCursorDelegateWhenPaddingChanged.qml @@ -0,0 +1,16 @@ +import QtQuick 2.12 + +Rectangle { + width: 200 + height: 200 + TextInput { + objectName: "textInput" + leftPadding: 10 + focus: true + cursorDelegate: Rectangle { + objectName: "cursorDelegate" + width: 5 + color: "red" + } + } +} diff --git a/tests/auto/quick/qquicktextinput/data/cursorTest.qml b/tests/auto/quick/qquicktextinput/data/cursorTest.qml index 363d37174b..44e81f9522 100644 --- a/tests/auto/quick/qquicktextinput/data/cursorTest.qml +++ b/tests/auto/quick/qquicktextinput/data/cursorTest.qml @@ -2,7 +2,7 @@ import QtQuick 2.0 Rectangle { id:rect; width: 300; height: 300; color: "white" property string contextualProperty: "Hello" - TextInput { text: "Hello world!"; id: textInputObject; objectName: "textInputObject" + TextInput { text: "Hello my wonderful world!"; id: textInputObject; objectName: "textInputObject" width: 300; height: 300 resources: [ Component { id:cursor; Item { id:cursorInstance; objectName: "cursorInstance"; property string localProperty: contextualProperty } } ] cursorDelegate: cursor diff --git a/tests/auto/quick/qquicktextinput/data/cursorTestExternal.qml b/tests/auto/quick/qquicktextinput/data/cursorTestExternal.qml index 31ee01db99..1e2c91e9cc 100644 --- a/tests/auto/quick/qquicktextinput/data/cursorTestExternal.qml +++ b/tests/auto/quick/qquicktextinput/data/cursorTestExternal.qml @@ -3,7 +3,7 @@ import QtQuick 2.0 Rectangle { width: 300; height: 300; color: "white" property string contextualProperty: "Hello" TextInput { - text: "Hello world!" + text: "Hello my wonderful world!" id: textInputObject; objectName: "textInputObject" width: 300; height: 300 diff --git a/tests/auto/quick/qquicktextinput/data/cursorTestInline.qml b/tests/auto/quick/qquicktextinput/data/cursorTestInline.qml index b699ed2752..b7ad69962e 100644 --- a/tests/auto/quick/qquicktextinput/data/cursorTestInline.qml +++ b/tests/auto/quick/qquicktextinput/data/cursorTestInline.qml @@ -3,7 +3,7 @@ import QtQuick 2.0 Rectangle { width: 300; height: 300; color: "white" property string contextualProperty: "Hello" TextInput { - text: "Hello world!" + text: "Hello my wonderful world!" id: textInputObject objectName: "textInputObject" width: 300; height: 300 diff --git a/tests/auto/quick/qquicktextinput/data/focusReason.qml b/tests/auto/quick/qquicktextinput/data/focusReason.qml new file mode 100644 index 0000000000..7ac913d363 --- /dev/null +++ b/tests/auto/quick/qquicktextinput/data/focusReason.qml @@ -0,0 +1,39 @@ +import QtQuick 2.2 + +Rectangle { + width: 400 + height: 400 + + Column { + spacing: 5 + TextInput { + id: first + objectName: "first" + width: 100 + Rectangle { anchors.fill: parent; color: parent.activeFocus ? "red" : "blue"; opacity: 0.3 } + KeyNavigation.backtab: third + KeyNavigation.tab: second + KeyNavigation.down: second + } + TextInput { + id: second + objectName: "second" + width: 100 + Rectangle { anchors.fill: parent; color: parent.activeFocus ? "red" : "blue"; opacity: 0.3 } + KeyNavigation.up: first + KeyNavigation.backtab: first + KeyNavigation.tab: third + } + TextInput { + objectName: "third" + id: third + width: 100 + Rectangle { anchors.fill: parent; color: parent.activeFocus ? "red" : "blue"; opacity: 0.3 } + KeyNavigation.backtab: second + KeyNavigation.tab: first + } + Component.onCompleted: { + first.focus = true + } + } +} diff --git a/tests/auto/quick/qquicktextinput/data/mouseselection_true.qml b/tests/auto/quick/qquicktextinput/data/mouseselection_old_default.qml index 974041b04a..42ab4931ea 100644 --- a/tests/auto/quick/qquicktextinput/data/mouseselection_true.qml +++ b/tests/auto/quick/qquicktextinput/data/mouseselection_old_default.qml @@ -3,5 +3,4 @@ import QtQuick 2.0 TextInput { focus: true text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - selectByMouse: true } diff --git a/tests/auto/quick/qquicktextinput/data/mouseselectionmode_default.qml b/tests/auto/quick/qquicktextinput/data/mouseselectionmode_default.qml index 974041b04a..ad19fa8c2a 100644 --- a/tests/auto/quick/qquicktextinput/data/mouseselectionmode_default.qml +++ b/tests/auto/quick/qquicktextinput/data/mouseselectionmode_default.qml @@ -1,7 +1,6 @@ -import QtQuick 2.0 +import QtQuick TextInput { focus: true text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" - selectByMouse: true } diff --git a/tests/auto/quick/qquicktextinput/data/twoInAColumn.qml b/tests/auto/quick/qquicktextinput/data/twoInAColumn.qml new file mode 100644 index 0000000000..dbc70afe4b --- /dev/null +++ b/tests/auto/quick/qquicktextinput/data/twoInAColumn.qml @@ -0,0 +1,14 @@ +import QtQuick +import QtQuick.Layouts + +ColumnLayout { + height: 100 + TextInput { + objectName: "top" + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + } + TextInput { + objectName: "bottom" + text: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" + } +} diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp index d0e5425c0f..8f8442544f 100644 --- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp +++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp @@ -1,42 +1,23 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + #include <qtest.h> #include <QtTest/QSignalSpy> -#include "../../shared/util.h" -#include "../../shared/testhttpserver.h" +#include <QtQuickTestUtils/private/qmlutils_p.h> +#include <QtQuickTestUtils/private/testhttpserver_p.h> +#include <QtQuickTestUtils/private/viewtestutils_p.h> +#include <QtQuickTestUtils/private/visualtestutils_p.h> #include <private/qinputmethod_p.h> #include <QtQml/qqmlengine.h> +#include <QtQml/qqmlcomponent.h> #include <QtQml/qqmlexpression.h> #include <QFile> #include <QtQuick/qquickview.h> #include <QtGui/qguiapplication.h> #include <QtGui/qstylehints.h> #include <QtGui/qvalidator.h> +#include <QtGui/private/qguiapplication_p.h> +#include <QtGui/private/qpointingdevice_p.h> #include <QInputMethod> #include <private/qquicktextinput_p.h> #include <private/qquicktextinput_p_p.h> @@ -46,13 +27,9 @@ #include <math.h> #include <qmath.h> -#ifdef Q_OS_OSX -#include <Carbon/Carbon.h> -#endif - #include "qplatformdefs.h" -#include "../../shared/platformquirks.h" -#include "../../shared/platforminputcontext.h" +#include <QtQuickTestUtils/private/platformquirks_p.h> +#include <QtQuickTestUtils/private/platforminputcontext_p.h> Q_DECLARE_METATYPE(QQuickTextInput::SelectionMode) Q_DECLARE_METATYPE(QQuickTextInput::EchoMode) @@ -60,22 +37,6 @@ Q_DECLARE_METATYPE(Qt::Key) DEFINE_BOOL_CONFIG_OPTION(qmlDisableDistanceField, QML_DISABLE_DISTANCEFIELD) -QString createExpectedFileIfNotFound(const QString& filebasename, const QImage& actual) -{ - // XXX This will be replaced by some clever persistent platform image store. - QString persistent_dir = QQmlDataTest::instance()->dataDirectory(); - QString arch = "unknown-architecture"; // QTest needs to help with this. - - QString expectfile = persistent_dir + QDir::separator() + filebasename + QLatin1Char('-') + arch + ".png"; - - if (!QFile::exists(expectfile)) { - actual.save(expectfile); - qWarning() << "created" << expectfile; - } - - return expectfile; -} - template <typename T> static T evaluate(QObject *scope, const QString &expression) { QQmlExpression expr(qmlContext(scope), scope, expression); @@ -135,6 +96,8 @@ private slots: void validators(); void inputMethods(); + void inputMethodQueryEnterKeyType(); + void signal_accepted(); void signal_editingfinished(); void signal_textEdited(); @@ -238,6 +201,14 @@ private slots: void QTBUG_51115_readOnlyResetsSelection(); void QTBUG_77814_InsertRemoveNoSelection(); + void checkCursorDelegateWhenPaddingChanged(); + + void focusReason(); + + void touchscreenDoesNotSelect_data(); + void touchscreenDoesNotSelect(); + void touchscreenSetsFocusAndMovesCursor(); + private: void simulateKeys(QWindow *window, const QList<Key> &keys); #if QT_CONFIG(shortcut) @@ -247,6 +218,7 @@ private: QQmlEngine engine; QStringList standard; QStringList colorStrings; + QScopedPointer<QPointingDevice> touchscreen = QScopedPointer<QPointingDevice>(QTest::createTouchDevice()); }; typedef QList<int> IntList; @@ -257,7 +229,7 @@ Q_DECLARE_METATYPE(KeyList) void tst_qquicktextinput::simulateKeys(QWindow *window, const QList<Key> &keys) { - for (int i = 0; i < keys.count(); ++i) { + for (int i = 0; i < keys.size(); ++i) { const Qt::KeyboardModifiers modifiers = keys.at(i).keyCombination.keyboardModifiers(); const QChar character = keys.at(i).character; if (!character.isNull()) @@ -299,6 +271,7 @@ void tst_qquicktextinput::cleanup() } tst_qquicktextinput::tst_qquicktextinput() + : QQmlDataTest(QT_QMLTEST_DATADIR) { standard << "the quick brown fox jumped over the lazy dog" << "It's supercalifragisiticexpialidocious!" @@ -343,7 +316,7 @@ void tst_qquicktextinput::text() QVERIFY(textinputObject != nullptr); QCOMPARE(textinputObject->text(), standard.at(i)); - QCOMPARE(textinputObject->length(), standard.at(i).length()); + QCOMPARE(textinputObject->length(), standard.at(i).size()); delete textinputObject; } @@ -495,36 +468,36 @@ void tst_qquicktextinput::color() textInputObject->setColor(QColor("white")); QCOMPARE(textInputObject->color(), QColor("white")); - QCOMPARE(colorSpy.count(), 1); + QCOMPARE(colorSpy.size(), 1); textInputObject->setSelectionColor(QColor("black")); QCOMPARE(textInputObject->selectionColor(), QColor("black")); - QCOMPARE(selectionColorSpy.count(), 1); + QCOMPARE(selectionColorSpy.size(), 1); textInputObject->setSelectedTextColor(QColor("blue")); QCOMPARE(textInputObject->selectedTextColor(), QColor("blue")); - QCOMPARE(selectedTextColorSpy.count(), 1); + QCOMPARE(selectedTextColorSpy.size(), 1); textInputObject->setColor(QColor("white")); - QCOMPARE(colorSpy.count(), 1); + QCOMPARE(colorSpy.size(), 1); textInputObject->setSelectionColor(QColor("black")); - QCOMPARE(selectionColorSpy.count(), 1); + QCOMPARE(selectionColorSpy.size(), 1); textInputObject->setSelectedTextColor(QColor("blue")); - QCOMPARE(selectedTextColorSpy.count(), 1); + QCOMPARE(selectedTextColorSpy.size(), 1); textInputObject->setColor(QColor("black")); QCOMPARE(textInputObject->color(), QColor("black")); - QCOMPARE(colorSpy.count(), 2); + QCOMPARE(colorSpy.size(), 2); textInputObject->setSelectionColor(QColor("blue")); QCOMPARE(textInputObject->selectionColor(), QColor("blue")); - QCOMPARE(selectionColorSpy.count(), 2); + QCOMPARE(selectionColorSpy.size(), 2); textInputObject->setSelectedTextColor(QColor("white")); QCOMPARE(textInputObject->selectedTextColor(), QColor("white")); - QCOMPARE(selectedTextColorSpy.count(), 2); + QCOMPARE(selectedTextColorSpy.size(), 2); } //test color @@ -600,7 +573,7 @@ void tst_qquicktextinput::wrap() delete textObject; } - for (int i = 0; i < standard.count(); i++) { + for (int i = 0; i < standard.size(); i++) { QString componentStr = "import QtQuick 2.0\nTextInput { wrapMode: Text.WrapAnywhere; width: 30; text: \"" + standard.at(i) + "\" }"; QQmlComponent textComponent(&engine); textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile("")); @@ -630,14 +603,14 @@ void tst_qquicktextinput::wrap() input->setWrapMode(QQuickTextInput::Wrap); QCOMPARE(input->wrapMode(), QQuickTextInput::Wrap); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); input->setWrapMode(QQuickTextInput::Wrap); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); input->setWrapMode(QQuickTextInput::NoWrap); QCOMPARE(input->wrapMode(), QQuickTextInput::NoWrap); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); } } @@ -673,7 +646,7 @@ void tst_qquicktextinput::selection() QCOMPARE(textinputObject->selectionEnd(), 0); QVERIFY(textinputObject->selectedText().isNull()); - textinputObject->setCursorPosition(textinputObject->text().count()+1); + textinputObject->setCursorPosition(textinputObject->text().size() + 1); QCOMPARE(textinputObject->cursorPosition(), 0); QCOMPARE(textinputObject->selectionStart(), 0); QCOMPARE(textinputObject->selectionEnd(), 0); @@ -733,7 +706,7 @@ void tst_qquicktextinput::selection() QInputMethodEvent event("", attributes); QGuiApplication::sendEvent(textinputObject, &event); } - QCOMPARE(selectionSpy.count(), 1); + QCOMPARE(selectionSpy.size(), 1); QCOMPARE(textinputObject->selectionStart(), 12); QCOMPARE(textinputObject->selectionEnd(), 17); @@ -757,7 +730,7 @@ void tst_qquicktextinput::persistentSelection() input->setPersistentSelection(false); QCOMPARE(input->persistentSelection(), false); - QCOMPARE(spy.count(), 0); + QCOMPARE(spy.size(), 0); input->select(1, 4); QCOMPARE(input->property("selected").toString(), QLatin1String("ell")); @@ -770,7 +743,7 @@ void tst_qquicktextinput::persistentSelection() input->setPersistentSelection(true); QCOMPARE(input->persistentSelection(), true); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); input->select(1, 4); QCOMPARE(input->property("selected").toString(), QLatin1String("ell")); @@ -801,25 +774,25 @@ void tst_qquicktextinput::overwriteMode() QVERIFY(textInput->hasActiveFocus()); textInput->setOverwriteMode(true); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); QCOMPARE(true, textInput->overwriteMode()); textInput->setOverwriteMode(false); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); QCOMPARE(false, textInput->overwriteMode()); QVERIFY(!textInput->overwriteMode()); QString insertString = "Some first text"; - for (int j = 0; j < insertString.length(); j++) + for (int j = 0; j < insertString.size(); j++) QTest::keyClick(&window, insertString.at(j).toLatin1()); QCOMPARE(textInput->text(), QString("Some first text")); textInput->setOverwriteMode(true); - QCOMPARE(spy.count(), 3); + QCOMPARE(spy.size(), 3); textInput->setCursorPosition(5); insertString = "shiny"; - for (int j = 0; j < insertString.length(); j++) + for (int j = 0; j < insertString.size(); j++) QTest::keyClick(&window, insertString.at(j).toLatin1()); QCOMPARE(textInput->text(), QString("Some shiny text")); } @@ -861,24 +834,24 @@ void tst_qquicktextinput::isRightToLeft() // first test that the right string is delivered to the QString::isRightToLeft() QCOMPARE(textInput.isRightToLeft(0,0), text.mid(0,0).isRightToLeft()); QCOMPARE(textInput.isRightToLeft(0,1), text.mid(0,1).isRightToLeft()); - QCOMPARE(textInput.isRightToLeft(text.count()-2, text.count()-1), text.mid(text.count()-2, text.count()-1).isRightToLeft()); - QCOMPARE(textInput.isRightToLeft(text.count()/2, text.count()/2 + 1), text.mid(text.count()/2, text.count()/2 + 1).isRightToLeft()); - QCOMPARE(textInput.isRightToLeft(0,text.count()/4), text.mid(0,text.count()/4).isRightToLeft()); - QCOMPARE(textInput.isRightToLeft(text.count()/4,3*text.count()/4), text.mid(text.count()/4,3*text.count()/4).isRightToLeft()); + QCOMPARE(textInput.isRightToLeft(text.size()-2, text.size()-1), text.mid(text.size()-2, text.size()-1).isRightToLeft()); + QCOMPARE(textInput.isRightToLeft(text.size()/2, text.size()/2 + 1), text.mid(text.size()/2, text.size()/2 + 1).isRightToLeft()); + QCOMPARE(textInput.isRightToLeft(0,text.size()/4), text.mid(0,text.size()/4).isRightToLeft()); + QCOMPARE(textInput.isRightToLeft(text.size()/4,3*text.size()/4), text.mid(text.size()/4,3*text.size()/4).isRightToLeft()); if (text.isEmpty()) QTest::ignoreMessage(QtWarningMsg, "<Unknown File>: QML TextInput: isRightToLeft(start, end) called with the end property being smaller than the start."); - QCOMPARE(textInput.isRightToLeft(3*text.count()/4,text.count()-1), text.mid(3*text.count()/4,text.count()-1).isRightToLeft()); + QCOMPARE(textInput.isRightToLeft(3*text.size()/4,text.size()-1), text.mid(3*text.size()/4,text.size()-1).isRightToLeft()); // then test that the feature actually works QCOMPARE(textInput.isRightToLeft(0,0), emptyString); QCOMPARE(textInput.isRightToLeft(0,1), firstCharacter); - QCOMPARE(textInput.isRightToLeft(text.count()-2, text.count()-1), lastCharacter); - QCOMPARE(textInput.isRightToLeft(text.count()/2, text.count()/2 + 1), middleCharacter); - QCOMPARE(textInput.isRightToLeft(0,text.count()/4), startString); - QCOMPARE(textInput.isRightToLeft(text.count()/4,3*text.count()/4), midString); + QCOMPARE(textInput.isRightToLeft(text.size()-2, text.size()-1), lastCharacter); + QCOMPARE(textInput.isRightToLeft(text.size()/2, text.size()/2 + 1), middleCharacter); + QCOMPARE(textInput.isRightToLeft(0,text.size()/4), startString); + QCOMPARE(textInput.isRightToLeft(text.size()/4,3*text.size()/4), midString); if (text.isEmpty()) QTest::ignoreMessage(QtWarningMsg, "<Unknown File>: QML TextInput: isRightToLeft(start, end) called with the end property being smaller than the start."); - QCOMPARE(textInput.isRightToLeft(3*text.count()/4,text.count()-1), endString); + QCOMPARE(textInput.isRightToLeft(3*text.size()/4,text.size()-1), endString); } void tst_qquicktextinput::moveCursorSelection_data() @@ -1293,7 +1266,7 @@ void tst_qquicktextinput::moveCursorSelectionSequence() void tst_qquicktextinput::dragMouseSelection() { - QString qmlfile = testFile("mouseselection_true.qml"); + QString qmlfile = testFile("mouseselectionmode_default.qml"); QQuickView window(QUrl::fromLocalFile(qmlfile)); @@ -1304,6 +1277,7 @@ void tst_qquicktextinput::dragMouseSelection() QVERIFY(window.rootObject() != nullptr); QQuickTextInput *textInputObject = qobject_cast<QQuickTextInput *>(window.rootObject()); QVERIFY(textInputObject != nullptr); + textInputObject->setSelectByMouse(true); // press-and-drag-and-release from x1 to x2 int x1 = 10; @@ -1313,8 +1287,8 @@ void tst_qquicktextinput::dragMouseSelection() QTest::mouseMove(&window, QPoint(x2, y)); QTest::mouseRelease(&window, Qt::LeftButton, Qt::NoModifier, QPoint(x2,y)); QString str1; - QTRY_VERIFY((str1 = textInputObject->selectedText()).length() > 3); - QTRY_VERIFY(str1.length() > 3); + QTRY_VERIFY((str1 = textInputObject->selectedText()).size() > 3); + QTRY_VERIFY(str1.size() > 3); // press and drag the current selection. x1 = 40; @@ -1323,7 +1297,7 @@ void tst_qquicktextinput::dragMouseSelection() QTest::mouseMove(&window, QPoint(x2, y)); QTest::mouseRelease(&window, Qt::LeftButton, Qt::NoModifier, QPoint(x2,y)); QString str2 = textInputObject->selectedText(); - QTRY_VERIFY(str2.length() > 3); + QTRY_VERIFY(str2.size() > 3); QTRY_VERIFY(str1 != str2); } @@ -1379,7 +1353,7 @@ void tst_qquicktextinput::mouseSelectionMode() if (selectWords) { QTRY_COMPARE(textInputObject->selectedText(), text); } else { - QTRY_VERIFY(textInputObject->selectedText().length() > 3); + QTRY_VERIFY(textInputObject->selectedText().size() > 3); QVERIFY(textInputObject->selectedText() != text); } } @@ -1398,14 +1372,14 @@ void tst_qquicktextinput::mouseSelectionMode_accessors() input->setMouseSelectionMode(QQuickTextInput::SelectWords); QCOMPARE(input->mouseSelectionMode(), QQuickTextInput::SelectWords); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); input->setMouseSelectionMode(QQuickTextInput::SelectWords); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); input->setMouseSelectionMode(QQuickTextInput::SelectCharacters); QCOMPARE(input->mouseSelectionMode(), QQuickTextInput::SelectCharacters); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); } void tst_qquicktextinput::selectByMouse() @@ -1422,15 +1396,15 @@ void tst_qquicktextinput::selectByMouse() input->setSelectByMouse(true); QCOMPARE(input->selectByMouse(), true); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); QCOMPARE(spy.at(0).at(0).toBool(), true); input->setSelectByMouse(true); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); input->setSelectByMouse(false); QCOMPARE(input->selectByMouse(), false); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); QCOMPARE(spy.at(1).at(0).toBool(), false); } @@ -1448,14 +1422,14 @@ void tst_qquicktextinput::renderType() input->setRenderType(QQuickTextInput::NativeRendering); QCOMPARE(input->renderType(), QQuickTextInput::NativeRendering); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); input->setRenderType(QQuickTextInput::NativeRendering); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); input->setRenderType(QQuickTextInput::QtRendering); QCOMPARE(input->renderType(), QQuickTextInput::QtRendering); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); } void tst_qquicktextinput::horizontalAlignment_RightToLeft() @@ -1565,7 +1539,7 @@ void tst_qquicktextinput::horizontalAlignment_RightToLeft() QSignalSpy cursorRectangleSpy(textInput, SIGNAL(cursorRectangleChanged())); platformInputContext.setInputDirection(Qt::RightToLeft); QCOMPARE(qApp->inputMethod()->inputDirection(), Qt::RightToLeft); - QCOMPARE(cursorRectangleSpy.count(), 1); + QCOMPARE(cursorRectangleSpy.size(), 1); QCOMPARE(textInput->hAlign(), QQuickTextInput::AlignRight); QVERIFY(textInput->boundingRect().right() >= textInput->width() - 1); QVERIFY(textInput->boundingRect().right() <= textInput->width() + 1); @@ -1899,16 +1873,16 @@ void tst_qquicktextinput::maxLength() QVERIFY(textinputObject != nullptr); QVERIFY(textinputObject->text().isEmpty()); QCOMPARE(textinputObject->maxLength(), 10); - foreach (const QString &str, standard) { - QVERIFY(textinputObject->text().length() <= 10); + for (const QString &str : std::as_const(standard)) { + QVERIFY(textinputObject->text().size() <= 10); textinputObject->setText(str); - QVERIFY(textinputObject->text().length() <= 10); + QVERIFY(textinputObject->text().size() <= 10); } textinputObject->setText(""); QTRY_VERIFY(textinputObject->hasActiveFocus()); for (int i=0; i<20; i++) { - QTRY_COMPARE(textinputObject->text().length(), qMin(i,10)); + QTRY_COMPARE(textinputObject->text().size(), qMin(i,10)); QTest::keyClick(&window, Qt::Key_A); } } @@ -1924,11 +1898,11 @@ void tst_qquicktextinput::masks() QQuickTextInput *textinputObject = qobject_cast<QQuickTextInput *>(window.rootObject()); QVERIFY(textinputObject != nullptr); QTRY_VERIFY(textinputObject->hasActiveFocus()); - QCOMPARE(textinputObject->text().length(), 0); + QCOMPARE(textinputObject->text().size(), 0); QCOMPARE(textinputObject->inputMask(), QString("HHHHhhhh; ")); QCOMPARE(textinputObject->length(), 8); for (int i=0; i<10; i++) { - QTRY_COMPARE(qMin(i,8), textinputObject->text().length()); + QTRY_COMPARE(qMin(i,8), textinputObject->text().size()); QCOMPARE(textinputObject->length(), 8); QCOMPARE(textinputObject->getText(0, qMin(i, 8)), QString(qMin(i, 8), 'a')); QCOMPARE(textinputObject->getText(qMin(i, 8), 8), QString(8 - qMin(i, 8), ' ')); @@ -1980,10 +1954,10 @@ void tst_qquicktextinput::validators() QTRY_COMPARE(intInput->text(), QLatin1String("1")); QCOMPARE(intInput->hasAcceptableInput(), false); QCOMPARE(intInput->property("acceptable").toBool(), false); - QCOMPARE(intSpy.count(), 0); + QCOMPARE(intSpy.size(), 0); QCOMPARE(intInput->hasAcceptableInput(), false); QCOMPARE(intInput->property("acceptable").toBool(), false); - QCOMPARE(intSpy.count(), 0); + QCOMPARE(intSpy.size(), 0); QTest::keyPress(&window, Qt::Key_Period); QTest::keyRelease(&window, Qt::Key_Period, Qt::NoModifier); QTRY_COMPARE(intInput->text(), QLatin1String("1")); @@ -2011,13 +1985,13 @@ void tst_qquicktextinput::validators() QCOMPARE(intInput->text(), QLatin1String("11")); QCOMPARE(intInput->hasAcceptableInput(), true); QCOMPARE(intInput->property("acceptable").toBool(), true); - QCOMPARE(intSpy.count(), 1); + QCOMPARE(intSpy.size(), 1); QTest::keyPress(&window, Qt::Key_0); QTest::keyRelease(&window, Qt::Key_0, Qt::NoModifier); QCOMPARE(intInput->text(), QLatin1String("11")); QCOMPARE(intInput->hasAcceptableInput(), true); QCOMPARE(intInput->property("acceptable").toBool(), true); - QCOMPARE(intSpy.count(), 1); + QCOMPARE(intSpy.size(), 1); QQuickTextInput *dblInput = qobject_cast<QQuickTextInput *>(qvariant_cast<QObject *>(window.rootObject()->property("dblInput"))); QVERIFY(dblInput); @@ -2043,13 +2017,13 @@ void tst_qquicktextinput::validators() QTRY_COMPARE(dblInput->text(), QLatin1String("1")); QCOMPARE(dblInput->hasAcceptableInput(), false); QCOMPARE(dblInput->property("acceptable").toBool(), false); - QCOMPARE(dblSpy.count(), 0); + QCOMPARE(dblSpy.size(), 0); QTest::keyPress(&window, Qt::Key_2); QTest::keyRelease(&window, Qt::Key_2, Qt::NoModifier); QTRY_COMPARE(dblInput->text(), QLatin1String("12")); QCOMPARE(dblInput->hasAcceptableInput(), true); QCOMPARE(dblInput->property("acceptable").toBool(), true); - QCOMPARE(dblSpy.count(), 1); + QCOMPARE(dblSpy.size(), 1); QTest::keyPress(&window, Qt::Key_Comma); QTest::keyRelease(&window, Qt::Key_Comma, Qt::NoModifier); QTRY_COMPARE(dblInput->text(), QLatin1String("12,")); @@ -2090,84 +2064,84 @@ void tst_qquicktextinput::validators() QTRY_COMPARE(dblInput->text(), QLatin1String("12.")); QCOMPARE(dblInput->hasAcceptableInput(), true); QCOMPARE(dblInput->property("acceptable").toBool(), true); - QCOMPARE(dblSpy.count(), 1 + extraSignals); + QCOMPARE(dblSpy.size(), 1 + extraSignals); QTest::keyPress(&window, Qt::Key_1); QTest::keyRelease(&window, Qt::Key_1, Qt::NoModifier); QTRY_COMPARE(dblInput->text(), QLatin1String("12.1")); QCOMPARE(dblInput->hasAcceptableInput(), true); QCOMPARE(dblInput->property("acceptable").toBool(), true); - QCOMPARE(dblSpy.count(), 1 + extraSignals); + QCOMPARE(dblSpy.size(), 1 + extraSignals); QTest::keyPress(&window, Qt::Key_1); QTest::keyRelease(&window, Qt::Key_1, Qt::NoModifier); QTRY_COMPARE(dblInput->text(), QLatin1String("12.11")); QCOMPARE(dblInput->hasAcceptableInput(), true); QCOMPARE(dblInput->property("acceptable").toBool(), true); - QCOMPARE(dblSpy.count(), 1 + extraSignals); + QCOMPARE(dblSpy.size(), 1 + extraSignals); QTest::keyPress(&window, Qt::Key_1); QTest::keyRelease(&window, Qt::Key_1, Qt::NoModifier); QTRY_COMPARE(dblInput->text(), QLatin1String("12.11")); QCOMPARE(dblInput->hasAcceptableInput(), true); QCOMPARE(dblInput->property("acceptable").toBool(), true); - QCOMPARE(dblSpy.count(), 1 + extraSignals); + QCOMPARE(dblSpy.size(), 1 + extraSignals); // Ensure the validator doesn't prevent characters being removed. dblInput->setValidator(intInput->validator()); QCOMPARE(dblInput->text(), QLatin1String("12.11")); QCOMPARE(dblInput->hasAcceptableInput(), false); QCOMPARE(dblInput->property("acceptable").toBool(), false); - QCOMPARE(dblSpy.count(), 2 + extraSignals); + QCOMPARE(dblSpy.size(), 2 + extraSignals); QTest::keyPress(&window, Qt::Key_Backspace); QTest::keyRelease(&window, Qt::Key_Backspace, Qt::NoModifier); QTRY_COMPARE(dblInput->text(), QLatin1String("12.1")); QCOMPARE(dblInput->hasAcceptableInput(), false); QCOMPARE(dblInput->property("acceptable").toBool(), false); - QCOMPARE(dblSpy.count(), 2 + extraSignals); + QCOMPARE(dblSpy.size(), 2 + extraSignals); // Once unacceptable input is in anything goes until it reaches an acceptable state again. QTest::keyPress(&window, Qt::Key_1); QTest::keyRelease(&window, Qt::Key_1, Qt::NoModifier); QTRY_COMPARE(dblInput->text(), QLatin1String("12.11")); QCOMPARE(dblInput->hasAcceptableInput(), false); - QCOMPARE(dblSpy.count(), 2 + extraSignals); + QCOMPARE(dblSpy.size(), 2 + extraSignals); QTest::keyPress(&window, Qt::Key_Backspace); QTest::keyRelease(&window, Qt::Key_Backspace, Qt::NoModifier); QTRY_COMPARE(dblInput->text(), QLatin1String("12.1")); QCOMPARE(dblInput->hasAcceptableInput(), false); QCOMPARE(dblInput->property("acceptable").toBool(), false); - QCOMPARE(dblSpy.count(), 2 + extraSignals); + QCOMPARE(dblSpy.size(), 2 + extraSignals); QTest::keyPress(&window, Qt::Key_Backspace); QTest::keyRelease(&window, Qt::Key_Backspace, Qt::NoModifier); QTRY_COMPARE(dblInput->text(), QLatin1String("12.")); QCOMPARE(dblInput->hasAcceptableInput(), false); QCOMPARE(dblInput->property("acceptable").toBool(), false); - QCOMPARE(dblSpy.count(), 2 + extraSignals); + QCOMPARE(dblSpy.size(), 2 + extraSignals); QTest::keyPress(&window, Qt::Key_Backspace); QTest::keyRelease(&window, Qt::Key_Backspace, Qt::NoModifier); QTRY_COMPARE(dblInput->text(), QLatin1String("12")); QCOMPARE(dblInput->hasAcceptableInput(), false); QCOMPARE(dblInput->property("acceptable").toBool(), false); - QCOMPARE(dblSpy.count(), 2 + extraSignals); + QCOMPARE(dblSpy.size(), 2 + extraSignals); QTest::keyPress(&window, Qt::Key_Backspace); QTest::keyRelease(&window, Qt::Key_Backspace, Qt::NoModifier); QTRY_COMPARE(dblInput->text(), QLatin1String("1")); QCOMPARE(dblInput->hasAcceptableInput(), false); QCOMPARE(dblInput->property("acceptable").toBool(), false); - QCOMPARE(dblSpy.count(), 2 + extraSignals); + QCOMPARE(dblSpy.size(), 2 + extraSignals); QTest::keyPress(&window, Qt::Key_1); QTest::keyRelease(&window, Qt::Key_1, Qt::NoModifier); QCOMPARE(dblInput->text(), QLatin1String("11")); QCOMPARE(dblInput->property("acceptable").toBool(), true); QCOMPARE(dblInput->hasAcceptableInput(), true); - QCOMPARE(dblSpy.count(), 3 + extraSignals); + QCOMPARE(dblSpy.size(), 3 + extraSignals); // Changing the validator properties will re-evaluate whether the input is acceptable. intValidator->setTop(10); QCOMPARE(dblInput->property("acceptable").toBool(), false); QCOMPARE(dblInput->hasAcceptableInput(), false); - QCOMPARE(dblSpy.count(), 4 + extraSignals); + QCOMPARE(dblSpy.size(), 4 + extraSignals); intValidator->setTop(12); QCOMPARE(dblInput->property("acceptable").toBool(), true); QCOMPARE(dblInput->hasAcceptableInput(), true); - QCOMPARE(dblSpy.count(), 5 + extraSignals); + QCOMPARE(dblSpy.size(), 5 + extraSignals); QQuickTextInput *strInput = qobject_cast<QQuickTextInput *>(qvariant_cast<QObject *>(window.rootObject()->property("strInput"))); QVERIFY(strInput); @@ -2181,37 +2155,37 @@ void tst_qquicktextinput::validators() QTRY_COMPARE(strInput->text(), QLatin1String("")); QCOMPARE(strInput->hasAcceptableInput(), false); QCOMPARE(strInput->property("acceptable").toBool(), false); - QCOMPARE(strSpy.count(), 0); + QCOMPARE(strSpy.size(), 0); QTest::keyPress(&window, Qt::Key_A); QTest::keyRelease(&window, Qt::Key_A, Qt::NoModifier); QTRY_COMPARE(strInput->text(), QLatin1String("a")); QCOMPARE(strInput->hasAcceptableInput(), false); QCOMPARE(strInput->property("acceptable").toBool(), false); - QCOMPARE(strSpy.count(), 0); + QCOMPARE(strSpy.size(), 0); QTest::keyPress(&window, Qt::Key_A); QTest::keyRelease(&window, Qt::Key_A, Qt::NoModifier); QTRY_COMPARE(strInput->text(), QLatin1String("aa")); QCOMPARE(strInput->hasAcceptableInput(), true); QCOMPARE(strInput->property("acceptable").toBool(), true); - QCOMPARE(strSpy.count(), 1); + QCOMPARE(strSpy.size(), 1); QTest::keyPress(&window, Qt::Key_A); QTest::keyRelease(&window, Qt::Key_A, Qt::NoModifier); QTRY_COMPARE(strInput->text(), QLatin1String("aaa")); QCOMPARE(strInput->hasAcceptableInput(), true); QCOMPARE(strInput->property("acceptable").toBool(), true); - QCOMPARE(strSpy.count(), 1); + QCOMPARE(strSpy.size(), 1); QTest::keyPress(&window, Qt::Key_A); QTest::keyRelease(&window, Qt::Key_A, Qt::NoModifier); QTRY_COMPARE(strInput->text(), QLatin1String("aaaa")); QCOMPARE(strInput->hasAcceptableInput(), true); QCOMPARE(strInput->property("acceptable").toBool(), true); - QCOMPARE(strSpy.count(), 1); + QCOMPARE(strSpy.size(), 1); QTest::keyPress(&window, Qt::Key_A); QTest::keyRelease(&window, Qt::Key_A, Qt::NoModifier); QTRY_COMPARE(strInput->text(), QLatin1String("aaaa")); QCOMPARE(strInput->hasAcceptableInput(), true); QCOMPARE(strInput->property("acceptable").toBool(), true); - QCOMPARE(strSpy.count(), 1); + QCOMPARE(strSpy.size(), 1); QQuickTextInput *unvalidatedInput = qobject_cast<QQuickTextInput *>(qvariant_cast<QObject *>(window.rootObject()->property("unvalidatedInput"))); QVERIFY(unvalidatedInput); @@ -2225,13 +2199,13 @@ void tst_qquicktextinput::validators() QTRY_COMPARE(unvalidatedInput->text(), QLatin1String("1")); QCOMPARE(unvalidatedInput->hasAcceptableInput(), true); QCOMPARE(unvalidatedInput->property("acceptable").toBool(), true); - QCOMPARE(unvalidatedSpy.count(), 0); + QCOMPARE(unvalidatedSpy.size(), 0); QTest::keyPress(&window, Qt::Key_A); QTest::keyRelease(&window, Qt::Key_A, Qt::NoModifier); QTRY_COMPARE(unvalidatedInput->text(), QLatin1String("1a")); QCOMPARE(unvalidatedInput->hasAcceptableInput(), true); QCOMPARE(unvalidatedInput->property("acceptable").toBool(), true); - QCOMPARE(unvalidatedSpy.count(), 0); + QCOMPARE(unvalidatedSpy.size(), 0); } void tst_qquicktextinput::inputMethods() @@ -2249,9 +2223,9 @@ void tst_qquicktextinput::inputMethods() QSignalSpy inputMethodHintSpy(input, SIGNAL(inputMethodHintsChanged())); input->setInputMethodHints(Qt::ImhUppercaseOnly); QVERIFY(input->inputMethodHints() & Qt::ImhUppercaseOnly); - QCOMPARE(inputMethodHintSpy.count(), 1); + QCOMPARE(inputMethodHintSpy.size(), 1); input->setInputMethodHints(Qt::ImhUppercaseOnly); - QCOMPARE(inputMethodHintSpy.count(), 1); + QCOMPARE(inputMethodHintSpy.size(), 1); // default value QQuickTextInput plainInput; @@ -2310,8 +2284,8 @@ void tst_qquicktextinput::inputMethods() // input should reset selection even if replacement parameters are out of bounds input->setText("text"); input->setCursorPosition(0); - input->moveCursorSelection(input->text().length()); - event.setCommitString("replacement", -input->text().length(), input->text().length()); + input->moveCursorSelection(input->text().size()); + event.setCommitString("replacement", -input->text().size(), input->text().size()); QGuiApplication::sendEvent(input, &event); QCOMPARE(input->selectionStart(), input->selectionEnd()); QCOMPARE(input->text(), QString("replacement")); @@ -2326,6 +2300,36 @@ void tst_qquicktextinput::inputMethods() QCOMPARE(enabledQueryEvent.value(Qt::ImEnabled).toBool(), false); } +void tst_qquicktextinput::inputMethodQueryEnterKeyType() +{ + QQuickView view(testFileUrl("focusReason.qml")); + + QQuickTextInput *first = view.rootObject()->findChild<QQuickTextInput *>("first"); + QQuickTextInput *second = view.rootObject()->findChild<QQuickTextInput *>("second"); + QQuickTextInput *third = view.rootObject()->findChild<QQuickTextInput *>("third"); + QVERIFY(first && second && third); + + first->setActiveFocusOnTab(true); + second->setActiveFocusOnTab(true); + third->setActiveFocusOnTab(true); + + view.show(); + + QVariant enterTypeFirst = first->inputMethodQuery(Qt::ImEnterKeyType); + QVariant enterTypeSecond = second->inputMethodQuery(Qt::ImEnterKeyType); + QVariant enterTypeThird = third->inputMethodQuery(Qt::ImEnterKeyType); +#ifdef Q_OS_ANDROID + // QTBUG-61652 + // EnterKey is changed to EnterKeyNext if the focus can be moved to item below + QCOMPARE(enterTypeFirst.value<Qt::EnterKeyType>(), Qt::EnterKeyNext); + QCOMPARE(enterTypeSecond.value<Qt::EnterKeyType>(), Qt::EnterKeyNext); +#else + QCOMPARE(enterTypeFirst.value<Qt::EnterKeyType>(), Qt::EnterKeyDefault); + QCOMPARE(enterTypeSecond.value<Qt::EnterKeyType>(), Qt::EnterKeyDefault); +#endif + QCOMPARE(enterTypeThird.value<Qt::EnterKeyType>(), Qt::EnterKeyDefault); +} + void tst_qquicktextinput::signal_accepted() { QQuickView window(testFileUrl("signal_accepted.qml")); @@ -2350,22 +2354,22 @@ void tst_qquicktextinput::signal_accepted() QTRY_COMPARE(input->text(), QLatin1String("a")); QCOMPARE(input->hasAcceptableInput(), false); QCOMPARE(input->property("acceptable").toBool(), false); - QTRY_COMPARE(inputSpy.count(), 0); + QTRY_COMPARE(inputSpy.size(), 0); QTest::keyPress(&window, Qt::Key_Enter); QTest::keyRelease(&window, Qt::Key_Enter, Qt::NoModifier); - QTRY_COMPARE(acceptedSpy.count(), 0); + QTRY_COMPARE(acceptedSpy.size(), 0); QTest::keyPress(&window, Qt::Key_A); QTest::keyRelease(&window, Qt::Key_A, Qt::NoModifier); QTRY_COMPARE(input->text(), QLatin1String("aa")); QCOMPARE(input->hasAcceptableInput(), true); QCOMPARE(input->property("acceptable").toBool(), true); - QTRY_COMPARE(inputSpy.count(), 1); + QTRY_COMPARE(inputSpy.size(), 1); QTest::keyPress(&window, Qt::Key_Enter); QTest::keyRelease(&window, Qt::Key_Enter, Qt::NoModifier); - QTRY_COMPARE(acceptedSpy.count(), 1); + QTRY_COMPARE(acceptedSpy.size(), 1); } void tst_qquicktextinput::signal_editingfinished() @@ -2393,23 +2397,23 @@ void tst_qquicktextinput::signal_editingfinished() QTRY_COMPARE(input1->text(), QLatin1String("a")); QCOMPARE(input1->hasAcceptableInput(), false); QCOMPARE(input1->property("acceptable").toBool(), false); - QTRY_COMPARE(input1Spy.count(), 0); + QTRY_COMPARE(input1Spy.size(), 0); QTest::keyPress(&window, Qt::Key_Enter); QTest::keyRelease(&window, Qt::Key_Enter, Qt::NoModifier); - QTRY_COMPARE(editingFinished1Spy.count(), 0); + QTRY_COMPARE(editingFinished1Spy.size(), 0); QTest::keyPress(&window, Qt::Key_A); QTest::keyRelease(&window, Qt::Key_A, Qt::NoModifier); QTRY_COMPARE(input1->text(), QLatin1String("aa")); QCOMPARE(input1->hasAcceptableInput(), true); QCOMPARE(input1->property("acceptable").toBool(), true); - QTRY_COMPARE(input1Spy.count(), 1); + QTRY_COMPARE(input1Spy.size(), 1); QTest::keyPress(&window, Qt::Key_Enter); QTest::keyRelease(&window, Qt::Key_Enter, Qt::NoModifier); - QTRY_COMPARE(editingFinished1Spy.count(), 1); - QTRY_COMPARE(input1Spy.count(), 1); + QTRY_COMPARE(editingFinished1Spy.size(), 1); + QTRY_COMPARE(input1Spy.size(), 1); QSignalSpy editingFinished2Spy(input2, SIGNAL(editingFinished())); QSignalSpy input2Spy(input2, SIGNAL(acceptableInputChanged())); @@ -2423,19 +2427,19 @@ void tst_qquicktextinput::signal_editingfinished() QTRY_COMPARE(input2->text(), QLatin1String("a")); QCOMPARE(input2->hasAcceptableInput(), false); QCOMPARE(input2->property("acceptable").toBool(), false); - QTRY_COMPARE(input2Spy.count(), 0); + QTRY_COMPARE(input2Spy.size(), 0); QTest::keyPress(&window, Qt::Key_A); QTest::keyRelease(&window, Qt::Key_A, Qt::NoModifier); QTRY_COMPARE(input2->text(), QLatin1String("aa")); QCOMPARE(input2->hasAcceptableInput(), true); QCOMPARE(input2->property("acceptable").toBool(), true); - QTRY_COMPARE(input2Spy.count(), 1); + QTRY_COMPARE(input2Spy.size(), 1); input1->setFocus(true); QTRY_VERIFY(input1->hasActiveFocus()); QTRY_VERIFY(!input2->hasActiveFocus()); - QTRY_COMPARE(editingFinished2Spy.count(), 1); + QTRY_COMPARE(editingFinished2Spy.size(), 1); } void tst_qquicktextinput::signal_textEdited() @@ -2461,32 +2465,32 @@ void tst_qquicktextinput::signal_textEdited() int textEdits = 0; QTest::keyClick(&window, Qt::Key_A); - QCOMPARE(textChangedSpy.count(), ++textChanges); - QCOMPARE(textEditedSpy.count(), ++textEdits); + QCOMPARE(textChangedSpy.size(), ++textChanges); + QCOMPARE(textEditedSpy.size(), ++textEdits); QTest::keyClick(&window, Qt::Key_B); - QCOMPARE(textChangedSpy.count(), ++textChanges); - QCOMPARE(textEditedSpy.count(), ++textEdits); + QCOMPARE(textChangedSpy.size(), ++textChanges); + QCOMPARE(textEditedSpy.size(), ++textEdits); QTest::keyClick(&window, Qt::Key_C); - QCOMPARE(textChangedSpy.count(), ++textChanges); - QCOMPARE(textEditedSpy.count(), ++textEdits); + QCOMPARE(textChangedSpy.size(), ++textChanges); + QCOMPARE(textEditedSpy.size(), ++textEdits); QTest::keyClick(&window, Qt::Key_Space); - QCOMPARE(textChangedSpy.count(), ++textChanges); - QCOMPARE(textEditedSpy.count(), ++textEdits); + QCOMPARE(textChangedSpy.size(), ++textChanges); + QCOMPARE(textEditedSpy.size(), ++textEdits); QTest::keyClick(&window, Qt::Key_Backspace); - QCOMPARE(textChangedSpy.count(), ++textChanges); - QCOMPARE(textEditedSpy.count(), ++textEdits); + QCOMPARE(textChangedSpy.size(), ++textChanges); + QCOMPARE(textEditedSpy.size(), ++textEdits); input->clear(); - QCOMPARE(textChangedSpy.count(), ++textChanges); - QCOMPARE(textEditedSpy.count(), textEdits); + QCOMPARE(textChangedSpy.size(), ++textChanges); + QCOMPARE(textEditedSpy.size(), textEdits); input->setText("TextInput"); - QCOMPARE(textChangedSpy.count(), ++textChanges); - QCOMPARE(textEditedSpy.count(), textEdits); + QCOMPARE(textChangedSpy.size(), ++textChanges); + QCOMPARE(textEditedSpy.size(), textEdits); } /* @@ -2512,12 +2516,12 @@ void tst_qquicktextinput::navigation() QTest::keyClick(&window, Qt::Key_Right); QVERIFY(input->hasActiveFocus()); //QT-2944: If text is selected, ensure we deselect upon cursor motion - input->setCursorPosition(input->text().length()); - input->select(0,input->text().length()); + input->setCursorPosition(input->text().size()); + input->select(0,input->text().size()); QVERIFY(input->selectionStart() != input->selectionEnd()); QTest::keyClick(&window, Qt::Key_Right); QCOMPARE(input->selectionStart(), input->selectionEnd()); - QCOMPARE(input->selectionStart(), input->text().length()); + QCOMPARE(input->selectionStart(), input->text().size()); QVERIFY(input->hasActiveFocus()); QTest::keyClick(&window, Qt::Key_Right); QVERIFY(!input->hasActiveFocus()); @@ -2568,7 +2572,7 @@ void tst_qquicktextinput::navigation_RTL() QTest::keyClick(&window, Qt::Key_Left); QVERIFY(input->hasActiveFocus()); - input->setCursorPosition(input->text().length()); + input->setCursorPosition(input->text().size()); QVERIFY(input->hasActiveFocus()); // move off @@ -2593,16 +2597,16 @@ void tst_qquicktextinput::copyAndPaste() QVERIFY(textInput != nullptr); // copy and paste - QCOMPARE(textInput->text().length(), 12); - textInput->select(0, textInput->text().length()); + QCOMPARE(textInput->text().size(), 12); + textInput->select(0, textInput->text().size()); textInput->copy(); QCOMPARE(textInput->selectedText(), QString("Hello world!")); - QCOMPARE(textInput->selectedText().length(), 12); + QCOMPARE(textInput->selectedText().size(), 12); textInput->setCursorPosition(0); QTRY_VERIFY(textInput->canPaste()); textInput->paste(); QCOMPARE(textInput->text(), QString("Hello world!Hello world!")); - QCOMPARE(textInput->text().length(), 24); + QCOMPARE(textInput->text().size(), 24); // can paste QVERIFY(textInput->canPaste()); @@ -2610,7 +2614,7 @@ void tst_qquicktextinput::copyAndPaste() QVERIFY(!textInput->canPaste()); textInput->paste(); QCOMPARE(textInput->text(), QString("Hello world!Hello world!")); - QCOMPARE(textInput->text().length(), 24); + QCOMPARE(textInput->text().size(), 24); textInput->setReadOnly(false); QVERIFY(textInput->canPaste()); @@ -2632,10 +2636,10 @@ void tst_qquicktextinput::copyAndPaste() // select all and cut textInput->selectAll(); textInput->cut(); - QCOMPARE(textInput->text().length(), 0); + QCOMPARE(textInput->text().size(), 0); textInput->paste(); QCOMPARE(textInput->text(), QString("Hello world!Hello world!")); - QCOMPARE(textInput->text().length(), 24); + QCOMPARE(textInput->text().size(), 24); // Copy first word. textInput->setCursorPosition(0); @@ -2662,7 +2666,7 @@ void tst_qquicktextinput::copyAndPaste() QQuickTextInput::EchoMode echoMode = QQuickTextInput::EchoMode(index); textInput->setEchoMode(echoMode); textInput->setText("My password"); - textInput->select(0, textInput->text().length()); + textInput->select(0, textInput->text().size()); textInput->copy(); if (echoMode == QQuickTextInput::Normal) { QVERIFY(!clipboard->text().isEmpty()); @@ -2698,24 +2702,24 @@ void tst_qquicktextinput::copyAndPasteKeySequence() // copy and paste QVERIFY(textInput->hasActiveFocus()); - QCOMPARE(textInput->text().length(), 12); - textInput->select(0, textInput->text().length()); + QCOMPARE(textInput->text().size(), 12); + textInput->select(0, textInput->text().size()); simulateKeys(&window, QKeySequence::Copy); QCOMPARE(textInput->selectedText(), QString("Hello world!")); - QCOMPARE(textInput->selectedText().length(), 12); + QCOMPARE(textInput->selectedText().size(), 12); textInput->setCursorPosition(0); QVERIFY(textInput->canPaste()); simulateKeys(&window, QKeySequence::Paste); QCOMPARE(textInput->text(), QString("Hello world!Hello world!")); - QCOMPARE(textInput->text().length(), 24); + QCOMPARE(textInput->text().size(), 24); // select all and cut simulateKeys(&window, QKeySequence::SelectAll); simulateKeys(&window, QKeySequence::Cut); - QCOMPARE(textInput->text().length(), 0); + QCOMPARE(textInput->text().size(), 0); simulateKeys(&window, QKeySequence::Paste); QCOMPARE(textInput->text(), QString("Hello world!Hello world!")); - QCOMPARE(textInput->text().length(), 24); + QCOMPARE(textInput->text().size(), 24); // clear copy buffer QClipboard *clipboard = QGuiApplication::clipboard(); @@ -2730,7 +2734,7 @@ void tst_qquicktextinput::copyAndPasteKeySequence() QQuickTextInput::EchoMode echoMode = QQuickTextInput::EchoMode(index); textInput->setEchoMode(echoMode); textInput->setText("My password"); - textInput->select(0, textInput->text().length()); + textInput->select(0, textInput->text().size()); simulateKeys(&window, QKeySequence::Copy); if (echoMode == QQuickTextInput::Normal) { QVERIFY(!clipboard->text().isEmpty()); @@ -2749,15 +2753,18 @@ void tst_qquicktextinput::copyAndPasteKeySequence() #if QT_CONFIG(clipboard) && QT_CONFIG(shortcut) void tst_qquicktextinput::canPasteEmpty() { + if (!PlatformQuirks::isClipboardAvailable()) + QSKIP("This machine has no clipboard support."); + QGuiApplication::clipboard()->clear(); - QString componentStr = "import QtQuick 2.0\nTextInput { text: \"Hello world!\" }"; + const QString componentStr = "import QtQuick 2.0\nTextInput { text: \"Hello world!\" }"; QQmlComponent textInputComponent(&engine); textInputComponent.setData(componentStr.toLatin1(), QUrl()); QQuickTextInput *textInput = qobject_cast<QQuickTextInput*>(textInputComponent.create()); QVERIFY(textInput != nullptr); - bool cp = !textInput->isReadOnly() && QGuiApplication::clipboard()->text().length() != 0; + const bool cp = !textInput->isReadOnly() && QGuiApplication::clipboard()->text().size() != 0; QCOMPARE(textInput->canPaste(), cp); } #endif @@ -2765,15 +2772,18 @@ void tst_qquicktextinput::canPasteEmpty() #if QT_CONFIG(clipboard) && QT_CONFIG(shortcut) void tst_qquicktextinput::canPaste() { + if (!PlatformQuirks::isClipboardAvailable()) + QSKIP("This machine has no clipboard support."); + QGuiApplication::clipboard()->setText("Some text"); - QString componentStr = "import QtQuick 2.0\nTextInput { text: \"Hello world!\" }"; + const QString componentStr = "import QtQuick 2.0\nTextInput { text: \"Hello world!\" }"; QQmlComponent textInputComponent(&engine); textInputComponent.setData(componentStr.toLatin1(), QUrl()); QQuickTextInput *textInput = qobject_cast<QQuickTextInput*>(textInputComponent.create()); QVERIFY(textInput != nullptr); - bool cp = !textInput->isReadOnly() && QGuiApplication::clipboard()->text().length() != 0; + const bool cp = !textInput->isReadOnly() && QGuiApplication::clipboard()->text().size() != 0; QCOMPARE(textInput->canPaste(), cp); } #endif @@ -2782,9 +2792,9 @@ void tst_qquicktextinput::canPaste() void tst_qquicktextinput::middleClickPaste() { if (!PlatformQuirks::isClipboardAvailable()) - QSKIP("This machine doesn't support the clipboard"); + QSKIP("This machine has no clipboard support."); - QQuickView window(testFileUrl("mouseselection_true.qml")); + QQuickView window(testFileUrl("mouseselectionmode_default.qml")); window.show(); window.requestActivate(); @@ -2793,11 +2803,12 @@ void tst_qquicktextinput::middleClickPaste() QVERIFY(window.rootObject() != nullptr); QQuickTextInput *textInputObject = qobject_cast<QQuickTextInput *>(window.rootObject()); QVERIFY(textInputObject != nullptr); + textInputObject->setSelectByMouse(true); textInputObject->setFocus(true); - QString originalText = textInputObject->text(); - QString selectedText = "234567"; + const QString originalText = textInputObject->text(); + const QString selectedText = "234567"; // press-and-drag-and-release from x1 to x2 const QPoint p1 = textInputObject->positionToRectangle(2).center().toPoint(); @@ -2815,7 +2826,7 @@ void tst_qquicktextinput::middleClickPaste() QTest::qWait(QGuiApplication::styleHints()->mouseDoubleClickInterval() + 10); if (QGuiApplication::clipboard()->supportsSelection()) - QCOMPARE(textInputObject->text().mid(1, selectedText.length()), selectedText); + QCOMPARE(textInputObject->text().mid(1, selectedText.size()), selectedText); else QCOMPARE(textInputObject->text(), originalText); } @@ -2867,7 +2878,7 @@ void tst_qquicktextinput::cursorDelegate() QVERIFY(delegateObject); QCOMPARE(delegateObject->property("localProperty").toString(), QString("Hello")); //Test Delegate gets moved - for (int i=0; i<= textInputObject->text().length(); i++) { + for (int i=0; i<= textInputObject->text().size(); i++) { textInputObject->setCursorPosition(i); QCOMPARE(textInputObject->cursorRectangle().x(), delegateObject->x()); QCOMPARE(textInputObject->cursorRectangle().y(), delegateObject->y()); @@ -2879,7 +2890,7 @@ void tst_qquicktextinput::cursorDelegate() // Test delegate gets moved on mouse press. textInputObject->setSelectByMouse(true); textInputObject->setCursorPosition(0); - const QPoint point1 = textInputObject->positionToRectangle(5).center().toPoint(); + const QPoint point1 = textInputObject->positionToRectangle(10).center().toPoint(); QTest::qWait(400); //ensure this isn't treated as a double-click QTest::mouseClick(&view, Qt::LeftButton, Qt::NoModifier, point1); QTest::qWait(50); @@ -2889,10 +2900,11 @@ void tst_qquicktextinput::cursorDelegate() // Test delegate gets moved on mouse drag textInputObject->setCursorPosition(0); - const QPoint point2 = textInputObject->positionToRectangle(10).center().toPoint(); + const QPoint point2 = textInputObject->positionToRectangle(15).center().toPoint(); QTest::qWait(400); //ensure this isn't treated as a double-click QTest::mousePress(&view, Qt::LeftButton, Qt::NoModifier, point1); - QMouseEvent mv(QEvent::MouseMove, point2, Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); + QMouseEvent mv(QEvent::MouseMove, point2, textInputObject->mapToGlobal(point2), + Qt::LeftButton, Qt::LeftButton,Qt::NoModifier); QGuiApplication::sendEvent(&view, &mv); QTest::mouseRelease(&view, Qt::LeftButton, Qt::NoModifier, point2); QTest::qWait(50); @@ -2902,7 +2914,7 @@ void tst_qquicktextinput::cursorDelegate() textInputObject->setReadOnly(true); textInputObject->setCursorPosition(0); QTest::qWait(400); //ensure this isn't treated as a double-click - QTest::mouseClick(&view, Qt::LeftButton, Qt::NoModifier, textInputObject->positionToRectangle(5).center().toPoint()); + QTest::mouseClick(&view, Qt::LeftButton, Qt::NoModifier, textInputObject->positionToRectangle(10).center().toPoint()); QTest::qWait(50); QTRY_VERIFY(textInputObject->cursorPosition() != 0); QCOMPARE(textInputObject->cursorRectangle().x(), delegateObject->x()); @@ -2910,7 +2922,7 @@ void tst_qquicktextinput::cursorDelegate() textInputObject->setCursorPosition(0); QTest::qWait(400); //ensure this isn't treated as a double-click - QTest::mouseClick(&view, Qt::LeftButton, Qt::NoModifier, textInputObject->positionToRectangle(5).center().toPoint()); + QTest::mouseClick(&view, Qt::LeftButton, Qt::NoModifier, textInputObject->positionToRectangle(10).center().toPoint()); QTest::qWait(50); QTRY_VERIFY(textInputObject->cursorPosition() != 0); QCOMPARE(textInputObject->cursorRectangle().x(), delegateObject->x()); @@ -3004,27 +3016,27 @@ void tst_qquicktextinput::cursorVisible() input.setCursorVisible(true); QCOMPARE(input.isCursorVisible(), true); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); input.setCursorVisible(false); QCOMPARE(input.isCursorVisible(), false); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); input.setFocus(true); QCOMPARE(input.isCursorVisible(), false); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); input.setParentItem(view.rootObject()); QCOMPARE(input.isCursorVisible(), true); - QCOMPARE(spy.count(), 3); + QCOMPARE(spy.size(), 3); input.setFocus(false); QCOMPARE(input.isCursorVisible(), false); - QCOMPARE(spy.count(), 4); + QCOMPARE(spy.size(), 4); input.setFocus(true); QCOMPARE(input.isCursorVisible(), true); - QCOMPARE(spy.count(), 5); + QCOMPARE(spy.size(), 5); QQuickView alternateView; alternateView.show(); @@ -3032,12 +3044,12 @@ void tst_qquicktextinput::cursorVisible() QVERIFY(QTest::qWaitForWindowActive(&alternateView)); QCOMPARE(input.isCursorVisible(), false); - QCOMPARE(spy.count(), 6); + QCOMPARE(spy.size(), 6); view.requestActivate(); QVERIFY(QTest::qWaitForWindowActive(&view)); QCOMPARE(input.isCursorVisible(), true); - QCOMPARE(spy.count(), 7); + QCOMPARE(spy.size(), 7); { // Cursor attribute with 0 length hides cursor. QInputMethodEvent ev(QString(), QList<QInputMethodEvent::Attribute>() @@ -3045,7 +3057,7 @@ void tst_qquicktextinput::cursorVisible() QCoreApplication::sendEvent(&input, &ev); } QCOMPARE(input.isCursorVisible(), false); - QCOMPARE(spy.count(), 8); + QCOMPARE(spy.size(), 8); { // Cursor attribute with non zero length shows cursor. QInputMethodEvent ev(QString(), QList<QInputMethodEvent::Attribute>() @@ -3053,7 +3065,7 @@ void tst_qquicktextinput::cursorVisible() QCoreApplication::sendEvent(&input, &ev); } QCOMPARE(input.isCursorVisible(), true); - QCOMPARE(spy.count(), 9); + QCOMPARE(spy.size(), 9); { // If the cursor is hidden by the input method and the text is changed it should be visible again. QInputMethodEvent ev(QString(), QList<QInputMethodEvent::Attribute>() @@ -3061,11 +3073,11 @@ void tst_qquicktextinput::cursorVisible() QCoreApplication::sendEvent(&input, &ev); } QCOMPARE(input.isCursorVisible(), false); - QCOMPARE(spy.count(), 10); + QCOMPARE(spy.size(), 10); input.setText("something"); QCOMPARE(input.isCursorVisible(), true); - QCOMPARE(spy.count(), 11); + QCOMPARE(spy.size(), 11); { // If the cursor is hidden by the input method and the cursor position is changed it should be visible again. QInputMethodEvent ev(QString(), QList<QInputMethodEvent::Attribute>() @@ -3073,11 +3085,11 @@ void tst_qquicktextinput::cursorVisible() QCoreApplication::sendEvent(&input, &ev); } QCOMPARE(input.isCursorVisible(), false); - QCOMPARE(spy.count(), 12); + QCOMPARE(spy.size(), 12); input.setCursorPosition(5); QCOMPARE(input.isCursorVisible(), true); - QCOMPARE(spy.count(), 13); + QCOMPARE(spy.size(), 13); } void tst_qquicktextinput::cursorRectangle_data() @@ -3154,14 +3166,14 @@ void tst_qquicktextinput::cursorRectangle() // Check the cursor rectangle remains within the input bounding rect when auto scrolling. QCOMPARE(r.left(), leftToRight ? input.width() : 0); - for (int i = positionAtWidth + 1; i < text.length(); ++i) { + for (int i = positionAtWidth + 1; i < text.size(); ++i) { input.setCursorPosition(i); QCOMPARE(r, input.cursorRectangle()); COMPARE_INPUT_METHOD_QUERY(QRectF, (&input), Qt::ImCursorRectangle, toRectF, r); QCOMPARE(input.positionToRectangle(i), r); } - for (int i = text.length() - 2; i >= 0; --i) { + for (int i = text.size() - 2; i >= 0; --i) { input.setCursorPosition(i); r = input.cursorRectangle(); QCOMPARE(r.top(), 0.); @@ -3200,7 +3212,7 @@ void tst_qquicktextinput::cursorRectangle() COMPARE_INPUT_METHOD_QUERY(QRectF, (&input), Qt::ImCursorRectangle, toRectF, r); QCOMPARE(input.positionToRectangle(11), r); - for (int i = wrapPosition + 1; i < text.length(); ++i) { + for (int i = wrapPosition + 1; i < text.size(); ++i) { input.setCursorPosition(i); r = input.cursorRectangle(); QVERIFY(r.top() >= line.height() - 5); @@ -3241,7 +3253,7 @@ void tst_qquicktextinput::cursorRectangle() COMPARE_INPUT_METHOD_QUERY(QRectF, (&input), Qt::ImCursorRectangle, toRectF, r); QCOMPARE(input.positionToRectangle(11), r); - for (int i = wrapPosition + 1; i < text.length(); ++i) { + for (int i = wrapPosition + 1; i < text.size(); ++i) { input.setCursorPosition(i); r = input.cursorRectangle(); QVERIFY(r.bottom() >= input.height()); @@ -3249,7 +3261,7 @@ void tst_qquicktextinput::cursorRectangle() QCOMPARE(input.positionToRectangle(i), r); } - for (int i = text.length() - 2; i >= wrapPosition; --i) { + for (int i = text.size() - 2; i >= wrapPosition; --i) { input.setCursorPosition(i); r = input.cursorRectangle(); QVERIFY(r.bottom() >= input.height()); @@ -3290,7 +3302,7 @@ void tst_qquicktextinput::cursorRectangle() widerText[1] = 'W'; // Assumes shortText is at least two characters long. input.setText(widerText); - QCOMPARE(cursorRectangleSpy.count(), 1); + QCOMPARE(cursorRectangleSpy.size(), 1); } void tst_qquicktextinput::readOnly() @@ -3318,7 +3330,7 @@ void tst_qquicktextinput::readOnly() input->setCursorPosition(3); input->setReadOnly(false); QCOMPARE(input->isReadOnly(), false); - QCOMPARE(input->cursorPosition(), input->text().length()); + QCOMPARE(input->cursorPosition(), input->text().size()); QVERIFY(input->isCursorVisible()); } @@ -3440,7 +3452,7 @@ void tst_qquicktextinput::passwordEchoDelay() QSignalSpy cursorSpy(input, SIGNAL(cursorRectangleChanged())); QTest::qWait(maskDelay); QTRY_COMPARE(input->displayText(), QString(5, fillChar)); - QCOMPARE(cursorSpy.count(), 1); + QCOMPARE(cursorSpy.size(), 1); QCOMPARE(input->cursorRectangle().topLeft(), cursor->position()); QTest::keyPress(&window, '5'); @@ -3491,7 +3503,7 @@ void tst_qquicktextinput::focusOnPress() textInputObject->setFocusOnPress(true); QCOMPARE(textInputObject->focusOnPress(), true); - QCOMPARE(activeFocusOnPressSpy.count(), 0); + QCOMPARE(activeFocusOnPressSpy.size(), 0); QQuickWindow window; window.resize(100, 50); @@ -3508,20 +3520,20 @@ void tst_qquicktextinput::focusOnPress() QGuiApplication::processEvents(); QCOMPARE(textInputObject->hasFocus(), true); QCOMPARE(textInputObject->hasActiveFocus(), true); - QCOMPARE(focusSpy.count(), 1); - QCOMPARE(activeFocusSpy.count(), 1); + QCOMPARE(focusSpy.size(), 1); + QCOMPARE(activeFocusSpy.size(), 1); QCOMPARE(textInputObject->selectedText(), QString()); QTest::mouseRelease(&window, Qt::LeftButton, noModifiers); textInputObject->setFocusOnPress(false); QCOMPARE(textInputObject->focusOnPress(), false); - QCOMPARE(activeFocusOnPressSpy.count(), 1); + QCOMPARE(activeFocusOnPressSpy.size(), 1); textInputObject->setFocus(false); QCOMPARE(textInputObject->hasFocus(), false); QCOMPARE(textInputObject->hasActiveFocus(), false); - QCOMPARE(focusSpy.count(), 2); - QCOMPARE(activeFocusSpy.count(), 2); + QCOMPARE(focusSpy.size(), 2); + QCOMPARE(activeFocusSpy.size(), 2); // Wait for double click timeout to expire before clicking again. QTest::qWait(400); @@ -3529,13 +3541,13 @@ void tst_qquicktextinput::focusOnPress() QGuiApplication::processEvents(); QCOMPARE(textInputObject->hasFocus(), false); QCOMPARE(textInputObject->hasActiveFocus(), false); - QCOMPARE(focusSpy.count(), 2); - QCOMPARE(activeFocusSpy.count(), 2); + QCOMPARE(focusSpy.size(), 2); + QCOMPARE(activeFocusSpy.size(), 2); QTest::mouseRelease(&window, Qt::LeftButton, noModifiers); textInputObject->setFocusOnPress(true); QCOMPARE(textInputObject->focusOnPress(), true); - QCOMPARE(activeFocusOnPressSpy.count(), 2); + QCOMPARE(activeFocusOnPressSpy.size(), 2); // Test a selection made in the on(Active)FocusChanged handler isn't overwritten. textInputObject->setProperty("selectOnFocus", true); @@ -3545,8 +3557,8 @@ void tst_qquicktextinput::focusOnPress() QGuiApplication::processEvents(); QCOMPARE(textInputObject->hasFocus(), true); QCOMPARE(textInputObject->hasActiveFocus(), true); - QCOMPARE(focusSpy.count(), 3); - QCOMPARE(activeFocusSpy.count(), 3); + QCOMPARE(focusSpy.size(), 3); + QCOMPARE(activeFocusSpy.size(), 3); QCOMPARE(textInputObject->selectedText(), textInputObject->text()); QTest::mouseRelease(&window, Qt::LeftButton, noModifiers); } @@ -3637,7 +3649,7 @@ void tst_qquicktextinput::openInputPanel() anotherInput.setFocus(true); QCOMPARE(qApp->inputMethod()->isVisible(), true); QCOMPARE(qApp->focusObject(), qobject_cast<QObject*>(&anotherInput)); - QCOMPARE(inputPanelVisibilitySpy.count(), 0); + QCOMPARE(inputPanelVisibilitySpy.size(), 0); anotherInput.setFocus(false); QVERIFY(qApp->focusObject() != &anotherInput); @@ -3672,7 +3684,7 @@ public: { nbPaint = 0; } - virtual QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *data) + QSGNode *updatePaintNode(QSGNode *node, UpdatePaintNodeData *data) override { nbPaint++; return QQuickTextInput::updatePaintNode(node, data); @@ -3752,8 +3764,6 @@ void tst_qquicktextinput::focusOutNotClearSelection() input.setFocus(false, Qt::PopupFocusReason); QGuiApplication::processEvents(); QTRY_COMPARE(input.selectedText(), QLatin1String("llo")); - // QTBUG-36332 and 36292: a popup window does not take focus - QTRY_COMPARE(input.hasActiveFocus(), true); input.setFocus(true); QTRY_COMPARE(input.hasActiveFocus(), true); @@ -3788,18 +3798,18 @@ void tst_qquicktextinput::contentSize() QVERIFY(textObject->contentWidth() > textObject->width()); QVERIFY(textObject->contentHeight() < textObject->height()); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); textObject->setWrapMode(QQuickTextInput::WordWrap); QVERIFY(textObject->contentWidth() <= textObject->width()); QVERIFY(textObject->contentHeight() > textObject->height()); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); textObject->setText("The quickredfoxjumpedoverthe lazy brown dog"); QVERIFY(textObject->contentWidth() > textObject->width()); QVERIFY(textObject->contentHeight() > textObject->height()); - QCOMPARE(spy.count(), 3); + QCOMPARE(spy.size(), 3); textObject->setText("The quick red fox jumped over the lazy brown dog"); for (int w = 60; w < 120; ++w) { @@ -3812,7 +3822,7 @@ void tst_qquicktextinput::contentSize() static void sendPreeditText(QQuickItem *item, const QString &text, int cursor) { QInputMethodEvent event(text, QList<QInputMethodEvent::Attribute>() - << QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, cursor, text.length(), QVariant())); + << QInputMethodEvent::Attribute(QInputMethodEvent::Cursor, cursor, text.size(), QVariant())); QCoreApplication::sendEvent(item, &event); } @@ -3837,14 +3847,14 @@ void tst_qquicktextinput::preeditAutoScroll() sendPreeditText(input, preeditText.mid(0, 3), 1); QVERIFY(evaluate<int>(input, QString("positionAt(0)")) != 0); QVERIFY(input->cursorRectangle().left() < input->boundingRect().width()); - QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + QCOMPARE(cursorRectangleSpy.size(), ++cursorRectangleChanges); // test the text is scrolled back when the preedit is removed. QInputMethodEvent imEvent; QCoreApplication::sendEvent(input, &imEvent); QCOMPARE(evaluate<int>(input, QString("positionAt(%1)").arg(0)), 0); QCOMPARE(evaluate<int>(input, QString("positionAt(%1)").arg(input->width())), 5); - QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + QCOMPARE(cursorRectangleSpy.size(), ++cursorRectangleChanges); QTextLayout layout(preeditText); layout.setFont(input->font()); @@ -3865,7 +3875,7 @@ void tst_qquicktextinput::preeditAutoScroll() int width = ceil(line.cursorToX(i, QTextLine::Trailing)) - floor(line.cursorToX(i)); QVERIFY(input->cursorRectangle().right() >= width - 3); QVERIFY(input->positionToRectangle(0).x() < x); - QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + QCOMPARE(cursorRectangleSpy.size(), ++cursorRectangleChanges); x = input->positionToRectangle(0).x(); } for (int i = 1; i >= 0; --i) { @@ -3873,24 +3883,24 @@ void tst_qquicktextinput::preeditAutoScroll() int width = ceil(line.cursorToX(i, QTextLine::Trailing)) - floor(line.cursorToX(i)); QVERIFY(input->cursorRectangle().right() >= width - 3); QVERIFY(input->positionToRectangle(0).x() > x); - QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + QCOMPARE(cursorRectangleSpy.size(), ++cursorRectangleChanges); x = input->positionToRectangle(0).x(); } // Test incrementing the preedit cursor doesn't cause further // scrolling when right most text is visible. - sendPreeditText(input, preeditText, preeditText.length() - 3); - QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + sendPreeditText(input, preeditText, preeditText.size() - 3); + QCOMPARE(cursorRectangleSpy.size(), ++cursorRectangleChanges); x = input->positionToRectangle(0).x(); for (int i = 2; i >= 0; --i) { - sendPreeditText(input, preeditText, preeditText.length() - i); + sendPreeditText(input, preeditText, preeditText.size() - i); QCOMPARE(input->positionToRectangle(0).x(), x); - QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + QCOMPARE(cursorRectangleSpy.size(), ++cursorRectangleChanges); } for (int i = 1; i < 3; ++i) { - sendPreeditText(input, preeditText, preeditText.length() - i); + sendPreeditText(input, preeditText, preeditText.size() - i); QCOMPARE(input->positionToRectangle(0).x(), x); - QCOMPARE(cursorRectangleSpy.count(), ++cursorRectangleChanges); + QCOMPARE(cursorRectangleSpy.size(), ++cursorRectangleChanges); } // Test disabling auto scroll. @@ -3944,8 +3954,8 @@ void tst_qquicktextinput::preeditCursorRectangle() QVERIFY(previousRect.left() < currentRect.left()); QCOMPARE(input->cursorRectangle(), currentRect); QCOMPARE(cursor->position(), currentRect.topLeft()); - QVERIFY(inputSpy.count() > 0); inputSpy.clear(); - QVERIFY(panelSpy.count() > 0); panelSpy.clear(); + QVERIFY(inputSpy.size() > 0); inputSpy.clear(); + QVERIFY(panelSpy.size() > 0); panelSpy.clear(); previousRect = currentRect; } @@ -3958,8 +3968,8 @@ void tst_qquicktextinput::preeditCursorRectangle() currentRect = query.value(Qt::ImCursorRectangle).toRectF(); QCOMPARE(input->cursorRectangle(), currentRect); QCOMPARE(cursor->position(), currentRect.topLeft()); - QCOMPARE(inputSpy.count(), 1); - QCOMPARE(panelSpy.count(), 1); + QCOMPARE(inputSpy.size(), 1); + QCOMPARE(panelSpy.size(), 1); // Verify that if there is no preedit cursor then the micro focus rect is the // same as it would be if it were positioned at the end of the preedit text. @@ -3972,8 +3982,8 @@ void tst_qquicktextinput::preeditCursorRectangle() QCOMPARE(currentRect, previousRect); QCOMPARE(input->cursorRectangle(), currentRect); QCOMPARE(cursor->position(), currentRect.topLeft()); - QCOMPARE(inputSpy.count(), 1); - QCOMPARE(panelSpy.count(), 1); + QCOMPARE(inputSpy.size(), 1); + QCOMPARE(panelSpy.size(), 1); } void tst_qquicktextinput::inputContextMouseHandler() @@ -4040,37 +4050,37 @@ void tst_qquicktextinput::inputMethodComposing() QGuiApplication::sendEvent(input, &event); } QCOMPARE(input->isInputMethodComposing(), true); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); { QInputMethodEvent event(text.mid(12), QList<QInputMethodEvent::Attribute>()); QGuiApplication::sendEvent(input, &event); } - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); { QInputMethodEvent event; QGuiApplication::sendEvent(input, &event); } QCOMPARE(input->isInputMethodComposing(), false); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); // Changing the text while not composing doesn't alter the composing state. input->setText(text.mid(0, 16)); QCOMPARE(input->isInputMethodComposing(), false); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); { QInputMethodEvent event(text.mid(16), QList<QInputMethodEvent::Attribute>()); QGuiApplication::sendEvent(input, &event); } QCOMPARE(input->isInputMethodComposing(), true); - QCOMPARE(spy.count(), 3); + QCOMPARE(spy.size(), 3); // Changing the text while composing cancels composition. input->setText(text.mid(0, 12)); QCOMPARE(input->isInputMethodComposing(), false); - QCOMPARE(spy.count(), 4); + QCOMPARE(spy.size(), 4); { // Preedit cursor positioned outside (empty) preedit; composing. QInputMethodEvent event(QString(), QList<QInputMethodEvent::Attribute>() @@ -4078,7 +4088,7 @@ void tst_qquicktextinput::inputMethodComposing() QGuiApplication::sendEvent(input, &event); } QCOMPARE(input->isInputMethodComposing(), true); - QCOMPARE(spy.count(), 5); + QCOMPARE(spy.size(), 5); { // Cursor hidden; composing @@ -4087,7 +4097,7 @@ void tst_qquicktextinput::inputMethodComposing() QGuiApplication::sendEvent(input, &event); } QCOMPARE(input->isInputMethodComposing(), true); - QCOMPARE(spy.count(), 5); + QCOMPARE(spy.size(), 5); { // Default cursor attributes; composing. QInputMethodEvent event(QString(), QList<QInputMethodEvent::Attribute>() @@ -4095,7 +4105,7 @@ void tst_qquicktextinput::inputMethodComposing() QGuiApplication::sendEvent(input, &event); } QCOMPARE(input->isInputMethodComposing(), true); - QCOMPARE(spy.count(), 5); + QCOMPARE(spy.size(), 5); { // Selections are persisted: not composing QInputMethodEvent event(QString(), QList<QInputMethodEvent::Attribute>() @@ -4103,7 +4113,7 @@ void tst_qquicktextinput::inputMethodComposing() QGuiApplication::sendEvent(input, &event); } QCOMPARE(input->isInputMethodComposing(), false); - QCOMPARE(spy.count(), 6); + QCOMPARE(spy.size(), 6); input->setCursorPosition(12); @@ -4115,14 +4125,14 @@ void tst_qquicktextinput::inputMethodComposing() QGuiApplication::sendEvent(input, &event); } QCOMPARE(input->isInputMethodComposing(), true); - QCOMPARE(spy.count(), 7); + QCOMPARE(spy.size(), 7); { QInputMethodEvent event; QGuiApplication::sendEvent(input, &event); } QCOMPARE(input->isInputMethodComposing(), false); - QCOMPARE(spy.count(), 8); + QCOMPARE(spy.size(), 8); } void tst_qquicktextinput::inputMethodUpdate() @@ -4309,7 +4319,7 @@ void tst_qquicktextinput::getText_data() QTest::newRow("all plain text") << standard.at(0) << QString() - << 0 << standard.at(0).length() + << 0 << standard.at(0).size() << standard.at(0); QTest::newRow("plain text sub string") @@ -4333,13 +4343,13 @@ void tst_qquicktextinput::getText_data() QTest::newRow("plain text cropped end") << standard.at(0) << QString() - << 23 << standard.at(0).length() + 8 + << 23 << standard.at(0).size() + 8 << standard.at(0).mid(23); QTest::newRow("plain text cropped beginning and end") << standard.at(0) << QString() - << -9 << standard.at(0).length() + 4 + << -9 << standard.at(0).size() + 4 << standard.at(0); } @@ -4387,10 +4397,10 @@ void tst_qquicktextinput::insert_data() QTest::newRow("at cursor position (end)") << standard.at(0) << QString() - << standard.at(0).length() << standard.at(0).length() << standard.at(0).length() + << standard.at(0).size() << standard.at(0).size() << standard.at(0).size() << QString("Hello") << standard.at(0) + QString("Hello") - << standard.at(0).length() + 5 << standard.at(0).length() + 5 << standard.at(0).length() + 5 + << standard.at(0).size() + 5 << standard.at(0).size() + 5 << standard.at(0).size() + 5 << false << true; QTest::newRow("at cursor position (middle)") @@ -4414,10 +4424,10 @@ void tst_qquicktextinput::insert_data() QTest::newRow("before cursor position (end)") << standard.at(0) << QString() - << standard.at(0).length() << standard.at(0).length() << 18 + << standard.at(0).size() << standard.at(0).size() << 18 << QString("Hello") << standard.at(0).mid(0, 18) + QString("Hello") + standard.at(0).mid(18) - << standard.at(0).length() + 5 << standard.at(0).length() + 5 << standard.at(0).length() + 5 + << standard.at(0).size() + 5 << standard.at(0).size() + 5 << standard.at(0).size() + 5 << false << true; QTest::newRow("before cursor position (middle)") @@ -4432,7 +4442,7 @@ void tst_qquicktextinput::insert_data() QTest::newRow("after cursor position (middle)") << standard.at(0) << QString() - << 18 << 18 << standard.at(0).length() + << 18 << 18 << standard.at(0).size() << QString("Hello") << standard.at(0) + QString("Hello") << 18 << 18 << 18 @@ -4459,7 +4469,7 @@ void tst_qquicktextinput::insert_data() QTest::newRow("after selection") << standard.at(0) << QString() - << 14 << 19 << standard.at(0).length() + << 14 << 19 << standard.at(0).size() << QString("Hello") << standard.at(0) + QString("Hello") << 14 << 19 << 19 @@ -4468,7 +4478,7 @@ void tst_qquicktextinput::insert_data() QTest::newRow("after reversed selection") << standard.at(0) << QString() - << 19 << 14 << standard.at(0).length() + << 19 << 14 << standard.at(0).size() << QString("Hello") << standard.at(0) + QString("Hello") << 14 << 19 << 14 @@ -4513,7 +4523,7 @@ void tst_qquicktextinput::insert_data() QTest::newRow("past end") << standard.at(0) << QString() - << 0 << 0 << standard.at(0).length() + 3 + << 0 << 0 << standard.at(0).size() + 3 << QString("Hello") << standard.at(0) << 0 << 0 << 0 @@ -4534,10 +4544,10 @@ void tst_qquicktextinput::insert_data() QTest::newRow("mask: at cursor position (end)") << ip << inputMask - << inputMask.length() << inputMask.length() << inputMask.length() + << inputMask.size() << inputMask.size() << inputMask.size() << QString("8") << ip - << inputMask.length() << inputMask.length() << inputMask.length() + << inputMask.size() << inputMask.size() << inputMask.size() << false << false; QTest::newRow("mask: at cursor position (middle)") @@ -4561,10 +4571,10 @@ void tst_qquicktextinput::insert_data() QTest::newRow("mask: before cursor position (end)") << ip << inputMask - << inputMask.length() << inputMask.length() << 6 + << inputMask.size() << inputMask.size() << 6 << QString("75.2") << QString("192.167.5.24") - << inputMask.length() << inputMask.length() << inputMask.length() + << inputMask.size() << inputMask.size() << inputMask.size() << false << false; QTest::newRow("mask: before cursor position (middle)") @@ -4651,7 +4661,7 @@ void tst_qquicktextinput::insert_data() QTest::newRow("mask: past end") << ip << inputMask - << 0 << 0 << ip.length() + 3 + << 0 << 0 << ip.size() + 3 << QString("4") << ip << 0 << 0 << 0 @@ -4708,7 +4718,7 @@ void tst_qquicktextinput::insert() textInput->insert(insertPosition, insertText); QCOMPARE(textInput->text(), expectedText); - QCOMPARE(textInput->length(), inputMask.isEmpty() ? expectedText.length() : inputMask.length()); + QCOMPARE(textInput->length(), inputMask.isEmpty() ? expectedText.size() : inputMask.size()); QCOMPARE(textInput->selectionStart(), expectedSelectionStart); QCOMPARE(textInput->selectionEnd(), expectedSelectionEnd); @@ -4717,11 +4727,11 @@ void tst_qquicktextinput::insert() if (selectionStart > selectionEnd) qSwap(selectionStart, selectionEnd); - QCOMPARE(selectionSpy.count() > 0, selectionChanged); - QCOMPARE(selectionStartSpy.count() > 0, selectionStart != expectedSelectionStart); - QCOMPARE(selectionEndSpy.count() > 0, selectionEnd != expectedSelectionEnd); - QCOMPARE(textSpy.count() > 0, text != expectedText); - QCOMPARE(cursorPositionSpy.count() > 0, cursorPositionChanged); + QCOMPARE(selectionSpy.size() > 0, selectionChanged); + QCOMPARE(selectionStartSpy.size() > 0, selectionStart != expectedSelectionStart); + QCOMPARE(selectionEndSpy.size() > 0, selectionEnd != expectedSelectionEnd); + QCOMPARE(textSpy.size() > 0, text != expectedText); + QCOMPARE(cursorPositionSpy.size() > 0, cursorPositionChanged); } void tst_qquicktextinput::remove_data() @@ -4760,19 +4770,19 @@ void tst_qquicktextinput::remove_data() QTest::newRow("to cursor position (end)") << standard.at(0) << QString() - << standard.at(0).length() << standard.at(0).length() - << standard.at(0).length() << standard.at(0).length() - 5 - << standard.at(0).mid(0, standard.at(0).length() - 5) - << standard.at(0).length() - 5 << standard.at(0).length() - 5 << standard.at(0).length() - 5 + << standard.at(0).size() << standard.at(0).size() + << standard.at(0).size() << standard.at(0).size() - 5 + << standard.at(0).mid(0, standard.at(0).size() - 5) + << standard.at(0).size() - 5 << standard.at(0).size() - 5 << standard.at(0).size() - 5 << false << true; QTest::newRow("to cursor position (end)") << standard.at(0) << QString() - << standard.at(0).length() << standard.at(0).length() - << standard.at(0).length() - 5 << standard.at(0).length() - << standard.at(0).mid(0, standard.at(0).length() - 5) - << standard.at(0).length() - 5 << standard.at(0).length() - 5 << standard.at(0).length() - 5 + << standard.at(0).size() << standard.at(0).size() + << standard.at(0).size() - 5 << standard.at(0).size() + << standard.at(0).mid(0, standard.at(0).size() - 5) + << standard.at(0).size() - 5 << standard.at(0).size() - 5 << standard.at(0).size() - 5 << false << true; QTest::newRow("from cursor position (middle)") @@ -4805,10 +4815,10 @@ void tst_qquicktextinput::remove_data() QTest::newRow("before cursor position (end)") << standard.at(0) << QString() - << standard.at(0).length() << standard.at(0).length() + << standard.at(0).size() << standard.at(0).size() << 18 << 23 << standard.at(0).mid(0, 18) + standard.at(0).mid(23) - << standard.at(0).length() - 5 << standard.at(0).length() - 5 << standard.at(0).length() - 5 + << standard.at(0).size() - 5 << standard.at(0).size() - 5 << standard.at(0).size() - 5 << false << true; QTest::newRow("before cursor position (middle)") @@ -4851,8 +4861,8 @@ void tst_qquicktextinput::remove_data() << standard.at(0) << QString() << 14 << 19 - << standard.at(0).length() - 5 << standard.at(0).length() - << standard.at(0).mid(0, standard.at(0).length() - 5) + << standard.at(0).size() - 5 << standard.at(0).size() + << standard.at(0).mid(0, standard.at(0).size() - 5) << 14 << 19 << 19 << false << false; @@ -4860,8 +4870,8 @@ void tst_qquicktextinput::remove_data() << standard.at(0) << QString() << 19 << 14 - << standard.at(0).length() - 5 << standard.at(0).length() - << standard.at(0).mid(0, standard.at(0).length() - 5) + << standard.at(0).size() - 5 << standard.at(0).size() + << standard.at(0).mid(0, standard.at(0).size() - 5) << 14 << 19 << 14 << false << false; @@ -4896,7 +4906,7 @@ void tst_qquicktextinput::remove_data() << standard.at(0) << QString() << 0 << 0 - << 23 << standard.at(0).length() + 8 + << 23 << standard.at(0).size() + 8 << standard.at(0).mid(0, 23) << 0 << 0 << 0 << false << false; @@ -4905,7 +4915,7 @@ void tst_qquicktextinput::remove_data() << standard.at(0) << QString() << 0 << 0 - << -9 << standard.at(0).length() + 4 + << -9 << standard.at(0).size() + 4 << QString() << 0 << 0 << 0 << false << false; @@ -5063,7 +5073,7 @@ void tst_qquicktextinput::remove() textInput->remove(removeStart, removeEnd); QCOMPARE(textInput->text(), expectedText); - QCOMPARE(textInput->length(), inputMask.isEmpty() ? expectedText.length() : inputMask.length()); + QCOMPARE(textInput->length(), inputMask.isEmpty() ? expectedText.size() : inputMask.size()); if (selectionStart > selectionEnd) // qSwap(selectionStart, selectionEnd); @@ -5072,13 +5082,13 @@ void tst_qquicktextinput::remove() QCOMPARE(textInput->selectionEnd(), expectedSelectionEnd); QCOMPARE(textInput->cursorPosition(), expectedCursorPosition); - QCOMPARE(selectionSpy.count() > 0, selectionChanged); - QCOMPARE(selectionStartSpy.count() > 0, selectionStart != expectedSelectionStart); - QCOMPARE(selectionEndSpy.count() > 0, selectionEnd != expectedSelectionEnd); - QCOMPARE(textSpy.count() > 0, text != expectedText); + QCOMPARE(selectionSpy.size() > 0, selectionChanged); + QCOMPARE(selectionStartSpy.size() > 0, selectionStart != expectedSelectionStart); + QCOMPARE(selectionEndSpy.size() > 0, selectionEnd != expectedSelectionEnd); + QCOMPARE(textSpy.size() > 0, text != expectedText); if (cursorPositionChanged) // - QVERIFY(cursorPositionSpy.count() > 0); + QVERIFY(cursorPositionSpy.size() > 0); } #if QT_CONFIG(shortcut) @@ -5438,11 +5448,11 @@ void tst_qquicktextinput::undo() // QTest::keyClick(testWidget, Qt::Key_End, Qt::ShiftModifier); } - for (int j = 0; j < insertString.at(i).length(); j++) + for (int j = 0; j < insertString.at(i).size(); j++) QTest::keyClick(&window, insertString.at(i).at(j).toLatin1()); } - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); // STEP 2: Next call undo several times and see if we can restore to the previous state for (i = 0; i < expectedString.size() - 1; ++i) { @@ -5454,7 +5464,7 @@ void tst_qquicktextinput::undo() // STEP 3: Verify that we have undone everything QVERIFY(textInput->text().isEmpty()); QVERIFY(!textInput->canUndo()); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); } void tst_qquicktextinput::redo_data() @@ -5515,13 +5525,13 @@ void tst_qquicktextinput::redo() for (i = 0; i < insertString.size(); ++i) { if (insertIndex[i] > -1) textInput->setCursorPosition(insertIndex[i]); - for (int j = 0; j < insertString.at(i).length(); j++) + for (int j = 0; j < insertString.at(i).size(); j++) QTest::keyClick(&window, insertString.at(i).at(j).toLatin1()); QVERIFY(textInput->canUndo()); QVERIFY(!textInput->canRedo()); } - QCOMPARE(spy.count(), 0); + QCOMPARE(spy.size(), 0); // undo everything while (!textInput->text().isEmpty()) { @@ -5530,7 +5540,7 @@ void tst_qquicktextinput::redo() QVERIFY(textInput->canRedo()); } - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); for (i = 0; i < expectedString.size(); ++i) { QVERIFY(textInput->canRedo()); @@ -5539,7 +5549,7 @@ void tst_qquicktextinput::redo() QVERIFY(textInput->canUndo()); } QVERIFY(!textInput->canRedo()); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); } #if QT_CONFIG(shortcut) @@ -5873,12 +5883,12 @@ void tst_qquicktextinput::clear() textInput->clear(); QVERIFY(textInput->text().isEmpty()); - QCOMPARE(spy.count(), 1); + QCOMPARE(spy.size(), 1); // checks that clears can be undone textInput->undo(); QVERIFY(!textInput->canUndo()); - QCOMPARE(spy.count(), 2); + QCOMPARE(spy.size(), 2); QCOMPARE(textInput->text(), QString("I am Legend")); textInput->setCursorPosition(4); @@ -5890,14 +5900,16 @@ void tst_qquicktextinput::clear() textInput->clear(); QVERIFY(textInput->text().isEmpty()); + QVERIFY2(textInput->preeditText().isEmpty(), "Pre-edit text must be empty after clear"); - QCOMPARE(spy.count(), 3); + QCOMPARE(spy.size(), 3); // checks that clears can be undone textInput->undo(); QVERIFY(!textInput->canUndo()); - QCOMPARE(spy.count(), 4); + QCOMPARE(spy.size(), 4); QCOMPARE(textInput->text(), QString("I am Legend")); + QVERIFY2(textInput->preeditText().isEmpty(), "Pre-edit text must be empty after undo"); } void tst_qquicktextinput::backspaceSurrogatePairs() @@ -5912,7 +5924,7 @@ void tst_qquicktextinput::backspaceSurrogatePairs() QQuickTextInput *textInput = qobject_cast<QQuickTextInput*>(textInputComponent.create()); QVERIFY(textInput != nullptr); textInput->setText(text); - textInput->setCursorPosition(text.length()); + textInput->setCursorPosition(text.size()); QQuickWindow window; textInput->setParentItem(window.contentItem()); @@ -5921,7 +5933,7 @@ void tst_qquicktextinput::backspaceSurrogatePairs() QVERIFY(QTest::qWaitForWindowActive(&window)); QCOMPARE(QGuiApplication::focusWindow(), &window); - for (int i = text.length(); i >= 0; i -= 2) { + for (int i = text.size(); i >= 0; i -= 2) { QCOMPARE(textInput->text(), text.mid(0, i)); QTest::keyClick(&window, Qt::Key_Backspace, Qt::NoModifier); } @@ -5930,7 +5942,7 @@ void tst_qquicktextinput::backspaceSurrogatePairs() textInput->setText(text); textInput->setCursorPosition(0); - for (int i = 0; i < text.length(); i += 2) { + for (int i = 0; i < text.size(); i += 2) { QCOMPARE(textInput->text(), text.mid(i)); QTest::keyClick(&window, Qt::Key_Delete, Qt::NoModifier); } @@ -6417,9 +6429,9 @@ void tst_qquicktextinput::setInputMask() // inputMaskChanged signal QString unescapedMask = mask; // mask is escaped, because '\' is also escape in a JS string unescapedMask.replace(QLatin1String("\\\\"), QLatin1String("\\")); // simple unescape - QSignalSpy spy(textInput, SIGNAL(inputMaskChanged(const QString &))); + QSignalSpy spy(textInput, SIGNAL(inputMaskChanged(QString))); textInput->setInputMask(unescapedMask); - QCOMPARE(spy.count(), 0); + QCOMPARE(spy.size(), 0); // then either insert using insert() or keyboard if (insert_text) { @@ -6433,7 +6445,7 @@ void tst_qquicktextinput::setInputMask() QVERIFY(textInput->hasActiveFocus()); QTest::keyClick(&window, Qt::Key_Home); - for (int i = 0; i < input.length(); i++) + for (int i = 0; i < input.size(); i++) QTest::keyClick(&window, input.at(i).toLatin1()); } @@ -6713,8 +6725,8 @@ class TestValidator : public QValidator public: TestValidator(QObject *parent = nullptr) : QValidator(parent) { } - State validate(QString &input, int &) const { return input == QStringLiteral("ok") ? Acceptable : Intermediate; } - void fixup(QString &input) const { input = QStringLiteral("ok"); } + State validate(QString &input, int &) const override { return input == QStringLiteral("ok") ? Acceptable : Intermediate; } + void fixup(QString &input) const override { input = QStringLiteral("ok"); } }; void tst_qquicktextinput::fixup() @@ -6913,7 +6925,7 @@ void tst_qquicktextinput::ensureVisible() input->ensureVisible(input->length()); - QCOMPARE(cursorSpy.count(), 1); + QCOMPARE(cursorSpy.size(), 1); QCOMPARE(input->boundingRect().x(), input->width() - line.naturalTextWidth()); QCOMPARE(input->boundingRect().y(), qreal(0)); @@ -7023,6 +7035,209 @@ void tst_qquicktextinput::QTBUG_77814_InsertRemoveNoSelection() QCOMPARE(textInput->selectedText(), QString()); } +void tst_qquicktextinput::checkCursorDelegateWhenPaddingChanged() +{ + QQuickView view; + view.setSource(testFileUrl("checkCursorDelegateWhenPaddingChanged.qml")); + view.show(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + + QQuickTextInput *textInput = view.rootObject()->findChild<QQuickTextInput *>("textInput"); + QVERIFY(textInput); + + QQuickItem *cursorDelegate = textInput->findChild<QQuickItem *>("cursorDelegate"); + QVERIFY(cursorDelegate); + + QCOMPARE(cursorDelegate->x(), textInput->leftPadding()); + QCOMPARE(cursorDelegate->y(), textInput->topPadding()); + + textInput->setPadding(5); + QCOMPARE(cursorDelegate->x(), textInput->leftPadding()); + QCOMPARE(cursorDelegate->y(), textInput->topPadding()); + + textInput->setTopPadding(10); + QCOMPARE(cursorDelegate->x(), textInput->leftPadding()); + QCOMPARE(cursorDelegate->y(), textInput->topPadding()); + + textInput->setLeftPadding(10); + QCOMPARE(cursorDelegate->x(), textInput->leftPadding()); + QCOMPARE(cursorDelegate->y(), textInput->topPadding()); +} + +/*! + Verifies that TextInput items get focus in/out events with the + correct focus reason set. + + Up and Down keys translates to Backtab and Tab focus reasons. + + See QTBUG-75862. +*/ +void tst_qquicktextinput::focusReason() +{ + QQuickView view; + view.setSource(testFileUrl("focusReason.qml")); + + QQuickTextInput *first = view.rootObject()->findChild<QQuickTextInput *>("first"); + QQuickTextInput *second = view.rootObject()->findChild<QQuickTextInput *>("second"); + QQuickTextInput *third = view.rootObject()->findChild<QQuickTextInput *>("third"); + QVERIFY(first && second && third); + + class FocusEventFilter : public QObject + { + public: + using QObject::QObject; + + QHash<QObject*, Qt::FocusReason> lastFocusReason; + protected: + bool eventFilter(QObject *o, QEvent *e) override + { + if (e->type() == QEvent::FocusIn || e->type() == QEvent::FocusOut) { + QFocusEvent *fe = static_cast<QFocusEvent*>(e); + lastFocusReason[o] = fe->reason(); + } + return QObject::eventFilter(o, e); + } + } eventFilter; + first->installEventFilter(&eventFilter); + second->installEventFilter(&eventFilter); + third->installEventFilter(&eventFilter); + + view.show(); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QCOMPARE(qApp->focusObject(), first); + // on some platforms we don't get ActiveWindowFocusReason; tolerate this, + // it's not what we are testing in this test + if (eventFilter.lastFocusReason[first] != Qt::ActiveWindowFocusReason) { + QEXPECT_FAIL("", qPrintable(QString("No window activation event on the %1 platform") + .arg(QGuiApplication::platformName())), + Continue); + } + QCOMPARE(eventFilter.lastFocusReason[first], Qt::ActiveWindowFocusReason); + + QTest::mouseClick(&view, Qt::LeftButton, {}, + (second->boundingRect().center() + second->position()).toPoint()); + QTRY_COMPARE(qApp->focusObject(), second); + QCOMPARE(eventFilter.lastFocusReason[first], Qt::MouseFocusReason); + QCOMPARE(eventFilter.lastFocusReason[second], Qt::MouseFocusReason); + + QTest::keyClick(&view, Qt::Key_Tab); + QCOMPARE(qApp->focusObject(), third); + QCOMPARE(eventFilter.lastFocusReason[second], Qt::TabFocusReason); + QCOMPARE(eventFilter.lastFocusReason[third], Qt::TabFocusReason); + + QTest::keyClick(&view, Qt::Key_Backtab); + QCOMPARE(qApp->focusObject(), second); + QCOMPARE(eventFilter.lastFocusReason[third], Qt::BacktabFocusReason); + QCOMPARE(eventFilter.lastFocusReason[second], Qt::BacktabFocusReason); + + QTest::keyClick(&view, Qt::Key_Up); + QCOMPARE(qApp->focusObject(), first); + QCOMPARE(eventFilter.lastFocusReason[second], Qt::BacktabFocusReason); + QCOMPARE(eventFilter.lastFocusReason[first], Qt::BacktabFocusReason); + + QTest::keyClick(&view, Qt::Key_Down); + QCOMPARE(qApp->focusObject(), second); + QCOMPARE(eventFilter.lastFocusReason[second], Qt::TabFocusReason); + QCOMPARE(eventFilter.lastFocusReason[first], Qt::TabFocusReason); +} + +void tst_qquicktextinput::touchscreenDoesNotSelect_data() +{ + QTest::addColumn<QUrl>("src"); + QTest::addColumn<bool>("expectDefaultSelectByMouse"); + QTest::addColumn<bool>("overrideSelectByMouseFalse"); + QTest::newRow("new default") << testFileUrl("mouseselectionmode_default.qml") << true << false; + QTest::newRow("new override") << testFileUrl("mouseselectionmode_default.qml") << true << true; +#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) + QTest::newRow("old default") << testFileUrl("mouseselection_old_default.qml") << false << false; +#endif +} + +void tst_qquicktextinput::touchscreenDoesNotSelect() +{ + QFETCH(QUrl, src); + QFETCH(bool, expectDefaultSelectByMouse); + QFETCH(bool, overrideSelectByMouseFalse); + + QQuickView window; + QVERIFY(QQuickTest::showView(window, src)); + + QQuickTextInput *textInputObject = qobject_cast<QQuickTextInput *>(window.rootObject()); + QVERIFY(textInputObject); + QCOMPARE(textInputObject->selectByMouse(), expectDefaultSelectByMouse); + if (overrideSelectByMouseFalse) + textInputObject->setSelectByMouse(overrideSelectByMouseFalse); + + // press-drag-and-release from x1 to x2 + int x1 = 10; + int x2 = 70; + int y = textInputObject->height() / 2; + QTest::touchEvent(&window, touchscreen.data()).press(0, QPoint(x1,y), &window); + QTest::touchEvent(&window, touchscreen.data()).move(0, QPoint(x2,y), &window); + QTest::touchEvent(&window, touchscreen.data()).release(0, QPoint(x2,y), &window); + QQuickTouchUtils::flush(&window); + QVERIFY(textInputObject->selectedText().isEmpty()); + + // select all text (which moves the cursor to the end), then tap: + // with old API, it deselects, and moves the cursor (QTBUG-116606) + // with new API, it remains selected, and the cursor remains at the end + textInputObject->selectAll(); + const int cursorPos = textInputObject->cursorPosition(); + QTest::touchEvent(&window, touchscreen.data()).press(0, QPoint(x2,y), &window); + QTest::touchEvent(&window, touchscreen.data()).release(0, QPoint(x2,y), &window); + QQuickTouchUtils::flush(&window); + QCOMPARE(textInputObject->selectedText().isEmpty(), !expectDefaultSelectByMouse); + if (expectDefaultSelectByMouse) + QCOMPARE(textInputObject->cursorPosition(), cursorPos); + else + QCOMPARE_NE(textInputObject->cursorPosition(), cursorPos); +} + +void tst_qquicktextinput::touchscreenSetsFocusAndMovesCursor() +{ + SKIP_IF_NO_WINDOW_ACTIVATION + + QQuickView window; + QVERIFY(QQuickTest::showView(window, testFileUrl("twoInAColumn.qml"))); + window.requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(&window)); + + QQuickTextInput *top = window.rootObject()->findChild<QQuickTextInput*>("top"); + QVERIFY(top); + QQuickTextInput *bottom = window.rootObject()->findChild<QQuickTextInput*>("bottom"); + QVERIFY(bottom); + + // tap the bottom field + int x1 = 10; + int y = bottom->position().y() + bottom->height() / 2; + QTest::touchEvent(&window, touchscreen.data()).press(0, QPoint(x1,y), &window); + QQuickTouchUtils::flush(&window); + QCOMPARE(qApp->focusObject(), bottom); + // text cursor is at the end by default, on press + const auto len = bottom->text().size(); + QCOMPARE(bottom->cursorPosition(), len); + // so typing a character appends it + QVERIFY(!bottom->text().endsWith('q')); + QTest::keyClick(&window, Qt::Key_Q); + QVERIFY(bottom->text().endsWith('q')); + QCOMPARE(bottom->text().size(), len + 1); + QTest::touchEvent(&window, touchscreen.data()).release(0, QPoint(x1,y), &window); + QQuickTouchUtils::flush(&window); + // the cursor gets moved on release, as long as TextInput's grab wasn't stolen (e.g. by Flickable) + QVERIFY(bottom->cursorPosition() < 5); + + // press-drag-and-release from x1 to x2 on the top field + int x2 = 70; + y = top->position().y() + top->height() / 2; + QTest::touchEvent(&window, touchscreen.data()).press(0, QPoint(x1,y), &window); + QTest::touchEvent(&window, touchscreen.data()).move(0, QPoint(x2,y), &window); + QTest::touchEvent(&window, touchscreen.data()).release(0, QPoint(x2,y), &window); + QQuickTouchUtils::flush(&window); + QCOMPARE(qApp->focusObject(), top); + QVERIFY(top->selectedText().isEmpty()); +} + QTEST_MAIN(tst_qquicktextinput) #include "tst_qquicktextinput.moc" |