diff options
Diffstat (limited to 'tests/auto/widgets/widgets')
13 files changed, 531 insertions, 18 deletions
diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp index c38c254b9a..40496dbebb 100644 --- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp +++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp @@ -53,6 +53,7 @@ #include <qdialog.h> #include <qevent.h> #include <qlineedit.h> +#include <qlabel.h> #include <qlistview.h> #include <qheaderview.h> #include <qlistwidget.h> @@ -131,6 +132,7 @@ private slots: void pixmapIcon(); void mouseWheel_data(); void mouseWheel(); + void wheelClosingPopup(); void layoutDirection(); void itemListPosition(); void separatorItem_data(); @@ -2041,6 +2043,32 @@ void tst_QComboBox::mouseWheel() } } +void tst_QComboBox::wheelClosingPopup() +{ + // QTBUG-40656, combo and other popups should close when the main window gets a wheel event. + QScrollArea scrollArea; + scrollArea.move(300, 300); + QWidget *widget = new QWidget; + scrollArea.setWidget(widget); + QVBoxLayout *layout = new QVBoxLayout(widget); + layout->setSizeConstraint(QLayout::SetMinAndMaxSize); + layout->addSpacing(100); + QComboBox *comboBox = new QComboBox; + comboBox->addItems(QStringList() << QStringLiteral("Won") << QStringLiteral("Too") + << QStringLiteral("3") << QStringLiteral("fore")); + layout->addWidget(comboBox); + layout->addSpacing(100); + const QPoint sizeP(scrollArea.width(), scrollArea.height()); + scrollArea.move(QGuiApplication::primaryScreen()->availableGeometry().center() - sizeP / 2); + scrollArea.show(); + QVERIFY(QTest::qWaitForWindowExposed(&scrollArea)); + comboBox->showPopup(); + QTRY_VERIFY(comboBox->view() && comboBox->view()->isVisible()); + QWheelEvent event(QPointF(10, 10), WHEEL_DELTA, Qt::NoButton, Qt::NoModifier); + QVERIFY(QCoreApplication::sendEvent(scrollArea.windowHandle(), &event)); + QTRY_VERIFY(!comboBox->view()->isVisible()); +} + void tst_QComboBox::layoutDirection() { QComboBox box; diff --git a/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp b/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp index a4d4e5d717..433fbc2bfe 100644 --- a/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp +++ b/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp @@ -46,6 +46,7 @@ #include <QStyleOptionGroupBox> #include <QVBoxLayout> #include <QRadioButton> +#include <QDialog> #include "qgroupbox.h" @@ -71,6 +72,7 @@ private slots: void setChecked_data(); void setChecked(); void enabledPropagation(); + void enabledChildPropagation(); void sizeHint(); void toggled(); void clicked_data(); @@ -288,6 +290,23 @@ void tst_QGroupBox::enabledPropagation() delete testWidget; } +void tst_QGroupBox::enabledChildPropagation() +{ + QGroupBox testWidget; + testWidget.setCheckable(true); + testWidget.setChecked(true); + // The value of isChecked() should be reflected in the isEnabled() of newly + // added child widgets, but not in top level widgets. + QWidget *childWidget = new QWidget(&testWidget); + QVERIFY(childWidget->isEnabled()); + QDialog *dialog = new QDialog(&testWidget); + QVERIFY(dialog->isEnabled()); + testWidget.setChecked(false); + childWidget = new QWidget(&testWidget); + QVERIFY(!childWidget->isEnabled()); + dialog = new QDialog(&testWidget); + QVERIFY(dialog->isEnabled()); +} void tst_QGroupBox::sizeHint() { diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp index 2d050cd5fa..63928db80f 100644 --- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp +++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. @@ -244,6 +244,7 @@ private slots: #ifndef QT_NO_CLIPBOARD void cut(); + void cutWithoutSelection(); #endif void maxLengthAndInputMask(); void returnPressedKeyEvent(); @@ -2977,7 +2978,37 @@ void tst_QLineEdit::cut() testWidget->cut(); QCOMPARE(testWidget->text(), QString("Abcdefg defg hijklmno")); } -#endif + +void tst_QLineEdit::cutWithoutSelection() +{ + enum { selectionLength = 1 }; + + if (QKeySequence(QKeySequence::Cut).toString() != QLatin1String("Ctrl+X")) + QSKIP("Platform with non-standard keybindings"); + QClipboard *clipboard = QGuiApplication::clipboard(); + if (!PlatformClipboard::isAvailable() + || !QGuiApplication::platformName().compare("xcb", Qt::CaseInsensitive)) { // Avoid unstable X11 clipboard + clipboard = Q_NULLPTR; + } + + if (clipboard) + clipboard->clear(); + const QString origText = QStringLiteral("test"); + QLineEdit lineEdit(origText); + lineEdit.setCursorPosition(0); + QVERIFY(!lineEdit.hasSelectedText()); + QTest::keyClick(&lineEdit, Qt::Key_X, Qt::ControlModifier); + QCOMPARE(lineEdit.text(), origText); // No selection, unmodified. + if (clipboard) + QVERIFY(clipboard->text().isEmpty()); + lineEdit.setSelection(0, selectionLength); + QTest::keyClick(&lineEdit, Qt::Key_X, Qt::ControlModifier); + QCOMPARE(lineEdit.text(), origText.right(origText.size() - selectionLength)); + if (clipboard) + QCOMPARE(clipboard->text(), origText.left(selectionLength)); +} + +#endif // !QT_NO_CLIPBOARD class InputMaskValidator : public QValidator { @@ -4186,9 +4217,14 @@ void tst_QLineEdit::clearButton() 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()); + QSignalSpy spyEdited(filterLineEdit, &QLineEdit::textEdited); + const QPoint clearButtonCenterPos = QRect(QPoint(0, 0), clearButton->size()).center(); + QTest::mouseClick(clearButton, Qt::LeftButton, 0, clearButtonCenterPos); + QCOMPARE(spyEdited.count(), 1); QTRY_COMPARE(clearButton->cursor().shape(), filterLineEdit->cursor().shape()); QTRY_COMPARE(filterModel->rowCount(), 3); + QCoreApplication::processEvents(); + QCOMPARE(spyEdited.count(), 1); filterLineEdit->setReadOnly(true); // QTBUG-34315 QVERIFY(!clearButton->isEnabled()); diff --git a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp index 59021108a2..4f611cd06f 100644 --- a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp +++ b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp @@ -237,6 +237,8 @@ public: tst_QMdiArea(); public slots: void initTestCase(); + void cleanup(); + protected slots: void activeChanged(QMdiSubWindow *child); @@ -306,6 +308,11 @@ void tst_QMdiArea::initTestCase() #endif } +void tst_QMdiArea::cleanup() +{ + QVERIFY(QApplication::topLevelWidgets().isEmpty()); +} + // Old QWorkspace tests void tst_QMdiArea::activeChanged(QMdiSubWindow *child) { @@ -1271,6 +1278,7 @@ void tst_QMdiArea::removeSubWindow_2() mdiArea.addSubWindow(subWindow); QVERIFY(numberOfConnectedSignals(subWindow) >= 2); subWindow->setParent(0); + QScopedPointer<MySubWindow> subWindowGuard(subWindow); QCOMPARE(numberOfConnectedSignals(subWindow), 0); } @@ -2340,7 +2348,7 @@ void tst_QMdiArea::setViewMode() QVERIFY(QTest::qWaitForWindowExposed(&mdiArea)); QMdiSubWindow *activeSubWindow = mdiArea.activeSubWindow(); - const QList<QMdiSubWindow *> subWindows = mdiArea.subWindowList(); + QList<QMdiSubWindow *> subWindows = mdiArea.subWindowList(); // Default. QVERIFY(!activeSubWindow->isMaximized()); @@ -2410,9 +2418,12 @@ void tst_QMdiArea::setViewMode() // Remove sub-windows and make sure the tab is removed. foreach (QMdiSubWindow *subWindow, subWindows) { - if (subWindow != activeSubWindow) + if (subWindow != activeSubWindow) { mdiArea.removeSubWindow(subWindow); + delete subWindow; + } } + subWindows.clear(); QCOMPARE(tabBar->count(), 1); // Go back to default (QMdiArea::SubWindowView). diff --git a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp index 87d87eb4bc..4b327c9ba8 100644 --- a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp +++ b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. @@ -58,6 +58,7 @@ #include <QStyle> #include <QStyleOptionTitleBar> #include <QPushButton> +#include <QScreen> #include <QSizeGrip> #include "../../../qtest-config.h" @@ -182,6 +183,7 @@ private slots: void mouseDoubleClick(); void setSystemMenu(); void restoreFocus(); + void restoreFocusOverCreation(); void changeFocusWithTab(); void closeEvent(); void setWindowTitle(); @@ -1126,6 +1128,7 @@ void tst_QMdiSubWindow::restoreFocus() expectedFocusWindow->showMinimized(); qApp->processEvents(); QVERIFY(expectedFocusWindow->isMinimized()); + qDebug() << expectedFocusWindow<< qApp->focusWidget(); QCOMPARE(qApp->focusWidget(), static_cast<QWidget *>(expectedFocusWindow)); // Minimized -> normal @@ -1178,6 +1181,48 @@ void tst_QMdiSubWindow::restoreFocus() QCOMPARE(qApp->focusWidget(), static_cast<QWidget *>(expectedFocusWindow)); } +class MultiWidget : public QWidget { +public: + explicit MultiWidget(QWidget *parent = 0) : QWidget(parent) + , m_lineEdit1(new QLineEdit(this)), m_lineEdit2(new QLineEdit(this)) + { + QVBoxLayout *lt = new QVBoxLayout(this); + lt->addWidget(m_lineEdit1); + lt->addWidget(m_lineEdit2); + } + + QLineEdit *m_lineEdit1; + QLineEdit *m_lineEdit2; +}; + +void tst_QMdiSubWindow::restoreFocusOverCreation() +{ + // QTBUG-38378, verify that the focus child of a subwindow + // is not "forgotten" when adding yet another subwindow. + QMdiArea mdiArea; + mdiArea.resize(800, 800); + mdiArea.move(QGuiApplication::primaryScreen()->availableGeometry().center() - QPoint(400, 400)); + mdiArea.setWindowTitle(QStringLiteral("restoreFocusOverCreation")); + + MultiWidget *subWidget1 = new MultiWidget; + MultiWidget *subWidget2 = new MultiWidget; + + QMdiSubWindow *subWindow1 = mdiArea.addSubWindow(subWidget1); + subWidget1->m_lineEdit2->setFocus(); + subWindow1->show(); + mdiArea.show(); + QApplication::setActiveWindow(&mdiArea); + QVERIFY(QTest::qWaitForWindowActive(&mdiArea)); + QCOMPARE(QApplication::focusWidget(), subWidget1->m_lineEdit2); + + QMdiSubWindow *subWindow2 = mdiArea.addSubWindow(subWidget2); + subWindow2->show(); + QTRY_COMPARE(QApplication::focusWidget(), subWidget2->m_lineEdit1); + + mdiArea.setActiveSubWindow(subWindow1); + QTRY_COMPARE(QApplication::focusWidget(), subWidget1->m_lineEdit2); +} + void tst_QMdiSubWindow::changeFocusWithTab() { QWidget *widget = new QWidget; diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp index b4be24f0e0..6c63d1ee90 100644 --- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp +++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. @@ -55,6 +55,7 @@ #include <qmenu.h> #include <qstyle.h> +#include <QTimer> #include <qdebug.h> Q_DECLARE_METATYPE(Qt::Key); @@ -132,6 +133,7 @@ private: enum { num_builtins = 10 }; QAction *activated, *highlighted, *builtins[num_builtins]; QString statustip; + bool m_onStatusTipTimerExecuted; }; // Testing get/set functions @@ -158,6 +160,7 @@ void tst_QMenu::getSetCheck() } tst_QMenu::tst_QMenu() + : m_onStatusTipTimerExecuted(false) { QApplication::setEffectEnabled(Qt::UI_AnimateMenu, false); } @@ -193,6 +196,7 @@ void tst_QMenu::init() { activated = highlighted = 0; lastMenu = 0; + m_onStatusTipTimerExecuted = false; } void tst_QMenu::createActions() @@ -492,8 +496,13 @@ void tst_QMenu::statusTip() //because showMenu calls QMenu::exec, we need to use a singleshot //to continue the test - QTimer::singleShot(200,this, SLOT(onStatusTipTimer())); + QTimer timer; + timer.setSingleShot(true); + connect(&timer, &QTimer::timeout, this, &tst_QMenu::onStatusTipTimer); + timer.setInterval(200); + timer.start(); btn->showMenu(); + QVERIFY(m_onStatusTipTimerExecuted); QVERIFY(statustip.isEmpty()); } @@ -513,6 +522,7 @@ void tst_QMenu::onStatusTipTimer() QCOMPARE(st, QString("sub action")); QVERIFY(menu->isVisible() == false); + m_onStatusTipTimerExecuted = true; } void tst_QMenu::widgetActionFocus() @@ -1037,6 +1047,14 @@ void tst_QMenu::QTBUG_37933_ampersands_data() QTest::newRow("simple") << QString("Test") << QString("Test"); QTest::newRow("ampersand") << QString("&Test") << QString("Test"); QTest::newRow("double_ampersand") << QString("&Test && more") << QString("Test & more"); + QTest::newRow("ampersand_in_parentheses") << QString("Test(&T) (&&) more") << QString("Test (&) more"); + QTest::newRow("ampersand_in_parentheses_after_space") << QString("Test (&T)") << QString("Test"); + QTest::newRow("ampersand_in_parentheses_after_spaces") << QString("Test (&T)") << QString("Test"); + QTest::newRow("ampersand_in_parentheses_before_space") << QString("Test(&T) ") << QString("Test "); + QTest::newRow("only_ampersand_in_parentheses") << QString("(&T)") << QString(""); + QTest::newRow("only_ampersand_in_parentheses_after_space") << QString(" (&T)") << QString(""); + QTest::newRow("parentheses_after_space") << QString(" (Dummy)") << QString(" (Dummy)"); + QTest::newRow("ampersand_after_space") << QString("About &Qt Project") << QString("About Qt Project"); } void tst_qmenu_QTBUG_37933_ampersands(); diff --git a/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro b/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro new file mode 100644 index 0000000000..bbc6e987af --- /dev/null +++ b/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro @@ -0,0 +1,8 @@ +CONFIG += testcase +CONFIG += parallel_test +TARGET = tst_qopenglwidget +QT += gui-private core-private testlib widgets + +SOURCES += tst_qopenglwidget.cpp + +win32-msvc2010:contains(QT_CONFIG, angle):CONFIG += insignificant_test # QTBUG-31611 diff --git a/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp b/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp new file mode 100644 index 0000000000..14d06e7111 --- /dev/null +++ b/tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp @@ -0,0 +1,266 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtWidgets/QOpenGLWidget> +#include <QtGui/QOpenGLFunctions> +#include <QtGui/QPainter> +#include <QtTest/QtTest> +#include <QSignalSpy> + +class tst_QOpenGLWidget : public QObject +{ + Q_OBJECT + +private slots: + void create(); + void clearAndGrab(); + void clearAndResizeAndGrab(); + void createNonTopLevel(); + void painter(); + void reparentToAlreadyCreated(); + void reparentToNotYetCreated(); +}; + +void tst_QOpenGLWidget::create() +{ + QScopedPointer<QOpenGLWidget> w(new QOpenGLWidget); + QVERIFY(!w->isValid()); + QSignalSpy frameSwappedSpy(w.data(), SIGNAL(frameSwapped())); + w->show(); + QTest::qWaitForWindowExposed(w.data()); + QVERIFY(frameSwappedSpy.count() > 0); + + QVERIFY(w->isValid()); + QVERIFY(w->context()); + QVERIFY(w->context()->format() == w->format()); + QVERIFY(w->defaultFramebufferObject() != 0); +} + +class ClearWidget : public QOpenGLWidget, protected QOpenGLFunctions +{ +public: + ClearWidget(QWidget *parent, int expectedWidth, int expectedHeight) + : QOpenGLWidget(parent), + m_initCalled(false), m_paintCalled(false), m_resizeCalled(false), + m_resizeOk(false), + m_w(expectedWidth), m_h(expectedHeight) { } + + void initializeGL() Q_DECL_OVERRIDE { + m_initCalled = true; + initializeOpenGLFunctions(); + } + void paintGL() Q_DECL_OVERRIDE { + m_paintCalled = true; + glClearColor(1.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + } + void resizeGL(int w, int h) Q_DECL_OVERRIDE { + m_resizeCalled = true; + m_resizeOk = w == m_w && h == m_h; + } + + bool m_initCalled; + bool m_paintCalled; + bool m_resizeCalled; + bool m_resizeOk; + int m_w; + int m_h; +}; + +void tst_QOpenGLWidget::clearAndGrab() +{ + QScopedPointer<ClearWidget> w(new ClearWidget(0, 800, 600)); + w->resize(800, 600); + w->show(); + QTest::qWaitForWindowExposed(w.data()); + QVERIFY(w->m_initCalled); + QVERIFY(w->m_resizeCalled); + QVERIFY(w->m_resizeOk); + QVERIFY(w->m_paintCalled); + + QImage image = w->grabFramebuffer(); + QVERIFY(!image.isNull()); + QCOMPARE(image.width(), w->width()); + QCOMPARE(image.height(), w->height()); + QVERIFY(image.pixel(30, 40) == qRgb(255, 0, 0)); +} + +void tst_QOpenGLWidget::clearAndResizeAndGrab() +{ + QScopedPointer<QOpenGLWidget> w(new ClearWidget(0, 640, 480)); + w->resize(640, 480); + w->show(); + QTest::qWaitForWindowExposed(w.data()); + + QImage image = w->grabFramebuffer(); + QVERIFY(!image.isNull()); + QCOMPARE(image.width(), w->width()); + QCOMPARE(image.height(), w->height()); + w->resize(800, 600); + image = w->grabFramebuffer(); + QVERIFY(!image.isNull()); + QCOMPARE(image.width(), 800); + QCOMPARE(image.height(), 600); + QCOMPARE(image.width(), w->width()); + QCOMPARE(image.height(), w->height()); + QVERIFY(image.pixel(30, 40) == qRgb(255, 0, 0)); +} + +void tst_QOpenGLWidget::createNonTopLevel() +{ + QWidget w; + ClearWidget *glw = new ClearWidget(&w, 600, 700); + QSignalSpy frameSwappedSpy(glw, SIGNAL(frameSwapped())); + w.resize(400, 400); + w.show(); + QTest::qWaitForWindowExposed(&w); + QVERIFY(frameSwappedSpy.count() > 0); + + QVERIFY(glw->m_resizeCalled); + glw->m_resizeCalled = false; + QVERIFY(!glw->m_resizeOk); + glw->resize(600, 700); + + QVERIFY(glw->m_initCalled); + QVERIFY(glw->m_resizeCalled); + QVERIFY(glw->m_resizeOk); + QVERIFY(glw->m_paintCalled); + + QImage image = glw->grabFramebuffer(); + QVERIFY(!image.isNull()); + QCOMPARE(image.width(), glw->width()); + QCOMPARE(image.height(), glw->height()); + QVERIFY(image.pixel(30, 40) == qRgb(255, 0, 0)); + + glw->doneCurrent(); + QVERIFY(!QOpenGLContext::currentContext()); + glw->makeCurrent(); + QVERIFY(QOpenGLContext::currentContext() == glw->context() && glw->context()); +} + +class PainterWidget : public QOpenGLWidget, protected QOpenGLFunctions +{ +public: + PainterWidget(QWidget *parent) + : QOpenGLWidget(parent), m_clear(false) { } + + void initializeGL() Q_DECL_OVERRIDE { + initializeOpenGLFunctions(); + } + void paintGL() Q_DECL_OVERRIDE { + QPainter p(this); + QCOMPARE(p.device()->width(), width()); + QCOMPARE(p.device()->height(), height()); + p.fillRect(QRect(QPoint(0, 0), QSize(width(), height())), Qt::blue); + if (m_clear) { + p.beginNativePainting(); + glClearColor(0.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + p.endNativePainting(); + } + } + bool m_clear; +}; + +void tst_QOpenGLWidget::painter() +{ + QWidget w; + PainterWidget *glw = new PainterWidget(&w); + w.resize(640, 480); + glw->resize(320, 200); + w.show(); + QTest::qWaitForWindowExposed(&w); + + QImage image = glw->grabFramebuffer(); + QCOMPARE(image.width(), glw->width()); + QCOMPARE(image.height(), glw->height()); + QVERIFY(image.pixel(20, 10) == qRgb(0, 0, 255)); + + glw->m_clear = true; + image = glw->grabFramebuffer(); + QVERIFY(image.pixel(20, 10) == qRgb(0, 255, 0)); +} + +void tst_QOpenGLWidget::reparentToAlreadyCreated() +{ + QWidget w1; + PainterWidget *glw = new PainterWidget(&w1); + w1.resize(640, 480); + glw->resize(320, 200); + w1.show(); + QTest::qWaitForWindowExposed(&w1); + + QWidget w2; + w2.show(); + QTest::qWaitForWindowExposed(&w2); + + glw->setParent(&w2); + glw->show(); + + QImage image = glw->grabFramebuffer(); + QCOMPARE(image.width(), 320); + QCOMPARE(image.height(), 200); + QVERIFY(image.pixel(20, 10) == qRgb(0, 0, 255)); +} + +void tst_QOpenGLWidget::reparentToNotYetCreated() +{ + QWidget w1; + PainterWidget *glw = new PainterWidget(&w1); + w1.resize(640, 480); + glw->resize(320, 200); + w1.show(); + QTest::qWaitForWindowExposed(&w1); + + QWidget w2; + glw->setParent(&w2); + w2.show(); + QTest::qWaitForWindowExposed(&w2); + + QImage image = glw->grabFramebuffer(); + QCOMPARE(image.width(), 320); + QCOMPARE(image.height(), 200); + QVERIFY(image.pixel(20, 10) == qRgb(0, 0, 255)); +} + +QTEST_MAIN(tst_QOpenGLWidget) + +#include "tst_qopenglwidget.moc" diff --git a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp index 21034e8f1b..350ae23d8a 100644 --- a/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp +++ b/tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp @@ -393,18 +393,31 @@ void tst_QSpinBox::valueChangedHelper(int value) actualValues << value; } +class MySpinBox: public QSpinBox +{ +public: + MySpinBox(QWidget *parent = 0) : QSpinBox(parent) {} + + void changeEvent(QEvent *ev) { + eventsReceived.append(ev->type()); + } + QList<QEvent::Type> eventsReceived; +}; + void tst_QSpinBox::setReadOnly() { - QSpinBox spin(0); + MySpinBox spin(0); spin.show(); QTest::keyClick(&spin, Qt::Key_Up); QCOMPARE(spin.value(), 1); spin.setReadOnly(true); + QCOMPARE(spin.eventsReceived, QList<QEvent::Type>() << QEvent::ReadOnlyChange); QTest::keyClick(&spin, Qt::Key_Up); QCOMPARE(spin.value(), 1); spin.stepBy(1); QCOMPARE(spin.value(), 2); spin.setReadOnly(false); + QCOMPARE(spin.eventsReceived, QList<QEvent::Type>() << QEvent::ReadOnlyChange << QEvent::ReadOnlyChange); QTest::keyClick(&spin, Qt::Key_Up); QCOMPARE(spin.value(), 3); } diff --git a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp index d66a10ae56..17fde2883a 100644 --- a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp +++ b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp @@ -56,6 +56,7 @@ #include <qlabel.h> #include <qdialog.h> #include <qscreen.h> +#include <qproxystyle.h> #include <qdebug.h> // for file error messages QT_FORWARD_DECLARE_CLASS(QSplitter) @@ -88,6 +89,7 @@ private slots: void testRemoval(); void rubberBandNotInSplitter(); void saveAndRestoreStateOfNotYetShownSplitter(); + void saveAndRestoreHandleWidth(); // task-specific tests below me: void task187373_addAbstractScrollAreas(); @@ -301,6 +303,41 @@ void tst_QSplitter::saveAndRestoreStateOfNotYetShownSplitter() delete spl; } +class TestSplitterStyle : public QProxyStyle +{ +public: + TestSplitterStyle() : handleWidth(5) {} + int pixelMetric(PixelMetric metric, const QStyleOption *option = 0, const QWidget *widget = 0) const Q_DECL_OVERRIDE + { + if (metric == QStyle::PM_SplitterWidth) + return handleWidth; + else + return QProxyStyle::pixelMetric(metric, option, widget); + } + int handleWidth; +}; + +void tst_QSplitter::saveAndRestoreHandleWidth() +{ + TestSplitterStyle style; + style.handleWidth = 5; + QSplitter spl; + spl.setStyle(&style); + + QCOMPARE(spl.handleWidth(), style.handleWidth); + style.handleWidth = 10; + QCOMPARE(spl.handleWidth(), style.handleWidth); + QByteArray ba = spl.saveState(); + spl.setHandleWidth(20); + QCOMPARE(spl.handleWidth(), 20); + spl.setHandleWidth(-1); + QCOMPARE(spl.handleWidth(), style.handleWidth); + spl.setHandleWidth(15); + QCOMPARE(spl.handleWidth(), 15); + spl.restoreState(ba); + QCOMPARE(spl.handleWidth(), style.handleWidth); +} + void tst_QSplitter::saveState_data() { QTest::addColumn<IntList>("initialSizes"); diff --git a/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp b/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp index 8dd191e621..38eae1d19d 100644 --- a/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp +++ b/tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp @@ -285,17 +285,21 @@ void tst_QStatusBar::QTBUG25492_msgtimeout() QCOMPARE(testWidget->currentMessage(), QString("Ready")); QCOMPARE(testWidget->currentMessage(), currentMessage); - QTest::qWait(1000); - - // Set display message for 2 seconds again - testWidget->showMessage("Ready", 2000); - QCOMPARE(testWidget->currentMessage(), QString("Ready")); + // Set display message for 2 seconds + QElapsedTimer t; + t.start(); + testWidget->showMessage("Ready 2000", 2000); + QCOMPARE(testWidget->currentMessage(), QString("Ready 2000")); QCOMPARE(testWidget->currentMessage(), currentMessage); - QTest::qWait(1500); - // Message disappears after 2 seconds QTRY_VERIFY(testWidget->currentMessage().isNull()); + qint64 ts = t.elapsed(); + + // XXX: ideally ts should be 2000, but sometimes it appears to go away early, probably due to timer granularity. + QVERIFY2(ts >= 1800, qPrintable("Timer was " + QString::number(ts))); + if (ts < 2000) + qWarning("QTBUG25492_msgtimeout: message vanished early, should be >= 2000, was %lld", ts); QVERIFY(currentMessage.isNull()); // Set display message for 2 seconds first @@ -303,8 +307,6 @@ void tst_QStatusBar::QTBUG25492_msgtimeout() QCOMPARE(testWidget->currentMessage(), QString("Ready 25492")); QCOMPARE(testWidget->currentMessage(), currentMessage); - QTest::qWait(1000); - // Set display message forever again testWidget->showMessage("Ready 25492", 0); QCOMPARE(testWidget->currentMessage(), QString("Ready 25492")); diff --git a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp index 06dd623368..fedf16271f 100644 --- a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp +++ b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp @@ -99,6 +99,7 @@ private slots: void taskQTBUG_10052_widgetLayoutWhenMoving(); void tabBarClicked(); + void autoHide(); }; // Testing get/set functions @@ -701,5 +702,32 @@ void tst_QTabBar::tabBarClicked() } } +void tst_QTabBar::autoHide() +{ + QTabBar tabBar; + QVERIFY(!tabBar.autoHide()); + QVERIFY(!tabBar.isVisible()); + tabBar.show(); + QVERIFY(tabBar.isVisible()); + tabBar.addTab("0"); + QVERIFY(tabBar.isVisible()); + tabBar.removeTab(0); + QVERIFY(tabBar.isVisible()); + + tabBar.setAutoHide(true); + QVERIFY(!tabBar.isVisible()); + tabBar.addTab("0"); + QVERIFY(!tabBar.isVisible()); + tabBar.addTab("1"); + QVERIFY(tabBar.isVisible()); + tabBar.removeTab(0); + QVERIFY(!tabBar.isVisible()); + tabBar.removeTab(0); + QVERIFY(!tabBar.isVisible()); + + tabBar.setAutoHide(false); + QVERIFY(tabBar.isVisible()); +} + QTEST_MAIN(tst_QTabBar) #include "tst_qtabbar.moc" diff --git a/tests/auto/widgets/widgets/widgets.pro b/tests/auto/widgets/widgets/widgets.pro index 29d1f7746c..423b3952d4 100644 --- a/tests/auto/widgets/widgets/widgets.pro +++ b/tests/auto/widgets/widgets/widgets.pro @@ -52,3 +52,5 @@ SUBDIRS=\ qmainwindow \ qtextedit \ qtoolbar \ + +contains(QT_CONFIG, opengl): SUBDIRS += qopenglwidget |