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 <QtDeclarative/qdeclarativeview.h>
47 #include <private/qdeclarativerectangle_p.h>
48 #include <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();
95 QDeclarativeEngine engine;
99 T *findItem(QGraphicsObject *parent, const QString &objectName)
104 const QMetaObject &mo = T::staticMetaObject;
105 //qDebug() << parent->QGraphicsObject::children().count() << "children";
106 for (int i = 0; i < parent->childItems().count(); ++i) {
107 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(parent->childItems().at(i));
110 //qDebug() << "try" << item;
111 if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName))
112 return static_cast<T*>(item);
113 item = findItem<T>(item, objectName);
115 return static_cast<T*>(item);
121 class KeysTestObject : public QObject
125 Q_PROPERTY(bool processLast READ processLast NOTIFY processLastChanged)
128 KeysTestObject() : mKey(0), mModifiers(0), mForwardedKey(0), mLast(false) {}
137 bool processLast() const { return mLast; }
138 void setProcessLast(bool b) {
141 emit processLastChanged();
146 void keyPress(int key, QString text, int modifiers) {
149 mModifiers = modifiers;
151 void keyRelease(int key, QString text, int modifiers) {
154 mModifiers = modifiers;
156 void forwardedKey(int key) {
161 void processLastChanged();
173 class KeyTestItem : public QDeclarativeItem
177 KeyTestItem(QDeclarativeItem *parent=0) : QDeclarativeItem(parent), mKey(0) {}
180 void keyPressEvent(QKeyEvent *e) {
181 keyPressPreHandler(e);
187 if (e->key() == Qt::Key_A)
192 if (!e->isAccepted())
193 QDeclarativeItem::keyPressEvent(e);
196 void keyReleaseEvent(QKeyEvent *e) {
197 keyReleasePreHandler(e);
202 if (e->key() == Qt::Key_B)
207 if (!e->isAccepted())
208 QDeclarativeItem::keyReleaseEvent(e);
215 QML_DECLARE_TYPE(KeyTestItem);
218 tst_QDeclarativeItem::tst_QDeclarativeItem()
222 void tst_QDeclarativeItem::initTestCase()
224 qmlRegisterType<KeyTestItem>("Test",1,0,"KeyTestItem");
227 void tst_QDeclarativeItem::keys()
229 QDeclarativeView *canvas = new QDeclarativeView(0);
230 canvas->setFixedSize(240,320);
232 KeysTestObject *testObject = new KeysTestObject;
233 canvas->rootContext()->setContextProperty("keysTestObject", testObject);
235 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
236 canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(true));
238 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keystest.qml"));
240 qApp->processEvents();
242 QEvent wa(QEvent::WindowActivate);
243 QApplication::sendEvent(canvas, &wa);
244 QFocusEvent fe(QEvent::FocusIn);
245 QApplication::sendEvent(canvas, &fe);
247 QVERIFY(canvas->rootObject());
248 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
250 QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
251 QApplication::sendEvent(canvas, &key);
252 QCOMPARE(testObject->mKey, int(Qt::Key_A));
253 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A));
254 QCOMPARE(testObject->mText, QLatin1String("A"));
255 QVERIFY(testObject->mModifiers == Qt::NoModifier);
256 QVERIFY(!key.isAccepted());
260 key = QKeyEvent(QEvent::KeyRelease, Qt::Key_A, Qt::ShiftModifier, "A", false, 1);
261 QApplication::sendEvent(canvas, &key);
262 QCOMPARE(testObject->mKey, int(Qt::Key_A));
263 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A));
264 QCOMPARE(testObject->mText, QLatin1String("A"));
265 QVERIFY(testObject->mModifiers == Qt::ShiftModifier);
266 QVERIFY(key.isAccepted());
270 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
271 QApplication::sendEvent(canvas, &key);
272 QCOMPARE(testObject->mKey, int(Qt::Key_Return));
273 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Return));
274 QCOMPARE(testObject->mText, QLatin1String("Return"));
275 QVERIFY(testObject->mModifiers == Qt::NoModifier);
276 QVERIFY(key.isAccepted());
280 key = QKeyEvent(QEvent::KeyPress, Qt::Key_0, Qt::NoModifier, "0", false, 1);
281 QApplication::sendEvent(canvas, &key);
282 QCOMPARE(testObject->mKey, int(Qt::Key_0));
283 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_0));
284 QCOMPARE(testObject->mText, QLatin1String("0"));
285 QVERIFY(testObject->mModifiers == Qt::NoModifier);
286 QVERIFY(key.isAccepted());
290 key = QKeyEvent(QEvent::KeyPress, Qt::Key_9, Qt::NoModifier, "9", false, 1);
291 QApplication::sendEvent(canvas, &key);
292 QCOMPARE(testObject->mKey, int(Qt::Key_9));
293 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_9));
294 QCOMPARE(testObject->mText, QLatin1String("9"));
295 QVERIFY(testObject->mModifiers == Qt::NoModifier);
296 QVERIFY(!key.isAccepted());
300 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
301 QApplication::sendEvent(canvas, &key);
302 QCOMPARE(testObject->mKey, int(Qt::Key_Tab));
303 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Tab));
304 QCOMPARE(testObject->mText, QLatin1String("Tab"));
305 QVERIFY(testObject->mModifiers == Qt::NoModifier);
306 QVERIFY(key.isAccepted());
310 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
311 QApplication::sendEvent(canvas, &key);
312 QCOMPARE(testObject->mKey, int(Qt::Key_Backtab));
313 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Backtab));
314 QCOMPARE(testObject->mText, QLatin1String("Backtab"));
315 QVERIFY(testObject->mModifiers == Qt::NoModifier);
316 QVERIFY(key.isAccepted());
320 canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(false));
321 key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
322 QApplication::sendEvent(canvas, &key);
323 QCOMPARE(testObject->mKey, int(Qt::Key_A));
324 QCOMPARE(testObject->mForwardedKey, 0);
325 QCOMPARE(testObject->mText, QLatin1String("A"));
326 QVERIFY(testObject->mModifiers == Qt::NoModifier);
327 QVERIFY(!key.isAccepted());
331 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(false));
332 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), false);
334 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
335 QApplication::sendEvent(canvas, &key);
336 QCOMPARE(testObject->mKey, 0);
337 QVERIFY(!key.isAccepted());
339 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
340 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
342 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
343 QApplication::sendEvent(canvas, &key);
344 QCOMPARE(testObject->mKey, int(Qt::Key_Return));
345 QVERIFY(key.isAccepted());
351 void tst_QDeclarativeItem::keysProcessingOrder()
353 QDeclarativeView *canvas = new QDeclarativeView(0);
354 canvas->setFixedSize(240,320);
356 KeysTestObject *testObject = new KeysTestObject;
357 canvas->rootContext()->setContextProperty("keysTestObject", testObject);
359 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keyspriority.qml"));
361 qApp->processEvents();
363 KeyTestItem *testItem = qobject_cast<KeyTestItem*>(canvas->rootObject());
366 QEvent wa(QEvent::WindowActivate);
367 QApplication::sendEvent(canvas, &wa);
368 QFocusEvent fe(QEvent::FocusIn);
369 QApplication::sendEvent(canvas, &fe);
371 QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
372 QApplication::sendEvent(canvas, &key);
373 QCOMPARE(testObject->mKey, int(Qt::Key_A));
374 QCOMPARE(testObject->mText, QLatin1String("A"));
375 QVERIFY(testObject->mModifiers == Qt::NoModifier);
376 QVERIFY(key.isAccepted());
380 testObject->setProcessLast(true);
382 key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
383 QApplication::sendEvent(canvas, &key);
384 QCOMPARE(testObject->mKey, 0);
385 QVERIFY(key.isAccepted());
389 key = QKeyEvent(QEvent::KeyPress, Qt::Key_B, Qt::NoModifier, "B", false, 1);
390 QApplication::sendEvent(canvas, &key);
391 QCOMPARE(testObject->mKey, int(Qt::Key_B));
392 QCOMPARE(testObject->mText, QLatin1String("B"));
393 QVERIFY(testObject->mModifiers == Qt::NoModifier);
394 QVERIFY(!key.isAccepted());
398 key = QKeyEvent(QEvent::KeyRelease, Qt::Key_B, Qt::NoModifier, "B", false, 1);
399 QApplication::sendEvent(canvas, &key);
400 QCOMPARE(testObject->mKey, 0);
401 QVERIFY(key.isAccepted());
407 QDeclarativeItemPrivate *childPrivate(QGraphicsObject *rootItem, const char * itemString)
409 QDeclarativeItem *item = findItem<QDeclarativeItem>(rootItem, QString(QLatin1String(itemString)));
410 QDeclarativeItemPrivate* itemPrivate = QDeclarativeItemPrivate::get(item);
414 QVariant childProperty(QGraphicsObject *rootItem, const char * itemString, const char * property)
416 QDeclarativeItem *item = findItem<QDeclarativeItem>(rootItem, QString(QLatin1String(itemString)));
417 return item->property(property);
420 bool anchorsMirrored(QGraphicsObject *rootItem, const char * itemString)
422 QDeclarativeItem *item = findItem<QDeclarativeItem>(rootItem, QString(QLatin1String(itemString)));
423 QDeclarativeItemPrivate* itemPrivate = QDeclarativeItemPrivate::get(item);
424 return itemPrivate->anchors()->mirrored();
427 void tst_QDeclarativeItem::layoutMirroring()
429 QDeclarativeView *canvas = new QDeclarativeView(0);
430 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/layoutmirroring.qml"));
433 QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
435 QDeclarativeItemPrivate *rootPrivate = QDeclarativeItemPrivate::get(rootItem);
436 QVERIFY(rootPrivate);
438 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
439 QCOMPARE(childPrivate(rootItem, "mirrored2")->effectiveLayoutMirror, true);
440 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
441 QCOMPARE(childPrivate(rootItem, "notMirrored2")->effectiveLayoutMirror, false);
442 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true);
443 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true);
445 QCOMPARE(anchorsMirrored(rootItem, "mirrored1"), true);
446 QCOMPARE(anchorsMirrored(rootItem, "mirrored2"), true);
447 QCOMPARE(anchorsMirrored(rootItem, "notMirrored1"), false);
448 QCOMPARE(anchorsMirrored(rootItem, "notMirrored2"), false);
449 QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror1"), true);
450 QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror2"), true);
452 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true);
453 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritedLayoutMirror, false);
454 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true);
455 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritedLayoutMirror, false);
456 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true);
457 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true);
459 QCOMPARE(childPrivate(rootItem, "mirrored1")->isMirrorImplicit, false);
460 QCOMPARE(childPrivate(rootItem, "mirrored2")->isMirrorImplicit, false);
461 QCOMPARE(childPrivate(rootItem, "notMirrored1")->isMirrorImplicit, false);
462 QCOMPARE(childPrivate(rootItem, "notMirrored2")->isMirrorImplicit, true);
463 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->isMirrorImplicit, true);
464 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->isMirrorImplicit, true);
466 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromParent, true);
467 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromParent, false);
468 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromParent, true);
469 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromParent, false);
470 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromParent, true);
471 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromParent, true);
473 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromItem, true);
474 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromItem, false);
475 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromItem, false);
476 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromItem, false);
477 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromItem, false);
478 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromItem, false);
480 // load dynamic content using Loader that needs to inherit mirroring
481 rootItem->setProperty("state", "newContent");
482 QCOMPARE(childPrivate(rootItem, "notMirrored3")->effectiveLayoutMirror, false);
483 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->effectiveLayoutMirror, true);
485 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritedLayoutMirror, true);
486 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritedLayoutMirror, true);
488 QCOMPARE(childPrivate(rootItem, "notMirrored3")->isMirrorImplicit, false);
489 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->isMirrorImplicit, true);
491 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromParent, true);
492 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritMirrorFromParent, true);
494 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false);
495 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false);
497 // disable inheritance
498 rootItem->setProperty("childrenInherit", false);
500 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, false);
501 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, false);
502 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
503 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
505 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, false);
506 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, false);
507 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, false);
508 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, false);
510 // re-enable inheritance
511 rootItem->setProperty("childrenInherit", true);
513 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true);
514 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true);
515 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
516 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
518 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true);
519 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true);
520 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true);
521 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true);
526 QDeclarativeItem *parentItem1 = new QDeclarativeItem();
527 QDeclarativeItemPrivate::get(parentItem1)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
528 QDeclarativeItemPrivate::get(parentItem1)->isMirrorImplicit = false;
529 QDeclarativeItemPrivate::get(parentItem1)->inheritMirrorFromItem = true; // LayoutMirroring.childrenInherit: true
530 QDeclarativeItemPrivate::get(parentItem1)->resolveLayoutMirror();
532 // inherit in constructor
533 QDeclarativeItem *childItem1 = new QDeclarativeItem(parentItem1);
534 QCOMPARE(QDeclarativeItemPrivate::get(childItem1)->effectiveLayoutMirror, true);
535 QCOMPARE(QDeclarativeItemPrivate::get(childItem1)->inheritMirrorFromParent, true);
537 // inherit through a parent change
538 QDeclarativeItem *childItem2 = new QDeclarativeItem();
539 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->effectiveLayoutMirror, false);
540 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->inheritMirrorFromParent, false);
541 childItem2->setParentItem(parentItem1);
542 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->effectiveLayoutMirror, true);
543 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->inheritMirrorFromParent, true);
545 // stop inherting through a parent change
546 QDeclarativeItem *parentItem2 = new QDeclarativeItem();
547 QDeclarativeItemPrivate::get(parentItem2)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
548 QDeclarativeItemPrivate::get(parentItem2)->resolveLayoutMirror();
549 childItem2->setParentItem(parentItem2);
550 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->effectiveLayoutMirror, false);
551 QCOMPARE(QDeclarativeItemPrivate::get(childItem2)->inheritMirrorFromParent, false);
557 void tst_QDeclarativeItem::layoutMirroringIllegalParent()
559 QDeclarativeComponent component(&engine);
560 component.setData("import QtQuick 1.1; QtObject { LayoutMirroring.enabled: true; LayoutMirroring.childrenInherit: true }", QUrl::fromLocalFile(""));
561 QTest::ignoreMessage(QtWarningMsg, "file::1:21: QML QtObject: LayoutDirection attached property only works with Items");
562 QObject *object = component.create();
563 QVERIFY(object != 0);
566 void tst_QDeclarativeItem::keyNavigation()
568 QDeclarativeView *canvas = new QDeclarativeView(0);
569 canvas->setFixedSize(240,320);
571 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
573 qApp->processEvents();
575 QEvent wa(QEvent::WindowActivate);
576 QApplication::sendEvent(canvas, &wa);
577 QFocusEvent fe(QEvent::FocusIn);
578 QApplication::sendEvent(canvas, &fe);
580 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
582 QVERIFY(item->hasActiveFocus());
585 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
586 Q_RETURN_ARG(QVariant, result)));
587 QVERIFY(result.toBool());
590 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
591 QApplication::sendEvent(canvas, &key);
592 QVERIFY(key.isAccepted());
594 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
596 QVERIFY(item->hasActiveFocus());
599 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
600 QApplication::sendEvent(canvas, &key);
601 QVERIFY(key.isAccepted());
603 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
605 QVERIFY(item->hasActiveFocus());
608 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
609 QApplication::sendEvent(canvas, &key);
610 QVERIFY(key.isAccepted());
612 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
614 QVERIFY(item->hasActiveFocus());
617 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
618 QApplication::sendEvent(canvas, &key);
619 QVERIFY(key.isAccepted());
621 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
623 QVERIFY(item->hasActiveFocus());
626 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
627 QApplication::sendEvent(canvas, &key);
628 QVERIFY(key.isAccepted());
630 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
632 QVERIFY(item->hasActiveFocus());
635 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
636 QApplication::sendEvent(canvas, &key);
637 QVERIFY(key.isAccepted());
639 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
641 QVERIFY(item->hasActiveFocus());
646 void tst_QDeclarativeItem::keyNavigation_RightToLeft()
648 QDeclarativeView *canvas = new QDeclarativeView(0);
649 canvas->setFixedSize(240,320);
651 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
653 qApp->processEvents();
655 QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
657 QDeclarativeItemPrivate* rootItemPrivate = QDeclarativeItemPrivate::get(rootItem);
659 rootItemPrivate->effectiveLayoutMirror = true; // LayoutMirroring.mirror: true
660 rootItemPrivate->isMirrorImplicit = false;
661 rootItemPrivate->inheritMirrorFromItem = true; // LayoutMirroring.inherit: true
662 rootItemPrivate->resolveLayoutMirror();
664 QEvent wa(QEvent::WindowActivate);
665 QApplication::sendEvent(canvas, &wa);
666 QFocusEvent fe(QEvent::FocusIn);
667 QApplication::sendEvent(canvas, &fe);
669 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
671 QVERIFY(item->hasActiveFocus());
674 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
675 Q_RETURN_ARG(QVariant, result)));
676 QVERIFY(result.toBool());
679 QKeyEvent key(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
680 QApplication::sendEvent(canvas, &key);
681 QVERIFY(key.isAccepted());
683 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
685 QVERIFY(item->hasActiveFocus());
688 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
689 QApplication::sendEvent(canvas, &key);
690 QVERIFY(key.isAccepted());
692 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
694 QVERIFY(item->hasActiveFocus());
699 void tst_QDeclarativeItem::keyNavigation_skipNotVisible()
701 QDeclarativeView *canvas = new QDeclarativeView(0);
702 canvas->setFixedSize(240,320);
704 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest.qml"));
706 qApp->processEvents();
708 QEvent wa(QEvent::WindowActivate);
709 QApplication::sendEvent(canvas, &wa);
710 QFocusEvent fe(QEvent::FocusIn);
711 QApplication::sendEvent(canvas, &fe);
713 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
715 QVERIFY(item->hasActiveFocus());
717 // Set item 2 to not visible
718 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
720 item->setVisible(false);
721 QVERIFY(!item->isVisible());
724 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
725 QApplication::sendEvent(canvas, &key);
726 QVERIFY(key.isAccepted());
728 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
730 QVERIFY(item->hasActiveFocus());
733 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
734 QApplication::sendEvent(canvas, &key);
735 QVERIFY(key.isAccepted());
737 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
739 QVERIFY(item->hasActiveFocus());
742 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
743 QApplication::sendEvent(canvas, &key);
744 QVERIFY(key.isAccepted());
746 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
748 QVERIFY(item->hasActiveFocus());
750 //Set item 3 to not visible
751 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
753 item->setVisible(false);
754 QVERIFY(!item->isVisible());
757 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
758 QApplication::sendEvent(canvas, &key);
759 QVERIFY(key.isAccepted());
761 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
763 QVERIFY(item->hasActiveFocus());
766 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
767 QApplication::sendEvent(canvas, &key);
768 QVERIFY(key.isAccepted());
770 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
772 QVERIFY(item->hasActiveFocus());
777 void tst_QDeclarativeItem::keyNavigation_implicitSetting()
779 QDeclarativeView *canvas = new QDeclarativeView(0);
780 canvas->setFixedSize(240,320);
782 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigationtest_implicit.qml"));
784 qApp->processEvents();
786 QEvent wa(QEvent::WindowActivate);
787 QApplication::sendEvent(canvas, &wa);
788 QFocusEvent fe(QEvent::FocusIn);
789 QApplication::sendEvent(canvas, &fe);
791 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
793 QVERIFY(item->hasActiveFocus());
796 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
797 Q_RETURN_ARG(QVariant, result)));
798 QVERIFY(result.toBool());
801 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
802 QApplication::sendEvent(canvas, &key);
803 QVERIFY(key.isAccepted());
805 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
807 QVERIFY(item->hasActiveFocus());
810 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
811 QApplication::sendEvent(canvas, &key);
812 QVERIFY(key.isAccepted());
814 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
816 QVERIFY(item->hasActiveFocus());
819 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
820 QApplication::sendEvent(canvas, &key);
821 QVERIFY(key.isAccepted());
823 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
825 QVERIFY(item->hasActiveFocus());
828 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
829 QApplication::sendEvent(canvas, &key);
830 QVERIFY(key.isAccepted());
832 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
834 QVERIFY(item->hasActiveFocus());
837 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
838 QApplication::sendEvent(canvas, &key);
839 QVERIFY(key.isAccepted());
841 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
843 QVERIFY(item->hasActiveFocus());
846 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
847 QApplication::sendEvent(canvas, &key);
848 QVERIFY(key.isAccepted());
850 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
852 QVERIFY(item->hasActiveFocus());
855 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
856 QApplication::sendEvent(canvas, &key);
857 QVERIFY(key.isAccepted());
859 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item2");
861 QVERIFY(item->hasActiveFocus());
864 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
865 QApplication::sendEvent(canvas, &key);
866 QVERIFY(key.isAccepted());
868 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
870 QVERIFY(item->hasActiveFocus());
873 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
874 QApplication::sendEvent(canvas, &key);
875 QVERIFY(key.isAccepted());
877 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item1");
879 QVERIFY(item->hasActiveFocus());
882 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
883 QApplication::sendEvent(canvas, &key);
884 QVERIFY(key.isAccepted());
886 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item4");
888 QVERIFY(item->hasActiveFocus());
891 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
892 QApplication::sendEvent(canvas, &key);
893 QVERIFY(key.isAccepted());
895 item = findItem<QDeclarativeItem>(canvas->rootObject(), "item3");
897 QVERIFY(item->hasActiveFocus());
902 void tst_QDeclarativeItem::smooth()
904 QDeclarativeComponent component(&engine);
905 component.setData("import QtQuick 1.0; Item { smooth: false; }", QUrl::fromLocalFile(""));
906 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
907 QSignalSpy spy(item, SIGNAL(smoothChanged(bool)));
910 QVERIFY(!item->smooth());
912 item->setSmooth(true);
913 QVERIFY(item->smooth());
914 QCOMPARE(spy.count(),1);
915 QList<QVariant> arguments = spy.first();
916 QVERIFY(arguments.count() == 1);
917 QVERIFY(arguments.at(0).toBool() == true);
919 item->setSmooth(true);
920 QCOMPARE(spy.count(),1);
922 item->setSmooth(false);
923 QVERIFY(!item->smooth());
924 QCOMPARE(spy.count(),2);
925 item->setSmooth(false);
926 QCOMPARE(spy.count(),2);
931 void tst_QDeclarativeItem::clip()
933 QDeclarativeComponent component(&engine);
934 component.setData("import QtQuick 1.0\nItem { clip: false\n }", QUrl::fromLocalFile(""));
935 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
936 QSignalSpy spy(item, SIGNAL(clipChanged(bool)));
939 QVERIFY(!item->clip());
942 QVERIFY(item->clip());
944 QList<QVariant> arguments = spy.first();
945 QVERIFY(arguments.count() == 1);
946 QVERIFY(arguments.at(0).toBool() == true);
948 QCOMPARE(spy.count(),1);
950 QCOMPARE(spy.count(),1);
952 item->setClip(false);
953 QVERIFY(!item->clip());
954 QCOMPARE(spy.count(),2);
955 item->setClip(false);
956 QCOMPARE(spy.count(),2);
961 void tst_QDeclarativeItem::mapCoordinates()
966 QDeclarativeView *canvas = new QDeclarativeView(0);
967 canvas->setFixedSize(300, 300);
968 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml"));
970 qApp->processEvents();
972 QDeclarativeItem *root = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
974 QDeclarativeItem *a = findItem<QDeclarativeItem>(canvas->rootObject(), "itemA");
976 QDeclarativeItem *b = findItem<QDeclarativeItem>(canvas->rootObject(), "itemB");
981 QVERIFY(QMetaObject::invokeMethod(root, "mapAToB",
982 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
983 QCOMPARE(result.value<QPointF>(), qobject_cast<QGraphicsItem*>(a)->mapToItem(b, x, y));
985 QVERIFY(QMetaObject::invokeMethod(root, "mapAFromB",
986 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
987 QCOMPARE(result.value<QPointF>(), qobject_cast<QGraphicsItem*>(a)->mapFromItem(b, x, y));
989 QVERIFY(QMetaObject::invokeMethod(root, "mapAToNull",
990 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
991 QCOMPARE(result.value<QPointF>(), qobject_cast<QGraphicsItem*>(a)->mapToScene(x, y));
993 QVERIFY(QMetaObject::invokeMethod(root, "mapAFromNull",
994 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
995 QCOMPARE(result.value<QPointF>(), qobject_cast<QGraphicsItem*>(a)->mapFromScene(x, y));
997 QString warning1 = QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml").toString() + ":7:5: QML Item: mapToItem() given argument \"1122\" which is neither null nor an Item";
998 QString warning2 = QUrl::fromLocalFile(SRCDIR "/data/mapCoordinates.qml").toString() + ":7:5: QML Item: mapFromItem() given argument \"1122\" which is neither null nor an Item";
1000 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
1001 QVERIFY(QMetaObject::invokeMethod(root, "checkMapAToInvalid",
1002 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
1003 QVERIFY(result.toBool());
1005 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
1006 QVERIFY(QMetaObject::invokeMethod(root, "checkMapAFromInvalid",
1007 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
1008 QVERIFY(result.toBool());
1013 void tst_QDeclarativeItem::mapCoordinates_data()
1015 QTest::addColumn<int>("x");
1016 QTest::addColumn<int>("y");
1018 for (int i=-20; i<=20; i+=10)
1019 QTest::newRow(QTest::toString(i)) << i << i;
1022 void tst_QDeclarativeItem::transforms_data()
1024 QTest::addColumn<QByteArray>("qml");
1025 QTest::addColumn<QMatrix>("matrix");
1026 QTest::newRow("translate") << QByteArray("Translate { x: 10; y: 20 }")
1027 << QMatrix(1,0,0,1,10,20);
1028 QTest::newRow("rotation") << QByteArray("Rotation { angle: 90 }")
1029 << QMatrix(0,1,-1,0,0,0);
1030 QTest::newRow("scale") << QByteArray("Scale { xScale: 1.5; yScale: -2 }")
1031 << QMatrix(1.5,0,0,-2,0,0);
1032 QTest::newRow("sequence") << QByteArray("[ Translate { x: 10; y: 20 }, Scale { xScale: 1.5; yScale: -2 } ]")
1033 << QMatrix(1,0,0,1,10,20) * QMatrix(1.5,0,0,-2,0,0);
1036 void tst_QDeclarativeItem::transforms()
1038 QFETCH(QByteArray, qml);
1039 QFETCH(QMatrix, matrix);
1040 QDeclarativeComponent component(&engine);
1041 component.setData("import QtQuick 1.0\nItem { transform: "+qml+"}", QUrl::fromLocalFile(""));
1042 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(component.create());
1044 QCOMPARE(item->sceneMatrix(), matrix);
1047 void tst_QDeclarativeItem::childrenProperty()
1049 QDeclarativeComponent component(&engine, SRCDIR "/data/childrenProperty.qml");
1051 QObject *o = component.create();
1054 QCOMPARE(o->property("test1").toBool(), true);
1055 QCOMPARE(o->property("test2").toBool(), true);
1056 QCOMPARE(o->property("test3").toBool(), true);
1057 QCOMPARE(o->property("test4").toBool(), true);
1058 QCOMPARE(o->property("test5").toBool(), true);
1062 void tst_QDeclarativeItem::resourcesProperty()
1064 QDeclarativeComponent component(&engine, SRCDIR "/data/resourcesProperty.qml");
1066 QObject *o = component.create();
1069 QCOMPARE(o->property("test1").toBool(), true);
1070 QCOMPARE(o->property("test2").toBool(), true);
1071 QCOMPARE(o->property("test3").toBool(), true);
1072 QCOMPARE(o->property("test4").toBool(), true);
1073 QCOMPARE(o->property("test5").toBool(), true);
1077 void tst_QDeclarativeItem::mouseFocus()
1079 QDeclarativeView *canvas = new QDeclarativeView(0);
1081 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/mouseFocus.qml"));
1083 QVERIFY(canvas->rootObject());
1084 QApplication::setActiveWindow(canvas);
1085 QTest::qWaitForWindowShown(canvas);
1086 QTRY_COMPARE(QApplication::activeWindow(), static_cast<QWidget *>(canvas));
1088 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "declarativeItem");
1090 QSignalSpy focusSpy(item, SIGNAL(activeFocusChanged(bool)));
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 // make sure focusable graphics widget underneath does not steal focus
1098 QTest::mouseClick(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(item->scenePos()));
1099 QApplication::processEvents();
1100 QCOMPARE(focusSpy.count(), 1);
1101 QVERIFY(item->hasActiveFocus());
1103 item->setFocus(false);
1104 QVERIFY(!item->hasActiveFocus());
1105 QCOMPARE(focusSpy.count(), 2);
1106 item->setFocus(true);
1107 QCOMPARE(focusSpy.count(), 3);
1112 void tst_QDeclarativeItem::propertyChanges()
1114 QDeclarativeView *canvas = new QDeclarativeView(0);
1115 canvas->setFixedSize(240,320);
1116 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/propertychanges.qml"));
1119 QEvent wa(QEvent::WindowActivate);
1120 QApplication::sendEvent(canvas, &wa);
1121 QFocusEvent fe(QEvent::FocusIn);
1122 QApplication::sendEvent(canvas, &fe);
1124 QDeclarativeItem *item = findItem<QDeclarativeItem>(canvas->rootObject(), "item");
1125 QDeclarativeItem *parentItem = findItem<QDeclarativeItem>(canvas->rootObject(), "parentItem");
1128 QVERIFY(parentItem);
1130 QSignalSpy parentSpy(item, SIGNAL(parentChanged(QDeclarativeItem *)));
1131 QSignalSpy widthSpy(item, SIGNAL(widthChanged()));
1132 QSignalSpy heightSpy(item, SIGNAL(heightChanged()));
1133 QSignalSpy baselineOffsetSpy(item, SIGNAL(baselineOffsetChanged(qreal)));
1134 QSignalSpy childrenRectSpy(parentItem, SIGNAL(childrenRectChanged(QRectF)));
1135 QSignalSpy focusSpy(item, SIGNAL(focusChanged(bool)));
1136 QSignalSpy wantsFocusSpy(parentItem, SIGNAL(activeFocusChanged(bool)));
1137 QSignalSpy childrenChangedSpy(parentItem, SIGNAL(childrenChanged()));
1138 QSignalSpy xSpy(item, SIGNAL(xChanged()));
1139 QSignalSpy ySpy(item, SIGNAL(yChanged()));
1141 item->setParentItem(parentItem);
1142 item->setWidth(100.0);
1143 item->setHeight(200.0);
1144 item->setFocus(true);
1145 item->setBaselineOffset(10.0);
1147 QCOMPARE(item->parentItem(), parentItem);
1148 QCOMPARE(parentSpy.count(),1);
1149 QList<QVariant> parentArguments = parentSpy.first();
1150 QVERIFY(parentArguments.count() == 1);
1151 QCOMPARE(item->parentItem(), qvariant_cast<QDeclarativeItem *>(parentArguments.at(0)));
1152 QCOMPARE(childrenChangedSpy.count(),1);
1154 item->setParentItem(parentItem);
1155 QCOMPARE(childrenChangedSpy.count(),1);
1157 QCOMPARE(item->width(), 100.0);
1158 QCOMPARE(widthSpy.count(),1);
1160 QCOMPARE(item->height(), 200.0);
1161 QCOMPARE(heightSpy.count(),1);
1163 QCOMPARE(item->baselineOffset(), 10.0);
1164 QCOMPARE(baselineOffsetSpy.count(),1);
1165 QList<QVariant> baselineOffsetArguments = baselineOffsetSpy.first();
1166 QVERIFY(baselineOffsetArguments.count() == 1);
1167 QCOMPARE(item->baselineOffset(), baselineOffsetArguments.at(0).toReal());
1169 QCOMPARE(parentItem->childrenRect(), QRectF(0.0,0.0,100.0,200.0));
1170 QCOMPARE(childrenRectSpy.count(),2);
1171 QList<QVariant> childrenRectArguments = childrenRectSpy.at(1);
1172 QVERIFY(childrenRectArguments.count() == 1);
1173 QCOMPARE(parentItem->childrenRect(), childrenRectArguments.at(0).toRectF());
1175 QCOMPARE(item->hasActiveFocus(), true);
1176 QCOMPARE(focusSpy.count(),1);
1177 QList<QVariant> focusArguments = focusSpy.first();
1178 QVERIFY(focusArguments.count() == 1);
1179 QCOMPARE(focusArguments.at(0).toBool(), true);
1181 QCOMPARE(parentItem->hasActiveFocus(), false);
1182 QCOMPARE(parentItem->hasFocus(), false);
1183 QCOMPARE(wantsFocusSpy.count(),0);
1186 QCOMPARE(item->x(), 10.0);
1187 QCOMPARE(xSpy.count(), 1);
1190 QCOMPARE(item->y(), 10.0);
1191 QCOMPARE(ySpy.count(), 1);
1196 void tst_QDeclarativeItem::childrenRect()
1198 QDeclarativeView *canvas = new QDeclarativeView(0);
1199 canvas->setFixedSize(240,320);
1200 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRect.qml"));
1203 QGraphicsObject *o = canvas->rootObject();
1204 QDeclarativeItem *item = o->findChild<QDeclarativeItem*>("testItem");
1205 QCOMPARE(item->width(), qreal(0));
1206 QCOMPARE(item->height(), qreal(0));
1208 o->setProperty("childCount", 1);
1209 QCOMPARE(item->width(), qreal(10));
1210 QCOMPARE(item->height(), qreal(20));
1212 o->setProperty("childCount", 5);
1213 QCOMPARE(item->width(), qreal(50));
1214 QCOMPARE(item->height(), qreal(100));
1216 o->setProperty("childCount", 0);
1217 QCOMPARE(item->width(), qreal(0));
1218 QCOMPARE(item->height(), qreal(0));
1225 void tst_QDeclarativeItem::childrenRectBug()
1227 QDeclarativeView *canvas = new QDeclarativeView(0);
1228 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug.qml"));
1231 QGraphicsObject *o = canvas->rootObject();
1232 QDeclarativeItem *item = o->findChild<QDeclarativeItem*>("theItem");
1233 QCOMPARE(item->width(), qreal(200));
1234 QCOMPARE(item->height(), qreal(100));
1235 QCOMPARE(item->x(), qreal(100));
1241 void tst_QDeclarativeItem::childrenRectBug2()
1243 QDeclarativeView *canvas = new QDeclarativeView(0);
1244 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug2.qml"));
1247 QDeclarativeRectangle *rect = qobject_cast<QDeclarativeRectangle*>(canvas->rootObject());
1249 QDeclarativeItem *item = rect->findChild<QDeclarativeItem*>("theItem");
1250 QCOMPARE(item->width(), qreal(100));
1251 QCOMPARE(item->height(), qreal(110));
1252 QCOMPARE(item->x(), qreal(130));
1254 QDeclarativeItemPrivate *rectPrivate = QDeclarativeItemPrivate::get(rect);
1255 rectPrivate->setState("row");
1256 QCOMPARE(item->width(), qreal(210));
1257 QCOMPARE(item->height(), qreal(50));
1258 QCOMPARE(item->x(), qreal(75));
1264 void tst_QDeclarativeItem::childrenRectBug3()
1266 QDeclarativeView *canvas = new QDeclarativeView(0);
1267 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/childrenRectBug3.qml"));
1270 //don't crash on delete
1275 void tst_QDeclarativeItem::transformCrash()
1277 QDeclarativeView *canvas = new QDeclarativeView(0);
1278 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/transformCrash.qml"));
1284 void tst_QDeclarativeItem::implicitSize()
1286 QDeclarativeView *canvas = new QDeclarativeView(0);
1287 canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/implicitsize.qml"));
1290 QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
1292 QCOMPARE(item->width(), qreal(80));
1293 QCOMPARE(item->height(), qreal(60));
1295 QCOMPARE(item->implicitWidth(), qreal(200));
1296 QCOMPARE(item->implicitHeight(), qreal(100));
1298 QMetaObject::invokeMethod(item, "resetSize");
1300 QCOMPARE(item->width(), qreal(200));
1301 QCOMPARE(item->height(), qreal(100));
1303 QMetaObject::invokeMethod(item, "changeImplicit");
1305 QCOMPARE(item->implicitWidth(), qreal(150));
1306 QCOMPARE(item->implicitHeight(), qreal(80));
1307 QCOMPARE(item->width(), qreal(150));
1308 QCOMPARE(item->height(), qreal(80));
1313 void tst_QDeclarativeItem::testQtQuick11Attributes()
1315 QFETCH(QString, code);
1316 QFETCH(QString, warning);
1317 QFETCH(QString, error);
1319 QDeclarativeEngine engine;
1322 QDeclarativeComponent valid(&engine);
1323 valid.setData("import QtQuick 1.1; Item { " + code.toUtf8() + " }", QUrl(""));
1324 obj = valid.create();
1326 QVERIFY(valid.errorString().isEmpty());
1329 QDeclarativeComponent invalid(&engine);
1330 invalid.setData("import QtQuick 1.0; Item { " + code.toUtf8() + " }", QUrl(""));
1331 QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
1332 obj = invalid.create();
1333 QCOMPARE(invalid.errorString(), error);
1337 void tst_QDeclarativeItem::testQtQuick11Attributes_data()
1339 QTest::addColumn<QString>("code");
1340 QTest::addColumn<QString>("warning");
1341 QTest::addColumn<QString>("error");
1343 QTest::newRow("implicitWidth") << "implicitWidth: 100"
1344 << "QDeclarativeComponent: Component is not ready"
1345 << ":1 \"Item.implicitWidth\" is not available in QtQuick 1.0.\n";
1347 QTest::newRow("implicitHeight") << "implicitHeight: 100"
1348 << "QDeclarativeComponent: Component is not ready"
1349 << ":1 \"Item.implicitHeight\" is not available in QtQuick 1.0.\n";
1351 QTest::newRow("onImplicitWidthChanged") << "onImplicitWidthChanged: x"
1352 << "QDeclarativeComponent: Component is not ready"
1353 << ":1 \"Item.onImplicitWidthChanged\" is not available in QtQuick 1.0.\n";
1355 QTest::newRow("onImplicitHeightChanged") << "onImplicitHeightChanged: x"
1356 << "QDeclarativeComponent: Component is not ready"
1357 << ":1 \"Item.onImplicitHeightChanged\" is not available in QtQuick 1.0.\n";
1360 void tst_QDeclarativeItem::qtbug_16871()
1362 QDeclarativeComponent component(&engine, SRCDIR "/data/qtbug_16871.qml");
1363 QObject *o = component.create();
1368 QTEST_MAIN(tst_QDeclarativeItem)
1370 #include "tst_qdeclarativeitem.moc"