diff options
Diffstat (limited to 'tests/auto/widgets')
24 files changed, 625 insertions, 27 deletions
diff --git a/tests/auto/widgets/dialogs/qdialog/qdialog.pro b/tests/auto/widgets/dialogs/qdialog/qdialog.pro index 72a2dc52b3..c7917e8ff6 100644 --- a/tests/auto/widgets/dialogs/qdialog/qdialog.pro +++ b/tests/auto/widgets/dialogs/qdialog/qdialog.pro @@ -1,5 +1,5 @@ CONFIG += testcase CONFIG += parallel_test TARGET = tst_qdialog -QT += widgets testlib +QT += widgets testlib gui-private core-private SOURCES += tst_qdialog.cpp diff --git a/tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp b/tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp index 6d847086d9..1aab794e1b 100644 --- a/tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp +++ b/tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp @@ -49,8 +49,10 @@ #include <qstyle.h> #include <QVBoxLayout> #include <QSizeGrip> - - +#include <QDesktopWidget> +#include <private/qguiapplication_p.h> +#include <qpa/qplatformtheme.h> +#include <qpa/qplatformtheme_p.h> QT_FORWARD_DECLARE_CLASS(QDialog) @@ -82,6 +84,7 @@ private slots: #endif void setVisible(); void reject(); + void snapToDefaultButton(); private: QDialog *testWidget; @@ -554,6 +557,32 @@ void tst_QDialog::reject() QCOMPARE(dialog.called, 4); } +void tst_QDialog::snapToDefaultButton() +{ +#ifdef QT_NO_CURSOR + QSKIP("Test relies on there being a cursor"); +#else + QPoint topLeftPos = QApplication::desktop()->availableGeometry().topLeft(); + topLeftPos = QPoint(topLeftPos.x() + 100, topLeftPos.y() + 100); + QPoint startingPos(topLeftPos.x() + 250, topLeftPos.y() + 250); + QCursor::setPos(startingPos); + QVERIFY(QCursor::pos() == startingPos); + QDialog dialog; + QPushButton *button = new QPushButton(&dialog); + button->setDefault(true); + dialog.setGeometry(QRect(topLeftPos, QSize(200, 200))); + dialog.show(); + QVERIFY(QTest::qWaitForWindowExposed(&dialog)); + if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme()) { + if (theme->themeHint(QPlatformTheme::DialogSnapToDefaultButton).toBool()) { + QPoint localPos = button->mapFromGlobal(QCursor::pos()); + QVERIFY(button->rect().contains(localPos)); + } else { + QVERIFY(startingPos == QCursor::pos()); + } + } +#endif // !QT_NO_CURSOR +} QTEST_MAIN(tst_QDialog) #include "tst_qdialog.moc" diff --git a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp index 65d36247f6..81b69f6b89 100644 --- a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp +++ b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp @@ -612,6 +612,8 @@ void tst_QFiledialog::defaultSuffix() QCOMPARE(fd.defaultSuffix(), QString()); fd.setDefaultSuffix("txt"); QCOMPARE(fd.defaultSuffix(), QString("txt")); + fd.setDefaultSuffix(".txt"); + QCOMPARE(fd.defaultSuffix(), QString("txt")); fd.setDefaultSuffix(QString()); QCOMPARE(fd.defaultSuffix(), QString()); } @@ -1334,6 +1336,38 @@ QString saveName(QWidget *, const QString &, const QString &, const QString &, Q return "saveName"; } +QT_BEGIN_NAMESPACE +typedef QUrl (*_qt_filedialog_existing_directory_url_hook)(QWidget *parent, const QString &caption, const QUrl &dir, QFileDialog::Options options, const QStringList &supportedSchemes); +extern Q_WIDGETS_EXPORT _qt_filedialog_existing_directory_url_hook qt_filedialog_existing_directory_url_hook; +QT_END_NAMESPACE +QUrl existingUrl(QWidget *, const QString &, const QUrl &, QFileDialog::Options, const QStringList &) { + return QUrl("http://dirUrl"); +} + +QT_BEGIN_NAMESPACE +typedef QUrl (*_qt_filedialog_open_file_url_hook)(QWidget * parent, const QString &caption, const QUrl &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options, const QStringList &supportedSchemes); +extern Q_WIDGETS_EXPORT _qt_filedialog_open_file_url_hook qt_filedialog_open_file_url_hook; +QT_END_NAMESPACE +QUrl openUrl(QWidget *, const QString &, const QUrl &, const QString &, QString *, QFileDialog::Options, const QStringList &) { + return QUrl("http://openUrl"); +} + +QT_BEGIN_NAMESPACE +typedef QList<QUrl> (*_qt_filedialog_open_file_urls_hook)(QWidget * parent, const QString &caption, const QUrl &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options, const QStringList &supportedSchemes); +extern Q_WIDGETS_EXPORT _qt_filedialog_open_file_urls_hook qt_filedialog_open_file_urls_hook; +QT_END_NAMESPACE +QList<QUrl> openUrls(QWidget *, const QString &, const QUrl &, const QString &, QString *, QFileDialog::Options, const QStringList &) { + return QList<QUrl>() << QUrl("http://openUrls"); +} + +QT_BEGIN_NAMESPACE +typedef QUrl (*_qt_filedialog_save_file_url_hook)(QWidget * parent, const QString &caption, const QUrl &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options, const QStringList &supportedSchemes); +extern Q_WIDGETS_EXPORT _qt_filedialog_save_file_url_hook qt_filedialog_save_file_url_hook; +QT_END_NAMESPACE +QUrl saveUrl(QWidget *, const QString &, const QUrl &, const QString &, QString *, QFileDialog::Options, const QStringList &) { + return QUrl("http://saveUrl"); +} + void tst_QFiledialog::hooks() { @@ -1346,6 +1380,20 @@ void tst_QFiledialog::hooks() QCOMPARE(QFileDialog::getOpenFileName(), QString("openName")); QCOMPARE(QFileDialog::getOpenFileNames(), QStringList("openNames")); QCOMPARE(QFileDialog::getSaveFileName(), QString("saveName")); + QCOMPARE(QFileDialog::getExistingDirectoryUrl(), QUrl::fromLocalFile("dir")); + QCOMPARE(QFileDialog::getOpenFileUrl(), QUrl::fromLocalFile("openName")); + QCOMPARE(QFileDialog::getOpenFileUrls(), QList<QUrl>() << QUrl::fromLocalFile("openNames")); + QCOMPARE(QFileDialog::getSaveFileUrl(), QUrl::fromLocalFile("saveName")); + + qt_filedialog_existing_directory_url_hook = &existingUrl; + qt_filedialog_save_file_url_hook = &saveUrl; + qt_filedialog_open_file_url_hook = &openUrl; + qt_filedialog_open_file_urls_hook = &openUrls; + + QCOMPARE(QFileDialog::getExistingDirectoryUrl(), QUrl("http://dirUrl")); + QCOMPARE(QFileDialog::getOpenFileUrl(), QUrl("http://openUrl")); + QCOMPARE(QFileDialog::getOpenFileUrls(), QList<QUrl>() << QUrl("http://openUrls")); + QCOMPARE(QFileDialog::getSaveFileUrl(), QUrl("http://saveUrl")); } #ifdef Q_OS_UNIX diff --git a/tests/auto/widgets/graphicsview/graphicsview.pro b/tests/auto/widgets/graphicsview/graphicsview.pro index 9955e45b64..dce3c6dda9 100644 --- a/tests/auto/widgets/graphicsview/graphicsview.pro +++ b/tests/auto/widgets/graphicsview/graphicsview.pro @@ -26,7 +26,7 @@ SUBDIRS=\ qgraphicsscene \ qgraphicssceneindex \ -# These tests require the cleanlooks style -!contains(styles, cleanlooks):SUBDIRS -= \ +# These tests require the fusion style +!contains(styles, fusion):SUBDIRS -= \ qgraphicsproxywidget \ qgraphicswidget \ diff --git a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro index 3eb18e61eb..8e8c0708a3 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro +++ b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro @@ -3,4 +3,3 @@ TARGET = tst_qgraphicsanchorlayout QT += widgets widgets-private testlib QT += core-private gui-private SOURCES += tst_qgraphicsanchorlayout.cpp -CONFIG += parallel_test diff --git a/tests/auto/widgets/graphicsview/qgraphicseffectsource/qgraphicseffectsource.pro b/tests/auto/widgets/graphicsview/qgraphicseffectsource/qgraphicseffectsource.pro index 4fe3405d11..550d3debf7 100644 --- a/tests/auto/widgets/graphicsview/qgraphicseffectsource/qgraphicseffectsource.pro +++ b/tests/auto/widgets/graphicsview/qgraphicseffectsource/qgraphicseffectsource.pro @@ -5,4 +5,3 @@ QT += widgets widgets-private testlib QT += core-private gui-private SOURCES += tst_qgraphicseffectsource.cpp -CONFIG += parallel_test diff --git a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/qgraphicsgridlayout.pro b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/qgraphicsgridlayout.pro index 5796cbfd73..e49139a8ad 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/qgraphicsgridlayout.pro +++ b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/qgraphicsgridlayout.pro @@ -3,4 +3,3 @@ TARGET = tst_qgraphicsgridlayout QT += widgets testlib SOURCES += tst_qgraphicsgridlayout.cpp -CONFIG += parallel_test diff --git a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp index 8c8f27d635..1ffb5c3b5c 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp @@ -126,6 +126,7 @@ private slots: void spanningItem2x3_data(); void spanningItem2x3(); void spanningItem(); + void spanAcrossEmptyRow(); void heightForWidth(); void widthForHeight(); void heightForWidthWithSpanning(); @@ -3192,23 +3193,19 @@ void tst_QGraphicsGridLayout::heightForWidthWithSpanning() QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(-1, -1)), QSizeF(1, 1)); QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(-1, -1)), QSizeF(200, 100)); - QEXPECT_FAIL("", "Due to an old bug this wrongly returns QWIDGETSIZE_MAX", Continue); QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(-1, -1)), QSizeF(30000, 30000)); QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(200, -1)), QSizeF(200, 100)); QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(200, -1)), QSizeF(200, 100)); - QEXPECT_FAIL("", "Due to an old bug this wrongly returns QWIDGETSIZE_MAX", Continue); QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 100)); QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(2, -1)), QSizeF(2, 10000)); QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(2, -1)), QSizeF(2, 10000)); - QEXPECT_FAIL("", "Due to an old bug this wrongly returns QWIDGETSIZE_MAX", Continue); QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(2, -1)), QSizeF(2, 10000)); QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize, QSizeF(200, -1)), QSizeF(200, 100)); QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize, QSizeF(200, -1)), QSizeF(200, 100)); - QEXPECT_FAIL("", "Due to an old bug this wrongly returns QWIDGETSIZE_MAX", Continue); - QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 10000)); + QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize, QSizeF(200, -1)), QSizeF(200, 100)); } Q_DECLARE_METATYPE(QSizePolicy::Policy) @@ -3364,6 +3361,37 @@ void tst_QGraphicsGridLayout::spanningItem() QCOMPARE(layout->maximumSize(), QSizeF(160,80)); } +void tst_QGraphicsGridLayout::spanAcrossEmptyRow() +{ + QGraphicsWidget *form = new QGraphicsWidget(0, Qt::Window); + QGraphicsGridLayout *layout = new QGraphicsGridLayout(form); + layout->setContentsMargins(0, 0, 0, 0); + layout->setSpacing(0); + RectWidget *w1 = new RectWidget; + RectWidget *w2 = new RectWidget; + RectWidget *w3 = new RectWidget; + + QSizeF size(10, 10); + for (int i = 0; i < 3; ++i) { + w1->setSizeHint((Qt::SizeHint)i, size); + w2->setSizeHint((Qt::SizeHint)i, size); + w3->setSizeHint((Qt::SizeHint)i, size); + size+=size; //[(10,10), (20,20), (40,40)] + } + layout->addItem(w1, 0, 0, 1, 1); + layout->addItem(w2, 0, 1, 1, 2); + layout->addItem(w3, 0, 99, 1, 1); + + form->resize(60,20); + QCOMPARE(w1->geometry(), QRectF( 0, 0, 20, 20)); + QCOMPARE(w2->geometry(), QRectF(20, 0, 20, 20)); + QCOMPARE(w3->geometry(), QRectF(40, 0, 20, 20)); + + QCOMPARE(layout->effectiveSizeHint(Qt::MinimumSize), QSizeF(30, 10)); + QCOMPARE(layout->effectiveSizeHint(Qt::PreferredSize), QSizeF(60, 20)); + QCOMPARE(layout->effectiveSizeHint(Qt::MaximumSize), QSizeF(120, 40)); +} + void tst_QGraphicsGridLayout::stretchAndHeightForWidth() { QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Window); diff --git a/tests/auto/widgets/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro b/tests/auto/widgets/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro index 50a886cece..2bf1a1d676 100644 --- a/tests/auto/widgets/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro +++ b/tests/auto/widgets/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro @@ -2,5 +2,3 @@ CONFIG += testcase TARGET = tst_qgraphicslinearlayout QT += widgets testlib SOURCES += tst_qgraphicslinearlayout.cpp -CONFIG += parallel_test - diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp index c2e6d33adb..bf6d9abb18 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp @@ -808,6 +808,8 @@ void tst_QGraphicsProxyWidget::focusNextPrevChild() if (!hasScene) delete proxy; + if (!hasWidget) + delete widget; } void tst_QGraphicsProxyWidget::focusOutEvent_data() @@ -1393,6 +1395,9 @@ void tst_QGraphicsProxyWidget::sizePolicy() QCOMPARE(proxy.sizePolicy(), proxyPol); else QCOMPARE(proxy.sizePolicy(), widgetPol); + + if (!hasWidget) + delete widget; } } @@ -3154,6 +3159,10 @@ void tst_QGraphicsProxyWidget::actionsContextMenu() void tst_QGraphicsProxyWidget::deleteProxyForChildWidget() { +#if defined(Q_OS_WIN) + QSKIP("This test is crashing on windows, it needs to be fixed. QTBUG-29684"); +#endif + QDialog dialog; dialog.resize(320, 120); dialog.move(80, 40); @@ -3185,6 +3194,9 @@ void tst_QGraphicsProxyWidget::bypassGraphicsProxyWidget_data() void tst_QGraphicsProxyWidget::bypassGraphicsProxyWidget() { +#if defined(Q_OS_MAC) || defined(Q_OS_WIN) + QSKIP("Test case unstable on this platform, QTBUG-33067"); +#endif QFETCH(bool, bypass); QWidget *widget = new QWidget; diff --git a/tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro b/tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro index 5fd3bdf8d6..3d0d73566e 100644 --- a/tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro +++ b/tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro @@ -4,5 +4,4 @@ requires(contains(QT_CONFIG,private_tests)) QT += widgets widgets-private testlib QT += core-private gui-private SOURCES += tst_qgraphicssceneindex.cpp -CONFIG += parallel_test DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro b/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro index 4e119cbcb3..481bc96d96 100644 --- a/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro +++ b/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro @@ -6,5 +6,4 @@ QT += core-private gui-private SOURCES += tst_qgraphicswidget.cpp -linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = lucid ]"):DEFINES+=UBUNTU_LUCID # QTBUG-20778 DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp index 31439e203c..2dd2089f81 100644 --- a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp @@ -3194,9 +3194,6 @@ void tst_QGraphicsWidget::initialShow2() qApp->setActiveWindow(&view); QVERIFY(QTest::qWaitForWindowActive(&view)); -#ifdef UBUNTU_LUCID - QEXPECT_FAIL("", "QTBUG-20778", Abort); -#endif QTRY_COMPARE(widget->repaints, expectedRepaintCount); } diff --git a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp index 548b74f914..09f0161dff 100644 --- a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp +++ b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp @@ -357,8 +357,8 @@ void tst_QHeaderView::getSetCheck() QVERIFY(obj1.defaultSectionSize() >= 0); obj1.setDefaultSectionSize(0); QCOMPARE(0, obj1.defaultSectionSize()); - obj1.setDefaultSectionSize(INT_MAX); - QCOMPARE(INT_MAX, obj1.defaultSectionSize()); + obj1.setDefaultSectionSize(99999); + QCOMPARE(99999, obj1.defaultSectionSize()); // int QHeaderView::minimumSectionSize() // void QHeaderView::setMinimumSectionSize(int) @@ -366,8 +366,8 @@ void tst_QHeaderView::getSetCheck() QVERIFY(obj1.minimumSectionSize() >= 0); obj1.setMinimumSectionSize(0); QCOMPARE(0, obj1.minimumSectionSize()); - obj1.setMinimumSectionSize(INT_MAX); - QCOMPARE(INT_MAX, obj1.minimumSectionSize()); + obj1.setMinimumSectionSize(99999); + QCOMPARE(99999, obj1.minimumSectionSize()); // int QHeaderView::offset() // void QHeaderView::setOffset(int) diff --git a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp index 8e888f06ee..76ac6bcf19 100644 --- a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp +++ b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp @@ -106,6 +106,8 @@ private slots: void moveCursorStrikesBack_data(); void moveCursorStrikesBack(); + void moveCursorBiggerJump(); + void hideRows_data(); void hideRows(); @@ -1354,6 +1356,34 @@ void tst_QTableView::moveCursorStrikesBack() QCOMPARE(newColumn, expectedColumn); } +void tst_QTableView::moveCursorBiggerJump() +{ + QtTestTableModel model(50, 7); + QTableView view; + view.setModel(&model); + view.show(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + + int height = view.horizontalHeader()->height(); + for (int i=0;i<8;i++) + height += view.verticalHeader()->sectionSize(i); + view.resize(view.width(), height); + view.setCurrentIndex(model.index(0,0)); + + QTest::keyClick(&view, Qt::Key_PageDown); + QCOMPARE(view.indexAt(QPoint(0,0)), model.index(1,0)); + QTest::keyClick(&view, Qt::Key_PageDown); + QCOMPARE(view.indexAt(QPoint(0,0)), model.index(8,0)); + QTest::keyClick(&view, Qt::Key_PageDown); + QCOMPARE(view.indexAt(QPoint(0,0)), model.index(15,0)); + QTest::keyClick(&view, Qt::Key_PageUp); + QCOMPARE(view.indexAt(QPoint(0,0)), model.index(14,0)); + QTest::keyClick(&view, Qt::Key_PageUp); + QCOMPARE(view.indexAt(QPoint(0,0)), model.index(7,0)); + QTest::keyClick(&view, Qt::Key_PageUp); + QCOMPARE(view.indexAt(QPoint(0,0)), model.index(0,0)); +} + void tst_QTableView::hideRows_data() { QTest::addColumn<int>("rowCount"); @@ -3672,7 +3702,7 @@ void tst_QTableView::mouseWheel_data() << 10 + qApp->wheelScrollLines() << 10 + qApp->wheelScrollLines(); QTest::newRow("scroll down per pixel") << int(QAbstractItemView::ScrollPerPixel) << -120 - << 10 + qApp->wheelScrollLines() * 89 << 10 + qApp->wheelScrollLines() * 28; + << 10 + qApp->wheelScrollLines() << 10 + qApp->wheelScrollLines(); } void tst_QTableView::mouseWheel() @@ -3762,8 +3792,6 @@ void tst_QTableView::task259308_scrollVerticalHeaderSwappedSections() QTRY_COMPARE(tv.rowAt(0), tv.verticalHeader()->logicalIndex(0)); int newRow = tv.rowAt(tv.viewport()->height()); - if (newRow == tv.rowAt(tv.viewport()->height() - 1)) // Overlapping row - newRow++; QTest::keyClick(&tv, Qt::Key_PageDown); // Scroll down and check current QTRY_COMPARE(tv.currentIndex().row(), newRow); diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp index 9a7b7956d8..dcda9f7fd7 100644 --- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp +++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp @@ -2017,6 +2017,8 @@ void tst_QTreeView::clicked() view.setModel(&model); view.show(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + QModelIndex firstIndex = model.index(0, 0, QModelIndex()); QVERIFY(firstIndex.isValid()); int itemHeight = view.visualRect(firstIndex).height(); diff --git a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp index 2b9b4fd761..ab2df2e250 100644 --- a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp +++ b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp @@ -84,6 +84,7 @@ private slots: void controlTypes(); void controlTypes2(); void adjustSizeShouldMakeSureLayoutIsActivated(); + void testRetainSizeWhenHidden(); }; tst_QLayout::tst_QLayout() @@ -350,5 +351,47 @@ void tst_QLayout::adjustSizeShouldMakeSureLayoutIsActivated() QCOMPARE(main.size(), QSize(200, 10)); } +void tst_QLayout::testRetainSizeWhenHidden() +{ + QWidget widget; + QBoxLayout layout(QBoxLayout::TopToBottom, &widget); + + QLabel *label1 = new QLabel("label1 text", &widget); + layout.addWidget(label1); + QLabel *label2 = new QLabel("label2 text", &widget); + layout.addWidget(label2); + + widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); + int normalHeight = widget.height(); + + // a. Verify that a removed visible will mean lesser size after adjust + label1->hide(); + widget.adjustSize(); + int heightWithoutLabel1 = widget.height(); + QVERIFY(heightWithoutLabel1 < normalHeight); + + // b restore with verify that the size is the same + label1->show(); + QCOMPARE(widget.sizeHint().height(), normalHeight); + + // c verify that a policy with retainSizeWhenHidden is respected + QSizePolicy sp_remove = label1->sizePolicy(); + QSizePolicy sp_retain = label1->sizePolicy(); + sp_retain.setRetainSizeWhenHidden(true); + + label1->setSizePolicy(sp_retain); + label1->hide(); + QCOMPARE(widget.sizeHint().height(), normalHeight); + + // d check that changing the policy to not wanting size will result in lesser size + label1->setSizePolicy(sp_remove); + QCOMPARE(widget.sizeHint().height(), heightWithoutLabel1); + + // e verify that changing back the hidden widget to want the hidden size will ensure that it gets more size + label1->setSizePolicy(sp_retain); + QCOMPARE(widget.sizeHint().height(), normalHeight); +} + QTEST_MAIN(tst_QLayout) #include "tst_qlayout.moc" diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp index 82d3fae0fa..4631154230 100644 --- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp +++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp @@ -160,6 +160,7 @@ private slots: void maxVisibleItems(); void task_QTBUG_10491_currentIndexAndModelColumn(); void highlightedSignal(); + void itemData(); void task_QTBUG_31146_popupCompletion(); }; @@ -2756,6 +2757,151 @@ void tst_QComboBox::highlightedSignal() QCOMPARE(spy.size(), 1); } +void tst_QComboBox::itemData() +{ + QComboBox comboBox; + const int itemCount = 10; + + // ensure that the currentText(), the DisplayRole and the EditRole + // stay in sync when using QComboBox's default model + for (int i = 0; i < itemCount; ++i) { + QString itemText = QString("item text %1").arg(i); + comboBox.addItem(itemText); + } + + for (int i = 0; i < itemCount; ++i) { + QString itemText = QString("item text %1").arg(i); + QCOMPARE(comboBox.itemText(i), itemText); + QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText); + QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText); + + comboBox.setCurrentIndex(i); + QCOMPARE(comboBox.currentIndex(), i); + QCOMPARE(comboBox.currentText(), itemText); + QCOMPARE(comboBox.currentData(Qt::DisplayRole).toString(), itemText); + QCOMPARE(comboBox.currentData(Qt::EditRole).toString(), itemText); + } + + for (int i = 0; i < itemCount; ++i) { + // now change by using setItemText + QString itemText = QString("setItemText %1").arg(i); + comboBox.setItemText(i, itemText); + } + + for (int i = 0; i < itemCount; ++i) { + QString itemText = QString("setItemText %1").arg(i); + QCOMPARE(comboBox.itemText(i), itemText); + QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText); + QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText); + + comboBox.setCurrentIndex(i); + QCOMPARE(comboBox.currentIndex(), i); + QCOMPARE(comboBox.currentText(), itemText); + QCOMPARE(comboBox.currentData(Qt::DisplayRole).toString(), itemText); + QCOMPARE(comboBox.currentData(Qt::EditRole).toString(), itemText); + } + + for (int i = 0; i < itemCount; ++i) { + // now change by changing the DisplayRole's data + QString itemText = QString("setItemData(DisplayRole) %1").arg(i); + comboBox.setItemData(i, QVariant(itemText), Qt::DisplayRole); + } + + for (int i = 0; i < itemCount; ++i) { + QString itemText = QString("setItemData(DisplayRole) %1").arg(i); + QCOMPARE(comboBox.itemText(i), itemText); + QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText); + QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText); + + comboBox.setCurrentIndex(i); + QCOMPARE(comboBox.currentIndex(), i); + QCOMPARE(comboBox.currentText(), itemText); + QCOMPARE(comboBox.currentData(Qt::DisplayRole).toString(), itemText); + QCOMPARE(comboBox.currentData(Qt::EditRole).toString(), itemText); + } + + for (int i = 0; i < itemCount; ++i) { + // now change by changing the EditRole's data + QString itemText = QString("setItemData(EditRole) %1").arg(i); + comboBox.setItemData(i, QVariant(itemText), Qt::EditRole); + } + + for (int i = 0; i < itemCount; ++i) { + QString itemText = QString("setItemData(EditRole) %1").arg(i); + QCOMPARE(comboBox.itemText(i), itemText); + QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText); + QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText); + + comboBox.setCurrentIndex(i); + QCOMPARE(comboBox.currentIndex(), i); + QCOMPARE(comboBox.currentText(), itemText); + QCOMPARE(comboBox.currentData(Qt::DisplayRole).toString(), itemText); + QCOMPARE(comboBox.currentData(Qt::EditRole).toString(), itemText); + } + + comboBox.clear(); + + + // set additional user data in the addItem call + for (int i = 0; i < itemCount; ++i) { + QString itemText = QString("item text %1").arg(i); + QString itemDataText = QString("item data %1").arg(i); + comboBox.addItem(itemText, QVariant(itemDataText)); + } + + for (int i = 0; i < itemCount; ++i) { + QString itemText = QString("item text %1").arg(i); + QString itemDataText = QString("item data %1").arg(i); + QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText); + QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText); + QCOMPARE(comboBox.itemData(i).toString(), itemDataText); + + comboBox.setCurrentIndex(i); + QCOMPARE(comboBox.currentIndex(), i); + QCOMPARE(comboBox.currentData(Qt::DisplayRole).toString(), itemText); + QCOMPARE(comboBox.currentData(Qt::EditRole).toString(), itemText); + QCOMPARE(comboBox.currentData().toString(), itemDataText); + + } + + comboBox.clear(); + + + // additional roles, setItemData + // UserRole + 0 -> string + // UserRole + 1 -> double + // UserRole + 2 -> icon + QString qtlogoPath = QFINDTESTDATA("qtlogo.png"); + QIcon icon = QIcon(QPixmap(qtlogoPath)); + for (int i = 0; i < itemCount; ++i) { + QString itemText = QString("item text %1").arg(i); + QString itemDataText = QString("item data %1").arg(i); + double d = i; + comboBox.addItem(itemText); + comboBox.setItemData(i, QVariant(itemDataText), Qt::UserRole); + comboBox.setItemData(i, QVariant(d), Qt::UserRole + 1); + comboBox.setItemData(i, QVariant::fromValue(icon), Qt::UserRole + 2); + } + + for (int i = 0; i < itemCount; ++i) { + QString itemText = QString("item text %1").arg(i); + QString itemDataText = QString("item data %1").arg(i); + double d = i; + QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText); + QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText); + QCOMPARE(comboBox.itemData(i, Qt::UserRole).toString(), itemDataText); + QCOMPARE(comboBox.itemData(i, Qt::UserRole + 1).toDouble(), d); + QCOMPARE(comboBox.itemData(i, Qt::UserRole + 2).value<QIcon>(), icon); + + comboBox.setCurrentIndex(i); + QCOMPARE(comboBox.currentData(Qt::DisplayRole).toString(), itemText); + QCOMPARE(comboBox.currentData(Qt::EditRole).toString(), itemText); + QCOMPARE(comboBox.currentData(Qt::UserRole).toString(), itemDataText); + QCOMPARE(comboBox.currentData(Qt::UserRole + 1).toDouble(), d); + QCOMPARE(comboBox.currentData(Qt::UserRole + 2).value<QIcon>(), icon); + } +} + void tst_QComboBox::task_QTBUG_31146_popupCompletion() { QComboBox comboBox; diff --git a/tests/auto/widgets/widgets/qdialogbuttonbox/tst_qdialogbuttonbox.cpp b/tests/auto/widgets/widgets/qdialogbuttonbox/tst_qdialogbuttonbox.cpp index b0e454b643..db5b89f396 100644 --- a/tests/auto/widgets/widgets/qdialogbuttonbox/tst_qdialogbuttonbox.cpp +++ b/tests/auto/widgets/widgets/qdialogbuttonbox/tst_qdialogbuttonbox.cpp @@ -72,6 +72,8 @@ private slots: void testConstructor2_data(); void testConstructor3(); void testConstructor3_data(); + void testConstructor4(); + void testConstructor4_data(); void setOrientation_data(); void setOrientation(); void addButton1_data(); @@ -201,6 +203,41 @@ void tst_QDialogButtonBox::testConstructor3() QTEST(buttonBox.buttons().count(), "buttonCount"); } +void tst_QDialogButtonBox::testConstructor4_data() +{ + QTest::addColumn<QDialogButtonBox::StandardButtons>("buttons"); + QTest::addColumn<int>("buttonCount"); + + QTest::newRow("nothing") << (QDialogButtonBox::StandardButtons)0 << 0; + QTest::newRow("only 1") << QDialogButtonBox::StandardButtons(QDialogButtonBox::Ok) << 1; + QTest::newRow("only 1.. twice") + << (QDialogButtonBox::Ok | QDialogButtonBox::Ok) + << 1; + QTest::newRow("only 2") + << (QDialogButtonBox::Ok | QDialogButtonBox::Cancel) + << 2; + QTest::newRow("two different things") + << (QDialogButtonBox::Save | QDialogButtonBox::Close) + << 2; + QTest::newRow("three") + << (QDialogButtonBox::Ok + | QDialogButtonBox::Cancel + | QDialogButtonBox::Help) + << 3; + QTest::newRow("everything") + << (QDialogButtonBox::StandardButtons)UINT_MAX + << 18; +} + +void tst_QDialogButtonBox::testConstructor4() +{ + QFETCH(QDialogButtonBox::StandardButtons, buttons); + + QDialogButtonBox buttonBox(buttons); + QCOMPARE(buttonBox.orientation(), Qt::Horizontal); + QTEST(buttonBox.buttons().count(), "buttonCount"); +} + void tst_QDialogButtonBox::setOrientation_data() { QTest::addColumn<int>("orientation"); diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp index d428e2705d..3000aad9ce 100644 --- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp +++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp @@ -46,6 +46,9 @@ #include "qstringlist.h" #include "qstyle.h" #include "qvalidator.h" +#include "qwidgetaction.h" +#include "qimage.h" +#include "qicon.h" #include "qcompleter.h" #include "qstandarditemmodel.h" #include <qpa/qplatformtheme.h> @@ -61,8 +64,12 @@ #include <private/qlineedit_p.h> #include <private/qwidgetlinecontrol_p.h> #include <qmenu.h> +#include <qlabel.h> #include <qlayout.h> #include <qspinbox.h> +#include <qlistview.h> +#include <qstringlistmodel.h> +#include <qsortfilterproxymodel.h> #include <qdebug.h> #include "qcommonstyle.h" @@ -290,6 +297,9 @@ private slots: void undoRedoAndEchoModes_data(); void undoRedoAndEchoModes(); + void clearButton(); + void sideWidgets(); + protected slots: void editingFinished(); @@ -866,12 +876,18 @@ public: void tst_QLineEdit::hasAcceptableInputValidator() { + QSignalSpy spyChanged(testWidget, SIGNAL(textChanged(QString))); + QSignalSpy spyEdited(testWidget, SIGNAL(textEdited(QString))); + QFocusEvent lostFocus(QEvent::FocusOut); ValidatorWithFixup val; testWidget->setValidator(&val); testWidget->setText("foobar"); qApp->sendEvent(testWidget, &lostFocus); QVERIFY(testWidget->hasAcceptableInput()); + + QCOMPARE(spyChanged.count(), 2); + QCOMPARE(spyEdited.count(), 0); } @@ -4042,5 +4058,80 @@ void tst_QLineEdit::undoRedoAndEchoModes() QCOMPARE(testWidget->text(), expected.at(2)); } +void tst_QLineEdit::clearButton() +{ + // Construct a listview with a stringlist model and filter model. + QWidget testWidget; + QVBoxLayout *l = new QVBoxLayout(&testWidget); + QLineEdit *filterLineEdit = new QLineEdit(&testWidget); + l->addWidget(filterLineEdit); + QListView *listView = new QListView(&testWidget); + QStringListModel *model = new QStringListModel(QStringList() << QStringLiteral("aa") << QStringLiteral("ab") << QStringLiteral("cc"), listView); + QSortFilterProxyModel *filterModel = new QSortFilterProxyModel(listView); + filterModel->setSourceModel(model); + connect(filterLineEdit, SIGNAL(textChanged(QString)), filterModel, SLOT(setFilterFixedString(QString))); + listView->setModel(filterModel); + l->addWidget(listView); + testWidget.move(300, 300); + testWidget.show(); + qApp->setActiveWindow(&testWidget); + QVERIFY(QTest::qWaitForWindowActive(&testWidget)); + // Flip the clear button on,off, trying to detect crashes. + filterLineEdit->setClearButtonEnabled(true); + QVERIFY(filterLineEdit->isClearButtonEnabled()); + filterLineEdit->setClearButtonEnabled(true); + QVERIFY(filterLineEdit->isClearButtonEnabled()); + filterLineEdit->setClearButtonEnabled(false); + QVERIFY(!filterLineEdit->isClearButtonEnabled()); + filterLineEdit->setClearButtonEnabled(false); + QVERIFY(!filterLineEdit->isClearButtonEnabled()); + filterLineEdit->setClearButtonEnabled(true); + QVERIFY(filterLineEdit->isClearButtonEnabled()); + // Emulate filtering + QToolButton *clearButton = filterLineEdit->findChild<QToolButton *>(); + QVERIFY(clearButton); + QCOMPARE(filterModel->rowCount(), 3); + QTest::keyClick(filterLineEdit, 'a'); + QTRY_COMPARE(filterModel->rowCount(), 2); // matches 'aa', 'ab' + QTest::keyClick(filterLineEdit, 'b'); + QTRY_COMPARE(filterModel->rowCount(), 1); // matches 'ab' + QTest::mouseClick(clearButton, Qt::LeftButton, 0, QRect(QPoint(0, 0), clearButton->size()).center()); + QTRY_COMPARE(filterModel->rowCount(), 3); +} + +void tst_QLineEdit::sideWidgets() +{ + QWidget testWidget; + QVBoxLayout *l = new QVBoxLayout(&testWidget); + QLineEdit *lineEdit = new QLineEdit(&testWidget); + l->addWidget(lineEdit); + l->addSpacerItem(new QSpacerItem(0, 50, QSizePolicy::Ignored, QSizePolicy::Fixed)); + QImage image(QSize(20, 20), QImage::Format_ARGB32); + image.fill(Qt::yellow); + QAction *iconAction = new QAction(QIcon(QPixmap::fromImage(image)), QString(), lineEdit); + QWidgetAction *label1Action = new QWidgetAction(lineEdit); + label1Action->setDefaultWidget(new QLabel(QStringLiteral("l1"))); + QWidgetAction *label2Action = new QWidgetAction(lineEdit); + label2Action->setDefaultWidget(new QLabel(QStringLiteral("l2"))); + QWidgetAction *label3Action = new QWidgetAction(lineEdit); + label3Action->setDefaultWidget(new QLabel(QStringLiteral("l3"))); + lineEdit->addAction(iconAction, QLineEdit::LeadingPosition); + lineEdit->addAction(label2Action, QLineEdit::LeadingPosition); + lineEdit->addAction(label1Action, QLineEdit::TrailingPosition); + lineEdit->addAction(label3Action, QLineEdit::TrailingPosition); + testWidget.move(300, 300); + testWidget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&testWidget)); + // Arbitrarily add/remove actions, trying to detect crashes. Add QTRY_VERIFY(false) to view the result. + delete label3Action; + lineEdit->removeAction(label2Action); + lineEdit->removeAction(iconAction); + lineEdit->removeAction(label1Action); + lineEdit->removeAction(iconAction); + lineEdit->removeAction(label1Action); + lineEdit->addAction(iconAction); + lineEdit->addAction(iconAction); +} + QTEST_MAIN(tst_QLineEdit) #include "tst_qlineedit.moc" diff --git a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp index a64b34c56a..004fdda5ef 100644 --- a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp +++ b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp @@ -98,6 +98,9 @@ private slots: void setValue_data(); void setValue(); + void setDisplayIntegerBase_data(); + void setDisplayIntegerBase(); + void setPrefixSuffix_data(); void setPrefixSuffix(); @@ -274,6 +277,61 @@ void tst_QSpinBox::setValue() QCOMPARE(spin.value(), expected); } +void tst_QSpinBox::setDisplayIntegerBase_data() +{ + QTest::addColumn<int>("value"); + QTest::addColumn<int>("base"); + QTest::addColumn<QString>("string"); + + QTest::newRow("base 10") << 42 << 10 << "42"; + QTest::newRow("base 2") << 42 << 2 << "101010"; + QTest::newRow("base 8") << 42 << 8 << "52"; + QTest::newRow("base 16") << 42 << 16 << "2a"; + QTest::newRow("base 0") << 42 << 0 << "42"; + QTest::newRow("base -4") << 42 << -4 << "42"; + QTest::newRow("base 40") << 42 << 40 << "42"; + + QTest::newRow("negative base 10") << -42 << 10 << "-42"; + QTest::newRow("negative base 2") << -42 << 2 << "-101010"; + QTest::newRow("negative base 8") << -42 << 8 << "-52"; + QTest::newRow("negative base 16") << -42 << 16 << "-2a"; + QTest::newRow("negative base 0") << -42 << 0 << "-42"; + QTest::newRow("negative base -4") << -42 << -4 << "-42"; + QTest::newRow("negative base 40") << -42 << 40 << "-42"; + + QTest::newRow("0 base 10") << 0 << 10 << "0"; + QTest::newRow("0 base 2") << 0 << 2 << "0"; + QTest::newRow("0 base 8") << 0 << 8 << "0"; + QTest::newRow("0 base 16") << 0 << 16 << "0"; + QTest::newRow("0 base 0") << 0 << 0 << "0"; + QTest::newRow("0 base -4") << 0 << -4 << "0"; + QTest::newRow("0 base 40") << 0 << 40 << "0"; +} + +void tst_QSpinBox::setDisplayIntegerBase() +{ + QFETCH(int, value); + QFETCH(int, base); + QFETCH(QString, string); + + SpinBox spin; + spin.setRange(INT_MIN, INT_MAX); + + spin.setValue(value); + QCOMPARE(spin.lineEdit()->text(), QString::number(value)); + + spin.setDisplayIntegerBase(base); + QCOMPARE(spin.lineEdit()->text(), string); + + spin.setValue(0); + QCOMPARE(spin.value(), 0); + QCOMPARE(spin.lineEdit()->text(), QString::number(0, base)); + + spin.lineEdit()->clear(); + QTest::keyClicks(spin.lineEdit(), string); + QCOMPARE(spin.value(), value); +} + void tst_QSpinBox::setPrefixSuffix_data() { QTest::addColumn<QString>("prefix"); diff --git a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp index 340eefbf17..8de3291207 100644 --- a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp +++ b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp @@ -109,6 +109,8 @@ void tst_QSplitter::getSetCheck() QSplitter obj1; // bool QSplitter::opaqueResize() // void QSplitter::setOpaqueResize(bool) + bool styleHint = obj1.style()->styleHint(QStyle::SH_Splitter_OpaqueResize); + QCOMPARE(styleHint, obj1.opaqueResize()); obj1.setOpaqueResize(false); QCOMPARE(false, obj1.opaqueResize()); obj1.setOpaqueResize(true); diff --git a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp index a188e3bfe1..0dac7d85e4 100644 --- a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp +++ b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp @@ -97,6 +97,8 @@ private slots: void changeTitleWhileDoubleClickingTab(); void taskQTBUG_10052_widgetLayoutWhenMoving(); + + void tabBarClicked(); }; // Testing get/set functions @@ -652,5 +654,45 @@ void tst_QTabBar::taskQTBUG_10052_widgetLayoutWhenMoving() QVERIFY(w2.moved); } +void tst_QTabBar::tabBarClicked() +{ + QTabBar tabBar; + tabBar.addTab("0"); + QSignalSpy clickSpy(&tabBar, SIGNAL(tabBarClicked(int))); + QSignalSpy doubleClickSpy(&tabBar, SIGNAL(tabBarDoubleClicked(int))); + + QCOMPARE(clickSpy.count(), 0); + QCOMPARE(doubleClickSpy.count(), 0); + + Qt::MouseButton button = Qt::LeftButton; + while (button <= Qt::MaxMouseButton) { + const QPoint tabPos = tabBar.tabRect(0).center(); + + QTest::mouseClick(&tabBar, button, 0, tabPos); + QCOMPARE(clickSpy.count(), 1); + QCOMPARE(clickSpy.takeFirst().takeFirst().toInt(), 0); + QCOMPARE(doubleClickSpy.count(), 0); + + QTest::mouseDClick(&tabBar, button, 0, tabPos); + QCOMPARE(clickSpy.count(), 0); + QCOMPARE(doubleClickSpy.count(), 1); + QCOMPARE(doubleClickSpy.takeFirst().takeFirst().toInt(), 0); + + const QPoint barPos(tabBar.tabRect(0).right() + 5, tabBar.tabRect(0).center().y()); + + QTest::mouseClick(&tabBar, button, 0, barPos); + QCOMPARE(clickSpy.count(), 1); + QCOMPARE(clickSpy.takeFirst().takeFirst().toInt(), -1); + QCOMPARE(doubleClickSpy.count(), 0); + + QTest::mouseDClick(&tabBar, button, 0, barPos); + QCOMPARE(clickSpy.count(), 0); + QCOMPARE(doubleClickSpy.count(), 1); + QCOMPARE(doubleClickSpy.takeFirst().takeFirst().toInt(), -1); + + button = Qt::MouseButton(button << 1); + } +} + QTEST_MAIN(tst_QTabBar) #include "tst_qtabbar.moc" diff --git a/tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp b/tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp index 5dd9ee9b0f..fa518e6afd 100644 --- a/tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp +++ b/tests/auto/widgets/widgets/qtabwidget/tst_qtabwidget.cpp @@ -42,6 +42,7 @@ #include <QtTest/QtTest> #include <qtabwidget.h> +#include <qtabbar.h> #include <qdebug.h> #include <qapplication.h> #include <qlabel.h> @@ -110,6 +111,7 @@ class tst_QTabWidget:public QObject { void minimumSizeHint(); void heightForWidth_data(); void heightForWidth(); + void tabBarClicked(); private: int addPage(); @@ -666,6 +668,46 @@ void tst_QTabWidget::heightForWidth() delete window; } +void tst_QTabWidget::tabBarClicked() +{ + QTabWidget tabWidget; + tabWidget.addTab(new QWidget(&tabWidget), "0"); + QSignalSpy clickSpy(&tabWidget, SIGNAL(tabBarClicked(int))); + QSignalSpy doubleClickSpy(&tabWidget, SIGNAL(tabBarDoubleClicked(int))); + + QCOMPARE(clickSpy.count(), 0); + QCOMPARE(doubleClickSpy.count(), 0); + + QTabBar &tabBar = *tabWidget.tabBar(); + Qt::MouseButton button = Qt::LeftButton; + while (button <= Qt::MaxMouseButton) { + const QPoint tabPos = tabBar.tabRect(0).center(); + + QTest::mouseClick(&tabBar, button, 0, tabPos); + QCOMPARE(clickSpy.count(), 1); + QCOMPARE(clickSpy.takeFirst().takeFirst().toInt(), 0); + QCOMPARE(doubleClickSpy.count(), 0); + + QTest::mouseDClick(&tabBar, button, 0, tabPos); + QCOMPARE(clickSpy.count(), 0); + QCOMPARE(doubleClickSpy.count(), 1); + QCOMPARE(doubleClickSpy.takeFirst().takeFirst().toInt(), 0); + + const QPoint barPos(tabBar.tabRect(0).right() + 5, tabBar.tabRect(0).center().y()); + + QTest::mouseClick(&tabBar, button, 0, barPos); + QCOMPARE(clickSpy.count(), 1); + QCOMPARE(clickSpy.takeFirst().takeFirst().toInt(), -1); + QCOMPARE(doubleClickSpy.count(), 0); + + QTest::mouseDClick(&tabBar, button, 0, barPos); + QCOMPARE(clickSpy.count(), 0); + QCOMPARE(doubleClickSpy.count(), 1); + QCOMPARE(doubleClickSpy.takeFirst().takeFirst().toInt(), -1); + + button = Qt::MouseButton(button << 1); + } +} QTEST_MAIN(tst_QTabWidget) #include "tst_qtabwidget.moc" |