summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp
diff options
context:
space:
mode:
authorIvan Komissarov <ABBAPOH@me.com>2012-04-14 12:14:22 +0400
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-05-07 22:43:14 +0200
commit0866e48ae25f53eb9b27b0b86d333700f912459f (patch)
treebed2d7932a67f64633999a1f0f92860cf6c46776 /tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp
parent9953393593e885d981331a2e01bc9f2c868b939a (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/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp')
-rw-r--r--tests/auto/widgets/itemviews/qitemdelegate/tst_qitemdelegate.cpp131
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: