1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the test suite of the Qt Toolkit.
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.
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.
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.
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.
40 ****************************************************************************/
42 #include <QtTest/QSignalSpy>
43 #include <QtDeclarative/qdeclarativecomponent.h>
44 #include <QtDeclarative/qdeclarativecontext.h>
45 #include <QtQuick1/qdeclarativeview.h>
46 #include <QtQuick1/qdeclarativeitem.h>
47 #include <QtWidgets/qgraphicswidget.h>
49 class tst_QDeclarativeView : public QObject
53 tst_QDeclarativeView();
57 void resizemodedeclarativeitem();
58 void resizemodegraphicswidget();
63 T *findItem(QGraphicsObject *parent, const QString &objectName);
67 tst_QDeclarativeView::tst_QDeclarativeView()
71 void tst_QDeclarativeView::scene()
75 scene.setItemIndexMethod(QGraphicsScene::NoIndex);
76 scene.setStickyFocus(true);
78 QDeclarativeView *view = new QDeclarativeView();
80 QVERIFY(view->scene());
81 view->setScene(&scene);
82 QCOMPARE(view->scene(), &scene);
84 view->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodedeclarativeitem.qml"));
85 QDeclarativeItem* declarativeItem = qobject_cast<QDeclarativeItem*>(view->rootObject());
86 QVERIFY(declarativeItem);
87 QVERIFY(scene.items().count() > 0);
88 QCOMPARE(scene.items().at(0), declarativeItem);
93 void tst_QDeclarativeView::resizemodedeclarativeitem()
96 QDeclarativeView *canvas = new QDeclarativeView(&window);
98 QSignalSpy sceneResizedSpy(canvas, SIGNAL(sceneResized(QSize)));
99 canvas->setResizeMode(QDeclarativeView::SizeRootObjectToView);
100 QCOMPARE(QSize(0,0), canvas->initialSize());
101 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodedeclarativeitem.qml"));
102 QDeclarativeItem* declarativeItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
103 QVERIFY(declarativeItem);
106 // initial size from root object
107 QCOMPARE(declarativeItem->width(), 200.0);
108 QCOMPARE(declarativeItem->height(), 200.0);
109 QCOMPARE(canvas->size(), QSize(200, 200));
110 QCOMPARE(canvas->size(), canvas->sizeHint());
111 QCOMPARE(canvas->size(), canvas->initialSize());
112 QCOMPARE(sceneResizedSpy.count(), 1);
114 // size update from view
115 canvas->resize(QSize(80,100));
116 QCOMPARE(declarativeItem->width(), 80.0);
117 QCOMPARE(declarativeItem->height(), 100.0);
118 QCOMPARE(canvas->size(), QSize(80, 100));
119 QCOMPARE(canvas->size(), canvas->sizeHint());
120 QCOMPARE(sceneResizedSpy.count(), 2);
122 canvas->setResizeMode(QDeclarativeView::SizeViewToRootObject);
124 // size update from view disabled
125 canvas->resize(QSize(60,80));
126 QCOMPARE(declarativeItem->width(), 80.0);
127 QCOMPARE(declarativeItem->height(), 100.0);
128 QCOMPARE(canvas->size(), QSize(60, 80));
129 QCOMPARE(sceneResizedSpy.count(), 3);
131 // size update from root object
132 declarativeItem->setWidth(250);
133 declarativeItem->setHeight(350);
134 QCOMPARE(declarativeItem->width(), 250.0);
135 QCOMPARE(declarativeItem->height(), 350.0);
136 QTRY_COMPARE(canvas->size(), QSize(250, 350));
137 QCOMPARE(canvas->size(), QSize(250, 350));
138 QCOMPARE(canvas->size(), canvas->sizeHint());
139 QCOMPARE(sceneResizedSpy.count(), 4);
144 canvas = new QDeclarativeView(&window);
146 QSignalSpy sceneResizedSpy2(canvas, SIGNAL(sceneResized(QSize)));
147 canvas->setResizeMode(QDeclarativeView::SizeViewToRootObject);
148 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodedeclarativeitem.qml"));
149 declarativeItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
150 QVERIFY(declarativeItem);
153 // initial size for root object
154 QCOMPARE(declarativeItem->width(), 200.0);
155 QCOMPARE(declarativeItem->height(), 200.0);
156 QCOMPARE(canvas->size(), canvas->sizeHint());
157 QCOMPARE(canvas->size(), canvas->initialSize());
158 QCOMPARE(sceneResizedSpy2.count(), 1);
160 // size update from root object
161 declarativeItem->setWidth(80);
162 declarativeItem->setHeight(100);
163 QCOMPARE(declarativeItem->width(), 80.0);
164 QCOMPARE(declarativeItem->height(), 100.0);
165 QTRY_COMPARE(canvas->size(), QSize(80, 100));
166 QCOMPARE(canvas->size(), QSize(80, 100));
167 QCOMPARE(canvas->size(), canvas->sizeHint());
168 QCOMPARE(sceneResizedSpy2.count(), 2);
170 // size update from root object disabled
171 canvas->setResizeMode(QDeclarativeView::SizeRootObjectToView);
172 declarativeItem->setWidth(60);
173 declarativeItem->setHeight(80);
174 QCOMPARE(canvas->width(), 80);
175 QCOMPARE(canvas->height(), 100);
176 QCOMPARE(QSize(declarativeItem->width(), declarativeItem->height()), canvas->sizeHint());
177 QCOMPARE(sceneResizedSpy2.count(), 2);
179 // size update from view
180 canvas->resize(QSize(200,300));
181 QCOMPARE(declarativeItem->width(), 200.0);
182 QCOMPARE(declarativeItem->height(), 300.0);
183 QCOMPARE(canvas->size(), QSize(200, 300));
184 QCOMPARE(canvas->size(), canvas->sizeHint());
185 QCOMPARE(sceneResizedSpy2.count(), 3);
189 canvas = new QDeclarativeView(&window);
190 canvas->resize(300, 300);
191 canvas->setResizeMode(QDeclarativeView::SizeRootObjectToView);
192 QCOMPARE(QSize(0,0), canvas->initialSize());
193 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodedeclarativeitem.qml"));
194 declarativeItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
195 QVERIFY(declarativeItem);
198 // initial size from root object
199 QCOMPARE(declarativeItem->width(), 300.0);
200 QCOMPARE(declarativeItem->height(), 300.0);
201 QCOMPARE(canvas->size(), QSize(300, 300));
202 QCOMPARE(canvas->size(), canvas->sizeHint());
203 QCOMPARE(canvas->initialSize(), QSize(200, 200));
207 void tst_QDeclarativeView::resizemodegraphicswidget()
210 QDeclarativeView *canvas = new QDeclarativeView(&window);
212 QSignalSpy sceneResizedSpy(canvas, SIGNAL(sceneResized(QSize)));
213 canvas->setResizeMode(QDeclarativeView::SizeRootObjectToView);
214 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodegraphicswidget.qml"));
215 QGraphicsWidget* graphicsWidget = qobject_cast<QGraphicsWidget*>(canvas->rootObject());
216 QVERIFY(graphicsWidget);
219 // initial size from root object
220 QCOMPARE(graphicsWidget->size(), QSizeF(200.0, 200.0));
221 QCOMPARE(canvas->size(), QSize(200, 200));
222 QCOMPARE(canvas->size(), QSize(200, 200));
223 QCOMPARE(canvas->size(), canvas->sizeHint());
224 QCOMPARE(canvas->size(), canvas->initialSize());
225 QCOMPARE(sceneResizedSpy.count(), 1);
227 // size update from view
228 canvas->resize(QSize(80,100));
229 QCOMPARE(graphicsWidget->size(), QSizeF(80.0,100.0));
230 QCOMPARE(canvas->size(), QSize(80,100));
231 QCOMPARE(canvas->size(), canvas->sizeHint());
232 QCOMPARE(sceneResizedSpy.count(), 2);
234 // size update from view disabled
235 canvas->setResizeMode(QDeclarativeView::SizeViewToRootObject);
236 canvas->resize(QSize(60,80));
237 QCOMPARE(graphicsWidget->size(), QSizeF(80.0,100.0));
238 QCOMPARE(canvas->size(), QSize(60, 80));
239 QCOMPARE(sceneResizedSpy.count(), 3);
241 // size update from root object
242 graphicsWidget->resize(QSizeF(250.0, 350.0));
243 QCOMPARE(graphicsWidget->size(), QSizeF(250.0,350.0));
244 QCOMPARE(canvas->size(), QSize(250, 350));
245 QCOMPARE(canvas->size(), canvas->sizeHint());
246 QCOMPARE(sceneResizedSpy.count(), 4);
251 canvas = new QDeclarativeView(&window);
253 QSignalSpy sceneResizedSpy2(canvas, SIGNAL(sceneResized(QSize)));
254 canvas->setResizeMode(QDeclarativeView::SizeViewToRootObject);
255 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/resizemodegraphicswidget.qml"));
256 graphicsWidget = qobject_cast<QGraphicsWidget*>(canvas->rootObject());
257 QVERIFY(graphicsWidget);
260 // initial size from root object
261 QCOMPARE(graphicsWidget->size(), QSizeF(200.0, 200.0));
262 QCOMPARE(canvas->size(), QSize(200, 200));
263 QCOMPARE(canvas->size(), canvas->sizeHint());
264 QCOMPARE(canvas->size(), canvas->initialSize());
265 QCOMPARE(sceneResizedSpy2.count(), 1);
267 // size update from root object
268 graphicsWidget->resize(QSizeF(80, 100));
269 QCOMPARE(graphicsWidget->size(), QSizeF(80.0, 100.0));
270 QCOMPARE(canvas->size(), QSize(80, 100));
271 QCOMPARE(canvas->size(), canvas->sizeHint());
272 QCOMPARE(sceneResizedSpy2.count(), 2);
274 // size update from root object disabled
275 canvas->setResizeMode(QDeclarativeView::SizeRootObjectToView);
276 graphicsWidget->resize(QSizeF(60,80));
277 QCOMPARE(canvas->size(), QSize(80,100));
278 QCOMPARE(QSize(graphicsWidget->size().width(), graphicsWidget->size().height()), canvas->sizeHint());
279 QCOMPARE(sceneResizedSpy2.count(), 2);
281 // size update from view
282 canvas->resize(QSize(200,300));
283 QCOMPARE(graphicsWidget->size(), QSizeF(200.0, 300.0));
284 QCOMPARE(canvas->size(), QSize(200, 300));
285 QCOMPARE(canvas->size(), canvas->sizeHint());
286 QCOMPARE(sceneResizedSpy2.count(), 3);
292 static void silentErrorsMsgHandler(QtMsgType, const char *)
296 void tst_QDeclarativeView::errors()
298 QDeclarativeView *canvas = new QDeclarativeView;
300 QtMsgHandler old = qInstallMsgHandler(silentErrorsMsgHandler);
301 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/error1.qml"));
302 qInstallMsgHandler(old);
303 QVERIFY(canvas->status() == QDeclarativeView::Error);
304 QVERIFY(canvas->errors().count() == 1);
309 T *tst_QDeclarativeView::findItem(QGraphicsObject *parent, const QString &objectName)
314 const QMetaObject &mo = T::staticMetaObject;
315 //qDebug() << parent->QGraphicsObject::children().count() << "children";
316 for (int i = 0; i < parent->childItems().count(); ++i) {
317 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(parent->childItems().at(i));
320 //qDebug() << "try" << item;
321 if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName))
322 return static_cast<T*>(item);
323 item = findItem<T>(item, objectName);
325 return static_cast<T*>(item);
331 QTEST_MAIN(tst_QDeclarativeView)
333 #include "tst_qdeclarativeview.moc"