1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the test suite of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** 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 <QtQuick1/qdeclarativeview.h>
47 #include <QtQuick1/private/qdeclarativerectangle_p.h>
48 #include <QtQuick1/private/qdeclarativeitem_p.h>
49 #include "../../../shared/util.h"
52 // In Symbian OS test data is located in applications private dir
56 class tst_QDeclarativeItem : public QObject
61 tst_QDeclarativeItem();
66 void keysProcessingOrder();
68 void keyNavigation_RightToLeft();
69 void keyNavigation_skipNotVisible();
70 void keyNavigation_implicitSetting();
71 void layoutMirroring();
72 void layoutMirroringIllegalParent();
75 void mapCoordinates();
76 void mapCoordinates_data();
77 void propertyChanges();
79 void transforms_data();
81 void childrenRectBug();
82 void childrenRectBug2();
83 void childrenRectBug3();
85 void childrenProperty();
86 void resourcesProperty();
89 void transformCrash();
91 void testQtQuick11Attributes();
92 void testQtQuick11Attributes_data();
96 QDeclarativeEngine engine;
100 T *findItem(QGraphicsObject *parent, const QString &objectName)
105 const QMetaObject &mo = T::staticMetaObject;
106 //qDebug() << parent->QGraphicsObject::children().count() << "children";
107 for (int i = 0; i < parent->childItems().count(); ++i) {
108 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(parent->childItems().at(i));
111 //qDebug() << "try" << item;
112 if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName))
113 return static_cast<T*>(item);
114 item = findItem<T>(item, objectName);
116 return static_cast<T*>(item);
122 class KeysTestObject : public QObject
126 Q_PROPERTY(bool processLast READ processLast NOTIFY processLastChanged)
129 KeysTestObject() : mKey(0), mModifiers(0), mForwardedKey(0), mLast(false) {}
138 bool processLast() const { return mLast; }
139 void setProcessLast(bool b) {
142 emit processLastChanged();
147 void keyPress(int key, QString text, int modifiers) {
150 mModifiers = modifiers;
152 void keyRelease(int key, QString text, int modifiers) {
155 mModifiers = modifiers;
157 void forwardedKey(int key) {
162 void processLastChanged();
174 class KeyTestItem : public QDeclarativeItem
178 KeyTestItem(QDeclarativeItem *parent=0) : QDeclarativeItem(parent), mKey(0) {}
181 void keyPressEvent(QKeyEvent *e) {
182 keyPressPreHandler(e);
188 if (e->key() == Qt::Key_A)
193 if (!e->isAccepted())
194 QDeclarativeItem::keyPressEvent(e);
197 void keyReleaseEvent(QKeyEvent *e) {
198 keyReleasePreHandler(e);
203 if (e->key() == Qt::Key_B)
208 if (!e->isAccepted())
209 QDeclarativeItem::keyReleaseEvent(e);
216 QML_DECLARE_TYPE(KeyTestItem);
219 tst_QDeclarativeItem::tst_QDeclarativeItem()
223 void tst_QDeclarativeItem::initTestCase()
225 qmlRegisterType<KeyTestItem>("Test",1,0,"KeyTestItem");
228 void tst_QDeclarativeItem::keys()
230 QDeclarativeView *canvas = new QDeclarativeView(0);
231 canvas->setFixedSize(240,320);
233 KeysTestObject *testObject = new KeysTestObject;
234 canvas->rootContext()->setContextProperty("keysTestObject", testObject);
236 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
237 canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(true));
239 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keystest.qml"));
241 qApp->processEvents();
243 QEvent wa(QEvent::WindowActivate);
244 QApplication::sendEvent(canvas, &wa);
245 QFocusEvent fe(QEvent::FocusIn);
246 QApplication::sendEvent(canvas, &fe);
248 QVERIFY(canvas->rootObject());
249 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
251 QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
252 QApplication::sendEvent(canvas, &key);
253 QCOMPARE(testObject->mKey, int(Qt::Key_A));
254 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A));
255 QCOMPARE(testObject->mText, QLatin1String("A"));
256 QVERIFY(testObject->mModifiers == Qt::NoModifier);
257 QVERIFY(!key.isAccepted());
261 key = QKeyEvent(QEvent::KeyRelease, Qt::Key_A, Qt::ShiftModifier, "A", false, 1);
262 QApplication::sendEvent(canvas, &key);
263 QCOMPARE(testObject->mKey, int(Qt::Key_A));
264 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A));
265 QCOMPARE(testObject->mText, QLatin1String("A"));
266 QVERIFY(testObject->mModifiers == Qt::ShiftModifier);
267 QVERIFY(key.isAccepted());
271 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
272 QApplication::sendEvent(canvas, &key);
273 QCOMPARE(testObject->mKey, int(Qt::Key_Return));
274 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Return));
275 QCOMPARE(testObject->mText, QLatin1String("Return"));
276 QVERIFY(testObject->mModifiers == Qt::NoModifier);
277 QVERIFY(key.isAccepted());
281 key = QKeyEvent(QEvent::KeyPress, Qt::Key_0, Qt::NoModifier, "0", false, 1);
282 QApplication::sendEvent(canvas, &key);
283 QCOMPARE(testObject->mKey, int(Qt::Key_0));
284 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_0));
285 QCOMPARE(testObject->mText, QLatin1String("0"));
286 QVERIFY(testObject->mModifiers == Qt::NoModifier);
287 QVERIFY(key.isAccepted());
291 key = QKeyEvent(QEvent::KeyPress, Qt::Key_9, Qt::NoModifier, "9", false, 1);
292 QApplication::sendEvent(canvas, &key);
293 QCOMPARE(testObject->mKey, int(Qt::Key_9));
294 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_9));
295 QCOMPARE(testObject->mText, QLatin1String("9"));
296 QVERIFY(testObject->mModifiers == Qt::NoModifier);
297 QVERIFY(!key.isAccepted());
301 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
302 QApplication::sendEvent(canvas, &key);
303 QCOMPARE(testObject->mKey, int(Qt::Key_Tab));
304 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Tab));
305 QCOMPARE(testObject->mText, QLatin1String("Tab"));
306 QVERIFY(testObject->mModifiers == Qt::NoModifier);
307 QVERIFY(key.isAccepted());
311 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
312 QApplication::sendEvent(canvas, &key);
313 QCOMPARE(testObject->mKey, int(Qt::Key_Backtab));
314 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Backtab));
315 QCOMPARE(testObject->mText, QLatin1String("Backtab"));
316 QVERIFY(testObject->mModifiers == Qt::NoModifier);
317 QVERIFY(key.isAccepted());
321 canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(false));
322 key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
323 QApplication::sendEvent(canvas, &key);
324 QCOMPARE(testObject->mKey, int(Qt::Key_A));
325 QCOMPARE(testObject->mForwardedKey, 0);
326 QCOMPARE(testObject->mText, QLatin1String("A"));
327 QVERIFY(testObject->mModifiers == Qt::NoModifier);
328 QVERIFY(!key.isAccepted());
332 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(false));
333 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), false);
335 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
336 QApplication::sendEvent(canvas, &key);
337 QCOMPARE(testObject->mKey, 0);
338 QVERIFY(!key.isAccepted());
340 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
341 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
343 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
344 QApplication::sendEvent(canvas, &key);
345 QCOMPARE(testObject->mKey, int(Qt::Key_Return));
346 QVERIFY(key.isAccepted());
352 void tst_QDeclarativeItem::keysProcessingOrder()
354 QDeclarativeView *canvas = new QDeclarativeView(0);
355 canvas->setFixedSize(240,320);
357 KeysTestObject *testObject = new KeysTestObject;
358 canvas->rootContext()->setContextProperty("keysTestObject", testObject);
360 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keyspriority.qml"));
362 qApp->processEvents();
364 KeyTestItem *testItem = qobject_cast<KeyTestItem*>(canvas->rootObject());
367 QEvent wa(QEvent::WindowActivate);
368 QApplication::sendEvent(canvas, &wa);
369 QFocusEvent fe(QEvent::FocusIn);
370 QApplication::sendEvent(canvas, &fe);
372 QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
373 QApplication::sendEvent(canvas, &key);
374 QCOMPARE(testObject->mKey, int(Qt::Key_A));
375 QCOMPARE(testObject->mText, QLatin1String("A"));
376 QVERIFY(testObject->mModifiers == Qt::NoModifier);
377 QVERIFY(key.isAccepted());
381 testObject->setProcessLast(true);
383 key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
384 QApplication::sendEvent(canvas, &key);
385 QCOMPARE(testObject->mKey, 0);
386 QVERIFY(key.isAccepted());
390 key = QKeyEvent(QEvent::KeyPress, Qt::Key_B, Qt::NoModifier, "B", false, 1);
391 QApplication::sendEvent(canvas, &key);
392 QCOMPARE(testObject->mKey, int(Qt::Key_B));
393 QCOMPARE(testObject->mText, QLatin1String("B"));
394 QVERIFY(testObject->mModifiers == Qt::NoModifier);
395 QVERIFY(!key.isAccepted());
399 key = QKeyEvent(QEvent::KeyRelease, Qt::Key_B, Qt::NoModifier, "B", false, 1);
400 QApplication::sendEvent(canvas, &key);
401 QCOMPARE(testObject->mKey, 0);
402 QVERIFY(key.isAccepted());
408 QDeclarativeItemPrivate *childPrivate(QGraphicsObject *rootItem, const char * itemString)
410 QDeclarativeItem *item = findItem<QDeclarativeItem>(rootItem, QString(QLatin1String(itemString)));
411 QDeclarativeItemPrivate* itemPrivate = QDeclarativeItemPrivate::get(item);
415 QVariant childProperty(QGraphicsObject *rootItem, const char * itemString, const char * property)
417 QDeclarativeItem *item = findItem<QDeclarativeItem>(rootItem, QString(QLatin1String(itemString)));
418 return item->property(property);
421 bool anchorsMirrored(QGraphicsObject *rootItem, const char * itemString)
423 QDeclarativeItem *item = findItem<QDeclarativeItem>(rootItem, QString(QLatin1String(itemString)));
424 QDeclarativeItemPrivate* itemPrivate = QDeclarativeItemPrivate::get(item);
425 return itemPrivate->anchors()->mirrored();
428 void tst_QDeclarativeItem::layoutMirroring()
430 QDeclarativeView *canvas = new QDeclarativeView(0);
431 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/layoutmirroring.qml"));
434 QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
436 QDeclarativeItemPrivate *rootPrivate = QDeclarativeItemPrivate::get(rootItem);
437 QVERIFY(rootPrivate);
439 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
440 QCOMPARE(childPrivate(rootItem, "mirrored2")->effectiveLayoutMirror, true);
441 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
442 QCOMPARE(childPrivate(rootItem, "notMirrored2")->effectiveLayoutMirror, false);
443 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true);
444 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true);
446 QCOMPARE(anchorsMirrored(rootItem, "mirrored1"), true);
447 QCOMPARE(anchorsMirrored(rootItem, "mirrored2"), true);
448 QCOMPARE(anchorsMirrored(rootItem, "notMirrored1"), false);
449 QCOMPARE(anchorsMirrored(rootItem, "notMirrored2"), false);
450 QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror1"), true);
451 QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror2"), true);
453 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true);
454 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritedLayoutMirror, false);
455 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true);
456 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritedLayoutMirror, false);
457 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true);
458 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true);
460 QCOMPARE(childPrivate(rootItem, "mirrored1")->isMirrorImplicit, false);
461 QCOMPARE(childPrivate(rootItem, "mirrored2")->isMirrorImplicit, false);
462 QCOMPARE(childPrivate(rootItem, "notMirrored1")->isMirrorImplicit, false);
463 QCOMPARE(childPrivate(rootItem, "notMirrored2")->isMirrorImplicit, true);
464 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->isMirrorImplicit, true);
465 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->isMirrorImplicit, true);
467 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromParent, true);
468 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromParent, false);
469 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromParent, true);
470 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromParent, false);
471 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromParent, true);
472 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromParent, true);
474 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromItem, true);
475 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromItem, false);
476 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromItem, false);
477 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromItem, false);
478 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromItem, false);
479 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromItem, false);
481 // load dynamic content using Loader that needs to inherit mirroring
482 rootItem->setProperty("state", "newContent");
483 QCOMPARE(childPrivate(rootItem, "notMirrored3")->effectiveLayoutMirror, false);
484 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->effectiveLayoutMirror, true);
486 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritedLayoutMirror, true);
487 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritedLayoutMirror, true);
489 QCOMPARE(childPrivate(rootItem, "notMirrored3")->isMirrorImplicit, false);
490 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->isMirrorImplicit, true);
492 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromParent, true);
493 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritMirrorFromParent, true);
495 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false);
496 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false);
498 // disable inheritance
499 rootItem->setProperty("childrenInherit", false);
501 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, false);
502 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, false);
503 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
504 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
506 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, false);
507 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, false);
508 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, false);
509 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, false);
511 // re-enable inheritance
512 rootItem->setProperty("childrenInherit", true);
514 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true);
515 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true);
516 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
517 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
519 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true);
520 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true);
521 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true);
522 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true);
527 QDeclarativeItem *parentItem1 = new QDeclarativeItem();
528 QDeclarativeItemPrivate::get(parentItem1)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
529 QDeclarativeItemPrivate::get(parentItem1)->isMirrorImplicit = false;
530 QDeclarativeItemPrivate::get(parentItem1)->inheritMirrorFromItem = true; // LayoutMirroring.childrenInherit: true
531 QDeclarativeItemPrivate::get(parentItem1)->resolveLayoutMirror();
533 // inherit in constructor
534 QDeclarativeItem *childItem1 = new QDeclarativeItem(parentItem1);
535 QCOMPARE(QDeclarativeItemPrivate::get(childItem1)->effectiveLayoutMirror, true);
536 QCOMPARE(QDeclarativeItemPrivate::get(childItem1)->inheritMirrorFromParent, true);
538 // inherit through a parent change
539 QDeclarativeItem *childItem2 = new QDeclarativeItem();
540 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->effectiveLayoutMirror, false);
541 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->inheritMirrorFromParent, false);
542 childItem2->setParentItem(parentItem1);
543 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->effectiveLayoutMirror, true);
544 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->inheritMirrorFromParent, true);
546 // stop inherting through a parent change
547 QDeclarativeItem *parentItem2 = new QDeclarativeItem();
548 QDeclarativeItemPrivate::get(parentItem2)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
549 QDeclarativeItemPrivate::get(parentItem2)->resolveLayoutMirror();
550 childItem2->setParentItem(parentItem2);
551 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->effectiveLayoutMirror, false);
552 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->inheritMirrorFromParent, false);
558 void tst_QDeclarativeItem::layoutMirroringIllegalParent()
560 QDeclarativeComponent component(&engine);
561 component.setData("import QtQuick 1.1; QtObject { LayoutMirroring.enabled: true; LayoutMirroring.childrenInherit: true }", QUrl::fromLocalFile(""));
562 QTest::ignoreMessage(QtWarningMsg, "file::1:21: QML QtObject: LayoutDirection attached property only works with Items");
563 QObject *object = component.create();
564 QVERIFY(object != 0);
567 void tst_QDeclarativeItem::keyNavigation()
569 QDeclarativeView *canvas = new QDeclarativeView(0);
570 canvas->setFixedSize(240,320);
572 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
574 qApp->processEvents();
576 QEvent wa(QEvent::WindowActivate);
577 QApplication::sendEvent(canvas, &wa);
578 QFocusEvent fe(QEvent::FocusIn);
579 QApplication::sendEvent(canvas, &fe);
581 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
583 QVERIFY(item->hasActiveFocus());
586 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
587 Q_RETURN_ARG(QVariant, result)));
588 QVERIFY(result.toBool());
591 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
592 QApplication::sendEvent(canvas, &key);
593 QVERIFY(key.isAccepted());
595 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
597 QVERIFY(item->hasActiveFocus());
600 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
601 QApplication::sendEvent(canvas, &key);
602 QVERIFY(key.isAccepted());
604 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
606 QVERIFY(item->hasActiveFocus());
609 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
610 QApplication::sendEvent(canvas, &key);
611 QVERIFY(key.isAccepted());
613 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
615 QVERIFY(item->hasActiveFocus());
618 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
619 QApplication::sendEvent(canvas, &key);
620 QVERIFY(key.isAccepted());
622 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
624 QVERIFY(item->hasActiveFocus());
627 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
628 QApplication::sendEvent(canvas, &key);
629 QVERIFY(key.isAccepted());
631 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
633 QVERIFY(item->hasActiveFocus());
636 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
637 QApplication::sendEvent(canvas, &key);
638 QVERIFY(key.isAccepted());
640 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
642 QVERIFY(item->hasActiveFocus());
647 void tst_QDeclarativeItem::keyNavigation_RightToLeft()
649 QDeclarativeView *canvas = new QDeclarativeView(0);
650 canvas->setFixedSize(240,320);
652 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
654 qApp->processEvents();
656 QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
658 QDeclarativeItemPrivate* rootItemPrivate = QDeclarativeItemPrivate::get(rootItem);
660 rootItemPrivate->effectiveLayoutMirror = true; // LayoutMirroring.mirror: true
661 rootItemPrivate->isMirrorImplicit = false;
662 rootItemPrivate->inheritMirrorFromItem = true; // LayoutMirroring.inherit: true
663 rootItemPrivate->resolveLayoutMirror();
665 QEvent wa(QEvent::WindowActivate);
666 QApplication::sendEvent(canvas, &wa);
667 QFocusEvent fe(QEvent::FocusIn);
668 QApplication::sendEvent(canvas, &fe);
670 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
672 QVERIFY(item->hasActiveFocus());
675 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
676 Q_RETURN_ARG(QVariant, result)));
677 QVERIFY(result.toBool());
680 QKeyEvent key(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
681 QApplication::sendEvent(canvas, &key);
682 QVERIFY(key.isAccepted());
684 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
686 QVERIFY(item->hasActiveFocus());
689 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
690 QApplication::sendEvent(canvas, &key);
691 QVERIFY(key.isAccepted());
693 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
695 QVERIFY(item->hasActiveFocus());
700 void tst_QDeclarativeItem::keyNavigation_skipNotVisible()
702 QDeclarativeView *canvas = new QDeclarativeView(0);
703 canvas->setFixedSize(240,320);
705 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
707 qApp->processEvents();
709 QEvent wa(QEvent::WindowActivate);
710 QApplication::sendEvent(canvas, &wa);
711 QFocusEvent fe(QEvent::FocusIn);
712 QApplication::sendEvent(canvas, &fe);
714 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
716 QVERIFY(item->hasActiveFocus());
718 // Set item 2 to not visible
719 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
721 item->setVisible(false);
722 QVERIFY(!item->isVisible());
725 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
726 QApplication::sendEvent(canvas, &key);
727 QVERIFY(key.isAccepted());
729 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
731 QVERIFY(item->hasActiveFocus());
734 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
735 QApplication::sendEvent(canvas, &key);
736 QVERIFY(key.isAccepted());
738 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
740 QVERIFY(item->hasActiveFocus());
743 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
744 QApplication::sendEvent(canvas, &key);
745 QVERIFY(key.isAccepted());
747 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
749 QVERIFY(item->hasActiveFocus());
751 //Set item 3 to not visible
752 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
754 item->setVisible(false);
755 QVERIFY(!item->isVisible());
758 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
759 QApplication::sendEvent(canvas, &key);
760 QVERIFY(key.isAccepted());
762 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
764 QVERIFY(item->hasActiveFocus());
767 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
768 QApplication::sendEvent(canvas, &key);
769 QVERIFY(key.isAccepted());
771 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
773 QVERIFY(item->hasActiveFocus());
778 void tst_QDeclarativeItem::keyNavigation_implicitSetting()
780 QDeclarativeView *canvas = new QDeclarativeView(0);
781 canvas->setFixedSize(240,320);
783 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest_implicit.qml"));
785 qApp->processEvents();
787 QEvent wa(QEvent::WindowActivate);
788 QApplication::sendEvent(canvas, &wa);
789 QFocusEvent fe(QEvent::FocusIn);
790 QApplication::sendEvent(canvas, &fe);
792 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
794 QVERIFY(item->hasActiveFocus());
797 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
798 Q_RETURN_ARG(QVariant, result)));
799 QVERIFY(result.toBool());
802 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
803 QApplication::sendEvent(canvas, &key);
804 QVERIFY(key.isAccepted());
806 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
808 QVERIFY(item->hasActiveFocus());
811 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
812 QApplication::sendEvent(canvas, &key);
813 QVERIFY(key.isAccepted());
815 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
817 QVERIFY(item->hasActiveFocus());
820 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
821 QApplication::sendEvent(canvas, &key);
822 QVERIFY(key.isAccepted());
824 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
826 QVERIFY(item->hasActiveFocus());
829 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
830 QApplication::sendEvent(canvas, &key);
831 QVERIFY(key.isAccepted());
833 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
835 QVERIFY(item->hasActiveFocus());
838 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
839 QApplication::sendEvent(canvas, &key);
840 QVERIFY(key.isAccepted());
842 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
844 QVERIFY(item->hasActiveFocus());
847 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
848 QApplication::sendEvent(canvas, &key);
849 QVERIFY(key.isAccepted());
851 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
853 QVERIFY(item->hasActiveFocus());
856 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
857 QApplication::sendEvent(canvas, &key);
858 QVERIFY(key.isAccepted());
860 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
862 QVERIFY(item->hasActiveFocus());
865 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
866 QApplication::sendEvent(canvas, &key);
867 QVERIFY(key.isAccepted());
869 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
871 QVERIFY(item->hasActiveFocus());
874 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
875 QApplication::sendEvent(canvas, &key);
876 QVERIFY(key.isAccepted());
878 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
880 QVERIFY(item->hasActiveFocus());
883 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
884 QApplication::sendEvent(canvas, &key);
885 QVERIFY(key.isAccepted());
887 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
889 QVERIFY(item->hasActiveFocus());
892 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
893 QApplication::sendEvent(canvas, &key);
894 QVERIFY(key.isAccepted());
896 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
898 QVERIFY(item->hasActiveFocus());
903 void tst_QDeclarativeItem::smooth()
905 QDeclarativeComponent component(&engine);
906 component.setData("import QtQuick 1.0; Item { smooth: false; }", QUrl::fromLocalFile(""));
907 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
908 QSignalSpy spy(item, SIGNAL(smoothChanged(bool)));
911 QVERIFY(!item->smooth());
913 item->setSmooth(true);
914 QVERIFY(item->smooth());
915 QCOMPARE(spy.count(),1);
916 QList<QVariant> arguments = spy.first();
917 QVERIFY(arguments.count() == 1);
918 QVERIFY(arguments.at(0).toBool() == true);
920 item->setSmooth(true);
921 QCOMPARE(spy.count(),1);
923 item->setSmooth(false);
924 QVERIFY(!item->smooth());
925 QCOMPARE(spy.count(),2);
926 item->setSmooth(false);
927 QCOMPARE(spy.count(),2);
932 void tst_QDeclarativeItem::clip()
934 QDeclarativeComponent component(&engine);
935 component.setData("import QtQuick 1.0\nItem { clip: false\n }", QUrl::fromLocalFile(""));
936 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
937 QSignalSpy spy(item, SIGNAL(clipChanged(bool)));
940 QVERIFY(!item->clip());
943 QVERIFY(item->clip());
945 QList<QVariant> arguments = spy.first();
946 QVERIFY(arguments.count() == 1);
947 QVERIFY(arguments.at(0).toBool() == true);
949 QCOMPARE(spy.count(),1);
951 QCOMPARE(spy.count(),1);
953 item->setClip(false);
954 QVERIFY(!item->clip());
955 QCOMPARE(spy.count(),2);
956 item->setClip(false);
957 QCOMPARE(spy.count(),2);
962 void tst_QDeclarativeItem::mapCoordinates()
967 QDeclarativeView *canvas = new QDeclarativeView(0);
968 canvas->setFixedSize(300, 300);
969 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml"));
971 qApp->processEvents();
973 QDeclarativeItem *root = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
975 QDeclarativeItem *a = findItem<QDeclarativeItem>(canvas->rootObject(), "itemA");
977 QDeclarativeItem *b = findItem<QDeclarativeItem>(canvas->rootObject(), "itemB");
982 QVERIFY(QMetaObject::invokeMethod(root, "mapAToB",
983 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
984 QCOMPARE(result.value<QPointF>(), qobject_cast<QGraphicsItem*>(a)->mapToItem(b, x, y));
986 QVERIFY(QMetaObject::invokeMethod(root, "mapAFromB",
987 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
988 QCOMPARE(result.value<QPointF>(), qobject_cast<QGraphicsItem*>(a)->mapFromItem(b, x, y));
990 QVERIFY(QMetaObject::invokeMethod(root, "mapAToNull",
991 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
992 QCOMPARE(result.value<QPointF>(), qobject_cast<QGraphicsItem*>(a)->mapToScene(x, y));
994 QVERIFY(QMetaObject::invokeMethod(root, "mapAFromNull",
995 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
996 QCOMPARE(result.value<QPointF>(), qobject_cast<QGraphicsItem*>(a)->mapFromScene(x, y));
998 QString warning1 = QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml").toString() + ":7:5: QML Item: mapToItem() given argument \"1122\" which is neither null nor an Item";
999 QString warning2 = QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml").toString() + ":7:5: QML Item: mapFromItem() given argument \"1122\" which is neither null nor an Item";
1001 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
1002 QVERIFY(QMetaObject::invokeMethod(root, "checkMapAToInvalid",
1003 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
1004 QVERIFY(result.toBool());
1006 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
1007 QVERIFY(QMetaObject::invokeMethod(root, "checkMapAFromInvalid",
1008 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
1009 QVERIFY(result.toBool());
1014 void tst_QDeclarativeItem::mapCoordinates_data()
1016 QTest::addColumn<int>("x");
1017 QTest::addColumn<int>("y");
1019 for (int i=-20; i<=20; i+=10)
1020 QTest::newRow(QTest::toString(i)) << i << i;
1023 void tst_QDeclarativeItem::transforms_data()
1025 QTest::addColumn<QByteArray>("qml");
1026 QTest::addColumn<QMatrix>("matrix");
1027 QTest::newRow("translate") << QByteArray("Translate { x: 10; y: 20 }")
1028 << QMatrix(1,0,0,1,10,20);
1029 QTest::newRow("rotation") << QByteArray("Rotation { angle: 90 }")
1030 << QMatrix(0,1,-1,0,0,0);
1031 QTest::newRow("scale") << QByteArray("Scale { xScale: 1.5; yScale: -2 }")
1032 << QMatrix(1.5,0,0,-2,0,0);
1033 QTest::newRow("sequence") << QByteArray("[ Translate { x: 10; y: 20 }, Scale { xScale: 1.5; yScale: -2 } ]")
1034 << QMatrix(1,0,0,1,10,20) * QMatrix(1.5,0,0,-2,0,0);
1037 void tst_QDeclarativeItem::transforms()
1039 QFETCH(QByteArray, qml);
1040 QFETCH(QMatrix, matrix);
1041 QDeclarativeComponent component(&engine);
1042 component.setData("import QtQuick 1.0\nItem { transform: "+qml+"}", QUrl::fromLocalFile(""));
1043 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
1045 QCOMPARE(item->sceneMatrix(), matrix);
1048 void tst_QDeclarativeItem::childrenProperty()
1050 QDeclarativeComponent component(&engine, SRCDIR "/data/childrenProperty.qml");
1052 QObject *o = component.create();
1055 QCOMPARE(o->property("test1").toBool(), true);
1056 QCOMPARE(o->property("test2").toBool(), true);
1057 QCOMPARE(o->property("test3").toBool(), true);
1058 QCOMPARE(o->property("test4").toBool(), true);
1059 QCOMPARE(o->property("test5").toBool(), true);
1063 void tst_QDeclarativeItem::resourcesProperty()
1065 QDeclarativeComponent component(&engine, SRCDIR "/data/resourcesProperty.qml");
1067 QObject *o = component.create();
1070 QCOMPARE(o->property("test1").toBool(), true);
1071 QCOMPARE(o->property("test2").toBool(), true);
1072 QCOMPARE(o->property("test3").toBool(), true);
1073 QCOMPARE(o->property("test4").toBool(), true);
1074 QCOMPARE(o->property("test5").toBool(), true);
1078 void tst_QDeclarativeItem::mouseFocus()
1080 QDeclarativeView *canvas = new QDeclarativeView(0);
1082 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/mouseFocus.qml"));
1084 QVERIFY(canvas->rootObject());
1085 QApplication::setActiveWindow(canvas);
1086 QTest::qWaitForWindowShown(canvas);
1087 QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
1089 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "declarativeItem");
1091 QSignalSpy focusSpy(item, SIGNAL(activeFocusChanged(bool)));
1093 QTest::mouseClick(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(item->scenePos()));
1094 QApplication::processEvents();
1095 QCOMPARE(focusSpy.count(), 1);
1096 QVERIFY(item->hasActiveFocus());
1098 // make sure focusable graphics widget underneath does not steal focus
1099 QTest::mouseClick(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(item->scenePos()));
1100 QApplication::processEvents();
1101 QCOMPARE(focusSpy.count(), 1);
1102 QVERIFY(item->hasActiveFocus());
1104 item->setFocus(false);
1105 QVERIFY(!item->hasActiveFocus());
1106 QCOMPARE(focusSpy.count(), 2);
1107 item->setFocus(true);
1108 QCOMPARE(focusSpy.count(), 3);
1113 void tst_QDeclarativeItem::propertyChanges()
1115 QDeclarativeView *canvas = new QDeclarativeView(0);
1116 canvas->setFixedSize(240,320);
1117 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml"));
1120 QEvent wa(QEvent::WindowActivate);
1121 QApplication::sendEvent(canvas, &wa);
1122 QFocusEvent fe(QEvent::FocusIn);
1123 QApplication::sendEvent(canvas, &fe);
1125 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item");
1126 QDeclarativeItem *parentItem = findItem<QDeclarativeItem>(canvas->rootObject(), "parentItem");
1129 QVERIFY(parentItem);
1131 QSignalSpy parentSpy(item, SIGNAL(parentChanged(QDeclarativeItem *)));
1132 QSignalSpy widthSpy(item, SIGNAL(widthChanged()));
1133 QSignalSpy heightSpy(item, SIGNAL(heightChanged()));
1134 QSignalSpy baselineOffsetSpy(item, SIGNAL(baselineOffsetChanged(qreal)));
1135 QSignalSpy childrenRectSpy(parentItem, SIGNAL(childrenRectChanged(QRectF)));
1136 QSignalSpy focusSpy(item, SIGNAL(focusChanged(bool)));
1137 QSignalSpy wantsFocusSpy(parentItem, SIGNAL(activeFocusChanged(bool)));
1138 QSignalSpy childrenChangedSpy(parentItem, SIGNAL(childrenChanged()));
1139 QSignalSpy xSpy(item, SIGNAL(xChanged()));
1140 QSignalSpy ySpy(item, SIGNAL(yChanged()));
1142 item->setParentItem(parentItem);
1143 item->setWidth(100.0);
1144 item->setHeight(200.0);
1145 item->setFocus(true);
1146 item->setBaselineOffset(10.0);
1148 QCOMPARE(item->parentItem(), parentItem);
1149 QCOMPARE(parentSpy.count(),1);
1150 QList<QVariant> parentArguments = parentSpy.first();
1151 QVERIFY(parentArguments.count() == 1);
1152 QCOMPARE(item->parentItem(), qvariant_cast<QDeclarativeItem *>(parentArguments.at(0)));
1153 QCOMPARE(childrenChangedSpy.count(),1);
1155 item->setParentItem(parentItem);
1156 QCOMPARE(childrenChangedSpy.count(),1);
1158 QCOMPARE(item->width(), 100.0);
1159 QCOMPARE(widthSpy.count(),1);
1161 QCOMPARE(item->height(), 200.0);
1162 QCOMPARE(heightSpy.count(),1);
1164 QCOMPARE(item->baselineOffset(), 10.0);
1165 QCOMPARE(baselineOffsetSpy.count(),1);
1166 QList<QVariant> baselineOffsetArguments = baselineOffsetSpy.first();
1167 QVERIFY(baselineOffsetArguments.count() == 1);
1168 QCOMPARE(item->baselineOffset(), baselineOffsetArguments.at(0).toReal());
1170 QCOMPARE(parentItem->childrenRect(), QRectF(0.0,0.0,100.0,200.0));
1171 QCOMPARE(childrenRectSpy.count(),2);
1172 QList<QVariant> childrenRectArguments = childrenRectSpy.at(1);
1173 QVERIFY(childrenRectArguments.count() == 1);
1174 QCOMPARE(parentItem->childrenRect(), childrenRectArguments.at(0).toRectF());
1176 QCOMPARE(item->hasActiveFocus(), true);
1177 QCOMPARE(focusSpy.count(),1);
1178 QList<QVariant> focusArguments = focusSpy.first();
1179 QVERIFY(focusArguments.count() == 1);
1180 QCOMPARE(focusArguments.at(0).toBool(), true);
1182 QCOMPARE(parentItem->hasActiveFocus(), false);
1183 QCOMPARE(parentItem->hasFocus(), false);
1184 QCOMPARE(wantsFocusSpy.count(),0);
1187 QCOMPARE(item->x(), 10.0);
1188 QCOMPARE(xSpy.count(), 1);
1191 QCOMPARE(item->y(), 10.0);
1192 QCOMPARE(ySpy.count(), 1);
1197 void tst_QDeclarativeItem::childrenRect()
1199 QDeclarativeView *canvas = new QDeclarativeView(0);
1200 canvas->setFixedSize(240,320);
1201 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRect.qml"));
1204 QGraphicsObject *o = canvas->rootObject();
1205 QDeclarativeItem *item = o->findChild<QDeclarativeItem*>("testItem");
1206 QCOMPARE(item->width(), qreal(0));
1207 QCOMPARE(item->height(), qreal(0));
1209 o->setProperty("childCount", 1);
1210 QCOMPARE(item->width(), qreal(10));
1211 QCOMPARE(item->height(), qreal(20));
1213 o->setProperty("childCount", 5);
1214 QCOMPARE(item->width(), qreal(50));
1215 QCOMPARE(item->height(), qreal(100));
1217 o->setProperty("childCount", 0);
1218 QCOMPARE(item->width(), qreal(0));
1219 QCOMPARE(item->height(), qreal(0));
1226 void tst_QDeclarativeItem::childrenRectBug()
1228 QDeclarativeView *canvas = new QDeclarativeView(0);
1229 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug.qml"));
1232 QGraphicsObject *o = canvas->rootObject();
1233 QDeclarativeItem *item = o->findChild<QDeclarativeItem*>("theItem");
1234 QCOMPARE(item->width(), qreal(200));
1235 QCOMPARE(item->height(), qreal(100));
1236 QCOMPARE(item->x(), qreal(100));
1242 void tst_QDeclarativeItem::childrenRectBug2()
1244 QDeclarativeView *canvas = new QDeclarativeView(0);
1245 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug2.qml"));
1248 QDeclarative1Rectangle *rect = qobject_cast<QDeclarative1Rectangle*>(canvas->rootObject());
1250 QDeclarativeItem *item = rect->findChild<QDeclarativeItem*>("theItem");
1251 QCOMPARE(item->width(), qreal(100));
1252 QCOMPARE(item->height(), qreal(110));
1253 QCOMPARE(item->x(), qreal(130));
1255 QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect);
1256 rectPrivate->setState("row");
1257 QCOMPARE(item->width(), qreal(210));
1258 QCOMPARE(item->height(), qreal(50));
1259 QCOMPARE(item->x(), qreal(75));
1265 void tst_QDeclarativeItem::childrenRectBug3()
1267 QDeclarativeView *canvas = new QDeclarativeView(0);
1268 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug3.qml"));
1271 //don't crash on delete
1276 void tst_QDeclarativeItem::transformCrash()
1278 QDeclarativeView *canvas = new QDeclarativeView(0);
1279 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/transformCrash.qml"));
1285 void tst_QDeclarativeItem::implicitSize()
1287 QDeclarativeView *canvas = new QDeclarativeView(0);
1288 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/implicitsize.qml"));
1291 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
1293 QCOMPARE(item->width(), qreal(80));
1294 QCOMPARE(item->height(), qreal(60));
1296 QCOMPARE(item->implicitWidth(), qreal(200));
1297 QCOMPARE(item->implicitHeight(), qreal(100));
1299 QMetaObject::invokeMethod(item, "resetSize");
1301 QCOMPARE(item->width(), qreal(200));
1302 QCOMPARE(item->height(), qreal(100));
1304 QMetaObject::invokeMethod(item, "changeImplicit");
1306 QCOMPARE(item->implicitWidth(), qreal(150));
1307 QCOMPARE(item->implicitHeight(), qreal(80));
1308 QCOMPARE(item->width(), qreal(150));
1309 QCOMPARE(item->height(), qreal(80));
1314 void tst_QDeclarativeItem::testQtQuick11Attributes()
1316 QFETCH(QString, code);
1317 QFETCH(QString, warning);
1318 QFETCH(QString, error);
1320 QDeclarativeEngine engine;
1323 QDeclarativeComponent valid(&engine);
1324 valid.setData("import QtQuick 1.1; Item { " + code.toUtf8() + " }", QUrl(""));
1325 obj = valid.create();
1327 QVERIFY(valid.errorString().isEmpty());
1330 QDeclarativeComponent invalid(&engine);
1331 invalid.setData("import QtQuick 1.0; Item { " + code.toUtf8() + " }", QUrl(""));
1332 QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
1333 obj = invalid.create();
1334 QCOMPARE(invalid.errorString(), error);
1338 void tst_QDeclarativeItem::testQtQuick11Attributes_data()
1340 QTest::addColumn<QString>("code");
1341 QTest::addColumn<QString>("warning");
1342 QTest::addColumn<QString>("error");
1344 QTest::newRow("implicitWidth") << "implicitWidth: 100"
1345 << "QDeclarativeComponent: Component is not ready"
1346 << ":1 \"Item.implicitWidth\" is not available in QtQuick 1.0.\n";
1348 QTest::newRow("implicitHeight") << "implicitHeight: 100"
1349 << "QDeclarativeComponent: Component is not ready"
1350 << ":1 \"Item.implicitHeight\" is not available in QtQuick 1.0.\n";
1352 QTest::newRow("onImplicitWidthChanged") << "onImplicitWidthChanged: x"
1353 << "QDeclarativeComponent: Component is not ready"
1354 << ":1 \"Item.onImplicitWidthChanged\" is not available in QtQuick 1.0.\n";
1356 QTest::newRow("onImplicitHeightChanged") << "onImplicitHeightChanged: x"
1357 << "QDeclarativeComponent: Component is not ready"
1358 << ":1 \"Item.onImplicitHeightChanged\" is not available in QtQuick 1.0.\n";
1361 void tst_QDeclarativeItem::qtbug_16871()
1363 QDeclarativeComponent component(&engine, SRCDIR "/data/qtbug_16871.qml");
1364 QObject *o = component.create();
1369 void tst_QDeclarativeItem::qtbug_21045()
1371 QDeclarativeComponent component(&engine);
1372 QGraphicsScene scene;
1373 component.setData("import QtQuick 1.1\nItem{visible: false; focus: true}", QUrl::fromLocalFile("file:"));
1374 QObject *o = component.create();
1375 QDeclarativeItem* i = qobject_cast<QDeclarativeItem*>(o);
1378 QVERIFY(!i->hasActiveFocus());
1381 QTEST_MAIN(tst_QDeclarativeItem)
1383 #include "tst_qdeclarativeitem.moc"