From 8257cf75c68bd3d2a2af0cd8260e3cc96f5d0df4 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Mon, 30 Nov 2020 12:02:29 +0100 Subject: Refactor QQuickTextInput test to use QKeyCombination Makes the code typesafe, simplifies the data structures, and fixes a compiler warning from implicit conversion from/to int. Pick-to: 6.0 Fixes: QTBUG-89356 Change-Id: I52d834811fa7325788fc71ea20f78b4afe3fdb86 Reviewed-by: Mitch Curtis --- .../quick/qquicktextinput/tst_qquicktextinput.cpp | 110 +++++++-------------- 1 file changed, 35 insertions(+), 75 deletions(-) (limited to 'tests/auto/quick/qquicktextinput') diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp index d176da4449..d0e5425c0f 100644 --- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp +++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp @@ -88,22 +88,11 @@ template static T evaluate(QObject *scope, const QString &expressio template int lengthOf(const T (&)[N]) { return N; } struct Key { - Key() = default; - Key(int key, Qt::Key keyAsCharacter) : key(key), character(keyAsCharacter <= 0xffff ? keyAsCharacter : 0) {} - Key(int key, QChar character) : key(key), character(character) {} - - QString toString() const { - if (character == 0) - return {}; - return character; - } - - int key; // a Qt::Key - QChar character; // the character corresponding to the key (if any) + QKeyCombination keyCombination; + QChar character = {}; // the character generated by keyCombination (if any) }; class tst_qquicktextinput : public QQmlDataTest - { Q_OBJECT public: @@ -250,8 +239,6 @@ private slots: void QTBUG_77814_InsertRemoveNoSelection(); private: - void simulateKey(QWindow *, int key); - void simulateKeys(QWindow *window, const QList &keys); #if QT_CONFIG(shortcut) void simulateKeys(QWindow *window, const QKeySequence &sequence); @@ -271,15 +258,12 @@ Q_DECLARE_METATYPE(KeyList) void tst_qquicktextinput::simulateKeys(QWindow *window, const QList &keys) { for (int i = 0; i < keys.count(); ++i) { - const int key = keys.at(i).key & ~Qt::KeyboardModifierMask; - const int modifiers = keys.at(i).key & Qt::KeyboardModifierMask; - const QString text = keys.at(i).toString(); - - QKeyEvent press(QEvent::KeyPress, Qt::Key(key), Qt::KeyboardModifiers(modifiers), text); - QKeyEvent release(QEvent::KeyRelease, Qt::Key(key), Qt::KeyboardModifiers(modifiers), text); - - QGuiApplication::sendEvent(window, &press); - QGuiApplication::sendEvent(window, &release); + const Qt::KeyboardModifiers modifiers = keys.at(i).keyCombination.keyboardModifiers(); + const QChar character = keys.at(i).character; + if (!character.isNull()) + QTest::keyClick(window, character.toLatin1(), modifiers); + else + QTest::keyClick(window, keys.at(i).keyCombination.key(), modifiers); } } @@ -294,7 +278,7 @@ void tst_qquicktextinput::simulateKeys(QWindow *window, const QKeySequence &sequ QList &operator <<(QList &keys, const QKeySequence &sequence) { for (int i = 0; i < sequence.count(); ++i) - keys << Key(sequence[i], QChar()); + keys << Key{sequence[i]}; return keys; } @@ -302,17 +286,8 @@ QList &operator <<(QList &keys, const QKeySequence &sequence) template QList &operator <<(QList &keys, const char (&characters)[N]) { - for (int i = 0; i < N - 1; ++i) { - int key = QTest::asciiToKey(characters[i]); - QChar character = QLatin1Char(characters[i]); - keys << Key(key, character); - } - return keys; -} - -QList &operator <<(QList &keys, Qt::Key key) -{ - keys << Key(key, QChar()); + for (int i = 0; i < N - 1; ++i) + keys << Key{{}, QLatin1Char(characters[i])}; return keys; } @@ -1934,9 +1909,7 @@ void tst_qquicktextinput::maxLength() QTRY_VERIFY(textinputObject->hasActiveFocus()); for (int i=0; i<20; i++) { QTRY_COMPARE(textinputObject->text().length(), qMin(i,10)); - //simulateKey(&window, Qt::Key_A); - QTest::keyPress(&window, Qt::Key_A); - QTest::keyRelease(&window, Qt::Key_A, Qt::NoModifier); + QTest::keyClick(&window, Qt::Key_A); } } @@ -1960,9 +1933,7 @@ void tst_qquicktextinput::masks() QCOMPARE(textinputObject->getText(0, qMin(i, 8)), QString(qMin(i, 8), 'a')); QCOMPARE(textinputObject->getText(qMin(i, 8), 8), QString(8 - qMin(i, 8), ' ')); QCOMPARE(i>=4, textinputObject->hasAcceptableInput()); - //simulateKey(&window, Qt::Key_A); - QTest::keyPress(&window, Qt::Key_A); - QTest::keyRelease(&window, Qt::Key_A, Qt::NoModifier); + QTest::keyClick(&window, Qt::Key_A); } } @@ -2536,39 +2507,39 @@ void tst_qquicktextinput::navigation() QVERIFY(input != nullptr); input->setCursorPosition(0); QTRY_VERIFY(input->hasActiveFocus()); - simulateKey(&window, Qt::Key_Left); + QTest::keyClick(&window, Qt::Key_Left); QVERIFY(!input->hasActiveFocus()); - simulateKey(&window, Qt::Key_Right); + 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()); QVERIFY(input->selectionStart() != input->selectionEnd()); - simulateKey(&window, Qt::Key_Right); + QTest::keyClick(&window, Qt::Key_Right); QCOMPARE(input->selectionStart(), input->selectionEnd()); QCOMPARE(input->selectionStart(), input->text().length()); QVERIFY(input->hasActiveFocus()); - simulateKey(&window, Qt::Key_Right); + QTest::keyClick(&window, Qt::Key_Right); QVERIFY(!input->hasActiveFocus()); - simulateKey(&window, Qt::Key_Left); + QTest::keyClick(&window, Qt::Key_Left); QVERIFY(input->hasActiveFocus()); // Up and Down should NOT do Home/End, even on OS X (QTBUG-10438). input->setCursorPosition(2); QCOMPARE(input->cursorPosition(),2); - simulateKey(&window, Qt::Key_Up); + QTest::keyClick(&window, Qt::Key_Up); QCOMPARE(input->cursorPosition(),2); - simulateKey(&window, Qt::Key_Down); + QTest::keyClick(&window, Qt::Key_Down); QCOMPARE(input->cursorPosition(),2); // Test left and right navigation works if the TextInput is empty (QTBUG-25447). input->setText(QString()); QCOMPARE(input->cursorPosition(), 0); - simulateKey(&window, Qt::Key_Right); + QTest::keyClick(&window, Qt::Key_Right); QCOMPARE(input->hasActiveFocus(), false); - simulateKey(&window, Qt::Key_Left); + QTest::keyClick(&window, Qt::Key_Left); QCOMPARE(input->hasActiveFocus(), true); - simulateKey(&window, Qt::Key_Left); + QTest::keyClick(&window, Qt::Key_Left); QCOMPARE(input->hasActiveFocus(), false); } @@ -2590,22 +2561,22 @@ void tst_qquicktextinput::navigation_RTL() QTRY_VERIFY(input->hasActiveFocus()); // move off - simulateKey(&window, Qt::Key_Right); + QTest::keyClick(&window, Qt::Key_Right); QVERIFY(!input->hasActiveFocus()); // move back - simulateKey(&window, Qt::Key_Left); + QTest::keyClick(&window, Qt::Key_Left); QVERIFY(input->hasActiveFocus()); input->setCursorPosition(input->text().length()); QVERIFY(input->hasActiveFocus()); // move off - simulateKey(&window, Qt::Key_Left); + QTest::keyClick(&window, Qt::Key_Left); QVERIFY(!input->hasActiveFocus()); // move back - simulateKey(&window, Qt::Key_Right); + QTest::keyClick(&window, Qt::Key_Right); QVERIFY(input->hasActiveFocus()); } @@ -3337,11 +3308,11 @@ void tst_qquicktextinput::readOnly() QVERIFY(input->isReadOnly()); QVERIFY(!input->isCursorVisible()); QString initial = input->text(); - for (int k=Qt::Key_0; k<=Qt::Key_Z; k++) - simulateKey(&window, k); - simulateKey(&window, Qt::Key_Return); - simulateKey(&window, Qt::Key_Space); - simulateKey(&window, Qt::Key_Escape); + for (int k = Qt::Key_0; k <= Qt::Key_Z; k++) + QTest::keyClick(&window, Qt::Key(k)); + QTest::keyClick(&window, Qt::Key_Return); + QTest::keyClick(&window, Qt::Key_Space); + QTest::keyClick(&window, Qt::Key_Escape); QCOMPARE(input->text(), initial); input->setCursorPosition(3); @@ -3496,17 +3467,6 @@ void tst_qquicktextinput::passwordEchoDelay() QCOMPARE(input->displayText(), QString(8, fillChar)); } - -void tst_qquicktextinput::simulateKey(QWindow *view, int key) -{ - QKeyEvent press(QKeyEvent::KeyPress, key, {}); - QKeyEvent release(QKeyEvent::KeyRelease, key, {}); - - QGuiApplication::sendEvent(view, &press); - QGuiApplication::sendEvent(view, &release); -} - - void tst_qquicktextinput::focusOnPress() { QString componentStr = @@ -5296,7 +5256,7 @@ void tst_qquicktextinput::keySequence() QVERIFY(QTest::qWaitForWindowActive(&window)); QVERIFY(textInput->hasActiveFocus()); - simulateKey(&window, layoutDirection); + QTest::keyClick(&window, layoutDirection); textInput->select(selectionStart, selectionEnd); @@ -6472,7 +6432,7 @@ void tst_qquicktextinput::setInputMask() QVERIFY(QTest::qWaitForWindowActive(&window)); QVERIFY(textInput->hasActiveFocus()); - simulateKey(&window, Qt::Key_Home); + QTest::keyClick(&window, Qt::Key_Home); for (int i = 0; i < input.length(); i++) QTest::keyClick(&window, input.at(i).toLatin1()); } @@ -6561,7 +6521,7 @@ void tst_qquicktextinput::keypress_inputMask_data() KeyList keys; // selecting all and delete keys << Qt::Key_Home - << Key(Qt::ShiftModifier, Qt::Key_End) + << Key{QKeyCombination(Qt::ShiftModifier, Qt::Key_End)} << Qt::Key_Delete; QTest::newRow("deleting all") << QString("000.000;_") << keys << QString(".") << QString("___.___"); } -- cgit v1.2.3