qt/qwidget/smoke_qwidget.cpp
branchSymbian3
changeset 43 14fcccfb4c0c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qt/qwidget/smoke_qwidget.cpp	Mon Jun 14 12:26:38 2010 +0100
@@ -0,0 +1,399 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 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$
+**
+****************************************************************************/
+
+
+#if defined(QT3_SUPPORT)
+#include <q3hbox.h>
+#include <q3textedit.h>
+#endif
+#include <qboxlayout.h>
+#include <qapplication.h>
+#include <qbitmap.h>
+#include <qdebug.h>
+#include <qeventloop.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qlistview.h>
+#include <qmessagebox.h>
+#include <qpainter.h>
+#include <qpoint.h>
+#include <qpushbutton.h>
+#include <qstyle.h>
+#include <qwidget.h>
+#include <qwindowsstyle.h>
+#include <qinputcontext.h>
+#include <qdesktopwidget.h>
+#include <private/qwidget_p.h>
+#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>
+
+#include <QtGui/QGraphicsView>
+#include <QtGui/QGraphicsProxyWidget>
+
+#include "../shared/util.h"
+
+
+#ifdef Q_WS_S60
+#include <avkon.hrh>                // EEikStatusPaneUidTitle
+#include <akntitle.h>               // CAknTitlePane
+#include <akncontext.h>             // CAknContextPane
+#include <eikspane.h>               // CEikStatusPane
+#include <eikbtgpc.h>               // CEikButtonGroupContainer
+#endif
+
+#ifdef Q_WS_QWS
+# include <qscreen_qws.h>
+#endif
+
+// I *MUST* have QtTest afterwards or this test won't work with newer headers
+#if defined(Q_WS_MAC)
+# include <private/qt_mac_p.h>
+#undef verify
+#include "tst_qwidget_mac_helpers.h"  // Abstract the ObjC stuff out so not everyone must run an ObjC++ compile.
+#endif
+
+#include <QtTest/QtTest>
+
+#if defined(Q_WS_WIN)
+#  include <qt_windows.h>
+#  if !defined(Q_OS_WINCE)
+#define Q_CHECK_PAINTEVENTS \
+    if (::SwitchDesktop(::GetThreadDesktop(::GetCurrentThreadId())) == 0) \
+        QSKIP("desktop is not visible, this test would fail", SkipSingle);
+#  else
+#    define Q_CHECK_PAINTEVENTS
+#  endif
+#elif defined(Q_WS_X11)
+#  include <private/qt_x11_p.h>
+#  include <qx11info_x11.h>
+#elif defined(Q_WS_QWS)
+# include <qwindowsystem_qws.h>
+#endif
+
+#if !defined(Q_WS_WIN)
+#define Q_CHECK_PAINTEVENTS
+#endif
+
+#if defined(Bool)
+#undef Bool
+#endif
+
+// Will try to wait for the condition while allowing event processing
+// for a maximum of 2 seconds.
+#define WAIT_FOR_CONDITION(expr, expected) \
+    do { \
+        const int step = 100; \
+        for (int i = 0; i < 2000 && expr != expected; i+=step) { \
+            QTest::qWait(step); \
+        } \
+    } while(0)
+
+//TESTED_CLASS=
+//TESTED_FILES=
+
+class tst_QWidget : public QObject
+{
+    Q_OBJECT
+
+public:
+    tst_QWidget();
+    virtual ~tst_QWidget();
+
+
+public slots:
+    void initTestCase();
+    void cleanupTestCase();
+    void init();
+    void cleanup();
+private slots:
+    void showFullScreen();
+	
+private:
+    bool ensureScreenSize(int width, int height);
+    QWidget *testWidget;
+};
+
+tst_QWidget::tst_QWidget()
+{
+    QFont font;
+    font.setBold(true);
+    font.setPointSize(42);
+    qApp->setFont(font, "QPropagationTestWidget");
+
+    QPalette palette;
+    palette.setColor(QPalette::ToolTipBase, QColor(12, 13, 14));
+    palette.setColor(QPalette::Text, QColor(21, 22, 23));
+    qApp->setPalette(palette, "QPropagationTestWidget");
+
+    testWidget = 0;
+}
+
+tst_QWidget::~tst_QWidget()
+{
+}
+
+class BezierViewer : public QWidget {
+public:
+    BezierViewer( QWidget* parent=0, const char* name=0 );
+    void paintEvent( QPaintEvent* );
+    void setPoints( const QPolygonF& poly );
+private:
+    QPolygonF points;
+
+};
+
+void tst_QWidget::initTestCase()
+{
+  // Create the test class
+    testWidget = new BezierViewer( 0, "testObject");
+    testWidget->resize(200,200);
+#ifdef QT3_SUPPORT
+    qApp->setMainWidget(testWidget);
+#endif
+    testWidget->show();
+    QTest::qWaitForWindowShown(testWidget);
+    QTest::qWait(50);
+}
+
+void tst_QWidget::cleanupTestCase()
+{
+    delete testWidget;
+    testWidget = 0;
+}
+
+
+void tst_QWidget::init()
+{
+// TODO: Add initialization code here.
+// This will be executed immediately before each test is run.
+    testWidget->setFont(QFont());
+    testWidget->setPalette(QPalette());
+}
+
+void tst_QWidget::cleanup()
+{
+}
+
+
+
+// Helper class...
+
+BezierViewer::BezierViewer( QWidget* parent, const char* name )
+	: QWidget( parent )
+{
+    setObjectName(name);
+    QPalette pal;
+    pal.setColor(backgroundRole(), Qt::white);
+    setPalette(pal);
+}
+
+
+void BezierViewer::setPoints( const QPolygonF& a )
+{
+    points = a;
+}
+
+#include "private/qbezier_p.h"
+void BezierViewer::paintEvent( QPaintEvent* )
+{
+    if ( points.size() != 4 ) {
+#if defined(QT_CHECK_RANGE)
+	qWarning( "QPolygon::bezier: The array must have 4 control points" );
+#endif
+	return;
+    }
+
+    // Calculate Bezier curve
+    QPolygonF bezier = QBezier::fromPoints(points.at(0),points.at(1),points.at(2),points.at(3)).toPolygon();
+
+    QPainter painter( this );
+
+    // Calculate scale to fit in window
+    QRectF br = bezier.boundingRect() | points.boundingRect();
+    QRectF pr = rect();
+    int scl = qMax( qMin(pr.width()/br.width(), pr.height()/br.height()), qreal(1.) );
+    int border = scl-1;
+
+    // Scale Bezier curve vertices
+    for ( QPolygonF::Iterator it = bezier.begin(); it != bezier.end(); ++it ) {
+	it->setX( (it->x()-br.x()) * scl + border );
+	it->setY( (it->y()-br.y()) * scl + border );
+    }
+
+    // Draw grid
+    painter.setPen( Qt::lightGray );
+	int i;
+	for ( i = border; i <= pr.width(); i += scl ) {
+		painter.drawLine( i, 0, i, pr.height() );
+    }
+    for ( int j = border; j <= pr.height(); j += scl ) {
+	painter.drawLine( 0, j, pr.width(), j );
+    }
+
+    // Write number of vertices
+    painter.setPen( Qt::red );
+    painter.setFont( QFont("Helvetica", 14, QFont::DemiBold, TRUE ) );
+    QString caption;
+    caption.setNum( bezier.size() );
+    caption += QString::fromLatin1( " vertices" );
+    painter.drawText( 10, pr.height()-10, caption );
+
+    // Draw Bezier curve
+    painter.setPen( Qt::black );
+    painter.drawPolyline( bezier );
+
+    // Scale and draw control points
+    painter.setPen( Qt::darkGreen );
+    for ( QPolygonF::Iterator p1 = points.begin(); p1 != points.end(); ++p1 ) {
+	int x = (p1->x()-br.x()) * scl + border;
+	int y = (p1->y()-br.y()) * scl + border;
+	painter.drawLine( x-4, y-4, x+4, y+4 );
+	painter.drawLine( x+4, y-4, x-4, y+4 );
+    }
+
+    // Draw vertices
+    painter.setPen( Qt::red );
+    painter.setBrush( Qt::red );
+    for ( QPolygonF::Iterator p2 = bezier.begin(); p2 != bezier.end(); ++p2 )
+	painter.drawEllipse( p2->x()-1, p2->y()-1, 3, 3 );
+}
+
+void tst_QWidget::showFullScreen()
+{
+    QWidget plain;
+    QHBoxLayout *layout;
+    QWidget layouted;
+    QLineEdit le;
+    QLineEdit le2;
+    QLineEdit le3;
+    layout = new QHBoxLayout;
+
+    layout->addWidget(&le);
+    layout->addWidget(&le2);
+    layout->addWidget(&le3);
+
+    layouted.setLayout(layout);
+
+    plain.showFullScreen();
+    QVERIFY(plain.windowState() & Qt::WindowFullScreen);
+
+    plain.showNormal();
+    QVERIFY(!(plain.windowState() & Qt::WindowFullScreen));
+
+    layouted.showFullScreen();
+    QVERIFY(layouted.windowState() & Qt::WindowFullScreen);
+
+    layouted.showNormal();
+    QVERIFY(!(layouted.windowState() & Qt::WindowFullScreen));
+
+#if !defined(Q_WS_QWS) && !defined(Q_OS_WINCE) && !defined (Q_WS_S60)
+//embedded may choose a different size to fit on the screen.
+    QCOMPARE(layouted.size(), layouted.sizeHint());
+#endif
+
+    layouted.showFullScreen();
+    QVERIFY(layouted.isFullScreen());
+    QVERIFY(layouted.isVisible());
+
+    layouted.hide();
+    QVERIFY(layouted.isFullScreen());
+    QVERIFY(!layouted.isVisible());
+
+    layouted.showFullScreen();
+    QVERIFY(layouted.isFullScreen());
+    QVERIFY(layouted.isVisible());
+
+    layouted.showMinimized();
+    QVERIFY(layouted.isMinimized());
+    QVERIFY(layouted.isFullScreen());
+
+    layouted.showFullScreen();
+    QVERIFY(!layouted.isMinimized());
+    QVERIFY(layouted.isFullScreen());
+    QVERIFY(layouted.isVisible());
+
+    layouted.showMinimized();
+    QVERIFY(layouted.isMinimized());
+    QVERIFY(layouted.isFullScreen());
+
+    layouted.showFullScreen();
+    QVERIFY(!layouted.isMinimized());
+    QVERIFY(layouted.isFullScreen());
+    QVERIFY(layouted.isVisible());
+
+    {
+        QWidget frame;
+        QWidget widget(&frame);
+        widget.showFullScreen();
+        QVERIFY(widget.isFullScreen());
+    }
+
+#ifdef QT3_SUPPORT
+#if !defined(Q_WS_QWS)
+//embedded respects max/min sizes by design -- maybe wrong design, but that's the way it is now.
+    {
+        Q3HBox box;
+        QWidget widget(&box);
+        widget.setMinimumSize(500, 500);
+        box.showFullScreen();
+        QVERIFY(box.isFullScreen());
+    }
+
+    {
+        Q3HBox box;
+        QWidget widget(&box);
+        widget.setMaximumSize(500, 500);
+
+        box.showFullScreen();
+        QVERIFY(box.isFullScreen());
+    }
+#endif
+#endif // QT3_SUPPORT
+}
+
+QTEST_MAIN(tst_QWidget)
+#include "smoke_qwidget.moc"