tests/auto/qwidget/tst_qwidget.cpp
changeset 18 2f34d5167611
parent 3 41300fa6a67c
child 19 fcece45ef507
--- a/tests/auto/qwidget/tst_qwidget.cpp	Tue Feb 02 00:43:10 2010 +0200
+++ b/tests/auto/qwidget/tst_qwidget.cpp	Fri Apr 16 15:50:13 2010 +0300
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
 ** All rights reserved.
 ** Contact: Nokia Corporation (qt-info@nokia.com)
 **
@@ -66,6 +66,8 @@
 #include <private/qapplication_p.h>
 #include <qcalendarwidget.h>
 #include <qmainwindow.h>
+#include <qdockwidget.h>
+#include <qtoolbar.h>
 #include <QtGui/qpaintengine.h>
 #include <private/qbackingstore_p.h>
 
@@ -248,6 +250,7 @@
 #else
     void persistentWinId();
 #endif
+    void showNativeChild();
     void qobject_castInDestroyedSlot();
 
     void showHideEvent_data();
@@ -356,6 +359,7 @@
     void paintOnScreenPossible();
 #endif
     void reparentStaticWidget();
+    void QTBUG6883_reparentStaticWidget2();
 #ifdef Q_WS_QWS
     void updateOutsideSurfaceClip();
 #endif
@@ -388,11 +392,17 @@
 
 #ifdef Q_OS_SYMBIAN
     void cbaVisibility();
+    void fullScreenWindowModeTransitions();
+    void maximizedWindowModeTransitions();
+    void minimizedWindowModeTransitions();
+    void normalWindowModeTransitions();
 #endif
 
     void focusProxyAndInputMethods();
     void scrollWithoutBackingStore();
 
+    void taskQTBUG_7532_tabOrderWithFocusProxy();
+
 private:
     bool ensureScreenSize(int width, int height);
     QWidget *testWidget;
@@ -4577,6 +4587,16 @@
 }
 #endif // Q_OS_SYMBIAN
 
+void tst_QWidget::showNativeChild()
+{
+    QWidget topLevel;
+    topLevel.setGeometry(0, 0, 100, 100);
+    QWidget child(&topLevel);
+    child.winId();
+    topLevel.show();
+    QTest::qWaitForWindowShown(&topLevel);
+}
+
 class ShowHideEventWidget : public QWidget
 {
 public:
@@ -5436,26 +5456,24 @@
     QRegion r;
 };
 
-template<typename R, typename C>
-void verifyColor(R const& region, C const& color)
-{
-    const QRegion r = QRegion(region);
-    for (int i = 0; i < r.rects().size(); ++i) {
-        const QRect rect = r.rects().at(i);
-        for (int t = 0; t < 5; t++) {
-            const QPixmap pixmap = QPixmap::grabWindow(QDesktopWidget().winId(),
-                                                   rect.left(), rect.top(),
-                                                   rect.width(), rect.height());
-            QCOMPARE(pixmap.size(), rect.size());
-            QPixmap expectedPixmap(pixmap); /* ensure equal formats */
-            expectedPixmap.fill(color);
-            if (pixmap.toImage().pixel(0,0) != QColor(color).rgb() && t < 4 )
-            { QTest::qWait(200); continue; }
-            QCOMPARE(pixmap.toImage().pixel(0,0), QColor(color).rgb());
-            QCOMPARE(pixmap, expectedPixmap);
-            break;
-        }
-    }
+#define VERIFY_COLOR(region, color) {                                   \
+    const QRegion r = QRegion(region);                                  \
+    for (int i = 0; i < r.rects().size(); ++i) {                        \
+        const QRect rect = r.rects().at(i);                             \
+        for (int t = 0; t < 5; t++) {                                   \
+            const QPixmap pixmap = QPixmap::grabWindow(QDesktopWidget().winId(), \
+                                                   rect.left(), rect.top(), \
+                                                   rect.width(), rect.height()); \
+            QCOMPARE(pixmap.size(), rect.size());                       \
+            QPixmap expectedPixmap(pixmap); /* ensure equal formats */  \
+            expectedPixmap.fill(color);                                 \
+            if (pixmap.toImage().pixel(0,0) != QColor(color).rgb() && t < 4 ) \
+            { QTest::qWait(200); continue; }                            \
+            QCOMPARE(pixmap.toImage().pixel(0,0), QColor(color).rgb()); \
+            QCOMPARE(pixmap, expectedPixmap);                           \
+            break;                                                      \
+        }                                                               \
+    }                                                                   \
 }
 
 void tst_QWidget::moveChild_data()
@@ -5496,9 +5514,9 @@
 #endif
     QTRY_COMPARE(parent.r, QRegion(parent.rect()) - child.geometry());
     QTRY_COMPARE(child.r, QRegion(child.rect()));
-    verifyColor(child.geometry().translated(tlwOffset),
+    VERIFY_COLOR(child.geometry().translated(tlwOffset),
                  child.color);
-    verifyColor(QRegion(parent.geometry()) - child.geometry().translated(tlwOffset),
+    VERIFY_COLOR(QRegion(parent.geometry()) - child.geometry().translated(tlwOffset),
                  parent.color);
     parent.reset();
     child.reset();
@@ -5517,9 +5535,9 @@
     // should be scrolled in backingstore
     QCOMPARE(child.r, QRegion());
 #endif
-    verifyColor(child.geometry().translated(tlwOffset),
+    VERIFY_COLOR(child.geometry().translated(tlwOffset),
                 child.color);
-    verifyColor(QRegion(parent.geometry()) - child.geometry().translated(tlwOffset),
+    VERIFY_COLOR(QRegion(parent.geometry()) - child.geometry().translated(tlwOffset),
                 parent.color);
 }
 
@@ -5550,8 +5568,8 @@
     child.move(desktopDimensions.width()/2, desktopDimensions.height()/2);
     qApp->processEvents();
 
-    verifyColor(child.geometry().translated(tlwOffset), Qt::blue);
-    verifyColor(QRegion(parent.geometry()) - child.geometry().translated(tlwOffset), Qt::red);
+    VERIFY_COLOR(child.geometry().translated(tlwOffset), Qt::blue);
+    VERIFY_COLOR(QRegion(parent.geometry()) - child.geometry().translated(tlwOffset), Qt::red);
 }
 
 void tst_QWidget::subtractOpaqueSiblings()
@@ -8728,6 +8746,31 @@
     // Please don't crash.
     paintOnScreen.resize(paintOnScreen.size() + QSize(2, 2));
     QTest::qWait(20);
+
+}
+
+void tst_QWidget::QTBUG6883_reparentStaticWidget2()
+{
+    QMainWindow mw;
+    QDockWidget *one = new QDockWidget("one", &mw);
+    mw.addDockWidget(Qt::LeftDockWidgetArea, one , Qt::Vertical);
+
+    QWidget *child = new QWidget();
+    child->setPalette(Qt::red);
+    child->setAutoFillBackground(true);
+    child->setAttribute(Qt::WA_StaticContents);
+    child->resize(100, 100);
+    one->setWidget(child);
+
+    QToolBar *mainTools = mw.addToolBar("Main Tools");
+    mainTools->addWidget(new QLineEdit);
+
+    mw.show();
+    QTest::qWaitForWindowShown(&mw);
+
+    one->setFloating(true);
+    QTest::qWait(20);
+    //do not crash
 }
 
 #ifdef Q_WS_QWS
@@ -9661,6 +9704,226 @@
     CEikButtonGroupContainer* buttonGroup = CEikonEnv::Static()->AppUiFactory()->Cba();
     QVERIFY(buttonGroup->IsVisible());
 }
+
+void tst_QWidget::fullScreenWindowModeTransitions()
+{
+    QWidget widget;
+    QVBoxLayout *layout = new QVBoxLayout;
+    QPushButton *button = new QPushButton("test Button");
+    layout->addWidget(button);
+    widget.setLayout(layout);
+    widget.show();
+
+    const QRect normalGeometry = widget.normalGeometry();
+    const QRect fullScreenGeometry = qApp->desktop()->screenGeometry(&widget);
+    const QRect maximumScreenGeometry = qApp->desktop()->availableGeometry(&widget);
+    CEikStatusPane *statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane();
+    CEikButtonGroupContainer *buttonGroup = CEikonEnv::Static()->AppUiFactory()->Cba();
+
+    //Enter
+    widget.showNormal();
+    widget.showFullScreen();
+    QCOMPARE(widget.geometry(), fullScreenGeometry);
+    QVERIFY(!buttonGroup->IsVisible());
+    QVERIFY(!statusPane->IsVisible());
+
+    widget.showMaximized();
+    widget.showFullScreen();
+    QCOMPARE(widget.geometry(), fullScreenGeometry);
+    QVERIFY(!buttonGroup->IsVisible());
+    QVERIFY(!statusPane->IsVisible());
+
+    widget.showMinimized();
+    widget.showFullScreen();
+    QCOMPARE(widget.geometry(), fullScreenGeometry);
+    QVERIFY(!buttonGroup->IsVisible());
+    QVERIFY(!statusPane->IsVisible());
+
+    //Exit
+    widget.showFullScreen();
+    widget.showNormal();
+    QCOMPARE(widget.geometry(), normalGeometry);
+    QVERIFY(buttonGroup->IsVisible());
+    QVERIFY(statusPane->IsVisible());
+
+    widget.showFullScreen();
+    widget.showMaximized();
+    QCOMPARE(widget.geometry(), maximumScreenGeometry);
+    QVERIFY(buttonGroup->IsVisible());
+    QVERIFY(statusPane->IsVisible());
+
+    widget.showFullScreen();
+    widget.showMinimized();
+    QCOMPARE(widget.geometry(), fullScreenGeometry);
+    QVERIFY(!buttonGroup->IsVisible());
+    QVERIFY(!statusPane->IsVisible());
+}
+
+void tst_QWidget::maximizedWindowModeTransitions()
+{
+    QWidget widget;
+    QVBoxLayout *layout = new QVBoxLayout;
+    QPushButton *button = new QPushButton("test Button");
+    layout->addWidget(button);
+    widget.setLayout(layout);
+    widget.show();
+
+    const QRect normalGeometry = widget.normalGeometry();
+    const QRect fullScreenGeometry = qApp->desktop()->screenGeometry(&widget);
+    const QRect maximumScreenGeometry = qApp->desktop()->availableGeometry(&widget);
+    CEikStatusPane *statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane();
+    CEikButtonGroupContainer *buttonGroup = CEikonEnv::Static()->AppUiFactory()->Cba();
+
+    //Enter
+    widget.showNormal();
+    widget.showMaximized();
+    QCOMPARE(widget.geometry(), maximumScreenGeometry);
+    QVERIFY(buttonGroup->IsVisible());
+    QVERIFY(statusPane->IsVisible());
+
+    widget.showFullScreen();
+    widget.showMaximized();
+    QCOMPARE(widget.geometry(), maximumScreenGeometry);
+    QVERIFY(buttonGroup->IsVisible());
+    QVERIFY(statusPane->IsVisible());
+
+    widget.showMinimized();
+    widget.showMaximized();
+    QCOMPARE(widget.geometry(), maximumScreenGeometry);
+    QVERIFY(buttonGroup->IsVisible());
+    QVERIFY(statusPane->IsVisible());
+
+    //Exit
+    widget.showMaximized();
+    widget.showNormal();
+    QCOMPARE(widget.geometry(), normalGeometry);
+    QVERIFY(buttonGroup->IsVisible());
+    QVERIFY(statusPane->IsVisible());
+
+    widget.showMaximized();
+    widget.showFullScreen();
+    QCOMPARE(widget.geometry(), fullScreenGeometry);
+    QVERIFY(!buttonGroup->IsVisible());
+    QVERIFY(!statusPane->IsVisible());
+
+    widget.showMaximized();
+    widget.showMinimized();
+    // Since showMinimized hides window decoration availableGeometry gives different value
+    // than with decoration visible. Altual size does not really matter since widget is invisible.
+    QCOMPARE(widget.geometry(), qApp->desktop()->availableGeometry(&widget));
+    QVERIFY(!buttonGroup->IsVisible());
+    QVERIFY(!statusPane->IsVisible());
+}
+
+void tst_QWidget::minimizedWindowModeTransitions()
+{
+    QWidget widget;
+    QVBoxLayout *layout = new QVBoxLayout;
+    QPushButton *button = new QPushButton("test Button");
+    layout->addWidget(button);
+    widget.setLayout(layout);
+    widget.show();
+
+    const QRect normalGeometry = widget.normalGeometry();
+    const QRect fullScreenGeometry = qApp->desktop()->screenGeometry(&widget);
+    const QRect maximumScreenGeometry = qApp->desktop()->availableGeometry(&widget);
+    CEikStatusPane *statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane();
+    CEikButtonGroupContainer *buttonGroup = CEikonEnv::Static()->AppUiFactory()->Cba();
+
+    //Enter
+    widget.showNormal();
+    widget.showMinimized();
+    QCOMPARE(widget.geometry(), normalGeometry);
+    QVERIFY(!buttonGroup->IsVisible());
+    QVERIFY(!statusPane->IsVisible());
+
+    widget.showFullScreen();
+    widget.showMinimized();
+    QCOMPARE(widget.geometry(), fullScreenGeometry);
+    QVERIFY(!buttonGroup->IsVisible());
+    QVERIFY(!statusPane->IsVisible());
+
+    widget.showMaximized();
+    widget.showMinimized();
+    // Since showMinimized hides window decoration availableGeometry gives different value
+    // than with decoration visible. Altual size does not really matter since widget is invisible.
+    QCOMPARE(widget.geometry(), qApp->desktop()->availableGeometry(&widget));
+    QVERIFY(!buttonGroup->IsVisible());
+    QVERIFY(!statusPane->IsVisible());
+
+    //Exit
+    widget.showMinimized();
+    widget.showNormal();
+    QCOMPARE(widget.geometry(), normalGeometry);
+    QVERIFY(buttonGroup->IsVisible());
+    QVERIFY(statusPane->IsVisible());
+
+    widget.showMinimized();
+    widget.showFullScreen();
+    QCOMPARE(widget.geometry(), fullScreenGeometry);
+    QVERIFY(!buttonGroup->IsVisible());
+    QVERIFY(!statusPane->IsVisible());
+
+    widget.showMinimized();
+    widget.showMaximized();
+    QCOMPARE(widget.geometry(), maximumScreenGeometry);
+    QVERIFY(buttonGroup->IsVisible());
+    QVERIFY(statusPane->IsVisible());
+}
+
+void tst_QWidget::normalWindowModeTransitions()
+{
+    QWidget widget;
+    QVBoxLayout *layout = new QVBoxLayout;
+    QPushButton *button = new QPushButton("test Button");
+    layout->addWidget(button);
+    widget.setLayout(layout);
+    widget.show();
+
+    const QRect normalGeometry = widget.normalGeometry();
+    const QRect fullScreenGeometry = qApp->desktop()->screenGeometry(&widget);
+    const QRect maximumScreenGeometry = qApp->desktop()->availableGeometry(&widget);
+    CEikStatusPane *statusPane = CEikonEnv::Static()->AppUiFactory()->StatusPane();
+    CEikButtonGroupContainer *buttonGroup = CEikonEnv::Static()->AppUiFactory()->Cba();
+
+    //Enter
+    widget.showMaximized();
+    widget.showNormal();
+    QCOMPARE(widget.geometry(), normalGeometry);
+    QVERIFY(buttonGroup->IsVisible());
+    QVERIFY(statusPane->IsVisible());
+
+    widget.showFullScreen();
+    widget.showNormal();
+    QCOMPARE(widget.geometry(), normalGeometry);
+    QVERIFY(buttonGroup->IsVisible());
+    QVERIFY(statusPane->IsVisible());
+
+    widget.showMinimized();
+    widget.showNormal();
+    QCOMPARE(widget.geometry(), normalGeometry);
+    QVERIFY(buttonGroup->IsVisible());
+    QVERIFY(statusPane->IsVisible());
+
+    //Exit
+    widget.showNormal();
+    widget.showMaximized();
+    QCOMPARE(widget.geometry(), maximumScreenGeometry);
+    QVERIFY(buttonGroup->IsVisible());
+    QVERIFY(statusPane->IsVisible());
+
+    widget.showNormal();
+    widget.showFullScreen();
+    QCOMPARE(widget.geometry(), fullScreenGeometry);
+    QVERIFY(!buttonGroup->IsVisible());
+    QVERIFY(!statusPane->IsVisible());
+
+    widget.showNormal();
+    widget.showMinimized();
+    QCOMPARE(widget.geometry(), normalGeometry);
+    QVERIFY(!buttonGroup->IsVisible());
+    QVERIFY(!statusPane->IsVisible());
+}
 #endif
 
 class InputContextTester : public QInputContext
@@ -9726,7 +9989,7 @@
     void deleteBackingStore()
     {
         if (static_cast<QWidgetPrivate*>(d_ptr.data())->maybeBackingStore()) {
-            delete static_cast<QWidgetPrivate*>(d_ptr.data())->topData()->backingStore;    
+            delete static_cast<QWidgetPrivate*>(d_ptr.data())->topData()->backingStore;
             static_cast<QWidgetPrivate*>(d_ptr.data())->topData()->backingStore = 0;
         }
     }
@@ -9757,5 +10020,17 @@
     QCOMPARE(child.pos(),QPoint(25,25));
 }
 
+void tst_QWidget::taskQTBUG_7532_tabOrderWithFocusProxy()
+{
+    QWidget w;
+    w.setFocusPolicy(Qt::TabFocus);
+    QWidget *fp = new QWidget(&w);
+    fp->setFocusPolicy(Qt::TabFocus);
+    w.setFocusProxy(fp);
+    QWidget::setTabOrder(&w, fp);
+
+    // No Q_ASSERT, then it's allright.
+}
+
 QTEST_MAIN(tst_QWidget)
 #include "tst_qwidget.moc"