diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2009-03-23 09:18:55 (GMT) |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2009-03-23 09:18:55 (GMT) |
commit | e5fcad302d86d316390c6b0f62759a067313e8a9 (patch) | |
tree | c2afbf6f1066b6ce261f14341cf6d310e5595bc1 /tests/auto/qdialog | |
download | Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.zip Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.tar.gz Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.tar.bz2 |
Long live Qt 4.5!
Diffstat (limited to 'tests/auto/qdialog')
-rw-r--r-- | tests/auto/qdialog/.gitignore | 1 | ||||
-rw-r--r-- | tests/auto/qdialog/qdialog.pro | 5 | ||||
-rw-r--r-- | tests/auto/qdialog/tst_qdialog.cpp | 600 |
3 files changed, 606 insertions, 0 deletions
diff --git a/tests/auto/qdialog/.gitignore b/tests/auto/qdialog/.gitignore new file mode 100644 index 0000000..4a4b5eb --- /dev/null +++ b/tests/auto/qdialog/.gitignore @@ -0,0 +1 @@ +tst_qdialog diff --git a/tests/auto/qdialog/qdialog.pro b/tests/auto/qdialog/qdialog.pro new file mode 100644 index 0000000..7fdb7fc --- /dev/null +++ b/tests/auto/qdialog/qdialog.pro @@ -0,0 +1,5 @@ +load(qttest_p4) +SOURCES += tst_qdialog.cpp + + + diff --git a/tests/auto/qdialog/tst_qdialog.cpp b/tests/auto/qdialog/tst_qdialog.cpp new file mode 100644 index 0000000..e77167e --- /dev/null +++ b/tests/auto/qdialog/tst_qdialog.cpp @@ -0,0 +1,600 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** 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, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include <QtTest/QtTest> + +#include <qdialog.h> +#include <qapplication.h> +#include <qlineedit.h> +#include <qpushbutton.h> +#include <qstyle.h> +#include <QVBoxLayout> +#include <QSizeGrip> + +Q_DECLARE_METATYPE(QSize) + + +QT_FORWARD_DECLARE_CLASS(QDialog) + +//TESTED_CLASS= +//TESTED_FILES= + +class tst_QDialog : public QObject +{ + Q_OBJECT +public: + tst_QDialog(); + +public slots: + void initTestCase(); + void cleanupTestCase(); +private slots: + void getSetCheck(); + void showExtension_data(); + void showExtension(); + void defaultButtons(); + void showMaximized(); + void showMinimized(); + void showFullScreen(); + void showAsTool(); + void toolDialogPosition(); + void deleteMainDefault(); + void deleteInExec(); + void throwInExec(); + void showSizeGrip(); + void setVisible(); + void reject(); + +private: + QDialog *testWidget; +}; + +// Testing get/set functions +void tst_QDialog::getSetCheck() +{ + QDialog obj1; + // QWidget* QDialog::extension() + // void QDialog::setExtension(QWidget*) + QWidget *var1 = new QWidget; + obj1.setExtension(var1); + QCOMPARE(var1, obj1.extension()); + obj1.setExtension((QWidget *)0); + QCOMPARE((QWidget *)0, obj1.extension()); + // No delete var1, since setExtension takes ownership + + // int QDialog::result() + // void QDialog::setResult(int) + obj1.setResult(0); + QCOMPARE(0, obj1.result()); + obj1.setResult(INT_MIN); + QCOMPARE(INT_MIN, obj1.result()); + obj1.setResult(INT_MAX); + QCOMPARE(INT_MAX, obj1.result()); +} + +// work around function being protected +class DummyDialog : public QDialog { +public: + DummyDialog(): QDialog(0) {} + void showExtension( bool b ) { QDialog::showExtension( b ); } +}; + +class ToolDialog : public QDialog +{ +public: + ToolDialog(QWidget *parent = 0) : QDialog(parent, Qt::Tool), mWasActive(false), tId(-1) { + } + bool wasActive() const { return mWasActive; } + + int exec() { + tId = startTimer(300); + return QDialog::exec(); + } +protected: + void timerEvent(QTimerEvent *event) { + if (tId == event->timerId()) { + killTimer(tId); + mWasActive = isActiveWindow(); + reject(); + } + } + +private: + int mWasActive; + int tId; +}; + +tst_QDialog::tst_QDialog() + +{ +} + +void tst_QDialog::initTestCase() +{ + // Create the test class + testWidget = new QDialog(0, Qt::X11BypassWindowManagerHint); + testWidget->resize(200,200); + testWidget->show(); + qApp->setActiveWindow(testWidget); +} + +void tst_QDialog::cleanupTestCase() +{ + if (testWidget) { + delete testWidget; + testWidget = 0; + } +} + +void tst_QDialog::showExtension_data() +{ + QTest::addColumn<QSize>("dlgSize"); + QTest::addColumn<QSize>("extSize"); + QTest::addColumn<bool>("horizontal"); + QTest::addColumn<QSize>("result"); + + //next we fill it with data + QTest::newRow( "data0" ) << QSize(100,100) << QSize(50,50) << (bool)FALSE << QSize(100,150); + QTest::newRow( "data1" ) << QSize(100,100) << QSize(120,50) << (bool)FALSE << QSize(120,150); + QTest::newRow( "data2" ) << QSize(100,100) << QSize(50,50) << (bool)TRUE << QSize(150,100); + QTest::newRow( "data3" ) << QSize(100,100) << QSize(50,120) << (bool)TRUE << QSize(150,120); +} + +void tst_QDialog::showExtension() +{ + QFETCH( QSize, dlgSize ); + QFETCH( QSize, extSize ); + QFETCH( bool, horizontal ); + + // set geometry of main dialog and extension widget + testWidget->setFixedSize( dlgSize ); + QWidget *ext = new QWidget( testWidget ); + ext->setFixedSize( extSize ); + testWidget->setExtension( ext ); + testWidget->setOrientation( horizontal ? Qt::Horizontal : Qt::Vertical ); + + QCOMPARE( testWidget->size(), dlgSize ); + QPoint oldPosition = testWidget->pos(); + + // show + ((DummyDialog*)testWidget)->showExtension( TRUE ); +// while ( testWidget->size() == dlgSize ) +// qApp->processEvents(); + QTEST( testWidget->size(), "result" ); + QCOMPARE(testWidget->pos(), oldPosition); + + // hide extension. back to old size ? + ((DummyDialog*)testWidget)->showExtension( FALSE ); + QCOMPARE( testWidget->size(), dlgSize ); + + testWidget->setExtension( 0 ); +} + +void tst_QDialog::defaultButtons() +{ + QLineEdit *lineEdit = new QLineEdit(testWidget); + QPushButton *push = new QPushButton("Button 1", testWidget); + QPushButton *pushTwo = new QPushButton("Button 2", testWidget); + QPushButton *pushThree = new QPushButton("Button 3", testWidget); + pushThree->setAutoDefault(FALSE); + + //we need to show the buttons. Otherwise they won't get the focus + push->show(); + pushTwo->show(); + pushThree->show(); + + push->setDefault(TRUE); + QVERIFY(push->isDefault()); + + pushTwo->setFocus(); + QVERIFY(pushTwo->isDefault()); + pushThree->setFocus(); + QVERIFY(push->isDefault()); + lineEdit->setFocus(); + QVERIFY(push->isDefault()); + + pushTwo->setDefault(TRUE); + QVERIFY(pushTwo->isDefault()); + + pushTwo->setFocus(); + QVERIFY(pushTwo->isDefault()); + lineEdit->setFocus(); + QVERIFY(pushTwo->isDefault()); +} + +void tst_QDialog::showMaximized() +{ + QDialog dialog(0); + dialog.setSizeGripEnabled(true); + QSizeGrip *sizeGrip = qFindChild<QSizeGrip *>(&dialog); + QVERIFY(sizeGrip); + + dialog.showMaximized(); + QVERIFY(dialog.isMaximized()); + QVERIFY(dialog.isVisible()); +#if !defined(Q_WS_MAC) && !defined(Q_OS_IRIX) && !defined(Q_OS_HPUX) + QVERIFY(!sizeGrip->isVisible()); +#endif + + dialog.showNormal(); + QVERIFY(!dialog.isMaximized()); + QVERIFY(dialog.isVisible()); + QVERIFY(sizeGrip->isVisible()); + + dialog.showMaximized(); + QVERIFY(dialog.isMaximized()); + QVERIFY(dialog.isVisible()); + + dialog.hide(); + QVERIFY(dialog.isMaximized()); + QVERIFY(!dialog.isVisible()); + + dialog.show(); + QVERIFY(dialog.isMaximized()); + QVERIFY(dialog.isVisible()); + + dialog.hide(); + QVERIFY(dialog.isMaximized()); + QVERIFY(!dialog.isVisible()); + + dialog.showMaximized(); + QVERIFY(dialog.isMaximized()); + QVERIFY(dialog.isVisible()); +} + +void tst_QDialog::showMinimized() +{ + QDialog dialog(0); + + dialog.showMinimized(); + QVERIFY(dialog.isMinimized()); + QVERIFY(dialog.isVisible()); + + dialog.showNormal(); + QVERIFY(!dialog.isMinimized()); + QVERIFY(dialog.isVisible()); + + dialog.showMinimized(); + QVERIFY(dialog.isMinimized()); + QVERIFY(dialog.isVisible()); + + dialog.hide(); + QVERIFY(dialog.isMinimized()); + QVERIFY(!dialog.isVisible()); + + dialog.show(); + QVERIFY(dialog.isMinimized()); + QVERIFY(dialog.isVisible()); + + dialog.hide(); + QVERIFY(dialog.isMinimized()); + QVERIFY(!dialog.isVisible()); + + dialog.showMinimized(); + QVERIFY(dialog.isMinimized()); + QVERIFY(dialog.isVisible()); +} + +void tst_QDialog::showFullScreen() +{ + QDialog dialog(0, Qt::X11BypassWindowManagerHint); + dialog.setSizeGripEnabled(true); + QSizeGrip *sizeGrip = qFindChild<QSizeGrip *>(&dialog); + QVERIFY(sizeGrip); + + qApp->syncX(); + dialog.showFullScreen(); + QVERIFY(dialog.isFullScreen()); + QVERIFY(dialog.isVisible()); + QVERIFY(!sizeGrip->isVisible()); + + qApp->syncX(); + dialog.showNormal(); + QVERIFY(!dialog.isFullScreen()); + QVERIFY(dialog.isVisible()); + QVERIFY(sizeGrip->isVisible()); + + qApp->syncX(); + dialog.showFullScreen(); + QVERIFY(dialog.isFullScreen()); + QVERIFY(dialog.isVisible()); + + qApp->syncX(); + dialog.hide(); + QVERIFY(dialog.isFullScreen()); + QVERIFY(!dialog.isVisible()); + + qApp->syncX(); + dialog.show(); + QVERIFY(dialog.isFullScreen()); + QVERIFY(dialog.isVisible()); + + qApp->syncX(); + dialog.hide(); + QVERIFY(dialog.isFullScreen()); + QVERIFY(!dialog.isVisible()); + + qApp->syncX(); + dialog.showFullScreen(); + QVERIFY(dialog.isFullScreen()); + QVERIFY(dialog.isVisible()); + + qApp->syncX(); + dialog.hide(); + QVERIFY(dialog.isFullScreen()); + QVERIFY(!dialog.isVisible()); +} + +void tst_QDialog::showAsTool() +{ +#if defined(Q_WS_X11) + QSKIP("Qt/X11: Skipped since activeWindow() is not respected by all window managers", SkipAll); +#elif defined(Q_OS_WINCE) + QSKIP("No real support for Qt::Tool on WinCE", SkipAll); +#endif + ToolDialog dialog(testWidget); + testWidget->activateWindow(); + dialog.exec(); + QTest::qWait(100); + if (testWidget->style()->styleHint(QStyle::SH_Widget_ShareActivation, 0, testWidget)) { +#if defined(Q_WS_QWS) && QT_VERSION < 0x040400 + QEXPECT_FAIL(0, "Qtopia Core has messed up WStyle_Tool (task 126435)", Continue); +#endif + QCOMPARE(dialog.wasActive(), true); + } else { + QCOMPARE(dialog.wasActive(), false); + } +} + +// Verify that pos() returns the same before and after show() +// for a dialog with the Tool window type. +void tst_QDialog::toolDialogPosition() +{ +#if defined(Q_OS_WINCE) + QSKIP("No real support for Qt::Tool on WinCE", SkipAll); +#endif + QDialog dialog(0, Qt::Tool); + dialog.move(QPoint(100,100)); + const QPoint beforeShowPosition = dialog.pos(); + dialog.show(); + const QPoint afterShowPosition = dialog.pos(); + QCOMPARE(afterShowPosition, beforeShowPosition); +} + +class Dialog : public QDialog +{ +public: + Dialog(QPushButton *&button) + { + button = new QPushButton(this); + } +}; + +void tst_QDialog::deleteMainDefault() +{ + QPushButton *button; + Dialog dialog(button); + button->setDefault(true); + delete button; + dialog.show(); + QTestEventLoop::instance().enterLoop(2); +} + +void tst_QDialog::deleteInExec() +{ + QDialog *dialog = new QDialog(0); + QMetaObject::invokeMethod(dialog, "deleteLater", Qt::QueuedConnection); + QCOMPARE(dialog->exec(), int(QDialog::Rejected)); +} + +#ifndef QT_NO_EXCEPTIONS +class QDialogTestException { }; + +class ExceptionDialog : public QDialog +{ + Q_OBJECT +public: + ExceptionDialog() : QDialog(0) { } +public slots: + void throwException() + { + QDialogTestException e; + throw e; + } +}; + +void tst_QDialog::throwInExec() +{ +#ifdef Q_WS_MAC + QSKIP("Qt/Mac: Throwing exceptions in excec() is not supported.", SkipAll); +#endif + int caughtExceptions = 0; + try { + ExceptionDialog dialog; + QMetaObject::invokeMethod(&dialog, "throwException", Qt::QueuedConnection); + (void) dialog.exec(); + } catch(...) { + ++caughtExceptions; + } + QCOMPARE(caughtExceptions, 1); +} +#else +void tst_QDialog::throwInExec() +{ + QSKIP("Exceptions are disabled", SkipAll); +} +#endif //QT_NO_EXCEPTIONS + +// From Task 124269 +void tst_QDialog::showSizeGrip() +{ +#ifndef QT_NO_SIZEGRIP + QDialog dialog(0); + dialog.show(); + QWidget *ext = new QWidget(&dialog); + QVERIFY(!dialog.extension()); + QVERIFY(!dialog.isSizeGripEnabled()); + + dialog.setSizeGripEnabled(true); + QPointer<QSizeGrip> sizeGrip = qFindChild<QSizeGrip *>(&dialog); + QVERIFY(sizeGrip); + QVERIFY(sizeGrip->isVisible()); + QVERIFY(dialog.isSizeGripEnabled()); + + dialog.setExtension(ext); + QVERIFY(dialog.extension() && !dialog.extension()->isVisible()); + QVERIFY(dialog.isSizeGripEnabled()); + + // normal show/hide sequence + dialog.showExtension(true); + QVERIFY(dialog.extension() && dialog.extension()->isVisible()); + QVERIFY(!dialog.isSizeGripEnabled()); + QVERIFY(!sizeGrip); + + dialog.showExtension(false); + QVERIFY(dialog.extension() && !dialog.extension()->isVisible()); + QVERIFY(dialog.isSizeGripEnabled()); + sizeGrip = qFindChild<QSizeGrip *>(&dialog); + QVERIFY(sizeGrip); + QVERIFY(sizeGrip->isVisible()); + + // show/hide sequence with interleaved size grip update + dialog.showExtension(true); + QVERIFY(dialog.extension() && dialog.extension()->isVisible()); + QVERIFY(!dialog.isSizeGripEnabled()); + QVERIFY(!sizeGrip); + + dialog.setSizeGripEnabled(false); + QVERIFY(!dialog.isSizeGripEnabled()); + + dialog.showExtension(false); + QVERIFY(dialog.extension() && !dialog.extension()->isVisible()); + QVERIFY(!dialog.isSizeGripEnabled()); + + dialog.setSizeGripEnabled(true); + sizeGrip = qFindChild<QSizeGrip *>(&dialog); + QVERIFY(sizeGrip); + QVERIFY(sizeGrip->isVisible()); + sizeGrip->hide(); + dialog.hide(); + dialog.show(); + QVERIFY(!sizeGrip->isVisible()); +#endif +} + +void tst_QDialog::setVisible() +{ + QWidget topLevel; + topLevel.show(); + + QDialog *dialog = new QDialog; + dialog->setLayout(new QVBoxLayout); + dialog->layout()->addWidget(new QPushButton("dialog button")); + + QWidget *widget = new QWidget(&topLevel); + widget->setLayout(new QVBoxLayout); + widget->layout()->addWidget(dialog); + + QVERIFY(!dialog->isVisible()); + QVERIFY(!dialog->isHidden()); + + widget->show(); + QVERIFY(dialog->isVisible()); + QVERIFY(!dialog->isHidden()); + + widget->hide(); + dialog->hide(); + widget->show(); + QVERIFY(!dialog->isVisible()); + QVERIFY(dialog->isHidden()); +} + +class TestRejectDialog : public QDialog +{ + public: + TestRejectDialog() : cancelReject(false), called(0) {} + void reject() + { + called++; + if (!cancelReject) + QDialog::reject(); + } + bool cancelReject; + int called; +}; + +void tst_QDialog::reject() +{ + TestRejectDialog dialog; + dialog.show(); + QTest::qWait(100); + QVERIFY(dialog.isVisible()); + dialog.reject(); + QTest::qWait(100); + QVERIFY(!dialog.isVisible()); + QCOMPARE(dialog.called, 1); + + dialog.show(); + QTest::qWait(100); + QVERIFY(dialog.isVisible()); + QVERIFY(dialog.close()); + QTest::qWait(100); + QVERIFY(!dialog.isVisible()); + QCOMPARE(dialog.called, 2); + + dialog.cancelReject = true; + dialog.show(); + QTest::qWait(100); + QVERIFY(dialog.isVisible()); + dialog.reject(); + QTest::qWait(100); + QVERIFY(dialog.isVisible()); + QCOMPARE(dialog.called, 3); + QVERIFY(!dialog.close()); + QTest::qWait(100); + QVERIFY(dialog.isVisible()); + QCOMPARE(dialog.called, 4); +} + + +QTEST_MAIN(tst_QDialog) +#include "tst_qdialog.moc" |