diff options
author | Ivan Komissarov <ABBAPOH@me.com> | 2012-04-14 12:14:22 +0400 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-05-07 22:43:14 +0200 |
commit | 0866e48ae25f53eb9b27b0b86d333700f912459f (patch) | |
tree | bed2d7932a67f64633999a1f0f92860cf6c46776 /tests | |
parent | 9953393593e885d981331a2e01bc9f2c868b939a (diff) |
Fixed applying invalid data from QLineEdit to model
Task-number: QTBUG-2216
Change-Id: I5d1c18aadb380667dedc2bb9f9b7e3dd8178a24c
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Stephen Kelly <stephen.kelly@kdab.com>
Reviewed-by: David Faure <david.faure@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp b/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp index d47eebe03a..538cc7bb4c 100644 --- a/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp +++ b/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp @@ -232,6 +232,8 @@ private slots: void enterKey_data(); void enterKey(); void comboBox(); + void testLineEditValidation_data(); + void testLineEditValidation(); void task257859_finalizeEdit(); void QTBUG4435_keepSelectionOnCheck(); @@ -1413,6 +1415,135 @@ void tst_QItemDelegate::comboBox() QCOMPARE(data.toBool(), false); } +void tst_QItemDelegate::testLineEditValidation_data() +{ + QTest::addColumn<int>("key"); + + QTest::newRow("enter") << int(Qt::Key_Enter); + QTest::newRow("return") << int(Qt::Key_Return); + QTest::newRow("tab") << int(Qt::Key_Tab); + QTest::newRow("backtab") << int(Qt::Key_Backtab); + QTest::newRow("escape") << int(Qt::Key_Escape); +} + +void tst_QItemDelegate::testLineEditValidation() +{ + QFETCH(int, key); + + struct TestDelegate : public QItemDelegate + { + virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const + { + Q_UNUSED(option); + Q_UNUSED(index); + + QLineEdit *editor = new QLineEdit(parent); + QRegularExpression re("\\w+,\\w+"); // two words separated by a comma + editor->setValidator(new QRegularExpressionValidator(re, editor)); + editor->setObjectName(QStringLiteral("TheEditor")); + return editor; + } + } delegate; + + QStandardItemModel model; + // need a couple of dummy items to test tab and back tab + model.appendRow(new QStandardItem(QStringLiteral("dummy"))); + QStandardItem *item = new QStandardItem(QStringLiteral("abc,def")); + model.appendRow(item); + model.appendRow(new QStandardItem(QStringLiteral("dummy"))); + + QListView view; + view.setModel(&model); + view.setItemDelegate(&delegate); + view.show(); + view.setFocus(); + QApplication::setActiveWindow(&view); + QVERIFY(QTest::qWaitForWindowActive(&view)); + + QList<QLineEdit *> lineEditors; + QPointer<QLineEdit> editor; + QPersistentModelIndex index = model.indexFromItem(item); + + view.setCurrentIndex(index); + view.edit(index); + QTest::qWait(30); + + lineEditors = view.findChildren<QLineEdit *>(QStringLiteral("TheEditor")); + QCOMPARE(lineEditors.count(), 1); + editor = lineEditors.at(0); + editor->clear(); + + // first try to set a valid text + QTest::keyClicks(editor, QStringLiteral("foo,bar")); + QTest::qWait(30); + + // close the editor + QTest::keyClick(editor, Qt::Key(key)); + QTest::qWait(30); + + QVERIFY(editor.isNull()); + if (key != Qt::Key_Escape) + QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("foo,bar")); + else + QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("abc,def")); + + // now an invalid (but partially matching) text + view.setCurrentIndex(index); + view.edit(index); + QTest::qWait(30); + + lineEditors = view.findChildren<QLineEdit *>(QStringLiteral("TheEditor")); + QCOMPARE(lineEditors.count(), 1); + editor = lineEditors.at(0); + editor->clear(); + + // edit + QTest::keyClicks(editor, QStringLiteral("foobar")); + QTest::qWait(30); + + // try to close the editor + QTest::keyClick(editor, Qt::Key(key)); + QTest::qWait(30); + + if (key != Qt::Key_Escape) { + QVERIFY(!editor.isNull()); + QCOMPARE(qApp->focusWidget(), editor.data()); + QCOMPARE(editor->text(), QStringLiteral("foobar")); + QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("foo,bar")); + } else { + QVERIFY(editor.isNull()); + QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("abc,def")); + } + + // reset the view to forcibly close the editor + view.reset(); + QTest::qWait(30); + + // set a valid text again + view.setCurrentIndex(index); + view.edit(index); + QTest::qWait(30); + + lineEditors = view.findChildren<QLineEdit *>(QStringLiteral("TheEditor")); + QCOMPARE(lineEditors.count(), 1); + editor = lineEditors.at(0); + editor->clear(); + + // set a valid text + QTest::keyClicks(editor, QStringLiteral("gender,bender")); + QTest::qWait(30); + + // close the editor + QTest::keyClick(editor, Qt::Key(key)); + QTest::qWait(30); + + QVERIFY(editor.isNull()); + if (key != Qt::Key_Escape) + QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("gender,bender")); + else + QCOMPARE(item->data(Qt::DisplayRole).toString(), QStringLiteral("abc,def")); +} + // ### _not_ covered: |