summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/widgets/widgets')
-rw-r--r--tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp28
-rw-r--r--tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp19
-rw-r--r--tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp42
-rw-r--r--tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp15
-rw-r--r--tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp47
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp22
-rw-r--r--tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro8
-rw-r--r--tests/auto/widgets/widgets/qopenglwidget/tst_qopenglwidget.cpp266
-rw-r--r--tests/auto/widgets/widgets/qspinbox/tst_qspinbox.cpp15
-rw-r--r--tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp37
-rw-r--r--tests/auto/widgets/widgets/qstatusbar/tst_qstatusbar.cpp20
-rw-r--r--tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp28
-rw-r--r--tests/auto/widgets/widgets/widgets.pro2
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