tests/auto/qdockwidget/tst_qdockwidget.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the test suite of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 
       
    43 
       
    44 #include <QtTest/QtTest>
       
    45 
       
    46 
       
    47 #include <qaction.h>
       
    48 #include <qdockwidget.h>
       
    49 #include <qmainwindow.h>
       
    50 #include <qlineedit.h>
       
    51 #include <QDesktopWidget>
       
    52 #include <QtGui/QPainter>
       
    53 
       
    54 bool hasFeature(QDockWidget *dockwidget, QDockWidget::DockWidgetFeature feature)
       
    55 { return (dockwidget->features() & feature) == feature; }
       
    56 
       
    57 void setFeature(QDockWidget *dockwidget, QDockWidget::DockWidgetFeature feature, bool on = true)
       
    58 {
       
    59     const QDockWidget::DockWidgetFeatures features = dockwidget->features();
       
    60     dockwidget->setFeatures(on ? features | feature : features & ~feature);
       
    61 }
       
    62 
       
    63 //TESTED_FILES=
       
    64 
       
    65 class tst_QDockWidget : public QObject
       
    66 {
       
    67      Q_OBJECT
       
    68 
       
    69 public:
       
    70     tst_QDockWidget();
       
    71 
       
    72 private slots:
       
    73     void getSetCheck();
       
    74     void widget();
       
    75     void setWidget();
       
    76     void setFeatures();
       
    77     void features();
       
    78     void setFloating();
       
    79     void setAllowedAreas();
       
    80     void allowedAreas();
       
    81     void isAreaAllowed();
       
    82     void toggleViewAction();
       
    83     void featuresChanged();
       
    84     void topLevelChanged();
       
    85     void allowedAreasChanged();
       
    86     void visibilityChanged();
       
    87     void dockLocationChanged();
       
    88     void setTitleBarWidget();
       
    89     // task specific tests:
       
    90     void task165177_deleteFocusWidget();
       
    91     void task169808_setFloating();
       
    92     void task237438_setFloatingCrash();
       
    93     void task248604_infiniteResize();
       
    94     void task258459_visibilityChanged();
       
    95 };
       
    96 
       
    97 // Testing get/set functions
       
    98 void tst_QDockWidget::getSetCheck()
       
    99 {
       
   100     QDockWidget obj1;
       
   101     // QWidget * QDockWidget::widget()
       
   102     // void QDockWidget::setWidget(QWidget *)
       
   103     QWidget *var1 = new QWidget();
       
   104     obj1.setWidget(var1);
       
   105     QCOMPARE(var1, obj1.widget());
       
   106     obj1.setWidget((QWidget *)0);
       
   107     QCOMPARE((QWidget *)0, obj1.widget());
       
   108     delete var1;
       
   109 
       
   110     // DockWidgetFeatures QDockWidget::features()
       
   111     // void QDockWidget::setFeatures(DockWidgetFeatures)
       
   112     obj1.setFeatures(QDockWidget::DockWidgetFeatures(QDockWidget::DockWidgetClosable));
       
   113     QCOMPARE(QDockWidget::DockWidgetFeatures(QDockWidget::DockWidgetClosable), obj1.features());
       
   114     obj1.setFeatures(QDockWidget::DockWidgetFeatures(QDockWidget::DockWidgetMovable));
       
   115     QCOMPARE(QDockWidget::DockWidgetFeatures(QDockWidget::DockWidgetMovable), obj1.features());
       
   116     obj1.setFeatures(QDockWidget::DockWidgetFeatures(QDockWidget::DockWidgetFloatable));
       
   117     QCOMPARE(QDockWidget::DockWidgetFeatures(QDockWidget::DockWidgetFloatable), obj1.features());
       
   118     obj1.setFeatures(QDockWidget::DockWidgetFeatures(QDockWidget::AllDockWidgetFeatures));
       
   119     QCOMPARE(QDockWidget::DockWidgetFeatures(QDockWidget::AllDockWidgetFeatures), obj1.features());
       
   120     obj1.setFeatures(QDockWidget::DockWidgetFeatures(QDockWidget::NoDockWidgetFeatures));
       
   121     QCOMPARE(QDockWidget::DockWidgetFeatures(QDockWidget::NoDockWidgetFeatures), obj1.features());
       
   122 }
       
   123 
       
   124 tst_QDockWidget::tst_QDockWidget()
       
   125 {
       
   126     qRegisterMetaType<QDockWidget::DockWidgetFeatures>("QDockWidget::DockWidgetFeatures");
       
   127     qRegisterMetaType<Qt::DockWidgetAreas>("Qt::DockWidgetAreas");
       
   128 }
       
   129 
       
   130 void tst_QDockWidget::widget()
       
   131 {
       
   132     {
       
   133         QDockWidget dw;
       
   134         QVERIFY(dw.widget() == 0);
       
   135     }
       
   136 
       
   137     {
       
   138         QDockWidget dw;
       
   139         QWidget *w1 = new QWidget;
       
   140         QWidget *w2 = new QWidget;
       
   141 
       
   142         dw.setWidget(w1);
       
   143         QVERIFY(dw.widget() != 0);
       
   144         QVERIFY(dw.widget() == w1);
       
   145         QCOMPARE(w1->parentWidget(), (QWidget*)&dw);
       
   146 
       
   147         dw.setWidget(0);
       
   148         QVERIFY(dw.widget() == 0);
       
   149 
       
   150         dw.setWidget(w2);
       
   151         QVERIFY(dw.widget() != 0);
       
   152         QVERIFY(dw.widget() == w2);
       
   153         QCOMPARE(w2->parentWidget(), (QWidget*)&dw);
       
   154 
       
   155         dw.setWidget(0);
       
   156         QVERIFY(dw.widget() == 0);
       
   157 
       
   158         dw.setWidget(w1);
       
   159         QVERIFY(dw.widget() != 0);
       
   160         QVERIFY(dw.widget() == w1);
       
   161         QCOMPARE(w1->parentWidget(), (QWidget*)&dw);
       
   162 
       
   163         dw.setWidget(w2);
       
   164         QVERIFY(dw.widget() != 0);
       
   165         QVERIFY(dw.widget() == w2);
       
   166         QCOMPARE(w2->parentWidget(), (QWidget*)&dw);
       
   167 
       
   168         dw.setWidget(0);
       
   169         QVERIFY(dw.widget() == 0);
       
   170     }
       
   171 
       
   172     {
       
   173         QDockWidget dw;
       
   174         QWidget *w1 = new QWidget;
       
   175         QWidget *w2 = new QWidget;
       
   176 
       
   177         dw.setWidget(w1);
       
   178         QVERIFY(dw.widget() != 0);
       
   179         QVERIFY(dw.widget() == w1);
       
   180         QCOMPARE(w1->parentWidget(), (QWidget*)&dw);
       
   181 
       
   182         w1->setParent(0);
       
   183         QVERIFY(dw.widget() == 0);
       
   184 
       
   185         dw.setWidget(w2);
       
   186         QVERIFY(dw.widget() != 0);
       
   187         QVERIFY(dw.widget() == w2);
       
   188         QCOMPARE(w2->parentWidget(), (QWidget*)&dw);
       
   189 
       
   190         w2->setParent(0);
       
   191         QVERIFY(dw.widget() == 0);
       
   192 
       
   193         dw.setWidget(w1);
       
   194         QVERIFY(dw.widget() != 0);
       
   195         QVERIFY(dw.widget() == w1);
       
   196         QCOMPARE(w1->parentWidget(), (QWidget*)&dw);
       
   197 
       
   198         dw.setWidget(w2);
       
   199         QVERIFY(dw.widget() != 0);
       
   200         QVERIFY(dw.widget() == w2);
       
   201         QCOMPARE(w2->parentWidget(), (QWidget*)&dw);
       
   202 
       
   203         w1->setParent(0);
       
   204         QVERIFY(dw.widget() != 0);
       
   205         QVERIFY(dw.widget() == w2);
       
   206         QCOMPARE(w2->parentWidget(), (QWidget*)&dw);
       
   207 
       
   208         w2->setParent(0);
       
   209         QVERIFY(dw.widget() == 0);
       
   210         delete w1;
       
   211         delete w2;
       
   212     }
       
   213 }
       
   214 
       
   215 void tst_QDockWidget::setWidget()
       
   216 { DEPENDS_ON("setWidget()"); }
       
   217 
       
   218 void tst_QDockWidget::setFeatures()
       
   219 { DEPENDS_ON("features()"); }
       
   220 
       
   221 void tst_QDockWidget::features()
       
   222 {
       
   223     QDockWidget dw;
       
   224 
       
   225     QSignalSpy spy(&dw, SIGNAL(featuresChanged(QDockWidget::DockWidgetFeatures)));
       
   226 
       
   227     // default features for dock widgets
       
   228     int allDockWidgetFeatures = QDockWidget::DockWidgetClosable |
       
   229                                 QDockWidget::DockWidgetMovable  |
       
   230                                 QDockWidget::DockWidgetFloatable;
       
   231 
       
   232     // defaults
       
   233     QCOMPARE(dw.features(), allDockWidgetFeatures);
       
   234     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
       
   235     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
       
   236     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
       
   237 
       
   238     // test individual setting
       
   239     setFeature(&dw, QDockWidget::DockWidgetClosable, false);
       
   240     QCOMPARE(dw.features(), QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
       
   241     QVERIFY(!hasFeature(&dw, QDockWidget::DockWidgetClosable));
       
   242     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
       
   243     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
       
   244     QCOMPARE(spy.count(), 1);
       
   245     QCOMPARE((int)*(static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData())),
       
   246             (int)dw.features());
       
   247     spy.clear();
       
   248     dw.setFeatures(dw.features());
       
   249     QCOMPARE(spy.count(), 0);
       
   250     spy.clear();
       
   251 
       
   252     setFeature(&dw, QDockWidget::DockWidgetClosable);
       
   253     QCOMPARE(dw.features(), allDockWidgetFeatures);
       
   254     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
       
   255     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
       
   256     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
       
   257     QCOMPARE(spy.count(), 1);
       
   258     QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
       
   259             (int)dw.features());
       
   260     spy.clear();
       
   261     dw.setFeatures(dw.features());
       
   262     QCOMPARE(spy.count(), 0);
       
   263     spy.clear();
       
   264 
       
   265     setFeature(&dw, QDockWidget::DockWidgetMovable, false);
       
   266     QCOMPARE(dw.features(), QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);
       
   267     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
       
   268     QVERIFY(!hasFeature(&dw, QDockWidget::DockWidgetMovable));
       
   269     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
       
   270     QCOMPARE(spy.count(), 1);
       
   271     QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
       
   272             (int)dw.features());
       
   273     spy.clear();
       
   274     dw.setFeatures(dw.features());
       
   275     QCOMPARE(spy.count(), 0);
       
   276     spy.clear();
       
   277 
       
   278     setFeature(&dw, QDockWidget::DockWidgetMovable);
       
   279     QCOMPARE(dw.features(), allDockWidgetFeatures);
       
   280     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
       
   281     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
       
   282     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
       
   283     QCOMPARE(spy.count(), 1);
       
   284     QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
       
   285             (int)dw.features());
       
   286     spy.clear();
       
   287     dw.setFeatures(dw.features());
       
   288     QCOMPARE(spy.count(), 0);
       
   289     spy.clear();
       
   290 
       
   291     setFeature(&dw, QDockWidget::DockWidgetFloatable, false);
       
   292     QCOMPARE(dw.features(), QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable);
       
   293     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
       
   294     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
       
   295     QVERIFY(!hasFeature(&dw, QDockWidget::DockWidgetFloatable));
       
   296     QCOMPARE(spy.count(), 1);
       
   297     QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
       
   298             (int)dw.features());
       
   299     spy.clear();
       
   300     dw.setFeatures(dw.features());
       
   301     QCOMPARE(spy.count(), 0);
       
   302     spy.clear();
       
   303 
       
   304     setFeature(&dw, QDockWidget::DockWidgetFloatable);
       
   305     QCOMPARE(dw.features(), allDockWidgetFeatures);
       
   306     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
       
   307     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
       
   308     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
       
   309     QCOMPARE(spy.count(), 1);
       
   310     QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
       
   311             (int)dw.features());
       
   312     spy.clear();
       
   313     dw.setFeatures(dw.features());
       
   314     QCOMPARE(spy.count(), 0);
       
   315     spy.clear();
       
   316 
       
   317     // set all at once
       
   318     dw.setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable);
       
   319     QCOMPARE(dw.features(), QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable);
       
   320     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
       
   321     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
       
   322     QVERIFY(!hasFeature(&dw, QDockWidget::DockWidgetFloatable));
       
   323     QCOMPARE(spy.count(), 1);
       
   324     QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
       
   325             (int)dw.features());
       
   326     spy.clear();
       
   327     dw.setFeatures(dw.features());
       
   328     QCOMPARE(spy.count(), 0);
       
   329     spy.clear();
       
   330 
       
   331     dw.setFeatures(QDockWidget::DockWidgetClosable);
       
   332     QCOMPARE(dw.features(), QDockWidget::DockWidgetClosable);
       
   333     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
       
   334     QVERIFY(!hasFeature(&dw, QDockWidget::DockWidgetMovable));
       
   335     QVERIFY(!hasFeature(&dw, QDockWidget::DockWidgetFloatable));
       
   336     QCOMPARE(spy.count(), 1);
       
   337     QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
       
   338             (int)dw.features());
       
   339     spy.clear();
       
   340     dw.setFeatures(dw.features());
       
   341     QCOMPARE(spy.count(), 0);
       
   342     spy.clear();
       
   343 
       
   344     dw.setFeatures(QDockWidget::AllDockWidgetFeatures);
       
   345     QCOMPARE(dw.features(), QDockWidget::AllDockWidgetFeatures);
       
   346     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetClosable));
       
   347     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetMovable));
       
   348     QVERIFY(hasFeature(&dw, QDockWidget::DockWidgetFloatable));
       
   349     QCOMPARE(spy.count(), 1);
       
   350     QCOMPARE((int)*static_cast<const QDockWidget::DockWidgetFeature *>(spy.at(0).value(0).constData()),
       
   351             (int)dw.features());
       
   352     spy.clear();
       
   353     dw.setFeatures(dw.features());
       
   354     QCOMPARE(spy.count(), 0);
       
   355     spy.clear();
       
   356 }
       
   357 
       
   358 void tst_QDockWidget::setFloating()
       
   359 {
       
   360     QMainWindow mw;
       
   361     QDockWidget dw;
       
   362     mw.addDockWidget(Qt::LeftDockWidgetArea, &dw);
       
   363 
       
   364     mw.show();
       
   365 #ifdef Q_WS_X11
       
   366     qt_x11_wait_for_window_manager(&mw);
       
   367 #endif
       
   368 
       
   369     QVERIFY(!dw.isFloating());
       
   370 
       
   371     QSignalSpy spy(&dw, SIGNAL(topLevelChanged(bool)));
       
   372 
       
   373     dw.setFloating(true);
       
   374     QVERIFY(dw.isFloating());
       
   375     QCOMPARE(spy.count(), 1);
       
   376     QCOMPARE(spy.at(0).value(0).toBool(), dw.isFloating());
       
   377     spy.clear();
       
   378     dw.setFloating(dw.isFloating());
       
   379     QCOMPARE(spy.count(), 0);
       
   380     spy.clear();
       
   381 
       
   382     dw.setFloating(false);
       
   383     QVERIFY(!dw.isFloating());
       
   384     QCOMPARE(spy.count(), 1);
       
   385     QCOMPARE(spy.at(0).value(0).toBool(), dw.isFloating());
       
   386     spy.clear();
       
   387     dw.setFloating(dw.isFloating());
       
   388     QCOMPARE(spy.count(), 0);
       
   389     spy.clear();
       
   390 }
       
   391 
       
   392 void tst_QDockWidget::setAllowedAreas()
       
   393 { DEPENDS_ON("allowedAreas()"); }
       
   394 
       
   395 void tst_QDockWidget::allowedAreas()
       
   396 {
       
   397     QDockWidget dw;
       
   398 
       
   399     QSignalSpy spy(&dw, SIGNAL(allowedAreasChanged(Qt::DockWidgetAreas)));
       
   400 
       
   401     // default
       
   402     QCOMPARE(dw.allowedAreas(), Qt::AllDockWidgetAreas);
       
   403     QVERIFY(dw.isAreaAllowed(Qt::LeftDockWidgetArea));
       
   404     QVERIFY(dw.isAreaAllowed(Qt::RightDockWidgetArea));
       
   405     QVERIFY(dw.isAreaAllowed(Qt::TopDockWidgetArea));
       
   406     QVERIFY(dw.isAreaAllowed(Qt::BottomDockWidgetArea));
       
   407 
       
   408     // a single dock window area
       
   409     dw.setAllowedAreas(Qt::LeftDockWidgetArea);
       
   410     QCOMPARE(dw.allowedAreas(), Qt::LeftDockWidgetArea);
       
   411     QVERIFY(dw.isAreaAllowed(Qt::LeftDockWidgetArea));
       
   412     QVERIFY(!dw.isAreaAllowed(Qt::RightDockWidgetArea));
       
   413     QVERIFY(!dw.isAreaAllowed(Qt::TopDockWidgetArea));
       
   414     QVERIFY(!dw.isAreaAllowed(Qt::BottomDockWidgetArea));
       
   415     QCOMPARE(spy.count(), 1);
       
   416     QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
       
   417             dw.allowedAreas());
       
   418     spy.clear();
       
   419     dw.setAllowedAreas(dw.allowedAreas());
       
   420     QCOMPARE(spy.count(), 0);
       
   421 
       
   422     dw.setAllowedAreas(Qt::RightDockWidgetArea);
       
   423     QCOMPARE(dw.allowedAreas(), Qt::RightDockWidgetArea);
       
   424     QVERIFY(!dw.isAreaAllowed(Qt::LeftDockWidgetArea));
       
   425     QVERIFY(dw.isAreaAllowed(Qt::RightDockWidgetArea));
       
   426     QVERIFY(!dw.isAreaAllowed(Qt::TopDockWidgetArea));
       
   427     QVERIFY(!dw.isAreaAllowed(Qt::BottomDockWidgetArea));
       
   428     QCOMPARE(spy.count(), 1);
       
   429     QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
       
   430             dw.allowedAreas());
       
   431     spy.clear();
       
   432     dw.setAllowedAreas(dw.allowedAreas());
       
   433     QCOMPARE(spy.count(), 0);
       
   434 
       
   435     dw.setAllowedAreas(Qt::TopDockWidgetArea);
       
   436     QCOMPARE(dw.allowedAreas(), Qt::TopDockWidgetArea);
       
   437     QVERIFY(!dw.isAreaAllowed(Qt::LeftDockWidgetArea));
       
   438     QVERIFY(!dw.isAreaAllowed(Qt::RightDockWidgetArea));
       
   439     QVERIFY(dw.isAreaAllowed(Qt::TopDockWidgetArea));
       
   440     QVERIFY(!dw.isAreaAllowed(Qt::BottomDockWidgetArea));
       
   441     QCOMPARE(spy.count(), 1);
       
   442     QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
       
   443             dw.allowedAreas());
       
   444     spy.clear();
       
   445     dw.setAllowedAreas(dw.allowedAreas());
       
   446     QCOMPARE(spy.count(), 0);
       
   447 
       
   448     dw.setAllowedAreas(Qt::BottomDockWidgetArea);
       
   449     QCOMPARE(dw.allowedAreas(), Qt::BottomDockWidgetArea);
       
   450     QVERIFY(!dw.isAreaAllowed(Qt::LeftDockWidgetArea));
       
   451     QVERIFY(!dw.isAreaAllowed(Qt::RightDockWidgetArea));
       
   452     QVERIFY(!dw.isAreaAllowed(Qt::TopDockWidgetArea));
       
   453     QVERIFY(dw.isAreaAllowed(Qt::BottomDockWidgetArea));
       
   454     QCOMPARE(spy.count(), 1);
       
   455     QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
       
   456             dw.allowedAreas());
       
   457     spy.clear();
       
   458     dw.setAllowedAreas(dw.allowedAreas());
       
   459     QCOMPARE(spy.count(), 0);
       
   460 
       
   461     // multiple dock window areas
       
   462     dw.setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
       
   463     QCOMPARE(dw.allowedAreas(), Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
       
   464     QVERIFY(!dw.isAreaAllowed(Qt::LeftDockWidgetArea));
       
   465     QVERIFY(!dw.isAreaAllowed(Qt::RightDockWidgetArea));
       
   466     QVERIFY(dw.isAreaAllowed(Qt::TopDockWidgetArea));
       
   467     QVERIFY(dw.isAreaAllowed(Qt::BottomDockWidgetArea));
       
   468     QCOMPARE(spy.count(), 1);
       
   469     QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
       
   470             dw.allowedAreas());
       
   471     spy.clear();
       
   472     dw.setAllowedAreas(dw.allowedAreas());
       
   473     QCOMPARE(spy.count(), 0);
       
   474 
       
   475     dw.setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
       
   476     QCOMPARE(dw.allowedAreas(), Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
       
   477     QVERIFY(dw.isAreaAllowed(Qt::LeftDockWidgetArea));
       
   478     QVERIFY(dw.isAreaAllowed(Qt::RightDockWidgetArea));
       
   479     QVERIFY(!dw.isAreaAllowed(Qt::TopDockWidgetArea));
       
   480     QVERIFY(!dw.isAreaAllowed(Qt::BottomDockWidgetArea));
       
   481     QCOMPARE(spy.count(), 1);
       
   482     QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
       
   483             dw.allowedAreas());
       
   484     spy.clear();
       
   485     dw.setAllowedAreas(dw.allowedAreas());
       
   486     QCOMPARE(spy.count(), 0);
       
   487 
       
   488     dw.setAllowedAreas(Qt::TopDockWidgetArea | Qt::LeftDockWidgetArea);
       
   489     QCOMPARE(dw.allowedAreas(), Qt::TopDockWidgetArea | Qt::LeftDockWidgetArea);
       
   490     QVERIFY(dw.isAreaAllowed(Qt::LeftDockWidgetArea));
       
   491     QVERIFY(!dw.isAreaAllowed(Qt::RightDockWidgetArea));
       
   492     QVERIFY(dw.isAreaAllowed(Qt::TopDockWidgetArea));
       
   493     QVERIFY(!dw.isAreaAllowed(Qt::BottomDockWidgetArea));
       
   494     QCOMPARE(spy.count(), 1);
       
   495     QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
       
   496             dw.allowedAreas());
       
   497     spy.clear();
       
   498     dw.setAllowedAreas(dw.allowedAreas());
       
   499     QCOMPARE(spy.count(), 0);
       
   500 
       
   501     dw.setAllowedAreas(Qt::BottomDockWidgetArea | Qt::RightDockWidgetArea);
       
   502     QCOMPARE(dw.allowedAreas(), Qt::BottomDockWidgetArea | Qt::RightDockWidgetArea);
       
   503     QVERIFY(!dw.isAreaAllowed(Qt::LeftDockWidgetArea));
       
   504     QVERIFY(dw.isAreaAllowed(Qt::RightDockWidgetArea));
       
   505     QVERIFY(!dw.isAreaAllowed(Qt::TopDockWidgetArea));
       
   506     QVERIFY(dw.isAreaAllowed(Qt::BottomDockWidgetArea));
       
   507     QCOMPARE(spy.count(), 1);
       
   508     QCOMPARE(*static_cast<const Qt::DockWidgetAreas *>(spy.at(0).value(0).constData()),
       
   509             dw.allowedAreas());
       
   510     spy.clear();
       
   511     dw.setAllowedAreas(dw.allowedAreas());
       
   512     QCOMPARE(spy.count(), 0);
       
   513 }
       
   514 
       
   515 void tst_QDockWidget::isAreaAllowed()
       
   516 { DEPENDS_ON("allowedAreas()"); }
       
   517 
       
   518 void tst_QDockWidget::toggleViewAction()
       
   519 {
       
   520     QMainWindow mw;
       
   521     QDockWidget dw(&mw);
       
   522     mw.addDockWidget(Qt::LeftDockWidgetArea, &dw);
       
   523     mw.show();
       
   524     QAction *toggleViewAction = dw.toggleViewAction();
       
   525     QVERIFY(!dw.isHidden());
       
   526     toggleViewAction->trigger();
       
   527     QVERIFY(dw.isHidden());
       
   528     toggleViewAction->trigger();
       
   529     QVERIFY(!dw.isHidden());
       
   530     toggleViewAction->trigger();
       
   531     QVERIFY(dw.isHidden());
       
   532 }
       
   533 
       
   534 void tst_QDockWidget::visibilityChanged()
       
   535 {
       
   536     QMainWindow mw;
       
   537     QDockWidget dw;
       
   538     QSignalSpy spy(&dw, SIGNAL(visibilityChanged(bool)));
       
   539 
       
   540     mw.addDockWidget(Qt::LeftDockWidgetArea, &dw);
       
   541     mw.show();
       
   542 
       
   543     QCOMPARE(spy.count(), 1);
       
   544     QCOMPARE(spy.at(0).at(0).toBool(), true);
       
   545     spy.clear();
       
   546 
       
   547     dw.hide();
       
   548     QCOMPARE(spy.count(), 1);
       
   549     QCOMPARE(spy.at(0).at(0).toBool(), false);
       
   550     spy.clear();
       
   551 
       
   552     dw.hide();
       
   553     QCOMPARE(spy.count(), 0);
       
   554 
       
   555     dw.show();
       
   556     QCOMPARE(spy.count(), 1);
       
   557     QCOMPARE(spy.at(0).at(0).toBool(), true);
       
   558     spy.clear();
       
   559 
       
   560     dw.show();
       
   561     QCOMPARE(spy.count(), 0);
       
   562 
       
   563     QDockWidget dw2;
       
   564     mw.tabifyDockWidget(&dw, &dw2);
       
   565     dw2.show();
       
   566     dw2.raise();
       
   567     QCOMPARE(spy.count(), 1);
       
   568     QCOMPARE(spy.at(0).at(0).toBool(), false);
       
   569     spy.clear();
       
   570 
       
   571     dw2.hide();
       
   572     qApp->processEvents();
       
   573     QCOMPARE(spy.count(), 1);
       
   574     QCOMPARE(spy.at(0).at(0).toBool(), true);
       
   575     spy.clear();
       
   576 
       
   577     dw2.show();
       
   578     dw2.raise();
       
   579     qApp->processEvents();
       
   580     QCOMPARE(spy.count(), 1);
       
   581     QCOMPARE(spy.at(0).at(0).toBool(), false);
       
   582     spy.clear();
       
   583 
       
   584     dw.raise();
       
   585     QCOMPARE(spy.count(), 1);
       
   586     QCOMPARE(spy.at(0).at(0).toBool(), true);
       
   587     spy.clear();
       
   588 
       
   589     dw.raise();
       
   590     QCOMPARE(spy.count(), 0);
       
   591 
       
   592     dw2.raise();
       
   593     QCOMPARE(spy.count(), 1);
       
   594     QCOMPARE(spy.at(0).at(0).toBool(), false);
       
   595     spy.clear();
       
   596 
       
   597     dw2.raise();
       
   598     QCOMPARE(spy.count(), 0);
       
   599 
       
   600     mw.addDockWidget(Qt::RightDockWidgetArea, &dw2);
       
   601 	QTest::qWait(200);
       
   602     QCOMPARE(spy.count(), 1);
       
   603     QCOMPARE(spy.at(0).at(0).toBool(), true);
       
   604 }
       
   605 
       
   606 Q_DECLARE_METATYPE(Qt::DockWidgetArea)
       
   607 
       
   608 void tst_QDockWidget::dockLocationChanged()
       
   609 {
       
   610     qRegisterMetaType<Qt::DockWidgetArea>("Qt::DockWidgetArea");
       
   611 
       
   612     QMainWindow mw;
       
   613     QDockWidget dw;
       
   614     QSignalSpy spy(&dw, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)));
       
   615 
       
   616     mw.addDockWidget(Qt::LeftDockWidgetArea, &dw);
       
   617     QCOMPARE(spy.count(), 1);
       
   618     QCOMPARE(qvariant_cast<Qt::DockWidgetArea>(spy.at(0).at(0)),
       
   619                 Qt::LeftDockWidgetArea);
       
   620     spy.clear();
       
   621 
       
   622     mw.addDockWidget(Qt::LeftDockWidgetArea, &dw);
       
   623     QCOMPARE(spy.count(), 1);
       
   624     QCOMPARE(qvariant_cast<Qt::DockWidgetArea>(spy.at(0).at(0)),
       
   625                 Qt::LeftDockWidgetArea);
       
   626     spy.clear();
       
   627 
       
   628     mw.addDockWidget(Qt::RightDockWidgetArea, &dw);
       
   629     QCOMPARE(spy.count(), 1);
       
   630     QCOMPARE(qvariant_cast<Qt::DockWidgetArea>(spy.at(0).at(0)),
       
   631                 Qt::RightDockWidgetArea);
       
   632     spy.clear();
       
   633 
       
   634     mw.removeDockWidget(&dw);
       
   635     QCOMPARE(spy.count(), 0);
       
   636 
       
   637     QDockWidget dw2;
       
   638     mw.addDockWidget(Qt::TopDockWidgetArea, &dw2);
       
   639     mw.tabifyDockWidget(&dw2, &dw);
       
   640     QCOMPARE(spy.count(), 1);
       
   641     QCOMPARE(qvariant_cast<Qt::DockWidgetArea>(spy.at(0).at(0)),
       
   642                 Qt::TopDockWidgetArea);
       
   643     spy.clear();
       
   644 
       
   645     mw.splitDockWidget(&dw2, &dw, Qt::Horizontal);
       
   646     QCOMPARE(spy.count(), 1);
       
   647     QCOMPARE(qvariant_cast<Qt::DockWidgetArea>(spy.at(0).at(0)),
       
   648                 Qt::TopDockWidgetArea);
       
   649     spy.clear();
       
   650     
       
   651     dw.setFloating(true);
       
   652     QTest::qWait(100);
       
   653     dw.setFloating(false);
       
   654     QTest::qWait(100);
       
   655     QCOMPARE(spy.count(), 1);
       
   656     QCOMPARE(qvariant_cast<Qt::DockWidgetArea>(spy.at(0).at(0)),
       
   657              Qt::TopDockWidgetArea);
       
   658     spy.clear();
       
   659 }
       
   660 
       
   661 void tst_QDockWidget::featuresChanged()
       
   662 { DEPENDS_ON("features()"); }
       
   663 
       
   664 void tst_QDockWidget::topLevelChanged()
       
   665 { DEPENDS_ON("setFloating()"); }
       
   666 
       
   667 void tst_QDockWidget::allowedAreasChanged()
       
   668 { DEPENDS_ON("allowedAreas()"); }
       
   669 
       
   670 void tst_QDockWidget::setTitleBarWidget()
       
   671 {
       
   672     //test the successive usage of setTitleBarWidget
       
   673 
       
   674     QDockWidget dock;
       
   675     QWidget w, w2;
       
   676 
       
   677     dock.show();
       
   678     qApp->processEvents();
       
   679 
       
   680     dock.setTitleBarWidget(&w);
       
   681     qApp->processEvents();
       
   682     QCOMPARE(w.isVisible(), true);
       
   683 
       
   684     //set another widget as the titlebar widget
       
   685     dock.setTitleBarWidget(&w2); // this used to crash (task 184668)
       
   686     qApp->processEvents();
       
   687     QCOMPARE(w.isVisible(), false);
       
   688     QCOMPARE(w2.isVisible(), true);
       
   689 
       
   690     //tries to reset the titlebarwidget to none
       
   691     dock.setTitleBarWidget(0);
       
   692     qApp->processEvents();
       
   693     QCOMPARE(w.isVisible(), false);
       
   694     QCOMPARE(w2.isVisible(), false);
       
   695 }
       
   696 
       
   697 
       
   698 void tst_QDockWidget::task165177_deleteFocusWidget()
       
   699 {
       
   700     QMainWindow mw;
       
   701     QDockWidget *dw = new QDockWidget(&mw);
       
   702     mw.addDockWidget(Qt::LeftDockWidgetArea, dw);
       
   703     QLineEdit *ledit = new QLineEdit;
       
   704     dw->setWidget(ledit);
       
   705     mw.show();
       
   706 #ifdef Q_WS_X11
       
   707     qt_x11_wait_for_window_manager(&mw);
       
   708 #endif
       
   709     qApp->processEvents();
       
   710     dw->setFloating(true);
       
   711     delete ledit;
       
   712     QCOMPARE(mw.focusWidget(), (QWidget *)0);
       
   713     QCOMPARE(dw->focusWidget(), (QWidget *)0);
       
   714 }
       
   715 
       
   716 void tst_QDockWidget::task169808_setFloating()
       
   717 {
       
   718     //we try to test if the sizeHint of the dock widget widget is taken into account
       
   719 
       
   720     class MyWidget : public QWidget
       
   721     {
       
   722     public:
       
   723         QSize sizeHint() const
       
   724         {
       
   725             const QRect& deskRect = qApp->desktop()->availableGeometry();
       
   726             return QSize(qMin(300, deskRect.width()), 300);
       
   727         }
       
   728 
       
   729         QSize minimumSizeHint() const
       
   730         {
       
   731             return QSize(20,20);
       
   732         }
       
   733 
       
   734         void paintEvent(QPaintEvent *)
       
   735         {
       
   736             QPainter p(this);
       
   737             p.fillRect(rect(), Qt::red);
       
   738         }
       
   739     };
       
   740     QMainWindow mw;
       
   741 	mw.setCentralWidget(new MyWidget);
       
   742 	QDockWidget *dw = new QDockWidget("my dock");
       
   743 	dw->setWidget(new MyWidget);
       
   744 	mw.addDockWidget(Qt::LeftDockWidgetArea, dw);
       
   745 	dw->setFloating(true);
       
   746 	mw.show();
       
   747 #ifdef Q_WS_X11
       
   748     qt_x11_wait_for_window_manager(&mw);
       
   749 #endif
       
   750 
       
   751     QCOMPARE(dw->widget()->size(), dw->widget()->sizeHint());
       
   752 
       
   753     //and now we try to test if the contents margin is taken into account
       
   754     dw->widget()->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
       
   755 	dw->setFloating(false);
       
   756 #ifdef Q_WS_X11
       
   757     qt_x11_wait_for_window_manager(&mw);
       
   758 #endif
       
   759     QTest::qWait(100); //leave time processing events
       
   760 
       
   761 
       
   762     const QSize oldSize = dw->size();
       
   763     const int margin = 20;
       
   764 
       
   765     dw->setContentsMargins(margin, margin, margin, margin);
       
   766 
       
   767 #ifdef Q_WS_X11
       
   768     qt_x11_wait_for_window_manager(&mw);
       
   769 #endif
       
   770     QTest::qWait(100); //leave time processing events
       
   771 
       
   772     //widget size shouldn't have changed
       
   773     QCOMPARE(dw->widget()->size(), dw->widget()->sizeHint());
       
   774     //dockwidget should be bigger
       
   775     QCOMPARE(dw->size(), oldSize + QSize(margin * 2, margin * 2));
       
   776 
       
   777 
       
   778 }
       
   779 
       
   780 void tst_QDockWidget::task237438_setFloatingCrash()
       
   781 {
       
   782     //should not crash
       
   783     QDockWidget pqdwDock;
       
   784     pqdwDock.setFloating(false);
       
   785     pqdwDock.show();
       
   786 }
       
   787 
       
   788 void tst_QDockWidget::task248604_infiniteResize()
       
   789 {
       
   790     QDockWidget d;
       
   791     QTabWidget *t = new QTabWidget;
       
   792     t->addTab(new QWidget, "Foo");
       
   793     d.setWidget(t);
       
   794     d.setContentsMargins(2, 2, 2, 2);
       
   795     d.setMinimumSize(320, 240);
       
   796     d.show();
       
   797     QTest::qWait(400);
       
   798     QCOMPARE(d.size(), QSize(320, 240));
       
   799 }
       
   800 
       
   801 
       
   802 void tst_QDockWidget::task258459_visibilityChanged()
       
   803 {
       
   804     QMainWindow win;
       
   805     QDockWidget dock1, dock2;
       
   806     win.addDockWidget(Qt::RightDockWidgetArea, &dock1);
       
   807     win.tabifyDockWidget(&dock1, &dock2);
       
   808     QSignalSpy spy1(&dock1, SIGNAL(visibilityChanged(bool)));
       
   809     QSignalSpy spy2(&dock2, SIGNAL(visibilityChanged(bool)));
       
   810     win.show();
       
   811     QTest::qWait(200);
       
   812     QCOMPARE(spy1.count(), 1);
       
   813     QCOMPARE(spy1.first().first().toBool(), false); //dock1 is invisible
       
   814     QCOMPARE(spy2.count(), 1);
       
   815     QCOMPARE(spy2.first().first().toBool(), true); //dock1 is visible
       
   816 }
       
   817 
       
   818 QTEST_MAIN(tst_QDockWidget)
       
   819 #include "tst_qdockwidget.moc"