summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-02-08 15:48:29 +0100
committerLiang Qi <liang.qi@qt.io>2017-02-08 15:49:18 +0100
commitdd756011da13b95fdb630a1bbb90234f1e60f415 (patch)
treea6259b1e9b6463108796ce912e3d1752e301505f /tests/auto/widgets
parent0c50edbe84914469973a3b10e0170023ccdd66fe (diff)
parentb6bf2a33f4c33a212da7b58a049b3b5b20b3f327 (diff)
Merge remote-tracking branch 'origin/5.8' into 5.9
Conflicts: configure.json mkspecs/win32-icc/qmake.conf Change-Id: Ibf40546b024d644c7d9ed490bee15b82597f4d3f
Diffstat (limited to 'tests/auto/widgets')
-rw-r--r--tests/auto/widgets/dialogs/qinputdialog/qinputdialog.pro2
-rw-r--r--tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp71
-rw-r--r--tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp57
3 files changed, 129 insertions, 1 deletions
diff --git a/tests/auto/widgets/dialogs/qinputdialog/qinputdialog.pro b/tests/auto/widgets/dialogs/qinputdialog/qinputdialog.pro
index cc479812a8..9cb14c5350 100644
--- a/tests/auto/widgets/dialogs/qinputdialog/qinputdialog.pro
+++ b/tests/auto/widgets/dialogs/qinputdialog/qinputdialog.pro
@@ -1,4 +1,4 @@
CONFIG += testcase
TARGET = tst_qinputdialog
-QT += widgets testlib
+QT += widgets-private testlib
SOURCES += tst_qinputdialog.cpp
diff --git a/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp b/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp
index bbb6883238..0ea9e0259f 100644
--- a/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp
+++ b/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp
@@ -35,6 +35,7 @@
#include <QComboBox>
#include <QDialogButtonBox>
#include <qinputdialog.h>
+#include <QtWidgets/private/qdialog_p.h>
class tst_QInputDialog : public QObject
{
@@ -52,6 +53,7 @@ private slots:
void getInt();
void getDouble_data();
void getDouble();
+ void taskQTBUG_54693_crashWhenParentIsDeletedWhileDialogIsOpen();
void task255502getDouble();
void getText_data();
void getText();
@@ -311,6 +313,75 @@ void tst_QInputDialog::getDouble()
delete parent;
}
+namespace {
+class SelfDestructParent : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit SelfDestructParent(int delay = 100)
+ : QWidget(Q_NULLPTR)
+ {
+ QTimer::singleShot(delay, this, SLOT(deleteLater()));
+ }
+};
+}
+
+void tst_QInputDialog::taskQTBUG_54693_crashWhenParentIsDeletedWhileDialogIsOpen()
+{
+ // getText
+ {
+ QAutoPointer<SelfDestructParent> dialog(new SelfDestructParent);
+ bool ok = true;
+ const QString result = QInputDialog::getText(dialog.get(), "Title", "Label", QLineEdit::Normal, "Text", &ok);
+ QVERIFY(!dialog);
+ QVERIFY(!ok);
+ QVERIFY(result.isNull());
+ }
+
+ // getMultiLineText
+ {
+ QAutoPointer<SelfDestructParent> dialog(new SelfDestructParent);
+ bool ok = true;
+ const QString result = QInputDialog::getMultiLineText(dialog.get(), "Title", "Label", "Text", &ok);
+ QVERIFY(!dialog);
+ QVERIFY(!ok);
+ QVERIFY(result.isNull());
+ }
+
+ // getItem
+ for (int editable = false; editable <= true; ++editable) {
+ QAutoPointer<SelfDestructParent> dialog(new SelfDestructParent);
+ bool ok = true;
+ const QString result = QInputDialog::getItem(dialog.get(), "Title", "Label",
+ QStringList() << "1" << "2", 1, editable, &ok);
+ QVERIFY(!dialog);
+ QVERIFY(!ok);
+ QCOMPARE(result, QLatin1String("2"));
+ }
+
+ // getInt
+ {
+ const int initial = 7;
+ QAutoPointer<SelfDestructParent> dialog(new SelfDestructParent);
+ bool ok = true;
+ const int result = QInputDialog::getInt(dialog.get(), "Title", "Label", initial, -10, +10, 1, &ok);
+ QVERIFY(!dialog);
+ QVERIFY(!ok);
+ QCOMPARE(result, initial);
+ }
+
+ // getDouble
+ {
+ const double initial = 7;
+ QAutoPointer<SelfDestructParent> dialog(new SelfDestructParent);
+ bool ok = true;
+ const double result = QInputDialog::getDouble(dialog.get(), "Title", "Label", initial, -10, +10, 2, &ok);
+ QVERIFY(!dialog);
+ QVERIFY(!ok);
+ QCOMPARE(result, initial);
+ }
+}
+
void tst_QInputDialog::task255502getDouble()
{
parent = new QWidget;
diff --git a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
index 426db265ae..d241296a6b 100644
--- a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
+++ b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
@@ -52,6 +52,7 @@
#include <qstringlistmodel.h>
#include <qsortfilterproxymodel.h>
#include <qproxystyle.h>
+#include <qdialog.h>
static inline void setFrameless(QWidget *w)
{
@@ -149,6 +150,7 @@ private slots:
void QTBUG50535_update_on_new_selection_model();
void testSelectionModelInSyncWithView();
void testClickToSelect();
+ void testDialogAsEditor();
};
class MyAbstractItemDelegate : public QAbstractItemDelegate
@@ -173,6 +175,29 @@ public:
QSize size;
};
+class DialogItemDelegate : public QStyledItemDelegate
+{
+public:
+ DialogItemDelegate() : QStyledItemDelegate() { }
+ QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const
+ {
+ openedEditor = new QDialog(parent);
+ return openedEditor;
+ }
+
+ void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
+ {
+ Q_UNUSED(model)
+ Q_UNUSED(index)
+
+ QDialog *dialog = qobject_cast<QDialog *>(editor);
+ result = static_cast<QDialog::DialogCode>(dialog->result());
+ }
+
+ mutable QDialog::DialogCode result;
+ mutable QDialog *openedEditor;
+};
+
// Testing get/set functions
void tst_QAbstractItemView::getSetCheck()
{
@@ -2156,5 +2181,37 @@ void tst_QAbstractItemView::testClickToSelect()
QCOMPARE(spy.back().front().value<QRect>(), QRect(nearCenterA, QSize(1, 1)));
}
+void tst_QAbstractItemView::testDialogAsEditor()
+{
+ DialogItemDelegate delegate;
+
+ QStandardItemModel model;
+ model.appendRow(new QStandardItem(QStringLiteral("editme")));
+
+ QListView view;
+ view.setItemDelegate(&delegate);
+ view.setModel(&model);
+ view.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&view));
+
+ view.edit(model.index(0,0));
+
+ QVERIFY(QTest::qWaitForWindowExposed(delegate.openedEditor));
+
+ delegate.openedEditor->reject();
+ QApplication::processEvents();
+
+ QCOMPARE(delegate.result, QDialog::Rejected);
+
+ view.edit(model.index(0,0));
+
+ QVERIFY(QTest::qWaitForWindowExposed(delegate.openedEditor));
+
+ delegate.openedEditor->accept();
+ QApplication::processEvents();
+
+ QCOMPARE(delegate.result, QDialog::Accepted);
+}
+
QTEST_MAIN(tst_QAbstractItemView)
#include "tst_qabstractitemview.moc"