aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2020-11-30 12:02:29 +0100
committerVolker Hilsheimer <volker.hilsheimer@qt.io>2020-12-10 17:32:05 +0100
commit01f3bb703e22ef6722cb2d9a04a57fc9d7f2a2bc (patch)
tree4a5917c38b3ff5ed7cbf813b25aadb40aace6048
parenta259a46488e089d22ad8a78c11348d5987d58044 (diff)
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. Fixes: QTBUG-89356 Change-Id: I52d834811fa7325788fc71ea20f78b4afe3fdb86 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io> (cherry picked from commit 8257cf75c68bd3d2a2af0cd8260e3cc96f5d0df4) Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
-rw-r--r--tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp101
1 files changed, 37 insertions, 64 deletions
diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
index c7609623c9..d0e5425c0f 100644
--- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
+++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp
@@ -87,10 +87,12 @@ template <typename T> static T evaluate(QObject *scope, const QString &expressio
template<typename T, int N> int lengthOf(const T (&)[N]) { return N; }
-typedef QPair<int, QChar> Key;
+struct Key {
+ QKeyCombination keyCombination;
+ QChar character = {}; // the character generated by keyCombination (if any)
+};
class tst_qquicktextinput : public QQmlDataTest
-
{
Q_OBJECT
public:
@@ -237,8 +239,6 @@ private slots:
void QTBUG_77814_InsertRemoveNoSelection();
private:
- void simulateKey(QWindow *, int key);
-
void simulateKeys(QWindow *window, const QList<Key> &keys);
#if QT_CONFIG(shortcut)
void simulateKeys(QWindow *window, const QKeySequence &sequence);
@@ -258,15 +258,12 @@ Q_DECLARE_METATYPE(KeyList)
void tst_qquicktextinput::simulateKeys(QWindow *window, const QList<Key> &keys)
{
for (int i = 0; i < keys.count(); ++i) {
- const int key = keys.at(i).first & ~Qt::KeyboardModifierMask;
- const int modifiers = keys.at(i).first & Qt::KeyboardModifierMask;
- const QString text = !keys.at(i).second.isNull() ? QString(keys.at(i).second) : QString();
-
- 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);
}
}
@@ -281,7 +278,7 @@ void tst_qquicktextinput::simulateKeys(QWindow *window, const QKeySequence &sequ
QList<Key> &operator <<(QList<Key> &keys, const QKeySequence &sequence)
{
for (int i = 0; i < sequence.count(); ++i)
- keys << Key(sequence[i], QChar());
+ keys << Key{sequence[i]};
return keys;
}
@@ -289,17 +286,8 @@ QList<Key> &operator <<(QList<Key> &keys, const QKeySequence &sequence)
template <int N> QList<Key> &operator <<(QList<Key> &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<Key> &operator <<(QList<Key> &keys, Qt::Key key)
-{
- keys << Key(key, QChar());
+ for (int i = 0; i < N - 1; ++i)
+ keys << Key{{}, QLatin1Char(characters[i])};
return keys;
}
@@ -1921,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);
}
}
@@ -1947,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);
}
}
@@ -2523,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);
}
@@ -2577,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());
}
@@ -3324,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);
@@ -3483,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 =
@@ -5283,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);
@@ -6459,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());
}
@@ -6548,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("___.___");
}