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 <QtQuick1/qdeclarativeview.h>
47 #include <QtQuick1/private/qdeclarativerectangle_p.h>
48 #include <QtQuick1/private/qdeclarativeitem_p.h>
50 class tst_QDeclarativeItem : public QObject
54 tst_QDeclarativeItem();
59 void keysProcessingOrder();
61 void keyNavigation_RightToLeft();
62 void keyNavigation_skipNotVisible();
63 void keyNavigation_implicitSetting();
64 void layoutMirroring();
65 void layoutMirroringIllegalParent();
68 void mapCoordinates();
69 void mapCoordinates_data();
70 void propertyChanges();
72 void transforms_data();
74 void childrenRectBug();
75 void childrenRectBug2();
76 void childrenRectBug3();
78 void childrenProperty();
79 void resourcesProperty();
82 void transformCrash();
84 void testQtQuick11Attributes();
85 void testQtQuick11Attributes_data();
89 QDeclarativeEngine engine;
93 T *findItem(QGraphicsObject *parent, const QString &objectName)
98 const QMetaObject &mo = T::staticMetaObject;
99 //qDebug() << parent->QGraphicsObject::children().count() << "children";
100 for (int i = 0; i < parent->childItems().count(); ++i) {
101 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(parent->childItems().at(i));
104 //qDebug() << "try" << item;
105 if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName))
106 return static_cast<T*>(item);
107 item = findItem<T>(item, objectName);
109 return static_cast<T*>(item);
115 class KeysTestObject : public QObject
119 Q_PROPERTY(bool processLast READ processLast NOTIFY processLastChanged)
122 KeysTestObject() : mKey(0), mModifiers(0), mForwardedKey(0), mLast(false) {}
131 bool processLast() const { return mLast; }
132 void setProcessLast(bool b) {
135 emit processLastChanged();
140 void keyPress(int key, QString text, int modifiers) {
143 mModifiers = modifiers;
145 void keyRelease(int key, QString text, int modifiers) {
148 mModifiers = modifiers;
150 void forwardedKey(int key) {
155 void processLastChanged();
167 class KeyTestItem : public QDeclarativeItem
171 KeyTestItem(QDeclarativeItem *parent=0) : QDeclarativeItem(parent), mKey(0) {}
174 void keyPressEvent(QKeyEvent *e) {
175 keyPressPreHandler(e);
181 if (e->key() == Qt::Key_A)
186 if (!e->isAccepted())
187 QDeclarativeItem::keyPressEvent(e);
190 void keyReleaseEvent(QKeyEvent *e) {
191 keyReleasePreHandler(e);
196 if (e->key() == Qt::Key_B)
201 if (!e->isAccepted())
202 QDeclarativeItem::keyReleaseEvent(e);
209 QML_DECLARE_TYPE(KeyTestItem);
212 tst_QDeclarativeItem::tst_QDeclarativeItem()
216 void tst_QDeclarativeItem::initTestCase()
218 qmlRegisterType<KeyTestItem>("Test",1,0,"KeyTestItem");
221 void tst_QDeclarativeItem::keys()
223 QDeclarativeView *canvas = new QDeclarativeView(0);
224 canvas->setFixedSize(240,320);
226 KeysTestObject *testObject = new KeysTestObject;
227 canvas->rootContext()->setContextProperty("keysTestObject", testObject);
229 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
230 canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(true));
232 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keystest.qml"));
234 qApp->processEvents();
236 QEvent wa(QEvent::WindowActivate);
237 QApplication::sendEvent(canvas, &wa);
238 QFocusEvent fe(QEvent::FocusIn);
239 QApplication::sendEvent(canvas, &fe);
241 QVERIFY(canvas->rootObject());
242 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
244 QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
245 QApplication::sendEvent(canvas, &key);
246 QCOMPARE(testObject->mKey, int(Qt::Key_A));
247 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A));
248 QCOMPARE(testObject->mText, QLatin1String("A"));
249 QVERIFY(testObject->mModifiers == Qt::NoModifier);
250 QVERIFY(!key.isAccepted());
254 key = QKeyEvent(QEvent::KeyRelease, Qt::Key_A, Qt::ShiftModifier, "A", false, 1);
255 QApplication::sendEvent(canvas, &key);
256 QCOMPARE(testObject->mKey, int(Qt::Key_A));
257 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A));
258 QCOMPARE(testObject->mText, QLatin1String("A"));
259 QVERIFY(testObject->mModifiers == Qt::ShiftModifier);
260 QVERIFY(key.isAccepted());
264 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
265 QApplication::sendEvent(canvas, &key);
266 QCOMPARE(testObject->mKey, int(Qt::Key_Return));
267 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Return));
268 QCOMPARE(testObject->mText, QLatin1String("Return"));
269 QVERIFY(testObject->mModifiers == Qt::NoModifier);
270 QVERIFY(key.isAccepted());
274 key = QKeyEvent(QEvent::KeyPress, Qt::Key_0, Qt::NoModifier, "0", false, 1);
275 QApplication::sendEvent(canvas, &key);
276 QCOMPARE(testObject->mKey, int(Qt::Key_0));
277 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_0));
278 QCOMPARE(testObject->mText, QLatin1String("0"));
279 QVERIFY(testObject->mModifiers == Qt::NoModifier);
280 QVERIFY(key.isAccepted());
284 key = QKeyEvent(QEvent::KeyPress, Qt::Key_9, Qt::NoModifier, "9", false, 1);
285 QApplication::sendEvent(canvas, &key);
286 QCOMPARE(testObject->mKey, int(Qt::Key_9));
287 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_9));
288 QCOMPARE(testObject->mText, QLatin1String("9"));
289 QVERIFY(testObject->mModifiers == Qt::NoModifier);
290 QVERIFY(!key.isAccepted());
294 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
295 QApplication::sendEvent(canvas, &key);
296 QCOMPARE(testObject->mKey, int(Qt::Key_Tab));
297 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Tab));
298 QCOMPARE(testObject->mText, QLatin1String("Tab"));
299 QVERIFY(testObject->mModifiers == Qt::NoModifier);
300 QVERIFY(key.isAccepted());
304 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
305 QApplication::sendEvent(canvas, &key);
306 QCOMPARE(testObject->mKey, int(Qt::Key_Backtab));
307 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Backtab));
308 QCOMPARE(testObject->mText, QLatin1String("Backtab"));
309 QVERIFY(testObject->mModifiers == Qt::NoModifier);
310 QVERIFY(key.isAccepted());
314 canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(false));
315 key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
316 QApplication::sendEvent(canvas, &key);
317 QCOMPARE(testObject->mKey, int(Qt::Key_A));
318 QCOMPARE(testObject->mForwardedKey, 0);
319 QCOMPARE(testObject->mText, QLatin1String("A"));
320 QVERIFY(testObject->mModifiers == Qt::NoModifier);
321 QVERIFY(!key.isAccepted());
325 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(false));
326 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), false);
328 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
329 QApplication::sendEvent(canvas, &key);
330 QCOMPARE(testObject->mKey, 0);
331 QVERIFY(!key.isAccepted());
333 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
334 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
336 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
337 QApplication::sendEvent(canvas, &key);
338 QCOMPARE(testObject->mKey, int(Qt::Key_Return));
339 QVERIFY(key.isAccepted());
345 void tst_QDeclarativeItem::keysProcessingOrder()
347 QDeclarativeView *canvas = new QDeclarativeView(0);
348 canvas->setFixedSize(240,320);
350 KeysTestObject *testObject = new KeysTestObject;
351 canvas->rootContext()->setContextProperty("keysTestObject", testObject);
353 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keyspriority.qml"));
355 qApp->processEvents();
357 KeyTestItem *testItem = qobject_cast<KeyTestItem*>(canvas->rootObject());
360 QEvent wa(QEvent::WindowActivate);
361 QApplication::sendEvent(canvas, &wa);
362 QFocusEvent fe(QEvent::FocusIn);
363 QApplication::sendEvent(canvas, &fe);
365 QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
366 QApplication::sendEvent(canvas, &key);
367 QCOMPARE(testObject->mKey, int(Qt::Key_A));
368 QCOMPARE(testObject->mText, QLatin1String("A"));
369 QVERIFY(testObject->mModifiers == Qt::NoModifier);
370 QVERIFY(key.isAccepted());
374 testObject->setProcessLast(true);
376 key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
377 QApplication::sendEvent(canvas, &key);
378 QCOMPARE(testObject->mKey, 0);
379 QVERIFY(key.isAccepted());
383 key = QKeyEvent(QEvent::KeyPress, Qt::Key_B, Qt::NoModifier, "B", false, 1);
384 QApplication::sendEvent(canvas, &key);
385 QCOMPARE(testObject->mKey, int(Qt::Key_B));
386 QCOMPARE(testObject->mText, QLatin1String("B"));
387 QVERIFY(testObject->mModifiers == Qt::NoModifier);
388 QVERIFY(!key.isAccepted());
392 key = QKeyEvent(QEvent::KeyRelease, Qt::Key_B, Qt::NoModifier, "B", false, 1);
393 QApplication::sendEvent(canvas, &key);
394 QCOMPARE(testObject->mKey, 0);
395 QVERIFY(key.isAccepted());
401 QDeclarativeItemPrivate *childPrivate(QGraphicsObject *rootItem, const char * itemString)
403 QDeclarativeItem *item = findItem<QDeclarativeItem>(rootItem, QString(QLatin1String(itemString)));
404 QDeclarativeItemPrivate* itemPrivate = QDeclarativeItemPrivate::get(item);
408 QVariant childProperty(QGraphicsObject *rootItem, const char * itemString, const char * property)
410 QDeclarativeItem *item = findItem<QDeclarativeItem>(rootItem, QString(QLatin1String(itemString)));
411 return item->property(property);
414 bool anchorsMirrored(QGraphicsObject *rootItem, const char * itemString)
416 QDeclarativeItem *item = findItem<QDeclarativeItem>(rootItem, QString(QLatin1String(itemString)));
417 QDeclarativeItemPrivate* itemPrivate = QDeclarativeItemPrivate::get(item);
418 return itemPrivate->anchors()->mirrored();
421 void tst_QDeclarativeItem::layoutMirroring()
423 QDeclarativeView *canvas = new QDeclarativeView(0);
424 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/layoutmirroring.qml"));
427 QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
429 QDeclarativeItemPrivate *rootPrivate = QDeclarativeItemPrivate::get(rootItem);
430 QVERIFY(rootPrivate);
432 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
433 QCOMPARE(childPrivate(rootItem, "mirrored2")->effectiveLayoutMirror, true);
434 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
435 QCOMPARE(childPrivate(rootItem, "notMirrored2")->effectiveLayoutMirror, false);
436 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true);
437 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true);
439 QCOMPARE(anchorsMirrored(rootItem, "mirrored1"), true);
440 QCOMPARE(anchorsMirrored(rootItem, "mirrored2"), true);
441 QCOMPARE(anchorsMirrored(rootItem, "notMirrored1"), false);
442 QCOMPARE(anchorsMirrored(rootItem, "notMirrored2"), false);
443 QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror1"), true);
444 QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror2"), true);
446 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true);
447 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritedLayoutMirror, false);
448 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true);
449 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritedLayoutMirror, false);
450 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true);
451 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true);
453 QCOMPARE(childPrivate(rootItem, "mirrored1")->isMirrorImplicit, false);
454 QCOMPARE(childPrivate(rootItem, "mirrored2")->isMirrorImplicit, false);
455 QCOMPARE(childPrivate(rootItem, "notMirrored1")->isMirrorImplicit, false);
456 QCOMPARE(childPrivate(rootItem, "notMirrored2")->isMirrorImplicit, true);
457 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->isMirrorImplicit, true);
458 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->isMirrorImplicit, true);
460 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromParent, true);
461 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromParent, false);
462 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromParent, true);
463 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromParent, false);
464 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromParent, true);
465 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromParent, true);
467 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromItem, true);
468 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromItem, false);
469 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromItem, false);
470 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromItem, false);
471 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromItem, false);
472 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromItem, false);
474 // load dynamic content using Loader that needs to inherit mirroring
475 rootItem->setProperty("state", "newContent");
476 QCOMPARE(childPrivate(rootItem, "notMirrored3")->effectiveLayoutMirror, false);
477 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->effectiveLayoutMirror, true);
479 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritedLayoutMirror, true);
480 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritedLayoutMirror, true);
482 QCOMPARE(childPrivate(rootItem, "notMirrored3")->isMirrorImplicit, false);
483 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->isMirrorImplicit, true);
485 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromParent, true);
486 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritMirrorFromParent, true);
488 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false);
489 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false);
491 // disable inheritance
492 rootItem->setProperty("childrenInherit", false);
494 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, false);
495 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, false);
496 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
497 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
499 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, false);
500 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, false);
501 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, false);
502 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, false);
504 // re-enable inheritance
505 rootItem->setProperty("childrenInherit", true);
507 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true);
508 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true);
509 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
510 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
512 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true);
513 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true);
514 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true);
515 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true);
520 QDeclarativeItem *parentItem1 = new QDeclarativeItem();
521 QDeclarativeItemPrivate::get(parentItem1)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
522 QDeclarativeItemPrivate::get(parentItem1)->isMirrorImplicit = false;
523 QDeclarativeItemPrivate::get(parentItem1)->inheritMirrorFromItem = true; // LayoutMirroring.childrenInherit: true
524 QDeclarativeItemPrivate::get(parentItem1)->resolveLayoutMirror();
526 // inherit in constructor
527 QDeclarativeItem *childItem1 = new QDeclarativeItem(parentItem1);
528 QCOMPARE(QDeclarativeItemPrivate::get(childItem1)->effectiveLayoutMirror, true);
529 QCOMPARE(QDeclarativeItemPrivate::get(childItem1)->inheritMirrorFromParent, true);
531 // inherit through a parent change
532 QDeclarativeItem *childItem2 = new QDeclarativeItem();
533 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->effectiveLayoutMirror, false);
534 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->inheritMirrorFromParent, false);
535 childItem2->setParentItem(parentItem1);
536 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->effectiveLayoutMirror, true);
537 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->inheritMirrorFromParent, true);
539 // stop inherting through a parent change
540 QDeclarativeItem *parentItem2 = new QDeclarativeItem();
541 QDeclarativeItemPrivate::get(parentItem2)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
542 QDeclarativeItemPrivate::get(parentItem2)->resolveLayoutMirror();
543 childItem2->setParentItem(parentItem2);
544 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->effectiveLayoutMirror, false);
545 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->inheritMirrorFromParent, false);
551 void tst_QDeclarativeItem::layoutMirroringIllegalParent()
553 QDeclarativeComponent component(&engine);
554 component.setData("import QtQuick 1.1; QtObject { LayoutMirroring.enabled: true; LayoutMirroring.childrenInherit: true }", QUrl::fromLocalFile(""));
555 QTest::ignoreMessage(QtWarningMsg, "file::1:21: QML QtObject: LayoutDirection attached property only works with Items");
556 QObject *object = component.create();
557 QVERIFY(object != 0);
560 void tst_QDeclarativeItem::keyNavigation()
562 QDeclarativeView *canvas = new QDeclarativeView(0);
563 canvas->setFixedSize(240,320);
565 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
567 qApp->processEvents();
569 QEvent wa(QEvent::WindowActivate);
570 QApplication::sendEvent(canvas, &wa);
571 QFocusEvent fe(QEvent::FocusIn);
572 QApplication::sendEvent(canvas, &fe);
574 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
576 QVERIFY(item->hasActiveFocus());
579 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
580 Q_RETURN_ARG(QVariant, result)));
581 QVERIFY(result.toBool());
584 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
585 QApplication::sendEvent(canvas, &key);
586 QVERIFY(key.isAccepted());
588 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
590 QVERIFY(item->hasActiveFocus());
593 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
594 QApplication::sendEvent(canvas, &key);
595 QVERIFY(key.isAccepted());
597 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
599 QVERIFY(item->hasActiveFocus());
602 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
603 QApplication::sendEvent(canvas, &key);
604 QVERIFY(key.isAccepted());
606 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
608 QVERIFY(item->hasActiveFocus());
611 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
612 QApplication::sendEvent(canvas, &key);
613 QVERIFY(key.isAccepted());
615 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
617 QVERIFY(item->hasActiveFocus());
620 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
621 QApplication::sendEvent(canvas, &key);
622 QVERIFY(key.isAccepted());
624 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
626 QVERIFY(item->hasActiveFocus());
629 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
630 QApplication::sendEvent(canvas, &key);
631 QVERIFY(key.isAccepted());
633 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
635 QVERIFY(item->hasActiveFocus());
640 void tst_QDeclarativeItem::keyNavigation_RightToLeft()
642 QDeclarativeView *canvas = new QDeclarativeView(0);
643 canvas->setFixedSize(240,320);
645 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
647 qApp->processEvents();
649 QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
651 QDeclarativeItemPrivate* rootItemPrivate = QDeclarativeItemPrivate::get(rootItem);
653 rootItemPrivate->effectiveLayoutMirror = true; // LayoutMirroring.mirror: true
654 rootItemPrivate->isMirrorImplicit = false;
655 rootItemPrivate->inheritMirrorFromItem = true; // LayoutMirroring.inherit: true
656 rootItemPrivate->resolveLayoutMirror();
658 QEvent wa(QEvent::WindowActivate);
659 QApplication::sendEvent(canvas, &wa);
660 QFocusEvent fe(QEvent::FocusIn);
661 QApplication::sendEvent(canvas, &fe);
663 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
665 QVERIFY(item->hasActiveFocus());
668 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
669 Q_RETURN_ARG(QVariant, result)));
670 QVERIFY(result.toBool());
673 QKeyEvent key(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
674 QApplication::sendEvent(canvas, &key);
675 QVERIFY(key.isAccepted());
677 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
679 QVERIFY(item->hasActiveFocus());
682 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
683 QApplication::sendEvent(canvas, &key);
684 QVERIFY(key.isAccepted());
686 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
688 QVERIFY(item->hasActiveFocus());
693 void tst_QDeclarativeItem::keyNavigation_skipNotVisible()
695 QDeclarativeView *canvas = new QDeclarativeView(0);
696 canvas->setFixedSize(240,320);
698 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
700 qApp->processEvents();
702 QEvent wa(QEvent::WindowActivate);
703 QApplication::sendEvent(canvas, &wa);
704 QFocusEvent fe(QEvent::FocusIn);
705 QApplication::sendEvent(canvas, &fe);
707 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
709 QVERIFY(item->hasActiveFocus());
711 // Set item 2 to not visible
712 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
714 item->setVisible(false);
715 QVERIFY(!item->isVisible());
718 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
719 QApplication::sendEvent(canvas, &key);
720 QVERIFY(key.isAccepted());
722 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
724 QVERIFY(item->hasActiveFocus());
727 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
728 QApplication::sendEvent(canvas, &key);
729 QVERIFY(key.isAccepted());
731 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
733 QVERIFY(item->hasActiveFocus());
736 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
737 QApplication::sendEvent(canvas, &key);
738 QVERIFY(key.isAccepted());
740 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
742 QVERIFY(item->hasActiveFocus());
744 //Set item 3 to not visible
745 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
747 item->setVisible(false);
748 QVERIFY(!item->isVisible());
751 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
752 QApplication::sendEvent(canvas, &key);
753 QVERIFY(key.isAccepted());
755 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
757 QVERIFY(item->hasActiveFocus());
760 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
761 QApplication::sendEvent(canvas, &key);
762 QVERIFY(key.isAccepted());
764 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
766 QVERIFY(item->hasActiveFocus());
771 void tst_QDeclarativeItem::keyNavigation_implicitSetting()
773 QDeclarativeView *canvas = new QDeclarativeView(0);
774 canvas->setFixedSize(240,320);
776 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest_implicit.qml"));
778 qApp->processEvents();
780 QEvent wa(QEvent::WindowActivate);
781 QApplication::sendEvent(canvas, &wa);
782 QFocusEvent fe(QEvent::FocusIn);
783 QApplication::sendEvent(canvas, &fe);
785 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
787 QVERIFY(item->hasActiveFocus());
790 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
791 Q_RETURN_ARG(QVariant, result)));
792 QVERIFY(result.toBool());
795 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
796 QApplication::sendEvent(canvas, &key);
797 QVERIFY(key.isAccepted());
799 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
801 QVERIFY(item->hasActiveFocus());
804 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
805 QApplication::sendEvent(canvas, &key);
806 QVERIFY(key.isAccepted());
808 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
810 QVERIFY(item->hasActiveFocus());
813 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
814 QApplication::sendEvent(canvas, &key);
815 QVERIFY(key.isAccepted());
817 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
819 QVERIFY(item->hasActiveFocus());
822 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
823 QApplication::sendEvent(canvas, &key);
824 QVERIFY(key.isAccepted());
826 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
828 QVERIFY(item->hasActiveFocus());
831 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
832 QApplication::sendEvent(canvas, &key);
833 QVERIFY(key.isAccepted());
835 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
837 QVERIFY(item->hasActiveFocus());
840 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
841 QApplication::sendEvent(canvas, &key);
842 QVERIFY(key.isAccepted());
844 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
846 QVERIFY(item->hasActiveFocus());
849 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
850 QApplication::sendEvent(canvas, &key);
851 QVERIFY(key.isAccepted());
853 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
855 QVERIFY(item->hasActiveFocus());
858 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
859 QApplication::sendEvent(canvas, &key);
860 QVERIFY(key.isAccepted());
862 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
864 QVERIFY(item->hasActiveFocus());
867 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
868 QApplication::sendEvent(canvas, &key);
869 QVERIFY(key.isAccepted());
871 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
873 QVERIFY(item->hasActiveFocus());
876 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
877 QApplication::sendEvent(canvas, &key);
878 QVERIFY(key.isAccepted());
880 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
882 QVERIFY(item->hasActiveFocus());
885 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
886 QApplication::sendEvent(canvas, &key);
887 QVERIFY(key.isAccepted());
889 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
891 QVERIFY(item->hasActiveFocus());
896 void tst_QDeclarativeItem::smooth()
898 QDeclarativeComponent component(&engine);
899 component.setData("import QtQuick 1.0; Item { smooth: false; }", QUrl::fromLocalFile(""));
900 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
901 QSignalSpy spy(item, SIGNAL(smoothChanged(bool)));
904 QVERIFY(!item->smooth());
906 item->setSmooth(true);
907 QVERIFY(item->smooth());
908 QCOMPARE(spy.count(),1);
909 QList<QVariant> arguments = spy.first();
910 QVERIFY(arguments.count() == 1);
911 QVERIFY(arguments.at(0).toBool() == true);
913 item->setSmooth(true);
914 QCOMPARE(spy.count(),1);
916 item->setSmooth(false);
917 QVERIFY(!item->smooth());
918 QCOMPARE(spy.count(),2);
919 item->setSmooth(false);
920 QCOMPARE(spy.count(),2);
925 void tst_QDeclarativeItem::clip()
927 QDeclarativeComponent component(&engine);
928 component.setData("import QtQuick 1.0\nItem { clip: false\n }", QUrl::fromLocalFile(""));
929 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
930 QSignalSpy spy(item, SIGNAL(clipChanged(bool)));
933 QVERIFY(!item->clip());
936 QVERIFY(item->clip());
938 QList<QVariant> arguments = spy.first();
939 QVERIFY(arguments.count() == 1);
940 QVERIFY(arguments.at(0).toBool() == true);
942 QCOMPARE(spy.count(),1);
944 QCOMPARE(spy.count(),1);
946 item->setClip(false);
947 QVERIFY(!item->clip());
948 QCOMPARE(spy.count(),2);
949 item->setClip(false);
950 QCOMPARE(spy.count(),2);
955 void tst_QDeclarativeItem::mapCoordinates()
960 QDeclarativeView *canvas = new QDeclarativeView(0);
961 canvas->setFixedSize(300, 300);
962 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml"));
964 qApp->processEvents();
966 QDeclarativeItem *root = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
968 QDeclarativeItem *a = findItem<QDeclarativeItem>(canvas->rootObject(), "itemA");
970 QDeclarativeItem *b = findItem<QDeclarativeItem>(canvas->rootObject(), "itemB");
975 QVERIFY(QMetaObject::invokeMethod(root, "mapAToB",
976 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
977 QCOMPARE(result.value<QPointF>(), qobject_cast<QGraphicsItem*>(a)->mapToItem(b, x, y));
979 QVERIFY(QMetaObject::invokeMethod(root, "mapAFromB",
980 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
981 QCOMPARE(result.value<QPointF>(), qobject_cast<QGraphicsItem*>(a)->mapFromItem(b, x, y));
983 QVERIFY(QMetaObject::invokeMethod(root, "mapAToNull",
984 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
985 QCOMPARE(result.value<QPointF>(), qobject_cast<QGraphicsItem*>(a)->mapToScene(x, y));
987 QVERIFY(QMetaObject::invokeMethod(root, "mapAFromNull",
988 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
989 QCOMPARE(result.value<QPointF>(), qobject_cast<QGraphicsItem*>(a)->mapFromScene(x, y));
991 QString warning1 = QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml").toString() + ":7:5: QML Item: mapToItem() given argument \"1122\" which is neither null nor an Item";
992 QString warning2 = QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml").toString() + ":7:5: QML Item: mapFromItem() given argument \"1122\" which is neither null nor an Item";
994 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
995 QVERIFY(QMetaObject::invokeMethod(root, "checkMapAToInvalid",
996 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
997 QVERIFY(result.toBool());
999 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
1000 QVERIFY(QMetaObject::invokeMethod(root, "checkMapAFromInvalid",
1001 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
1002 QVERIFY(result.toBool());
1007 void tst_QDeclarativeItem::mapCoordinates_data()
1009 QTest::addColumn<int>("x");
1010 QTest::addColumn<int>("y");
1012 for (int i=-20; i<=20; i+=10)
1013 QTest::newRow(QTest::toString(i)) << i << i;
1016 void tst_QDeclarativeItem::transforms_data()
1018 QTest::addColumn<QByteArray>("qml");
1019 QTest::addColumn<QMatrix>("matrix");
1020 QTest::newRow("translate") << QByteArray("Translate { x: 10; y: 20 }")
1021 << QMatrix(1,0,0,1,10,20);
1022 QTest::newRow("rotation") << QByteArray("Rotation { angle: 90 }")
1023 << QMatrix(0,1,-1,0,0,0);
1024 QTest::newRow("scale") << QByteArray("Scale { xScale: 1.5; yScale: -2 }")
1025 << QMatrix(1.5,0,0,-2,0,0);
1026 QTest::newRow("sequence") << QByteArray("[ Translate { x: 10; y: 20 }, Scale { xScale: 1.5; yScale: -2 } ]")
1027 << QMatrix(1,0,0,1,10,20) * QMatrix(1.5,0,0,-2,0,0);
1030 void tst_QDeclarativeItem::transforms()
1032 QFETCH(QByteArray, qml);
1033 QFETCH(QMatrix, matrix);
1034 QDeclarativeComponent component(&engine);
1035 component.setData("import QtQuick 1.0\nItem { transform: "+qml+"}", QUrl::fromLocalFile(""));
1036 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
1038 QCOMPARE(item->sceneMatrix(), matrix);
1041 void tst_QDeclarativeItem::childrenProperty()
1043 QDeclarativeComponent component(&engine, SRCDIR "/data/childrenProperty.qml");
1045 QObject *o = component.create();
1048 QCOMPARE(o->property("test1").toBool(), true);
1049 QCOMPARE(o->property("test2").toBool(), true);
1050 QCOMPARE(o->property("test3").toBool(), true);
1051 QCOMPARE(o->property("test4").toBool(), true);
1052 QCOMPARE(o->property("test5").toBool(), true);
1056 void tst_QDeclarativeItem::resourcesProperty()
1058 QDeclarativeComponent component(&engine, SRCDIR "/data/resourcesProperty.qml");
1060 QObject *o = component.create();
1063 QCOMPARE(o->property("test1").toBool(), true);
1064 QCOMPARE(o->property("test2").toBool(), true);
1065 QCOMPARE(o->property("test3").toBool(), true);
1066 QCOMPARE(o->property("test4").toBool(), true);
1067 QCOMPARE(o->property("test5").toBool(), true);
1071 void tst_QDeclarativeItem::mouseFocus()
1073 QDeclarativeView *canvas = new QDeclarativeView(0);
1075 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/mouseFocus.qml"));
1077 QVERIFY(canvas->rootObject());
1078 QApplication::setActiveWindow(canvas);
1079 QTest::qWaitForWindowShown(canvas);
1080 QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
1082 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "declarativeItem");
1084 QSignalSpy focusSpy(item, SIGNAL(activeFocusChanged(bool)));
1086 QTest::mouseClick(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(item->scenePos()));
1087 QApplication::processEvents();
1088 QCOMPARE(focusSpy.count(), 1);
1089 QVERIFY(item->hasActiveFocus());
1091 // make sure focusable graphics widget underneath does not steal focus
1092 QTest::mouseClick(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(item->scenePos()));
1093 QApplication::processEvents();
1094 QCOMPARE(focusSpy.count(), 1);
1095 QVERIFY(item->hasActiveFocus());
1097 item->setFocus(false);
1098 QVERIFY(!item->hasActiveFocus());
1099 QCOMPARE(focusSpy.count(), 2);
1100 item->setFocus(true);
1101 QCOMPARE(focusSpy.count(), 3);
1106 void tst_QDeclarativeItem::propertyChanges()
1108 QDeclarativeView *canvas = new QDeclarativeView(0);
1109 canvas->setFixedSize(240,320);
1110 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml"));
1113 QEvent wa(QEvent::WindowActivate);
1114 QApplication::sendEvent(canvas, &wa);
1115 QFocusEvent fe(QEvent::FocusIn);
1116 QApplication::sendEvent(canvas, &fe);
1118 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item");
1119 QDeclarativeItem *parentItem = findItem<QDeclarativeItem>(canvas->rootObject(), "parentItem");
1122 QVERIFY(parentItem);
1124 QSignalSpy parentSpy(item, SIGNAL(parentChanged(QDeclarativeItem *)));
1125 QSignalSpy widthSpy(item, SIGNAL(widthChanged()));
1126 QSignalSpy heightSpy(item, SIGNAL(heightChanged()));
1127 QSignalSpy baselineOffsetSpy(item, SIGNAL(baselineOffsetChanged(qreal)));
1128 QSignalSpy childrenRectSpy(parentItem, SIGNAL(childrenRectChanged(QRectF)));
1129 QSignalSpy focusSpy(item, SIGNAL(focusChanged(bool)));
1130 QSignalSpy wantsFocusSpy(parentItem, SIGNAL(activeFocusChanged(bool)));
1131 QSignalSpy childrenChangedSpy(parentItem, SIGNAL(childrenChanged()));
1132 QSignalSpy xSpy(item, SIGNAL(xChanged()));
1133 QSignalSpy ySpy(item, SIGNAL(yChanged()));
1135 item->setParentItem(parentItem);
1136 item->setWidth(100.0);
1137 item->setHeight(200.0);
1138 item->setFocus(true);
1139 item->setBaselineOffset(10.0);
1141 QCOMPARE(item->parentItem(), parentItem);
1142 QCOMPARE(parentSpy.count(),1);
1143 QList<QVariant> parentArguments = parentSpy.first();
1144 QVERIFY(parentArguments.count() == 1);
1145 QCOMPARE(item->parentItem(), qvariant_cast<QDeclarativeItem *>(parentArguments.at(0)));
1146 QCOMPARE(childrenChangedSpy.count(),1);
1148 item->setParentItem(parentItem);
1149 QCOMPARE(childrenChangedSpy.count(),1);
1151 QCOMPARE(item->width(), 100.0);
1152 QCOMPARE(widthSpy.count(),1);
1154 QCOMPARE(item->height(), 200.0);
1155 QCOMPARE(heightSpy.count(),1);
1157 QCOMPARE(item->baselineOffset(), 10.0);
1158 QCOMPARE(baselineOffsetSpy.count(),1);
1159 QList<QVariant> baselineOffsetArguments = baselineOffsetSpy.first();
1160 QVERIFY(baselineOffsetArguments.count() == 1);
1161 QCOMPARE(item->baselineOffset(), baselineOffsetArguments.at(0).toReal());
1163 QCOMPARE(parentItem->childrenRect(), QRectF(0.0,0.0,100.0,200.0));
1164 QCOMPARE(childrenRectSpy.count(),2);
1165 QList<QVariant> childrenRectArguments = childrenRectSpy.at(1);
1166 QVERIFY(childrenRectArguments.count() == 1);
1167 QCOMPARE(parentItem->childrenRect(), childrenRectArguments.at(0).toRectF());
1169 QCOMPARE(item->hasActiveFocus(), true);
1170 QCOMPARE(focusSpy.count(),1);
1171 QList<QVariant> focusArguments = focusSpy.first();
1172 QVERIFY(focusArguments.count() == 1);
1173 QCOMPARE(focusArguments.at(0).toBool(), true);
1175 QCOMPARE(parentItem->hasActiveFocus(), false);
1176 QCOMPARE(parentItem->hasFocus(), false);
1177 QCOMPARE(wantsFocusSpy.count(),0);
1180 QCOMPARE(item->x(), 10.0);
1181 QCOMPARE(xSpy.count(), 1);
1184 QCOMPARE(item->y(), 10.0);
1185 QCOMPARE(ySpy.count(), 1);
1190 void tst_QDeclarativeItem::childrenRect()
1192 QDeclarativeView *canvas = new QDeclarativeView(0);
1193 canvas->setFixedSize(240,320);
1194 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRect.qml"));
1197 QGraphicsObject *o = canvas->rootObject();
1198 QDeclarativeItem *item = o->findChild<QDeclarativeItem*>("testItem");
1199 QCOMPARE(item->width(), qreal(0));
1200 QCOMPARE(item->height(), qreal(0));
1202 o->setProperty("childCount", 1);
1203 QCOMPARE(item->width(), qreal(10));
1204 QCOMPARE(item->height(), qreal(20));
1206 o->setProperty("childCount", 5);
1207 QCOMPARE(item->width(), qreal(50));
1208 QCOMPARE(item->height(), qreal(100));
1210 o->setProperty("childCount", 0);
1211 QCOMPARE(item->width(), qreal(0));
1212 QCOMPARE(item->height(), qreal(0));
1219 void tst_QDeclarativeItem::childrenRectBug()
1221 QDeclarativeView *canvas = new QDeclarativeView(0);
1222 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug.qml"));
1225 QGraphicsObject *o = canvas->rootObject();
1226 QDeclarativeItem *item = o->findChild<QDeclarativeItem*>("theItem");
1227 QCOMPARE(item->width(), qreal(200));
1228 QCOMPARE(item->height(), qreal(100));
1229 QCOMPARE(item->x(), qreal(100));
1235 void tst_QDeclarativeItem::childrenRectBug2()
1237 QDeclarativeView *canvas = new QDeclarativeView(0);
1238 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug2.qml"));
1241 QDeclarative1Rectangle *rect = qobject_cast<QDeclarative1Rectangle*>(canvas->rootObject());
1243 QDeclarativeItem *item = rect->findChild<QDeclarativeItem*>("theItem");
1244 QCOMPARE(item->width(), qreal(100));
1245 QCOMPARE(item->height(), qreal(110));
1246 QCOMPARE(item->x(), qreal(130));
1248 QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect);
1249 rectPrivate->setState("row");
1250 QCOMPARE(item->width(), qreal(210));
1251 QCOMPARE(item->height(), qreal(50));
1252 QCOMPARE(item->x(), qreal(75));
1258 void tst_QDeclarativeItem::childrenRectBug3()
1260 QDeclarativeView *canvas = new QDeclarativeView(0);
1261 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug3.qml"));
1264 //don't crash on delete
1269 void tst_QDeclarativeItem::transformCrash()
1271 QDeclarativeView *canvas = new QDeclarativeView(0);
1272 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/transformCrash.qml"));
1278 void tst_QDeclarativeItem::implicitSize()
1280 QDeclarativeView *canvas = new QDeclarativeView(0);
1281 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/implicitsize.qml"));
1284 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
1286 QCOMPARE(item->width(), qreal(80));
1287 QCOMPARE(item->height(), qreal(60));
1289 QCOMPARE(item->implicitWidth(), qreal(200));
1290 QCOMPARE(item->implicitHeight(), qreal(100));
1292 QMetaObject::invokeMethod(item, "resetSize");
1294 QCOMPARE(item->width(), qreal(200));
1295 QCOMPARE(item->height(), qreal(100));
1297 QMetaObject::invokeMethod(item, "changeImplicit");
1299 QCOMPARE(item->implicitWidth(), qreal(150));
1300 QCOMPARE(item->implicitHeight(), qreal(80));
1301 QCOMPARE(item->width(), qreal(150));
1302 QCOMPARE(item->height(), qreal(80));
1307 void tst_QDeclarativeItem::testQtQuick11Attributes()
1309 QFETCH(QString, code);
1310 QFETCH(QString, warning);
1311 QFETCH(QString, error);
1313 QDeclarativeEngine engine;
1316 QDeclarativeComponent valid(&engine);
1317 valid.setData("import QtQuick 1.1; Item { " + code.toUtf8() + " }", QUrl(""));
1318 obj = valid.create();
1320 QVERIFY(valid.errorString().isEmpty());
1323 QDeclarativeComponent invalid(&engine);
1324 invalid.setData("import QtQuick 1.0; Item { " + code.toUtf8() + " }", QUrl(""));
1325 QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
1326 obj = invalid.create();
1327 QCOMPARE(invalid.errorString(), error);
1331 void tst_QDeclarativeItem::testQtQuick11Attributes_data()
1333 QTest::addColumn<QString>("code");
1334 QTest::addColumn<QString>("warning");
1335 QTest::addColumn<QString>("error");
1337 QTest::newRow("implicitWidth") << "implicitWidth: 100"
1338 << "QDeclarativeComponent: Component is not ready"
1339 << ":1 \"Item.implicitWidth\" is not available in QtQuick 1.0.\n";
1341 QTest::newRow("implicitHeight") << "implicitHeight: 100"
1342 << "QDeclarativeComponent: Component is not ready"
1343 << ":1 \"Item.implicitHeight\" is not available in QtQuick 1.0.\n";
1345 QTest::newRow("onImplicitWidthChanged") << "onImplicitWidthChanged: x"
1346 << "QDeclarativeComponent: Component is not ready"
1347 << ":1 \"Item.onImplicitWidthChanged\" is not available in QtQuick 1.0.\n";
1349 QTest::newRow("onImplicitHeightChanged") << "onImplicitHeightChanged: x"
1350 << "QDeclarativeComponent: Component is not ready"
1351 << ":1 \"Item.onImplicitHeightChanged\" is not available in QtQuick 1.0.\n";
1354 void tst_QDeclarativeItem::qtbug_16871()
1356 QDeclarativeComponent component(&engine, SRCDIR "/data/qtbug_16871.qml");
1357 QObject *o = component.create();
1362 void tst_QDeclarativeItem::qtbug_21045()
1364 QDeclarativeComponent component(&engine);
1365 QGraphicsScene scene;
1366 component.setData("import QtQuick 1.1\nItem{visible: false; focus: true}", QUrl::fromLocalFile("file:"));
1367 QObject *o = component.create();
1368 QDeclarativeItem* i = qobject_cast<QDeclarativeItem*>(o);
1371 QVERIFY(!i->hasActiveFocus());
1374 QTEST_MAIN(tst_QDeclarativeItem)
1376 #include "tst_qdeclarativeitem.moc"