tests/auto/qdialog/tst_qdialog.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/auto/qdialog/tst_qdialog.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,616 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying
+** this package.
+**
+** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@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>
+
+#include "../../shared/util.h"
+
+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();
+
+#ifdef Q_WS_S60
+    const int htDiff = ext->size().height() - testWidget->size().height();
+#endif
+    // show
+    ((DummyDialog*)testWidget)->showExtension( TRUE );
+//     while ( testWidget->size() == dlgSize )
+// 	qApp->processEvents();
+
+#ifdef Q_WS_S60
+    QPoint expectedPosition;
+    if (!horizontal) {
+        expectedPosition = QPoint(0, oldPosition.y() - extSize.height());
+    } else {
+        if (htDiff>0)
+            expectedPosition = QPoint(0, oldPosition.y() - htDiff);
+        else
+            expectedPosition = oldPosition;
+    }
+#endif
+
+    QTEST( testWidget->size(), "result"  );
+
+#ifdef Q_WS_S60
+    QCOMPARE(testWidget->pos(), expectedPosition);
+#else
+    QCOMPARE(testWidget->pos(), oldPosition);
+#endif
+
+    // 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)) {
+        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 exec() 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::qWaitForWindowShown(&dialog);
+    QTRY_VERIFY(dialog.isVisible());
+    dialog.reject();
+    QTRY_VERIFY(!dialog.isVisible());
+    QCOMPARE(dialog.called, 1);
+
+    dialog.show();
+    QTest::qWaitForWindowShown(&dialog);
+    QTRY_VERIFY(dialog.isVisible());
+    QVERIFY(dialog.close());
+    QTRY_VERIFY(!dialog.isVisible());
+    QCOMPARE(dialog.called, 2);
+
+    dialog.cancelReject = true;
+    dialog.show();
+    QTest::qWaitForWindowShown(&dialog);
+    QTRY_VERIFY(dialog.isVisible());
+    dialog.reject();
+    QTRY_VERIFY(dialog.isVisible());
+    QCOMPARE(dialog.called, 3);
+    QVERIFY(!dialog.close());
+    QTRY_VERIFY(dialog.isVisible());
+    QCOMPARE(dialog.called, 4);
+}
+
+
+QTEST_MAIN(tst_QDialog)
+#include "tst_qdialog.moc"