tests/auto/qdockwidget/tst_qdockwidget.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/auto/qdockwidget/tst_qdockwidget.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,819 @@
+/****************************************************************************
+**
+** 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 <qaction.h>
+#include <qdockwidget.h>
+#include <qmainwindow.h>
+#include <qlineedit.h>
+#include <QDesktopWidget>
+#include <QtGui/QPainter>
+
+bool hasFeature(QDockWidget *dockwidget, QDockWidget::DockWidgetFeature feature)
+{ return (dockwidget->features() & feature) == feature; }
+
+void setFeature(QDockWidget *dockwidget, QDockWidget::DockWidgetFeature feature, bool on = true)
+{
+    const QDockWidget::DockWidgetFeatures features = dockwidget->features();
+    dockwidget->setFeatures(on ? features | feature : features & ~feature);
+}
+
+//TESTED_FILES=
+
+class tst_QDockWidget : public QObject
+{
+     Q_OBJECT
+
+public:
+    tst_QDockWidget();
+
+private slots:
+    void getSetCheck();
+    void widget();
+    void setWidget();
+    void setFeatures();
+    void features();
+    void setFloating();
+    void setAllowedAreas();
+    void allowedAreas();
+    void isAreaAllowed();
+    void toggleViewAction();
+    void featuresChanged();
+    void topLevelChanged();
+    void allowedAreasChanged();
+    void visibilityChanged();
+    void dockLocationChanged();
+    void setTitleBarWidget();
+    // task specific tests:
+    void task165177_deleteFocusWidget();
+    void task169808_setFloating();
+    void task237438_setFloatingCrash();
+    void task248604_infiniteResize();
+    void task258459_visibilityChanged();
+};
+
+// Testing get/set functions
+void tst_QDockWidget::getSetCheck()
+{
+    QDockWidget obj1;
+    // QWidget * QDockWidget::widget()
+    // void QDockWidget::setWidget(QWidget *)
+    QWidget *var1 = new QWidget();
+    obj1.setWidget(var1);
+    QCOMPARE(var1, obj1.widget());
+    obj1.setWidget((QWidget *)0);
+    QCOMPARE((QWidget *)0, obj1.widget());
+    delete var1;
+
+    // DockWidgetFeatures QDockWidget::features()
+    // void QDockWidget::setFeatures(DockWidgetFeatures)
+    obj1.setFeatures(QDockWidget::DockWidgetFeatures(QDockWidget::DockWidgetClosable));
+    QCOMPARE(QDockWidget::DockWidgetFeatures(QDockWidget::DockWidgetClosable), obj1.features());
+    obj1.setFeatures(QDockWidget::DockWidgetFeatures(QDockWidget::DockWidgetMovable));
+    QCOMPARE(QDockWidget::DockWidgetFeatures(QDockWidget::DockWidgetMovable), obj1.features());
+    obj1.setFeatures(QDockWidget::DockWidgetFeatures(QDockWidget::DockWidgetFloatable));
+    QCOMPARE(QDockWidget::DockWidgetFeatures(QDockWidget::DockWidgetFloatable), obj1.features());
+    obj1.setFeatures(QDockWidget::DockWidgetFeatures(QDockWidget::AllDockWidgetFeatures));
+    QCOMPARE(QDockWidget::DockWidgetFeatures(QDockWidget::AllDockWidgetFeatures), obj1.features());
+    obj1.setFeatures(QDockWidget::DockWidgetFeatures(QDockWidget::NoDockWidgetFeatures));
+    QCOMPARE(QDockWidget::DockWidgetFeatures(QDockWidget::NoDockWidgetFeatures), obj1.features());
+}
+
+tst_QDockWidget::tst_QDockWidget()
+{
+    qRegisterMetaType<QDockWidget::DockWidgetFeatures>("QDockWidget::DockWidgetFeatures");
+    qRegisterMetaType<Qt::DockWidgetAreas>("Qt::DockWidgetAreas");
+}
+
+void tst_QDockWidget::widget()
+{
+    {
+        QDockWidget dw;
+        QVERIFY(dw.widget() == 0);
+    }
+
+    {
+        QDockWidget dw;
+        QWidget *w1 = new QWidget;
+        QWidget *w2 = new QWidget;
+
+        dw.setWidget(w1);
+        QVERIFY(dw.widget() != 0);
+        QVERIFY(dw.widget() == w1);
+        QCOMPARE(w1->parentWidget(), (QWidget*)&dw);
+
+        dw.setWidget(0);
+        QVERIFY(dw.widget() == 0);
+
+        dw.setWidget(w2);
+        QVERIFY(dw.widget() != 0);
+        QVERIFY(dw.widget() == w2);
+        QCOMPARE(w2->parentWidget(), (QWidget*)&dw);
+
+        dw.setWidget(0);
+        QVERIFY(dw.widget() == 0);
+
+        dw.setWidget(w1);
+        QVERIFY(dw.widget() != 0);
+        QVERIFY(dw.widget() == w1);
+        QCOMPARE(w1->parentWidget(), (QWidget*)&dw);
+
+        dw.setWidget(w2);
+        QVERIFY(dw.widget() != 0);
+        QVERIFY(dw.widget() == w2);
+        QCOMPARE(w2->parentWidget(), (QWidget*)&dw);
+
+        dw.setWidget(0);
+        QVERIFY(dw.widget() == 0);
+    }
+
+    {
+        QDockWidget dw;
+        QWidget *w1 = new QWidget;
+        QWidget *w2 = new QWidget;
+
+        dw.setWidget(w1);
+        QVERIFY(dw.widget() != 0);
+        QVERIFY(dw.widget() == w1);
+        QCOMPARE(w1->parentWidget(), (QWidget*)&dw);
+
+        w1->setParent(0);
+        QVERIFY(dw.widget() == 0);
+
+        dw.setWidget(w2);
+        QVERIFY(dw.widget() != 0);
+        QVERIFY(dw.widget() == w2);
+        QCOMPARE(w2->parentWidget(), (QWidget*)&dw);
+
+        w2->setParent(0);
+        QVERIFY(dw.widget() == 0);
+
+        dw.setWidget(w1);
+        QVERIFY(dw.widget() != 0);
+        QVERIFY(dw.widget() == w1);
+        QCOMPARE(w1->parentWidget(), (QWidget*)&dw);
+
+        dw.setWidget(w2);
+        QVERIFY(dw.widget() != 0);
+        QVERIFY(dw.widget() == w2);
+        QCOMPARE(w2->parentWidget(), (QWidget*)&dw);
+
+        w1->setParent(0);
+        QVERIFY(dw.widget() != 0);
+        QVERIFY(dw.widget() == w2);
+        QCOMPARE(w2->parentWidget(), (QWidget*)&dw);
+
+        w2->setParent(0);
+        QVERIFY(dw.widget() == 0);
+        delete w1;
+        delete w2;
+    }
+}
+
+void tst_QDockWidget::setWidget()
+{ DEPENDS_ON("setWidget()"); }
+
+void tst_QDockWidget::setFeatures()
+{ DEPENDS_ON("features()"); }
+
+void tst_QDockWidget::features()
+{
+    QDockWidget dw;
+
+    QSignalSpy spy(&dw, SIGNAL(featuresChanged(QDockWidget::DockWidgetFeatures)));
+
+    // default features for dock widgets
+    int allDockWidgetFeatures = QDockWidget::DockWidgetClosable |
+                                QDockWidget::DockWidgetMovable  |
+                                QDockWidget::DockWidgetFloatable;
+
+    // defaults
+    QCOMPARE(dw.features(), allDockWidgetFeatures);
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
+
+    // test individual setting
+    setFeature(&dw, QDockWidget::DockWidgetClosable, false);
+    QCOMPARE(dw.features(), QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
+    QVERIFY(!hasFeature(&dw, QDockWidget::DockWidgetClosable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE((int)*(static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData())),
+            (int)dw.features());
+    spy.clear();
+    dw.setFeatures(dw.features());
+    QCOMPARE(spy.count(), 0);
+    spy.clear();
+
+    setFeature(&dw, QDockWidget::DockWidgetClosable);
+    QCOMPARE(dw.features(), allDockWidgetFeatures);
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
+            (int)dw.features());
+    spy.clear();
+    dw.setFeatures(dw.features());
+    QCOMPARE(spy.count(), 0);
+    spy.clear();
+
+    setFeature(&dw, QDockWidget::DockWidgetMovable, false);
+    QCOMPARE(dw.features(), QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
+    QVERIFY(!hasFeature(&dw, QDockWidget::DockWidgetMovable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
+            (int)dw.features());
+    spy.clear();
+    dw.setFeatures(dw.features());
+    QCOMPARE(spy.count(), 0);
+    spy.clear();
+
+    setFeature(&dw, QDockWidget::DockWidgetMovable);
+    QCOMPARE(dw.features(), allDockWidgetFeatures);
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
+            (int)dw.features());
+    spy.clear();
+    dw.setFeatures(dw.features());
+    QCOMPARE(spy.count(), 0);
+    spy.clear();
+
+    setFeature(&dw, QDockWidget::DockWidgetFloatable, false);
+    QCOMPARE(dw.features(), QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable);
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
+    QVERIFY(!hasFeature(&dw, QDockWidget::DockWidgetFloatable));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
+            (int)dw.features());
+    spy.clear();
+    dw.setFeatures(dw.features());
+    QCOMPARE(spy.count(), 0);
+    spy.clear();
+
+    setFeature(&dw, QDockWidget::DockWidgetFloatable);
+    QCOMPARE(dw.features(), allDockWidgetFeatures);
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
+            (int)dw.features());
+    spy.clear();
+    dw.setFeatures(dw.features());
+    QCOMPARE(spy.count(), 0);
+    spy.clear();
+
+    // set all at once
+    dw.setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable);
+    QCOMPARE(dw.features(), QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable);
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
+    QVERIFY(!hasFeature(&dw, QDockWidget::DockWidgetFloatable));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
+            (int)dw.features());
+    spy.clear();
+    dw.setFeatures(dw.features());
+    QCOMPARE(spy.count(), 0);
+    spy.clear();
+
+    dw.setFeatures(QDockWidget::DockWidgetClosable);
+    QCOMPARE(dw.features(), QDockWidget::DockWidgetClosable);
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
+    QVERIFY(!hasFeature(&dw, QDockWidget::DockWidgetMovable));
+    QVERIFY(!hasFeature(&dw, QDockWidget::DockWidgetFloatable));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
+            (int)dw.features());
+    spy.clear();
+    dw.setFeatures(dw.features());
+    QCOMPARE(spy.count(), 0);
+    spy.clear();
+
+    dw.setFeatures(QDockWidget::AllDockWidgetFeatures);
+    QCOMPARE(dw.features(), QDockWidget::AllDockWidgetFeatures);
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
+    QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
+            (int)dw.features());
+    spy.clear();
+    dw.setFeatures(dw.features());
+    QCOMPARE(spy.count(), 0);
+    spy.clear();
+}
+
+void tst_QDockWidget::setFloating()
+{
+    QMainWindow mw;
+    QDockWidget dw;
+    mw.addDockWidget(Qt::LeftDockWidgetArea, &dw);
+
+    mw.show();
+#ifdef Q_WS_X11
+    qt_x11_wait_for_window_manager(&mw);
+#endif
+
+    QVERIFY(!dw.isFloating());
+
+    QSignalSpy spy(&dw, SIGNAL(topLevelChanged(bool)));
+
+    dw.setFloating(true);
+    QVERIFY(dw.isFloating());
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.at(0).value(0).toBool(), dw.isFloating());
+    spy.clear();
+    dw.setFloating(dw.isFloating());
+    QCOMPARE(spy.count(), 0);
+    spy.clear();
+
+    dw.setFloating(false);
+    QVERIFY(!dw.isFloating());
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.at(0).value(0).toBool(), dw.isFloating());
+    spy.clear();
+    dw.setFloating(dw.isFloating());
+    QCOMPARE(spy.count(), 0);
+    spy.clear();
+}
+
+void tst_QDockWidget::setAllowedAreas()
+{ DEPENDS_ON("allowedAreas()"); }
+
+void tst_QDockWidget::allowedAreas()
+{
+    QDockWidget dw;
+
+    QSignalSpy spy(&dw, SIGNAL(allowedAreasChanged(Qt::DockWidgetAreas)));
+
+    // default
+    QCOMPARE(dw.allowedAreas(), Qt::AllDockWidgetAreas);
+    QVERIFY(dw.isAreaAllowed(Qt::LeftDockWidgetArea));
+    QVERIFY(dw.isAreaAllowed(Qt::RightDockWidgetArea));
+    QVERIFY(dw.isAreaAllowed(Qt::TopDockWidgetArea));
+    QVERIFY(dw.isAreaAllowed(Qt::BottomDockWidgetArea));
+
+    // a single dock window area
+    dw.setAllowedAreas(Qt::LeftDockWidgetArea);
+    QCOMPARE(dw.allowedAreas(), Qt::LeftDockWidgetArea);
+    QVERIFY(dw.isAreaAllowed(Qt::LeftDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::RightDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::TopDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::BottomDockWidgetArea));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
+            dw.allowedAreas());
+    spy.clear();
+    dw.setAllowedAreas(dw.allowedAreas());
+    QCOMPARE(spy.count(), 0);
+
+    dw.setAllowedAreas(Qt::RightDockWidgetArea);
+    QCOMPARE(dw.allowedAreas(), Qt::RightDockWidgetArea);
+    QVERIFY(!dw.isAreaAllowed(Qt::LeftDockWidgetArea));
+    QVERIFY(dw.isAreaAllowed(Qt::RightDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::TopDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::BottomDockWidgetArea));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
+            dw.allowedAreas());
+    spy.clear();
+    dw.setAllowedAreas(dw.allowedAreas());
+    QCOMPARE(spy.count(), 0);
+
+    dw.setAllowedAreas(Qt::TopDockWidgetArea);
+    QCOMPARE(dw.allowedAreas(), Qt::TopDockWidgetArea);
+    QVERIFY(!dw.isAreaAllowed(Qt::LeftDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::RightDockWidgetArea));
+    QVERIFY(dw.isAreaAllowed(Qt::TopDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::BottomDockWidgetArea));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
+            dw.allowedAreas());
+    spy.clear();
+    dw.setAllowedAreas(dw.allowedAreas());
+    QCOMPARE(spy.count(), 0);
+
+    dw.setAllowedAreas(Qt::BottomDockWidgetArea);
+    QCOMPARE(dw.allowedAreas(), Qt::BottomDockWidgetArea);
+    QVERIFY(!dw.isAreaAllowed(Qt::LeftDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::RightDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::TopDockWidgetArea));
+    QVERIFY(dw.isAreaAllowed(Qt::BottomDockWidgetArea));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
+            dw.allowedAreas());
+    spy.clear();
+    dw.setAllowedAreas(dw.allowedAreas());
+    QCOMPARE(spy.count(), 0);
+
+    // multiple dock window areas
+    dw.setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
+    QCOMPARE(dw.allowedAreas(), Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
+    QVERIFY(!dw.isAreaAllowed(Qt::LeftDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::RightDockWidgetArea));
+    QVERIFY(dw.isAreaAllowed(Qt::TopDockWidgetArea));
+    QVERIFY(dw.isAreaAllowed(Qt::BottomDockWidgetArea));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
+            dw.allowedAreas());
+    spy.clear();
+    dw.setAllowedAreas(dw.allowedAreas());
+    QCOMPARE(spy.count(), 0);
+
+    dw.setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+    QCOMPARE(dw.allowedAreas(), Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+    QVERIFY(dw.isAreaAllowed(Qt::LeftDockWidgetArea));
+    QVERIFY(dw.isAreaAllowed(Qt::RightDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::TopDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::BottomDockWidgetArea));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
+            dw.allowedAreas());
+    spy.clear();
+    dw.setAllowedAreas(dw.allowedAreas());
+    QCOMPARE(spy.count(), 0);
+
+    dw.setAllowedAreas(Qt::TopDockWidgetArea | Qt::LeftDockWidgetArea);
+    QCOMPARE(dw.allowedAreas(), Qt::TopDockWidgetArea | Qt::LeftDockWidgetArea);
+    QVERIFY(dw.isAreaAllowed(Qt::LeftDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::RightDockWidgetArea));
+    QVERIFY(dw.isAreaAllowed(Qt::TopDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::BottomDockWidgetArea));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
+            dw.allowedAreas());
+    spy.clear();
+    dw.setAllowedAreas(dw.allowedAreas());
+    QCOMPARE(spy.count(), 0);
+
+    dw.setAllowedAreas(Qt::BottomDockWidgetArea | Qt::RightDockWidgetArea);
+    QCOMPARE(dw.allowedAreas(), Qt::BottomDockWidgetArea | Qt::RightDockWidgetArea);
+    QVERIFY(!dw.isAreaAllowed(Qt::LeftDockWidgetArea));
+    QVERIFY(dw.isAreaAllowed(Qt::RightDockWidgetArea));
+    QVERIFY(!dw.isAreaAllowed(Qt::TopDockWidgetArea));
+    QVERIFY(dw.isAreaAllowed(Qt::BottomDockWidgetArea));
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
+            dw.allowedAreas());
+    spy.clear();
+    dw.setAllowedAreas(dw.allowedAreas());
+    QCOMPARE(spy.count(), 0);
+}
+
+void tst_QDockWidget::isAreaAllowed()
+{ DEPENDS_ON("allowedAreas()"); }
+
+void tst_QDockWidget::toggleViewAction()
+{
+    QMainWindow mw;
+    QDockWidget dw(&mw);
+    mw.addDockWidget(Qt::LeftDockWidgetArea, &dw);
+    mw.show();
+    QAction *toggleViewAction = dw.toggleViewAction();
+    QVERIFY(!dw.isHidden());
+    toggleViewAction->trigger();
+    QVERIFY(dw.isHidden());
+    toggleViewAction->trigger();
+    QVERIFY(!dw.isHidden());
+    toggleViewAction->trigger();
+    QVERIFY(dw.isHidden());
+}
+
+void tst_QDockWidget::visibilityChanged()
+{
+    QMainWindow mw;
+    QDockWidget dw;
+    QSignalSpy spy(&dw, SIGNAL(visibilityChanged(bool)));
+
+    mw.addDockWidget(Qt::LeftDockWidgetArea, &dw);
+    mw.show();
+
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.at(0).at(0).toBool(), true);
+    spy.clear();
+
+    dw.hide();
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.at(0).at(0).toBool(), false);
+    spy.clear();
+
+    dw.hide();
+    QCOMPARE(spy.count(), 0);
+
+    dw.show();
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.at(0).at(0).toBool(), true);
+    spy.clear();
+
+    dw.show();
+    QCOMPARE(spy.count(), 0);
+
+    QDockWidget dw2;
+    mw.tabifyDockWidget(&dw, &dw2);
+    dw2.show();
+    dw2.raise();
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.at(0).at(0).toBool(), false);
+    spy.clear();
+
+    dw2.hide();
+    qApp->processEvents();
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.at(0).at(0).toBool(), true);
+    spy.clear();
+
+    dw2.show();
+    dw2.raise();
+    qApp->processEvents();
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.at(0).at(0).toBool(), false);
+    spy.clear();
+
+    dw.raise();
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.at(0).at(0).toBool(), true);
+    spy.clear();
+
+    dw.raise();
+    QCOMPARE(spy.count(), 0);
+
+    dw2.raise();
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.at(0).at(0).toBool(), false);
+    spy.clear();
+
+    dw2.raise();
+    QCOMPARE(spy.count(), 0);
+
+    mw.addDockWidget(Qt::RightDockWidgetArea, &dw2);
+	QTest::qWait(200);
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(spy.at(0).at(0).toBool(), true);
+}
+
+Q_DECLARE_METATYPE(Qt::DockWidgetArea)
+
+void tst_QDockWidget::dockLocationChanged()
+{
+    qRegisterMetaType<Qt::DockWidgetArea>("Qt::DockWidgetArea");
+
+    QMainWindow mw;
+    QDockWidget dw;
+    QSignalSpy spy(&dw, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)));
+
+    mw.addDockWidget(Qt::LeftDockWidgetArea, &dw);
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(qvariant_cast<Qt::DockWidgetArea>(spy.at(0).at(0)),
+                Qt::LeftDockWidgetArea);
+    spy.clear();
+
+    mw.addDockWidget(Qt::LeftDockWidgetArea, &dw);
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(qvariant_cast<Qt::DockWidgetArea>(spy.at(0).at(0)),
+                Qt::LeftDockWidgetArea);
+    spy.clear();
+
+    mw.addDockWidget(Qt::RightDockWidgetArea, &dw);
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(qvariant_cast<Qt::DockWidgetArea>(spy.at(0).at(0)),
+                Qt::RightDockWidgetArea);
+    spy.clear();
+
+    mw.removeDockWidget(&dw);
+    QCOMPARE(spy.count(), 0);
+
+    QDockWidget dw2;
+    mw.addDockWidget(Qt::TopDockWidgetArea, &dw2);
+    mw.tabifyDockWidget(&dw2, &dw);
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(qvariant_cast<Qt::DockWidgetArea>(spy.at(0).at(0)),
+                Qt::TopDockWidgetArea);
+    spy.clear();
+
+    mw.splitDockWidget(&dw2, &dw, Qt::Horizontal);
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(qvariant_cast<Qt::DockWidgetArea>(spy.at(0).at(0)),
+                Qt::TopDockWidgetArea);
+    spy.clear();
+    
+    dw.setFloating(true);
+    QTest::qWait(100);
+    dw.setFloating(false);
+    QTest::qWait(100);
+    QCOMPARE(spy.count(), 1);
+    QCOMPARE(qvariant_cast<Qt::DockWidgetArea>(spy.at(0).at(0)),
+             Qt::TopDockWidgetArea);
+    spy.clear();
+}
+
+void tst_QDockWidget::featuresChanged()
+{ DEPENDS_ON("features()"); }
+
+void tst_QDockWidget::topLevelChanged()
+{ DEPENDS_ON("setFloating()"); }
+
+void tst_QDockWidget::allowedAreasChanged()
+{ DEPENDS_ON("allowedAreas()"); }
+
+void tst_QDockWidget::setTitleBarWidget()
+{
+    //test the successive usage of setTitleBarWidget
+
+    QDockWidget dock;
+    QWidget w, w2;
+
+    dock.show();
+    qApp->processEvents();
+
+    dock.setTitleBarWidget(&w);
+    qApp->processEvents();
+    QCOMPARE(w.isVisible(), true);
+
+    //set another widget as the titlebar widget
+    dock.setTitleBarWidget(&w2); // this used to crash (task 184668)
+    qApp->processEvents();
+    QCOMPARE(w.isVisible(), false);
+    QCOMPARE(w2.isVisible(), true);
+
+    //tries to reset the titlebarwidget to none
+    dock.setTitleBarWidget(0);
+    qApp->processEvents();
+    QCOMPARE(w.isVisible(), false);
+    QCOMPARE(w2.isVisible(), false);
+}
+
+
+void tst_QDockWidget::task165177_deleteFocusWidget()
+{
+    QMainWindow mw;
+    QDockWidget *dw = new QDockWidget(&mw);
+    mw.addDockWidget(Qt::LeftDockWidgetArea, dw);
+    QLineEdit *ledit = new QLineEdit;
+    dw->setWidget(ledit);
+    mw.show();
+#ifdef Q_WS_X11
+    qt_x11_wait_for_window_manager(&mw);
+#endif
+    qApp->processEvents();
+    dw->setFloating(true);
+    delete ledit;
+    QCOMPARE(mw.focusWidget(), (QWidget *)0);
+    QCOMPARE(dw->focusWidget(), (QWidget *)0);
+}
+
+void tst_QDockWidget::task169808_setFloating()
+{
+    //we try to test if the sizeHint of the dock widget widget is taken into account
+
+    class MyWidget : public QWidget
+    {
+    public:
+        QSize sizeHint() const
+        {
+            const QRect& deskRect = qApp->desktop()->availableGeometry();
+            return QSize(qMin(300, deskRect.width()), 300);
+        }
+
+        QSize minimumSizeHint() const
+        {
+            return QSize(20,20);
+        }
+
+        void paintEvent(QPaintEvent *)
+        {
+            QPainter p(this);
+            p.fillRect(rect(), Qt::red);
+        }
+    };
+    QMainWindow mw;
+	mw.setCentralWidget(new MyWidget);
+	QDockWidget *dw = new QDockWidget("my dock");
+	dw->setWidget(new MyWidget);
+	mw.addDockWidget(Qt::LeftDockWidgetArea, dw);
+	dw->setFloating(true);
+	mw.show();
+#ifdef Q_WS_X11
+    qt_x11_wait_for_window_manager(&mw);
+#endif
+
+    QCOMPARE(dw->widget()->size(), dw->widget()->sizeHint());
+
+    //and now we try to test if the contents margin is taken into account
+    dw->widget()->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+	dw->setFloating(false);
+#ifdef Q_WS_X11
+    qt_x11_wait_for_window_manager(&mw);
+#endif
+    QTest::qWait(100); //leave time processing events
+
+
+    const QSize oldSize = dw->size();
+    const int margin = 20;
+
+    dw->setContentsMargins(margin, margin, margin, margin);
+
+#ifdef Q_WS_X11
+    qt_x11_wait_for_window_manager(&mw);
+#endif
+    QTest::qWait(100); //leave time processing events
+
+    //widget size shouldn't have changed
+    QCOMPARE(dw->widget()->size(), dw->widget()->sizeHint());
+    //dockwidget should be bigger
+    QCOMPARE(dw->size(), oldSize + QSize(margin * 2, margin * 2));
+
+
+}
+
+void tst_QDockWidget::task237438_setFloatingCrash()
+{
+    //should not crash
+    QDockWidget pqdwDock;
+    pqdwDock.setFloating(false);
+    pqdwDock.show();
+}
+
+void tst_QDockWidget::task248604_infiniteResize()
+{
+    QDockWidget d;
+    QTabWidget *t = new QTabWidget;
+    t->addTab(new QWidget, "Foo");
+    d.setWidget(t);
+    d.setContentsMargins(2, 2, 2, 2);
+    d.setMinimumSize(320, 240);
+    d.show();
+    QTest::qWait(400);
+    QCOMPARE(d.size(), QSize(320, 240));
+}
+
+
+void tst_QDockWidget::task258459_visibilityChanged()
+{
+    QMainWindow win;
+    QDockWidget dock1, dock2;
+    win.addDockWidget(Qt::RightDockWidgetArea, &dock1);
+    win.tabifyDockWidget(&dock1, &dock2);
+    QSignalSpy spy1(&dock1, SIGNAL(visibilityChanged(bool)));
+    QSignalSpy spy2(&dock2, SIGNAL(visibilityChanged(bool)));
+    win.show();
+    QTest::qWait(200);
+    QCOMPARE(spy1.count(), 1);
+    QCOMPARE(spy1.first().first().toBool(), false); //dock1 is invisible
+    QCOMPARE(spy2.count(), 1);
+    QCOMPARE(spy2.first().first().toBool(), true); //dock1 is visible
+}
+
+QTEST_MAIN(tst_QDockWidget)
+#include "tst_qdockwidget.moc"