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/qdeclarativeengine.h>
44 #include <QtDeclarative/qdeclarativecomponent.h>
45 #include <QtDeclarative/qdeclarativecontext.h>
46 #include <QtQuick/qquickview.h>
47 #include <QtGui/private/qinputmethod_p.h>
48 #include <QtQuick/private/qquickrectangle_p.h>
49 #include <QtQuick/private/qquicktextinput_p.h>
50 #include <private/qquickitem_p.h>
51 #include "../../shared/util.h"
52 #include "../shared/visualtestutil.h"
53 #include "../../shared/platforminputcontext.h"
55 using namespace QQuickVisualTestUtil;
57 class tst_QQuickItem : public QDeclarativeDataTest
68 void keysProcessingOrder();
71 void keyNavigation_RightToLeft();
72 void keyNavigation_skipNotVisible();
73 void keyNavigation_implicitSetting();
74 void layoutMirroring();
75 void layoutMirroringIllegalParent();
78 void mapCoordinates();
79 void mapCoordinates_data();
80 void propertyChanges();
82 void transforms_data();
84 void childrenRectBug();
85 void childrenRectBug2();
86 void childrenRectBug3();
88 void childrenProperty();
89 void resourcesProperty();
91 void transformCrash();
94 void visibleChildren();
97 QDeclarativeEngine engine;
100 class KeysTestObject : public QObject
104 Q_PROPERTY(bool processLast READ processLast NOTIFY processLastChanged)
107 KeysTestObject() : mKey(0), mModifiers(0), mForwardedKey(0), mLast(false) {}
116 bool processLast() const { return mLast; }
117 void setProcessLast(bool b) {
120 emit processLastChanged();
125 void keyPress(int key, QString text, int modifiers) {
128 mModifiers = modifiers;
130 void keyRelease(int key, QString text, int modifiers) {
133 mModifiers = modifiers;
135 void forwardedKey(int key) {
140 void processLastChanged();
152 class KeyTestItem : public QQuickItem
156 KeyTestItem(QQuickItem *parent=0) : QQuickItem(parent), mKey(0) {}
159 void keyPressEvent(QKeyEvent *e) {
162 if (e->key() == Qt::Key_A)
168 void keyReleaseEvent(QKeyEvent *e) {
169 if (e->key() == Qt::Key_B)
179 QML_DECLARE_TYPE(KeyTestItem);
182 tst_QQuickItem::tst_QQuickItem()
186 void tst_QQuickItem::initTestCase()
188 QDeclarativeDataTest::initTestCase();
189 qmlRegisterType<KeyTestItem>("Test",1,0,"KeyTestItem");
192 void tst_QQuickItem::cleanup()
194 QInputMethodPrivate *inputMethodPrivate = QInputMethodPrivate::get(qApp->inputMethod());
195 inputMethodPrivate->testContext = 0;
198 void tst_QQuickItem::keys()
200 QQuickView *canvas = new QQuickView(0);
201 canvas->setBaseSize(QSize(240,320));
203 KeysTestObject *testObject = new KeysTestObject;
204 canvas->rootContext()->setContextProperty("keysTestObject", testObject);
206 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
207 canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(true));
209 canvas->setSource(testFileUrl("keystest.qml"));
211 canvas->requestActivateWindow();
212 QTest::qWaitForWindowShown(canvas);
213 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
215 QVERIFY(canvas->rootObject());
216 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
218 QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
219 QGuiApplication::sendEvent(canvas, &key);
220 QCOMPARE(testObject->mKey, int(Qt::Key_A));
221 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A));
222 QCOMPARE(testObject->mText, QLatin1String("A"));
223 QVERIFY(testObject->mModifiers == Qt::NoModifier);
224 QVERIFY(!key.isAccepted());
228 key = QKeyEvent(QEvent::KeyRelease, Qt::Key_A, Qt::ShiftModifier, "A", false, 1);
229 QGuiApplication::sendEvent(canvas, &key);
230 QCOMPARE(testObject->mKey, int(Qt::Key_A));
231 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A));
232 QCOMPARE(testObject->mText, QLatin1String("A"));
233 QVERIFY(testObject->mModifiers == Qt::ShiftModifier);
234 QVERIFY(key.isAccepted());
238 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
239 QGuiApplication::sendEvent(canvas, &key);
240 QCOMPARE(testObject->mKey, int(Qt::Key_Return));
241 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Return));
242 QCOMPARE(testObject->mText, QLatin1String("Return"));
243 QVERIFY(testObject->mModifiers == Qt::NoModifier);
244 QVERIFY(key.isAccepted());
248 key = QKeyEvent(QEvent::KeyPress, Qt::Key_0, Qt::NoModifier, "0", false, 1);
249 QGuiApplication::sendEvent(canvas, &key);
250 QCOMPARE(testObject->mKey, int(Qt::Key_0));
251 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_0));
252 QCOMPARE(testObject->mText, QLatin1String("0"));
253 QVERIFY(testObject->mModifiers == Qt::NoModifier);
254 QVERIFY(key.isAccepted());
258 key = QKeyEvent(QEvent::KeyPress, Qt::Key_9, Qt::NoModifier, "9", false, 1);
259 QGuiApplication::sendEvent(canvas, &key);
260 QCOMPARE(testObject->mKey, int(Qt::Key_9));
261 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_9));
262 QCOMPARE(testObject->mText, QLatin1String("9"));
263 QVERIFY(testObject->mModifiers == Qt::NoModifier);
264 QVERIFY(!key.isAccepted());
268 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
269 QGuiApplication::sendEvent(canvas, &key);
270 QCOMPARE(testObject->mKey, int(Qt::Key_Tab));
271 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Tab));
272 QCOMPARE(testObject->mText, QLatin1String("Tab"));
273 QVERIFY(testObject->mModifiers == Qt::NoModifier);
274 QVERIFY(key.isAccepted());
278 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
279 QGuiApplication::sendEvent(canvas, &key);
280 QCOMPARE(testObject->mKey, int(Qt::Key_Backtab));
281 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Backtab));
282 QCOMPARE(testObject->mText, QLatin1String("Backtab"));
283 QVERIFY(testObject->mModifiers == Qt::NoModifier);
284 QVERIFY(key.isAccepted());
288 canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(false));
289 key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
290 QGuiApplication::sendEvent(canvas, &key);
291 QCOMPARE(testObject->mKey, int(Qt::Key_A));
292 QCOMPARE(testObject->mForwardedKey, 0);
293 QCOMPARE(testObject->mText, QLatin1String("A"));
294 QVERIFY(testObject->mModifiers == Qt::NoModifier);
295 QVERIFY(!key.isAccepted());
299 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(false));
300 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), false);
302 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
303 QGuiApplication::sendEvent(canvas, &key);
304 QCOMPARE(testObject->mKey, 0);
305 QVERIFY(!key.isAccepted());
307 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
308 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
310 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
311 QGuiApplication::sendEvent(canvas, &key);
312 QCOMPARE(testObject->mKey, int(Qt::Key_Return));
313 QVERIFY(key.isAccepted());
319 void tst_QQuickItem::keysProcessingOrder()
321 QQuickView *canvas = new QQuickView(0);
322 canvas->setBaseSize(QSize(240,320));
324 KeysTestObject *testObject = new KeysTestObject;
325 canvas->rootContext()->setContextProperty("keysTestObject", testObject);
327 canvas->setSource(testFileUrl("keyspriority.qml"));
329 canvas->requestActivateWindow();
330 QTest::qWaitForWindowShown(canvas);
331 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
333 KeyTestItem *testItem = qobject_cast<KeyTestItem*>(canvas->rootObject());
336 QCOMPARE(testItem->property("priorityTest").toInt(), 0);
338 QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
339 QGuiApplication::sendEvent(canvas, &key);
340 QCOMPARE(testObject->mKey, int(Qt::Key_A));
341 QCOMPARE(testObject->mText, QLatin1String("A"));
342 QVERIFY(testObject->mModifiers == Qt::NoModifier);
343 QVERIFY(key.isAccepted());
347 testObject->setProcessLast(true);
349 QCOMPARE(testItem->property("priorityTest").toInt(), 1);
351 key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
352 QGuiApplication::sendEvent(canvas, &key);
353 QCOMPARE(testObject->mKey, 0);
354 QVERIFY(key.isAccepted());
358 key = QKeyEvent(QEvent::KeyPress, Qt::Key_B, Qt::NoModifier, "B", false, 1);
359 QGuiApplication::sendEvent(canvas, &key);
360 QCOMPARE(testObject->mKey, int(Qt::Key_B));
361 QCOMPARE(testObject->mText, QLatin1String("B"));
362 QVERIFY(testObject->mModifiers == Qt::NoModifier);
363 QVERIFY(!key.isAccepted());
367 key = QKeyEvent(QEvent::KeyRelease, Qt::Key_B, Qt::NoModifier, "B", false, 1);
368 QGuiApplication::sendEvent(canvas, &key);
369 QCOMPARE(testObject->mKey, 0);
370 QVERIFY(key.isAccepted());
376 void tst_QQuickItem::keysim()
378 PlatformInputContext platformInputContext;
379 QInputMethodPrivate *inputMethodPrivate = QInputMethodPrivate::get(qApp->inputMethod());
380 inputMethodPrivate->testContext = &platformInputContext;
382 QQuickView *canvas = new QQuickView(0);
383 canvas->setBaseSize(QSize(240,320));
385 canvas->setSource(testFileUrl("keysim.qml"));
387 canvas->requestActivateWindow();
388 QTest::qWaitForWindowShown(canvas);
389 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
391 QVERIFY(canvas->rootObject());
392 QVERIFY(canvas->rootObject()->hasFocus() && canvas->rootObject()->hasActiveFocus());
394 QQuickTextInput *input = canvas->rootObject()->findChild<QQuickTextInput*>();
397 QInputMethodEvent ev("Hello world!", QList<QInputMethodEvent::Attribute>());
398 QGuiApplication::sendEvent(qGuiApp->focusObject(), &ev);
400 QEXPECT_FAIL("", "QTBUG-24280", Continue);
401 QCOMPARE(input->text(), QLatin1String("Hello world!"));
406 QQuickItemPrivate *childPrivate(QQuickItem *rootItem, const char * itemString)
408 QQuickItem *item = findItem<QQuickItem>(rootItem, QString(QLatin1String(itemString)));
409 QQuickItemPrivate* itemPrivate = QQuickItemPrivate::get(item);
413 QVariant childProperty(QQuickItem *rootItem, const char * itemString, const char * property)
415 QQuickItem *item = findItem<QQuickItem>(rootItem, QString(QLatin1String(itemString)));
416 return item->property(property);
419 bool anchorsMirrored(QQuickItem *rootItem, const char * itemString)
421 QQuickItem *item = findItem<QQuickItem>(rootItem, QString(QLatin1String(itemString)));
422 QQuickItemPrivate* itemPrivate = QQuickItemPrivate::get(item);
423 return itemPrivate->anchors()->mirrored();
426 void tst_QQuickItem::layoutMirroring()
428 QQuickView *canvas = new QQuickView(0);
429 canvas->setSource(testFileUrl("layoutmirroring.qml"));
432 QQuickItem *rootItem = qobject_cast<QQuickItem*>(canvas->rootObject());
434 QQuickItemPrivate *rootPrivate = QQuickItemPrivate::get(rootItem);
435 QVERIFY(rootPrivate);
437 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
438 QCOMPARE(childPrivate(rootItem, "mirrored2")->effectiveLayoutMirror, true);
439 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
440 QCOMPARE(childPrivate(rootItem, "notMirrored2")->effectiveLayoutMirror, false);
441 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true);
442 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true);
444 QCOMPARE(anchorsMirrored(rootItem, "mirrored1"), true);
445 QCOMPARE(anchorsMirrored(rootItem, "mirrored2"), true);
446 QCOMPARE(anchorsMirrored(rootItem, "notMirrored1"), false);
447 QCOMPARE(anchorsMirrored(rootItem, "notMirrored2"), false);
448 QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror1"), true);
449 QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror2"), true);
451 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true);
452 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritedLayoutMirror, false);
453 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true);
454 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritedLayoutMirror, false);
455 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true);
456 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true);
458 QCOMPARE(childPrivate(rootItem, "mirrored1")->isMirrorImplicit, false);
459 QCOMPARE(childPrivate(rootItem, "mirrored2")->isMirrorImplicit, false);
460 QCOMPARE(childPrivate(rootItem, "notMirrored1")->isMirrorImplicit, false);
461 QCOMPARE(childPrivate(rootItem, "notMirrored2")->isMirrorImplicit, true);
462 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->isMirrorImplicit, true);
463 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->isMirrorImplicit, true);
465 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromParent, true);
466 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromParent, false);
467 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromParent, true);
468 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromParent, false);
469 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromParent, true);
470 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromParent, true);
472 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromItem, true);
473 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromItem, false);
474 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromItem, false);
475 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromItem, false);
476 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromItem, false);
477 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromItem, false);
479 // load dynamic content using Loader that needs to inherit mirroring
480 rootItem->setProperty("state", "newContent");
481 QCOMPARE(childPrivate(rootItem, "notMirrored3")->effectiveLayoutMirror, false);
482 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->effectiveLayoutMirror, true);
484 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritedLayoutMirror, true);
485 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritedLayoutMirror, true);
487 QCOMPARE(childPrivate(rootItem, "notMirrored3")->isMirrorImplicit, false);
488 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->isMirrorImplicit, true);
490 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromParent, true);
491 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritMirrorFromParent, true);
493 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false);
494 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false);
496 // disable inheritance
497 rootItem->setProperty("childrenInherit", false);
499 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, false);
500 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, false);
501 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
502 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
504 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, false);
505 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, false);
506 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, false);
507 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, false);
509 // re-enable inheritance
510 rootItem->setProperty("childrenInherit", true);
512 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true);
513 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true);
514 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
515 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
517 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true);
518 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true);
519 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true);
520 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true);
525 QQuickItem *parentItem1 = new QQuickItem();
526 QQuickItemPrivate::get(parentItem1)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
527 QQuickItemPrivate::get(parentItem1)->isMirrorImplicit = false;
528 QQuickItemPrivate::get(parentItem1)->inheritMirrorFromItem = true; // LayoutMirroring.childrenInherit: true
529 QQuickItemPrivate::get(parentItem1)->resolveLayoutMirror();
531 // inherit in constructor
532 QQuickItem *childItem1 = new QQuickItem(parentItem1);
533 QCOMPARE(QQuickItemPrivate::get(childItem1)->effectiveLayoutMirror, true);
534 QCOMPARE(QQuickItemPrivate::get(childItem1)->inheritMirrorFromParent, true);
536 // inherit through a parent change
537 QQuickItem *childItem2 = new QQuickItem();
538 QCOMPARE(QQuickItemPrivate::get(childItem2)->effectiveLayoutMirror, false);
539 QCOMPARE(QQuickItemPrivate::get(childItem2)->inheritMirrorFromParent, false);
540 childItem2->setParentItem(parentItem1);
541 QCOMPARE(QQuickItemPrivate::get(childItem2)->effectiveLayoutMirror, true);
542 QCOMPARE(QQuickItemPrivate::get(childItem2)->inheritMirrorFromParent, true);
544 // stop inherting through a parent change
545 QQuickItem *parentItem2 = new QQuickItem();
546 QQuickItemPrivate::get(parentItem2)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
547 QQuickItemPrivate::get(parentItem2)->resolveLayoutMirror();
548 childItem2->setParentItem(parentItem2);
549 QCOMPARE(QQuickItemPrivate::get(childItem2)->effectiveLayoutMirror, false);
550 QCOMPARE(QQuickItemPrivate::get(childItem2)->inheritMirrorFromParent, false);
556 void tst_QQuickItem::layoutMirroringIllegalParent()
558 QDeclarativeComponent component(&engine);
559 component.setData("import QtQuick 2.0; QtObject { LayoutMirroring.enabled: true; LayoutMirroring.childrenInherit: true }", QUrl::fromLocalFile(""));
560 QTest::ignoreMessage(QtWarningMsg, "file::1:21: QML QtObject: LayoutDirection attached property only works with Items");
561 QObject *object = component.create();
562 QVERIFY(object != 0);
565 void tst_QQuickItem::keyNavigation()
567 QQuickView *canvas = new QQuickView(0);
568 canvas->setBaseSize(QSize(240,320));
570 canvas->setSource(testFileUrl("keynavigationtest.qml"));
572 canvas->requestActivateWindow();
573 QTest::qWaitForWindowShown(canvas);
574 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
576 QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item1");
578 QVERIFY(item->hasActiveFocus());
581 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
582 Q_RETURN_ARG(QVariant, result)));
583 QVERIFY(result.toBool());
586 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
587 QGuiApplication::sendEvent(canvas, &key);
588 QVERIFY(key.isAccepted());
590 item = findItem<QQuickItem>(canvas->rootObject(), "item2");
592 QVERIFY(item->hasActiveFocus());
595 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
596 QGuiApplication::sendEvent(canvas, &key);
597 QVERIFY(key.isAccepted());
599 item = findItem<QQuickItem>(canvas->rootObject(), "item4");
601 QVERIFY(item->hasActiveFocus());
604 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
605 QGuiApplication::sendEvent(canvas, &key);
606 QVERIFY(key.isAccepted());
608 item = findItem<QQuickItem>(canvas->rootObject(), "item3");
610 QVERIFY(item->hasActiveFocus());
613 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
614 QGuiApplication::sendEvent(canvas, &key);
615 QVERIFY(key.isAccepted());
617 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
619 QVERIFY(item->hasActiveFocus());
622 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
623 QGuiApplication::sendEvent(canvas, &key);
624 QVERIFY(key.isAccepted());
626 item = findItem<QQuickItem>(canvas->rootObject(), "item2");
628 QVERIFY(item->hasActiveFocus());
631 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
632 QGuiApplication::sendEvent(canvas, &key);
633 QVERIFY(key.isAccepted());
635 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
637 QVERIFY(item->hasActiveFocus());
642 void tst_QQuickItem::keyNavigation_RightToLeft()
644 QQuickView *canvas = new QQuickView(0);
645 canvas->setBaseSize(QSize(240,320));
647 canvas->setSource(testFileUrl("keynavigationtest.qml"));
649 canvas->requestActivateWindow();
650 QTest::qWaitForWindowShown(canvas);
651 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
653 QQuickItem *rootItem = qobject_cast<QQuickItem*>(canvas->rootObject());
655 QQuickItemPrivate* rootItemPrivate = QQuickItemPrivate::get(rootItem);
657 rootItemPrivate->effectiveLayoutMirror = true; // LayoutMirroring.mirror: true
658 rootItemPrivate->isMirrorImplicit = false;
659 rootItemPrivate->inheritMirrorFromItem = true; // LayoutMirroring.inherit: true
660 rootItemPrivate->resolveLayoutMirror();
662 QEvent wa(QEvent::WindowActivate);
663 QGuiApplication::sendEvent(canvas, &wa);
664 QFocusEvent fe(QEvent::FocusIn);
665 QGuiApplication::sendEvent(canvas, &fe);
667 QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item1");
669 QVERIFY(item->hasActiveFocus());
672 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
673 Q_RETURN_ARG(QVariant, result)));
674 QVERIFY(result.toBool());
677 QKeyEvent key(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
678 QGuiApplication::sendEvent(canvas, &key);
679 QVERIFY(key.isAccepted());
681 item = findItem<QQuickItem>(canvas->rootObject(), "item2");
683 QVERIFY(item->hasActiveFocus());
686 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
687 QGuiApplication::sendEvent(canvas, &key);
688 QVERIFY(key.isAccepted());
690 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
692 QVERIFY(item->hasActiveFocus());
697 void tst_QQuickItem::keyNavigation_skipNotVisible()
699 QQuickView *canvas = new QQuickView(0);
700 canvas->setBaseSize(QSize(240,320));
702 canvas->setSource(testFileUrl("keynavigationtest.qml"));
704 canvas->requestActivateWindow();
705 QTest::qWaitForWindowShown(canvas);
706 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
708 QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item1");
710 QVERIFY(item->hasActiveFocus());
712 // Set item 2 to not visible
713 item = findItem<QQuickItem>(canvas->rootObject(), "item2");
715 item->setVisible(false);
716 QVERIFY(!item->isVisible());
719 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
720 QGuiApplication::sendEvent(canvas, &key);
721 QVERIFY(key.isAccepted());
723 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
725 QVERIFY(item->hasActiveFocus());
728 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
729 QGuiApplication::sendEvent(canvas, &key);
730 QVERIFY(key.isAccepted());
732 item = findItem<QQuickItem>(canvas->rootObject(), "item3");
734 QVERIFY(item->hasActiveFocus());
737 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
738 QGuiApplication::sendEvent(canvas, &key);
739 QVERIFY(key.isAccepted());
741 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
743 QVERIFY(item->hasActiveFocus());
745 //Set item 3 to not visible
746 item = findItem<QQuickItem>(canvas->rootObject(), "item3");
748 item->setVisible(false);
749 QVERIFY(!item->isVisible());
752 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
753 QGuiApplication::sendEvent(canvas, &key);
754 QVERIFY(key.isAccepted());
756 item = findItem<QQuickItem>(canvas->rootObject(), "item4");
758 QVERIFY(item->hasActiveFocus());
761 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
762 QGuiApplication::sendEvent(canvas, &key);
763 QVERIFY(key.isAccepted());
765 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
767 QVERIFY(item->hasActiveFocus());
772 void tst_QQuickItem::keyNavigation_implicitSetting()
774 QQuickView *canvas = new QQuickView(0);
775 canvas->setBaseSize(QSize(240,320));
777 canvas->setSource(testFileUrl("keynavigationtest_implicit.qml"));
779 canvas->requestActivateWindow();
780 QTest::qWaitForWindowShown(canvas);
781 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
783 QEvent wa(QEvent::WindowActivate);
784 QGuiApplication::sendEvent(canvas, &wa);
785 QFocusEvent fe(QEvent::FocusIn);
786 QGuiApplication::sendEvent(canvas, &fe);
788 QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item1");
790 QVERIFY(item->hasActiveFocus());
793 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
794 Q_RETURN_ARG(QVariant, result)));
795 QVERIFY(result.toBool());
798 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
799 QGuiApplication::sendEvent(canvas, &key);
800 QVERIFY(key.isAccepted());
802 item = findItem<QQuickItem>(canvas->rootObject(), "item2");
804 QVERIFY(item->hasActiveFocus());
807 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
808 QGuiApplication::sendEvent(canvas, &key);
809 QVERIFY(key.isAccepted());
811 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
813 QVERIFY(item->hasActiveFocus());
816 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
817 QGuiApplication::sendEvent(canvas, &key);
818 QVERIFY(key.isAccepted());
820 item = findItem<QQuickItem>(canvas->rootObject(), "item3");
822 QVERIFY(item->hasActiveFocus());
825 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
826 QGuiApplication::sendEvent(canvas, &key);
827 QVERIFY(key.isAccepted());
829 item = findItem<QQuickItem>(canvas->rootObject(), "item4");
831 QVERIFY(item->hasActiveFocus());
834 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
835 QGuiApplication::sendEvent(canvas, &key);
836 QVERIFY(key.isAccepted());
838 item = findItem<QQuickItem>(canvas->rootObject(), "item3");
840 QVERIFY(item->hasActiveFocus());
843 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
844 QGuiApplication::sendEvent(canvas, &key);
845 QVERIFY(key.isAccepted());
847 item = findItem<QQuickItem>(canvas->rootObject(), "item4");
849 QVERIFY(item->hasActiveFocus());
852 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
853 QGuiApplication::sendEvent(canvas, &key);
854 QVERIFY(key.isAccepted());
856 item = findItem<QQuickItem>(canvas->rootObject(), "item2");
858 QVERIFY(item->hasActiveFocus());
861 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
862 QGuiApplication::sendEvent(canvas, &key);
863 QVERIFY(key.isAccepted());
865 item = findItem<QQuickItem>(canvas->rootObject(), "item4");
867 QVERIFY(item->hasActiveFocus());
870 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
871 QGuiApplication::sendEvent(canvas, &key);
872 QVERIFY(key.isAccepted());
874 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
876 QVERIFY(item->hasActiveFocus());
879 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
880 QGuiApplication::sendEvent(canvas, &key);
881 QVERIFY(key.isAccepted());
883 item = findItem<QQuickItem>(canvas->rootObject(), "item4");
885 QVERIFY(item->hasActiveFocus());
888 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
889 QGuiApplication::sendEvent(canvas, &key);
890 QVERIFY(key.isAccepted());
892 item = findItem<QQuickItem>(canvas->rootObject(), "item3");
894 QVERIFY(item->hasActiveFocus());
899 void tst_QQuickItem::smooth()
901 QDeclarativeComponent component(&engine);
902 component.setData("import QtQuick 2.0; Item { smooth: false; }", QUrl::fromLocalFile(""));
903 QQuickItem *item = qobject_cast<QQuickItem*>(component.create());
904 QSignalSpy spy(item, SIGNAL(smoothChanged(bool)));
907 QVERIFY(!item->smooth());
909 item->setSmooth(true);
910 QVERIFY(item->smooth());
911 QCOMPARE(spy.count(),1);
912 QList<QVariant> arguments = spy.first();
913 QVERIFY(arguments.count() == 1);
914 QVERIFY(arguments.at(0).toBool() == true);
916 item->setSmooth(true);
917 QCOMPARE(spy.count(),1);
919 item->setSmooth(false);
920 QVERIFY(!item->smooth());
921 QCOMPARE(spy.count(),2);
922 item->setSmooth(false);
923 QCOMPARE(spy.count(),2);
928 void tst_QQuickItem::clip()
930 QDeclarativeComponent component(&engine);
931 component.setData("import QtQuick 2.0\nItem { clip: false\n }", QUrl::fromLocalFile(""));
932 QQuickItem *item = qobject_cast<QQuickItem*>(component.create());
933 QSignalSpy spy(item, SIGNAL(clipChanged(bool)));
936 QVERIFY(!item->clip());
939 QVERIFY(item->clip());
941 QList<QVariant> arguments = spy.first();
942 QVERIFY(arguments.count() == 1);
943 QVERIFY(arguments.at(0).toBool() == true);
945 QCOMPARE(spy.count(),1);
947 QCOMPARE(spy.count(),1);
949 item->setClip(false);
950 QVERIFY(!item->clip());
951 QCOMPARE(spy.count(),2);
952 item->setClip(false);
953 QCOMPARE(spy.count(),2);
958 void tst_QQuickItem::mapCoordinates()
963 QQuickView *canvas = new QQuickView(0);
964 canvas->setBaseSize(QSize(300, 300));
965 canvas->setSource(testFileUrl("mapCoordinates.qml"));
967 qApp->processEvents();
969 QQuickItem *root = qobject_cast<QQuickItem*>(canvas->rootObject());
971 QQuickItem *a = findItem<QQuickItem>(canvas->rootObject(), "itemA");
973 QQuickItem *b = findItem<QQuickItem>(canvas->rootObject(), "itemB");
978 QVERIFY(QMetaObject::invokeMethod(root, "mapAToB",
979 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
980 QCOMPARE(result.value<QPointF>(), qobject_cast<QQuickItem*>(a)->mapToItem(b, QPointF(x, y)));
982 QVERIFY(QMetaObject::invokeMethod(root, "mapAFromB",
983 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
984 QCOMPARE(result.value<QPointF>(), qobject_cast<QQuickItem*>(a)->mapFromItem(b, QPointF(x, y)));
986 QVERIFY(QMetaObject::invokeMethod(root, "mapAToNull",
987 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
988 QCOMPARE(result.value<QPointF>(), qobject_cast<QQuickItem*>(a)->mapToScene(QPointF(x, y)));
990 QVERIFY(QMetaObject::invokeMethod(root, "mapAFromNull",
991 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
992 QCOMPARE(result.value<QPointF>(), qobject_cast<QQuickItem*>(a)->mapFromScene(QPointF(x, y)));
994 QString warning1 = testFileUrl("mapCoordinates.qml").toString() + ":48:5: QML Item: mapToItem() given argument \"1122\" which is neither null nor an Item";
995 QString warning2 = testFileUrl("mapCoordinates.qml").toString() + ":48:5: QML Item: mapFromItem() given argument \"1122\" which is neither null nor an Item";
997 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
998 QVERIFY(QMetaObject::invokeMethod(root, "checkMapAToInvalid",
999 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
1000 QVERIFY(result.toBool());
1002 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
1003 QVERIFY(QMetaObject::invokeMethod(root, "checkMapAFromInvalid",
1004 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
1005 QVERIFY(result.toBool());
1010 void tst_QQuickItem::mapCoordinates_data()
1012 QTest::addColumn<int>("x");
1013 QTest::addColumn<int>("y");
1015 for (int i=-20; i<=20; i+=10)
1016 QTest::newRow(QTest::toString(i)) << i << i;
1019 void tst_QQuickItem::transforms_data()
1021 QTest::addColumn<QByteArray>("qml");
1022 QTest::addColumn<QTransform>("transform");
1023 QTest::newRow("translate") << QByteArray("Translate { x: 10; y: 20 }")
1024 << QTransform(1,0,0,0,1,0,10,20,1);
1025 QTest::newRow("rotation") << QByteArray("Rotation { angle: 90 }")
1026 << QTransform(0,1,0,-1,0,0,0,0,1);
1027 QTest::newRow("scale") << QByteArray("Scale { xScale: 1.5; yScale: -2 }")
1028 << QTransform(1.5,0,0,0,-2,0,0,0,1);
1029 QTest::newRow("sequence") << QByteArray("[ Translate { x: 10; y: 20 }, Scale { xScale: 1.5; yScale: -2 } ]")
1030 << QTransform(1,0,0,0,1,0,10,20,1) * QTransform(1.5,0,0,0,-2,0,0,0,1);
1033 void tst_QQuickItem::transforms()
1035 QFETCH(QByteArray, qml);
1036 QFETCH(QTransform, transform);
1037 QDeclarativeComponent component(&engine);
1038 component.setData("import QtQuick 2.0\nItem { transform: "+qml+"}", QUrl::fromLocalFile(""));
1039 QQuickItem *item = qobject_cast<QQuickItem*>(component.create());
1041 QCOMPARE(item->itemTransform(0,0), transform);
1044 void tst_QQuickItem::childrenProperty()
1046 QDeclarativeComponent component(&engine, testFileUrl("childrenProperty.qml"));
1048 QObject *o = component.create();
1051 QCOMPARE(o->property("test1").toBool(), true);
1052 QCOMPARE(o->property("test2").toBool(), true);
1053 QCOMPARE(o->property("test3").toBool(), true);
1054 QCOMPARE(o->property("test4").toBool(), true);
1055 QCOMPARE(o->property("test5").toBool(), true);
1059 void tst_QQuickItem::resourcesProperty()
1061 QDeclarativeComponent component(&engine, testFileUrl("resourcesProperty.qml"));
1063 QObject *o = component.create();
1066 QCOMPARE(o->property("test1").toBool(), true);
1067 QCOMPARE(o->property("test2").toBool(), true);
1068 QCOMPARE(o->property("test3").toBool(), true);
1069 QCOMPARE(o->property("test4").toBool(), true);
1070 QCOMPARE(o->property("test5").toBool(), true);
1074 void tst_QQuickItem::propertyChanges()
1076 QQuickView *canvas = new QQuickView(0);
1077 canvas->setBaseSize(QSize(300, 300));
1078 canvas->setSource(testFileUrl("propertychanges.qml"));
1080 canvas->requestActivateWindow();
1081 QTest::qWaitForWindowShown(canvas);
1082 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
1084 QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item");
1085 QQuickItem *parentItem = findItem<QQuickItem>(canvas->rootObject(), "parentItem");
1088 QVERIFY(parentItem);
1090 QSignalSpy parentSpy(item, SIGNAL(parentChanged(QQuickItem *)));
1091 QSignalSpy widthSpy(item, SIGNAL(widthChanged()));
1092 QSignalSpy heightSpy(item, SIGNAL(heightChanged()));
1093 QSignalSpy baselineOffsetSpy(item, SIGNAL(baselineOffsetChanged(qreal)));
1094 QSignalSpy childrenRectSpy(parentItem, SIGNAL(childrenRectChanged(QRectF)));
1095 QSignalSpy focusSpy(item, SIGNAL(focusChanged(bool)));
1096 QSignalSpy wantsFocusSpy(parentItem, SIGNAL(activeFocusChanged(bool)));
1097 QSignalSpy childrenChangedSpy(parentItem, SIGNAL(childrenChanged()));
1098 QSignalSpy xSpy(item, SIGNAL(xChanged()));
1099 QSignalSpy ySpy(item, SIGNAL(yChanged()));
1101 item->setParentItem(parentItem);
1102 item->setWidth(100.0);
1103 item->setHeight(200.0);
1104 item->setFocus(true);
1105 item->setBaselineOffset(10.0);
1107 QCOMPARE(item->parentItem(), parentItem);
1108 QCOMPARE(parentSpy.count(),1);
1109 QList<QVariant> parentArguments = parentSpy.first();
1110 QVERIFY(parentArguments.count() == 1);
1111 QCOMPARE(item->parentItem(), qvariant_cast<QQuickItem *>(parentArguments.at(0)));
1112 QCOMPARE(childrenChangedSpy.count(),1);
1114 item->setParentItem(parentItem);
1115 QCOMPARE(childrenChangedSpy.count(),1);
1117 QCOMPARE(item->width(), 100.0);
1118 QCOMPARE(widthSpy.count(),1);
1120 QCOMPARE(item->height(), 200.0);
1121 QCOMPARE(heightSpy.count(),1);
1123 QCOMPARE(item->baselineOffset(), 10.0);
1124 QCOMPARE(baselineOffsetSpy.count(),1);
1125 QList<QVariant> baselineOffsetArguments = baselineOffsetSpy.first();
1126 QVERIFY(baselineOffsetArguments.count() == 1);
1127 QCOMPARE(item->baselineOffset(), baselineOffsetArguments.at(0).toReal());
1129 QCOMPARE(parentItem->childrenRect(), QRectF(0.0,0.0,100.0,200.0));
1130 QCOMPARE(childrenRectSpy.count(),1);
1131 QList<QVariant> childrenRectArguments = childrenRectSpy.at(0);
1132 QVERIFY(childrenRectArguments.count() == 1);
1133 QCOMPARE(parentItem->childrenRect(), childrenRectArguments.at(0).toRectF());
1135 QCOMPARE(item->hasActiveFocus(), true);
1136 QCOMPARE(focusSpy.count(),1);
1137 QList<QVariant> focusArguments = focusSpy.first();
1138 QVERIFY(focusArguments.count() == 1);
1139 QCOMPARE(focusArguments.at(0).toBool(), true);
1141 QCOMPARE(parentItem->hasActiveFocus(), false);
1142 QCOMPARE(parentItem->hasFocus(), false);
1143 QCOMPARE(wantsFocusSpy.count(),0);
1146 QCOMPARE(item->x(), 10.0);
1147 QCOMPARE(xSpy.count(), 1);
1150 QCOMPARE(item->y(), 10.0);
1151 QCOMPARE(ySpy.count(), 1);
1156 void tst_QQuickItem::childrenRect()
1158 QQuickView *canvas = new QQuickView(0);
1159 canvas->setSource(testFileUrl("childrenRect.qml"));
1160 canvas->setBaseSize(QSize(240,320));
1163 QQuickItem *o = canvas->rootObject();
1164 QQuickItem *item = o->findChild<QQuickItem*>("testItem");
1165 QCOMPARE(item->width(), qreal(0));
1166 QCOMPARE(item->height(), qreal(0));
1168 o->setProperty("childCount", 1);
1169 QCOMPARE(item->width(), qreal(10));
1170 QCOMPARE(item->height(), qreal(20));
1172 o->setProperty("childCount", 5);
1173 QCOMPARE(item->width(), qreal(50));
1174 QCOMPARE(item->height(), qreal(100));
1176 o->setProperty("childCount", 0);
1177 QCOMPARE(item->width(), qreal(0));
1178 QCOMPARE(item->height(), qreal(0));
1185 void tst_QQuickItem::childrenRectBug()
1187 QQuickView *canvas = new QQuickView(0);
1189 QString warning = testFileUrl("childrenRectBug.qml").toString() + ":7:5: QML Item: Binding loop detected for property \"height\"";
1190 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
1191 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
1193 canvas->setSource(testFileUrl("childrenRectBug.qml"));
1196 QQuickItem *o = canvas->rootObject();
1197 QQuickItem *item = o->findChild<QQuickItem*>("theItem");
1198 QCOMPARE(item->width(), qreal(200));
1199 QCOMPARE(item->height(), qreal(100));
1200 QCOMPARE(item->x(), qreal(100));
1206 void tst_QQuickItem::childrenRectBug2()
1208 QQuickView *canvas = new QQuickView(0);
1210 QString warning1 = testFileUrl("childrenRectBug2.qml").toString() + ":7:5: QML Item: Binding loop detected for property \"width\"";
1211 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
1212 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
1214 QString warning2 = testFileUrl("childrenRectBug2.qml").toString() + ":7:5: QML Item: Binding loop detected for property \"height\"";
1215 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
1216 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
1217 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
1218 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
1220 canvas->setSource(testFileUrl("childrenRectBug2.qml"));
1223 QQuickRectangle *rect = qobject_cast<QQuickRectangle*>(canvas->rootObject());
1225 QQuickItem *item = rect->findChild<QQuickItem*>("theItem");
1226 QCOMPARE(item->width(), qreal(100));
1227 QCOMPARE(item->height(), qreal(110));
1228 QCOMPARE(item->x(), qreal(130));
1230 QQuickItemPrivate *rectPrivate = QQuickItemPrivate::get(rect);
1231 rectPrivate->setState("row");
1232 QCOMPARE(item->width(), qreal(210));
1233 QCOMPARE(item->height(), qreal(50));
1234 QCOMPARE(item->x(), qreal(75));
1240 void tst_QQuickItem::childrenRectBug3()
1242 QQuickView *canvas = new QQuickView(0);
1243 canvas->setSource(testFileUrl("childrenRectBug3.qml"));
1246 //don't crash on delete
1251 void tst_QQuickItem::transformCrash()
1253 QQuickView *canvas = new QQuickView(0);
1254 canvas->setSource(testFileUrl("transformCrash.qml"));
1260 void tst_QQuickItem::implicitSize()
1262 QQuickView *canvas = new QQuickView(0);
1263 canvas->setSource(testFileUrl("implicitsize.qml"));
1266 QQuickItem *item = qobject_cast<QQuickItem*>(canvas->rootObject());
1268 QCOMPARE(item->width(), qreal(80));
1269 QCOMPARE(item->height(), qreal(60));
1271 QCOMPARE(item->implicitWidth(), qreal(200));
1272 QCOMPARE(item->implicitHeight(), qreal(100));
1274 QMetaObject::invokeMethod(item, "resetSize");
1276 QCOMPARE(item->width(), qreal(200));
1277 QCOMPARE(item->height(), qreal(100));
1279 QMetaObject::invokeMethod(item, "changeImplicit");
1281 QCOMPARE(item->implicitWidth(), qreal(150));
1282 QCOMPARE(item->implicitHeight(), qreal(80));
1283 QCOMPARE(item->width(), qreal(150));
1284 QCOMPARE(item->height(), qreal(80));
1289 void tst_QQuickItem::qtbug_16871()
1291 QDeclarativeComponent component(&engine, testFileUrl("qtbug_16871.qml"));
1292 QObject *o = component.create();
1298 void tst_QQuickItem::visibleChildren()
1300 QQuickView *canvas = new QQuickView(0);
1301 canvas->setSource(testFileUrl("visiblechildren.qml"));
1304 QQuickItem *root = qobject_cast<QQuickItem*>(canvas->rootObject());
1307 QCOMPARE(root->property("test1_1").toBool(), true);
1308 QCOMPARE(root->property("test1_2").toBool(), true);
1309 QCOMPARE(root->property("test1_3").toBool(), true);
1310 QCOMPARE(root->property("test1_4").toBool(), true);
1312 QMetaObject::invokeMethod(root, "hideFirstAndLastRowChild");
1313 QCOMPARE(root->property("test2_1").toBool(), true);
1314 QCOMPARE(root->property("test2_2").toBool(), true);
1315 QCOMPARE(root->property("test2_3").toBool(), true);
1316 QCOMPARE(root->property("test2_4").toBool(), true);
1318 QMetaObject::invokeMethod(root, "showLastRowChildsLastChild");
1319 QCOMPARE(root->property("test3_1").toBool(), true);
1320 QCOMPARE(root->property("test3_2").toBool(), true);
1321 QCOMPARE(root->property("test3_3").toBool(), true);
1322 QCOMPARE(root->property("test3_4").toBool(), true);
1324 QMetaObject::invokeMethod(root, "showLastRowChild");
1325 QCOMPARE(root->property("test4_1").toBool(), true);
1326 QCOMPARE(root->property("test4_2").toBool(), true);
1327 QCOMPARE(root->property("test4_3").toBool(), true);
1328 QCOMPARE(root->property("test4_4").toBool(), true);
1330 QString warning1 = testFileUrl("visiblechildren.qml").toString() + ":96:32: QML Item: QQuickItem: visibleChildren property is readonly and cannot be assigned to.";
1331 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
1332 QMetaObject::invokeMethod(root, "tryWriteToReadonlyVisibleChildren");
1333 QCOMPARE(root->property("test5_1").toBool(), true);
1335 QMetaObject::invokeMethod(root, "reparentVisibleItem3");
1336 QCOMPARE(root->property("test6_1").toBool(), true);
1337 QCOMPARE(root->property("test6_2").toBool(), true);
1338 QCOMPARE(root->property("test6_3").toBool(), true);
1339 QCOMPARE(root->property("test6_4").toBool(), true);
1341 QMetaObject::invokeMethod(root, "reparentImlicitlyInvisibleItem4_1");
1342 QCOMPARE(root->property("test7_1").toBool(), true);
1343 QCOMPARE(root->property("test7_2").toBool(), true);
1344 QCOMPARE(root->property("test7_3").toBool(), true);
1345 QCOMPARE(root->property("test7_4").toBool(), true);
1347 // FINALLY TEST THAT EVERYTHING IS AS EXPECTED
1348 QCOMPARE(root->property("test8_1").toBool(), true);
1349 QCOMPARE(root->property("test8_2").toBool(), true);
1350 QCOMPARE(root->property("test8_3").toBool(), true);
1351 QCOMPARE(root->property("test8_4").toBool(), true);
1352 QCOMPARE(root->property("test8_5").toBool(), true);
1357 void tst_QQuickItem::parentLoop()
1359 QQuickView *canvas = new QQuickView(0);
1361 QTest::ignoreMessage(QtWarningMsg, "QQuickItem::setParentItem: Parent is already part of this items subtree.");
1362 canvas->setSource(testFileUrl("parentLoop.qml"));
1364 QQuickItem *root = qobject_cast<QQuickItem*>(canvas->rootObject());
1367 QQuickItem *item1 = root->findChild<QQuickItem*>("item1");
1369 QCOMPARE(item1->parentItem(), root);
1371 QQuickItem *item2 = root->findChild<QQuickItem*>("item2");
1373 QCOMPARE(item2->parentItem(), item1);
1378 QTEST_MAIN(tst_QQuickItem)
1380 #include "tst_qquickitem.moc"