Remove "All rights reserved" line from license headers.
[profile/ivi/qtdeclarative.git] / tests / auto / qtquick1 / qdeclarativeviewer / tst_qdeclarativeviewer.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the test suite of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
20 **
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
28 **
29 ** Other Usage
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include <qtest.h>
43 #include <QtDeclarative/qdeclarativeengine.h>
44 #include <QtQuick1/qdeclarativeview.h>
45 #include <QtQuick1/qdeclarativeitem.h>
46 #include <QtDeclarative/qdeclarativecontext.h>
47 #include <QtWidgets/qmenubar.h>
48 #include <QSignalSpy>
49 #include "qmlruntime.h"
50 #include "deviceorientation.h"
51
52 #if defined(Q_OS_MAC) || defined(Q_WS_MAEMO_5)
53 #  define MENUBAR_HEIGHT(mw) 0
54 #else
55 #  define MENUBAR_HEIGHT(mw) (mw->menuBar()->height())
56 #endif
57
58
59 class QDeclarativeViewerTest : public QDeclarativeViewer
60 {
61 public:
62     QDeclarativeViewerTest() : QDeclarativeViewer(), resizeCount(0) {}
63
64     void resizeEvent (QResizeEvent *event) {
65         QDeclarativeViewer::resizeEvent(event);
66         ++resizeCount;
67     }
68
69     int resizeCount;
70 };
71
72 class tst_QDeclarativeViewer : public QObject
73
74 {
75     Q_OBJECT
76 public:
77     tst_QDeclarativeViewer();
78
79 private slots:
80     void runtimeContextProperty();
81     void loading();
82     void fileBrowser();
83     void resizing();
84     void paths();
85     void slowMode();
86
87 private:
88     QDeclarativeEngine engine;
89 };
90
91 tst_QDeclarativeViewer::tst_QDeclarativeViewer()
92 {
93 }
94
95 #define TEST_INITIAL_SIZES(viewer) { \
96     QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject()); \
97     QVERIFY(rootItem); \
98 \
99     QCOMPARE(rootItem->width(), 200.0); \
100     QCOMPARE(rootItem->height(), 300.0); \
101     QTRY_COMPARE(viewer->view()->size(), QSize(200, 300)); \
102     QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(200, 300)); \
103     QCOMPARE(viewer->size(), QSize(200, 300 + MENUBAR_HEIGHT(viewer))); \
104     QCOMPARE(viewer->size(), viewer->sizeHint()); \
105 }
106
107 void tst_QDeclarativeViewer::runtimeContextProperty()
108 {
109     QDeclarativeViewer *viewer = new QDeclarativeViewer();
110     QVERIFY(viewer);
111     viewer->open(SRCDIR "/data/orientation.qml");
112     QVERIFY(viewer->view());
113     QVERIFY(viewer->menuBar());
114     QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
115     QVERIFY(rootItem);
116     QObject *runtimeObject = qvariant_cast<QObject*>(viewer->view()->engine()->rootContext()->contextProperty("runtime"));
117     QVERIFY(runtimeObject);
118     
119     // test isActiveWindow property
120     QVERIFY(!runtimeObject->property("isActiveWindow").toBool());
121     
122     viewer->show();
123     QApplication::setActiveWindow(viewer);
124     QTest::qWaitForWindowShown(viewer);
125     QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(viewer));
126
127     QVERIFY(runtimeObject->property("isActiveWindow").toBool());
128     
129     TEST_INITIAL_SIZES(viewer);
130
131     // test orientation property
132     QCOMPARE(runtimeObject->property("orientation").toInt(), int(DeviceOrientation::Portrait));
133
134     viewer->rotateOrientation();
135     qApp->processEvents();
136
137     QCOMPARE(runtimeObject->property("orientation").toInt(), int(DeviceOrientation::Landscape));
138     QCOMPARE(rootItem->width(), 300.0);
139
140     QCOMPARE(rootItem->width(), 300.0);
141     QCOMPARE(rootItem->height(), 200.0);
142     QTRY_COMPARE(viewer->view()->size(), QSize(300, 200));
143     QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(300, 200));
144     QCOMPARE(viewer->size(), QSize(300, 200 + MENUBAR_HEIGHT(viewer)));
145     QCOMPARE(viewer->size(), viewer->sizeHint());
146
147     viewer->rotateOrientation();
148     qApp->processEvents();
149
150     QCOMPARE(runtimeObject->property("orientation").toInt(), int(DeviceOrientation::PortraitInverted));
151
152     QCOMPARE(rootItem->width(), 200.0);
153     QCOMPARE(rootItem->height(), 300.0);
154     QTRY_COMPARE(viewer->view()->size(), QSize(200, 300));
155     QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(200, 300));
156     QCOMPARE(viewer->size(), QSize(200, 300 + MENUBAR_HEIGHT(viewer)));
157     QCOMPARE(viewer->size(), viewer->sizeHint());
158
159     viewer->rotateOrientation();
160     qApp->processEvents();
161
162     QCOMPARE(runtimeObject->property("orientation").toInt(), int(DeviceOrientation::LandscapeInverted));
163
164     viewer->rotateOrientation();
165     qApp->processEvents();
166
167     QCOMPARE(runtimeObject->property("orientation").toInt(), int(DeviceOrientation::Portrait));
168
169     viewer->hide();
170     QVERIFY(!runtimeObject->property("isActiveWindow").toBool());
171
172     delete viewer;
173 }
174
175 void tst_QDeclarativeViewer::loading()
176 {
177     QDeclarativeViewer *viewer = new QDeclarativeViewer();
178     QVERIFY(viewer);
179     viewer->setSizeToView(true);
180     viewer->open(SRCDIR "/data/orientation.qml");
181     QVERIFY(viewer->view());
182     QVERIFY(viewer->menuBar());
183     QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
184     QVERIFY(rootItem);
185     viewer->show();
186
187     QApplication::setActiveWindow(viewer);
188     QTest::qWaitForWindowShown(viewer);
189     QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(viewer));
190
191     TEST_INITIAL_SIZES(viewer);
192
193     viewer->resize(QSize(250, 350));
194     qApp->processEvents();
195
196     // window resized
197     QTRY_COMPARE(rootItem->width(), 250.0);
198     QTRY_COMPARE(rootItem->height(), 350.0 - MENUBAR_HEIGHT(viewer));
199     QCOMPARE(viewer->view()->size(), QSize(250, 350 - MENUBAR_HEIGHT(viewer)));
200     QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
201     QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(250, 350 - MENUBAR_HEIGHT(viewer)));
202     QCOMPARE(viewer->size(), QSize(250, 350));
203     QCOMPARE(viewer->size(), viewer->sizeHint());
204
205     QSignalSpy statusSpy(viewer->view(), SIGNAL(statusChanged(QDeclarativeView::Status)));
206     viewer->reload();
207     QTRY_VERIFY(statusSpy.count() == 1);
208     rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
209     QVERIFY(rootItem);
210
211     // reload cause the window to return back to initial size
212     QTRY_COMPARE(rootItem->width(), 200.0);
213     QTRY_COMPARE(rootItem->height(), 300.0);
214     QCOMPARE(viewer->view()->size(), QSize(200, 300));
215     QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
216     QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(200, 300));
217     QCOMPARE(viewer->size(), QSize(200, 300 + MENUBAR_HEIGHT(viewer)));
218     QCOMPARE(viewer->size(), viewer->sizeHint());
219
220     viewer->resize(QSize(250, 350));
221     qApp->processEvents();
222
223     // window resized again
224     QTRY_COMPARE(rootItem->width(), 250.0);
225     QTRY_COMPARE(rootItem->height(), 350.0 - MENUBAR_HEIGHT(viewer));
226     QCOMPARE(viewer->view()->size(), QSize(250, 350 - MENUBAR_HEIGHT(viewer)));
227     QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
228     QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(250, 350 - MENUBAR_HEIGHT(viewer)));
229     QCOMPARE(viewer->size(), QSize(250, 350));
230     QCOMPARE(viewer->size(), viewer->sizeHint());
231
232     viewer->open(SRCDIR "/data/orientation.qml");
233     rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
234     QVERIFY(rootItem);
235
236     // open also causes the window to return back to initial size
237     QTRY_COMPARE(rootItem->width(), 200.0);
238     QTRY_COMPARE(rootItem->height(), 300.0);
239     QCOMPARE(viewer->view()->size(), QSize(200, 300));
240     QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
241     QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(200, 300));
242     QCOMPARE(viewer->size(), QSize(200, 300 + MENUBAR_HEIGHT(viewer)));
243     QCOMPARE(viewer->size(), viewer->sizeHint());
244
245     delete viewer;
246 }
247
248 static int numberOfWarnings = 0;
249 static void checkWarnings(QtMsgType, const char *)
250 {
251     numberOfWarnings++;
252 }
253
254 void tst_QDeclarativeViewer::fileBrowser()
255 {
256     QtMsgHandler previousMsgHandler = qInstallMsgHandler(checkWarnings);
257     QDeclarativeViewer *viewer = new QDeclarativeViewer();
258     QVERIFY(viewer);
259     viewer->setUseNativeFileBrowser(false);
260     viewer->openFile();
261     viewer->show();
262     QCoreApplication::processEvents();
263     qInstallMsgHandler(previousMsgHandler);
264
265     // QTBUG-15720
266     QVERIFY(numberOfWarnings == 0);
267
268     QApplication::setActiveWindow(viewer);
269     QTest::qWaitForWindowShown(viewer);
270     QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(viewer));
271
272     // Browser.qml successfully loaded
273     QDeclarativeItem* browserItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
274     QVERIFY(viewer->view());
275     QVERIFY(viewer->menuBar());
276     QVERIFY(browserItem);
277
278     // load something
279     viewer->open(SRCDIR "/data/orientation.qml");
280     QVERIFY(viewer->view());
281     QVERIFY(viewer->menuBar());
282     QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
283     QVERIFY(rootItem);
284     QVERIFY(browserItem != rootItem);
285
286     // go back to Browser.qml
287     viewer->openFile();
288     browserItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
289     QVERIFY(viewer->view());
290     QVERIFY(viewer->menuBar());
291     QVERIFY(browserItem);
292
293     delete viewer;
294 }
295
296 void tst_QDeclarativeViewer::resizing()
297 {
298     QDeclarativeViewerTest *viewer = new QDeclarativeViewerTest();
299     QVERIFY(viewer);
300     viewer->open(SRCDIR "/data/orientation.qml");
301     QVERIFY(viewer->view());
302     QVERIFY(viewer->menuBar());
303     QDeclarativeItem* rootItem = qobject_cast<QDeclarativeItem*>(viewer->view()->rootObject());
304     QVERIFY(rootItem);
305     viewer->show();
306
307     QApplication::setActiveWindow(viewer);
308     QTest::qWaitForWindowShown(viewer);
309     QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(viewer));
310
311     TEST_INITIAL_SIZES(viewer);
312
313     QCOMPARE(viewer->resizeCount, 1);
314
315     viewer->setSizeToView(false);
316
317     // size view to root object
318     rootItem->setWidth(150);
319     rootItem->setHeight(200);
320     qApp->processEvents();
321
322     QCOMPARE(rootItem->width(), 150.0);
323     QCOMPARE(rootItem->height(), 200.0);
324     QTRY_COMPARE(viewer->view()->size(), QSize(150, 200));
325     QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
326     QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(150, 200));
327     QCOMPARE(viewer->size(), QSize(150, 200 + MENUBAR_HEIGHT(viewer)));
328
329     QCOMPARE(viewer->resizeCount, 2);
330
331     // do not size root object to view
332     viewer->resize(QSize(180,250));
333     QCOMPARE(rootItem->width(), 150.0);
334     QCOMPARE(rootItem->height(), 200.0);
335
336     viewer->setSizeToView(true);
337
338     // size root object to view
339     viewer->resize(QSize(250,350));
340     qApp->processEvents();
341
342     QTRY_COMPARE(rootItem->width(), 250.0);
343     QTRY_COMPARE(rootItem->height(), 350.0 - MENUBAR_HEIGHT(viewer));
344     QTRY_COMPARE(viewer->view()->size(), QSize(250, 350 - MENUBAR_HEIGHT(viewer)));
345     QCOMPARE(viewer->view()->initialSize(), QSize(200, 300));
346     QCOMPARE(viewer->view()->sceneRect().size(), QSizeF(250, 350 - MENUBAR_HEIGHT(viewer)));
347     QCOMPARE(viewer->size(), QSize(250, 350));
348
349     // do not size view to root object
350     viewer->resizeCount = 0;
351
352     rootItem->setWidth(150);
353     rootItem->setHeight(200);
354     QTRY_COMPARE(viewer->size(), QSize(250, 350));
355
356     QCOMPARE(viewer->resizeCount, 0);
357
358     delete viewer;
359 }
360
361 void tst_QDeclarativeViewer::paths()
362 {
363     QDeclarativeViewer *viewer = new QDeclarativeViewer();
364     QVERIFY(viewer);
365
366     viewer->addLibraryPath("miscImportPath");
367     viewer->view()->engine()->importPathList().contains("miscImportPath");
368
369     viewer->addPluginPath("miscPluginPath");
370     viewer->view()->engine()->pluginPathList().contains("miscPluginPath");
371
372     delete viewer;
373 }
374
375 void tst_QDeclarativeViewer::slowMode()
376 {
377     QDeclarativeViewer *viewer = new QDeclarativeViewer();
378     QVERIFY(viewer);
379
380     viewer->setSlowMode(true);
381     viewer->setSlowMode(false);
382
383     delete viewer;
384 }
385
386 QTEST_MAIN(tst_QDeclarativeViewer)
387
388 #include "tst_qdeclarativeviewer.moc"