Initial import from the monolithic Qt.
[profile/ivi/qtdeclarative.git] / tests / auto / declarative / qdeclarativemousearea / tst_qdeclarativemousearea.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
6 **
7 ** This file is part of the test suite of the Qt Toolkit.
8 **
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file.  Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23 **
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27 **
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
30 **
31 **
32 **
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include <QtTest/QtTest>
43 #include <QtTest/QSignalSpy>
44 #include <private/qdeclarativemousearea_p.h>
45 #include <private/qdeclarativerectangle_p.h>
46 #include <private/qdeclarativeflickable_p.h>
47 #include <QtDeclarative/qdeclarativeview.h>
48 #include <QtDeclarative/qdeclarativecontext.h>
49 #include <QtDeclarative/qdeclarativeengine.h>
50
51 #ifdef Q_OS_SYMBIAN
52 // In Symbian OS test data is located in applications private dir
53 #define SRCDIR "."
54 #endif
55
56 class tst_QDeclarativeMouseArea: public QObject
57 {
58     Q_OBJECT
59 private slots:
60     void dragProperties();
61     void resetDrag();
62     void dragging();
63     void updateMouseAreaPosOnClick();
64     void updateMouseAreaPosOnResize();
65     void noOnClickedWithPressAndHold();
66     void onMousePressRejected();
67     void doubleClick();
68     void clickTwice();
69     void pressedOrdering();
70     void preventStealing();
71     void testQtQuick11Attributes();
72     void testQtQuick11Attributes_data();
73
74 private:
75     QDeclarativeView *createView();
76 };
77
78 void tst_QDeclarativeMouseArea::dragProperties()
79 {
80     QDeclarativeView *canvas = createView();
81     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragproperties.qml"));
82     canvas->show();
83     canvas->setFocus();
84     QVERIFY(canvas->rootObject() != 0);
85
86     QDeclarativeMouseArea *mouseRegion = canvas->rootObject()->findChild<QDeclarativeMouseArea*>("mouseregion");
87     QDeclarativeDrag *drag = mouseRegion->drag();
88     QVERIFY(mouseRegion != 0);
89     QVERIFY(drag != 0);
90
91     // target
92     QDeclarativeItem *blackRect = canvas->rootObject()->findChild<QDeclarativeItem*>("blackrect");
93     QVERIFY(blackRect != 0);
94     QVERIFY(blackRect == drag->target());
95     QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
96     QVERIFY(rootItem != 0);
97     QSignalSpy targetSpy(drag, SIGNAL(targetChanged()));
98     drag->setTarget(rootItem);
99     QCOMPARE(targetSpy.count(),1);
100     drag->setTarget(rootItem);
101     QCOMPARE(targetSpy.count(),1);
102
103     // axis
104     QCOMPARE(drag->axis(), QDeclarativeDrag::XandYAxis);
105     QSignalSpy axisSpy(drag, SIGNAL(axisChanged()));
106     drag->setAxis(QDeclarativeDrag::XAxis);
107     QCOMPARE(drag->axis(), QDeclarativeDrag::XAxis);
108     QCOMPARE(axisSpy.count(),1);
109     drag->setAxis(QDeclarativeDrag::XAxis);
110     QCOMPARE(axisSpy.count(),1);
111
112     // minimum and maximum properties
113     QSignalSpy xminSpy(drag, SIGNAL(minimumXChanged()));
114     QSignalSpy xmaxSpy(drag, SIGNAL(maximumXChanged()));
115     QSignalSpy yminSpy(drag, SIGNAL(minimumYChanged()));
116     QSignalSpy ymaxSpy(drag, SIGNAL(maximumYChanged()));
117
118     QCOMPARE(drag->xmin(), 0.0);
119     QCOMPARE(drag->xmax(), rootItem->width()-blackRect->width());
120     QCOMPARE(drag->ymin(), 0.0);
121     QCOMPARE(drag->ymax(), rootItem->height()-blackRect->height());
122
123     drag->setXmin(10);
124     drag->setXmax(10);
125     drag->setYmin(10);
126     drag->setYmax(10);
127
128     QCOMPARE(drag->xmin(), 10.0);
129     QCOMPARE(drag->xmax(), 10.0);
130     QCOMPARE(drag->ymin(), 10.0);
131     QCOMPARE(drag->ymax(), 10.0);
132
133     QCOMPARE(xminSpy.count(),1);
134     QCOMPARE(xmaxSpy.count(),1);
135     QCOMPARE(yminSpy.count(),1);
136     QCOMPARE(ymaxSpy.count(),1);
137
138     drag->setXmin(10);
139     drag->setXmax(10);
140     drag->setYmin(10);
141     drag->setYmax(10);
142
143     QCOMPARE(xminSpy.count(),1);
144     QCOMPARE(xmaxSpy.count(),1);
145     QCOMPARE(yminSpy.count(),1);
146     QCOMPARE(ymaxSpy.count(),1);
147
148     // filterChildren
149     QSignalSpy filterChildrenSpy(drag, SIGNAL(filterChildrenChanged()));
150
151     drag->setFilterChildren(true);
152
153     QVERIFY(drag->filterChildren());
154     QCOMPARE(filterChildrenSpy.count(), 1);
155
156     drag->setFilterChildren(true);
157     QCOMPARE(filterChildrenSpy.count(), 1);
158
159     delete canvas;
160 }
161
162 void tst_QDeclarativeMouseArea::resetDrag()
163 {
164     QDeclarativeView *canvas = createView();
165
166     canvas->rootContext()->setContextProperty("haveTarget", QVariant(true));
167     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragreset.qml"));
168     canvas->show();
169     canvas->setFocus();
170     QVERIFY(canvas->rootObject() != 0);
171
172     QDeclarativeMouseArea *mouseRegion = canvas->rootObject()->findChild<QDeclarativeMouseArea*>("mouseregion");
173     QDeclarativeDrag *drag = mouseRegion->drag();
174     QVERIFY(mouseRegion != 0);
175     QVERIFY(drag != 0);
176
177     // target
178     QDeclarativeItem *blackRect = canvas->rootObject()->findChild<QDeclarativeItem*>("blackrect");
179     QVERIFY(blackRect != 0);
180     QVERIFY(blackRect == drag->target());
181     QDeclarativeItem *rootItem = qobject_cast<QDeclarativeItem*>(canvas->rootObject());
182     QVERIFY(rootItem != 0);
183     QSignalSpy targetSpy(drag, SIGNAL(targetChanged()));
184     QVERIFY(drag->target() != 0);
185     canvas->rootContext()->setContextProperty("haveTarget", QVariant(false));
186     QCOMPARE(targetSpy.count(),1);
187     QVERIFY(drag->target() == 0);
188
189     delete canvas;
190 }
191
192
193 void tst_QDeclarativeMouseArea::dragging()
194 {
195     QDeclarativeView *canvas = createView();
196
197     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/dragging.qml"));
198     canvas->show();
199     canvas->setFocus();
200     QVERIFY(canvas->rootObject() != 0);
201
202     QDeclarativeMouseArea *mouseRegion = canvas->rootObject()->findChild<QDeclarativeMouseArea*>("mouseregion");
203     QDeclarativeDrag *drag = mouseRegion->drag();
204     QVERIFY(mouseRegion != 0);
205     QVERIFY(drag != 0);
206
207     // target
208     QDeclarativeItem *blackRect = canvas->rootObject()->findChild<QDeclarativeItem*>("blackrect");
209     QVERIFY(blackRect != 0);
210     QVERIFY(blackRect == drag->target());
211
212     QVERIFY(!drag->active());
213
214     QGraphicsScene *scene = canvas->scene();
215     QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
216     pressEvent.setScenePos(QPointF(100, 100));
217     pressEvent.setButton(Qt::LeftButton);
218     pressEvent.setButtons(Qt::LeftButton);
219     QApplication::sendEvent(scene, &pressEvent);
220
221     QVERIFY(!drag->active());
222     QCOMPARE(blackRect->x(), 50.0);
223     QCOMPARE(blackRect->y(), 50.0);
224
225     // First move event triggers drag, second is acted upon.
226     // This is due to possibility of higher stacked area taking precedence.
227     QGraphicsSceneMouseEvent moveEvent(QEvent::GraphicsSceneMouseMove);
228     moveEvent.setScenePos(QPointF(106, 106));
229     moveEvent.setButton(Qt::LeftButton);
230     moveEvent.setButtons(Qt::LeftButton);
231     QApplication::sendEvent(scene, &moveEvent);
232
233     moveEvent.setScenePos(QPointF(110, 110));
234     moveEvent.setButton(Qt::LeftButton);
235     moveEvent.setButtons(Qt::LeftButton);
236     QApplication::sendEvent(scene, &moveEvent);
237
238     QVERIFY(drag->active());
239     QCOMPARE(blackRect->x(), 60.0);
240     QCOMPARE(blackRect->y(), 60.0);
241
242     QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
243     releaseEvent.setScenePos(QPointF(110, 110));
244     releaseEvent.setButton(Qt::LeftButton);
245     releaseEvent.setButtons(Qt::LeftButton);
246     QApplication::sendEvent(scene, &releaseEvent);
247
248     QVERIFY(!drag->active());
249     QCOMPARE(blackRect->x(), 60.0);
250     QCOMPARE(blackRect->y(), 60.0);
251
252     delete canvas;
253 }
254
255 QDeclarativeView *tst_QDeclarativeMouseArea::createView()
256 {
257     QDeclarativeView *canvas = new QDeclarativeView(0);
258     canvas->setFixedSize(240,320);
259
260     return canvas;
261 }
262
263 void tst_QDeclarativeMouseArea::updateMouseAreaPosOnClick()
264 {
265     QDeclarativeView *canvas = createView();
266     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/updateMousePosOnClick.qml"));
267     canvas->show();
268     canvas->setFocus();
269     QVERIFY(canvas->rootObject() != 0);
270
271     QDeclarativeMouseArea *mouseRegion = canvas->rootObject()->findChild<QDeclarativeMouseArea*>("mouseregion");
272     QVERIFY(mouseRegion != 0);
273
274     QDeclarativeRectangle *rect = canvas->rootObject()->findChild<QDeclarativeRectangle*>("ball");
275     QVERIFY(rect != 0);
276
277     QCOMPARE(mouseRegion->mouseX(), rect->x());
278     QCOMPARE(mouseRegion->mouseY(), rect->y());
279
280     QGraphicsScene *scene = canvas->scene();
281     QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress);
282     event.setScenePos(QPointF(100, 100));
283     event.setButton(Qt::LeftButton);
284     event.setButtons(Qt::LeftButton);
285     QApplication::sendEvent(scene, &event);
286
287     QCOMPARE(mouseRegion->mouseX(), 100.0);
288     QCOMPARE(mouseRegion->mouseY(), 100.0);
289
290     QCOMPARE(mouseRegion->mouseX(), rect->x());
291     QCOMPARE(mouseRegion->mouseY(), rect->y());
292
293     delete canvas;
294 }
295
296 void tst_QDeclarativeMouseArea::updateMouseAreaPosOnResize()
297 {
298     QDeclarativeView *canvas = createView();
299     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/updateMousePosOnResize.qml"));
300     canvas->show();
301     canvas->setFocus();
302     QVERIFY(canvas->rootObject() != 0);
303
304     QDeclarativeMouseArea *mouseRegion = canvas->rootObject()->findChild<QDeclarativeMouseArea*>("mouseregion");
305     QVERIFY(mouseRegion != 0);
306
307     QDeclarativeRectangle *rect = canvas->rootObject()->findChild<QDeclarativeRectangle*>("brother");
308     QVERIFY(rect != 0);
309
310     QCOMPARE(mouseRegion->mouseX(), 0.0);
311     QCOMPARE(mouseRegion->mouseY(), 0.0);
312
313     QGraphicsScene *scene = canvas->scene();
314     QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress);
315     event.setScenePos(rect->pos());
316     event.setButton(Qt::LeftButton);
317     event.setButtons(Qt::LeftButton);
318     QApplication::sendEvent(scene, &event);
319
320     QVERIFY(!mouseRegion->property("emitPositionChanged").toBool());
321     QVERIFY(mouseRegion->property("mouseMatchesPos").toBool());
322
323     QCOMPARE(mouseRegion->property("x1").toInt(), 0);
324     QCOMPARE(mouseRegion->property("y1").toInt(), 0);
325
326     // XXX: is it on purpose that mouseX is real and mouse.x is int?
327     QCOMPARE(mouseRegion->property("x2").toInt(), (int) rect->x());
328     QCOMPARE(mouseRegion->property("y2").toInt(), (int) rect->y());
329
330     QCOMPARE(mouseRegion->mouseX(), rect->x());
331     QCOMPARE(mouseRegion->mouseY(), rect->y());
332
333     delete canvas;
334 }
335
336 void tst_QDeclarativeMouseArea::noOnClickedWithPressAndHold()
337 {
338     QDeclarativeView *canvas = createView();
339     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/clickandhold.qml"));
340     canvas->show();
341     canvas->setFocus();
342     QVERIFY(canvas->rootObject() != 0);
343
344     QGraphicsScene *scene = canvas->scene();
345     QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
346     pressEvent.setScenePos(QPointF(100, 100));
347     pressEvent.setButton(Qt::LeftButton);
348     pressEvent.setButtons(Qt::LeftButton);
349     QApplication::sendEvent(scene, &pressEvent);
350
351     QVERIFY(!canvas->rootObject()->property("clicked").toBool());
352     QVERIFY(!canvas->rootObject()->property("held").toBool());
353
354     QTest::qWait(1000);
355
356     QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
357     releaseEvent.setScenePos(QPointF(100, 100));
358     releaseEvent.setButton(Qt::LeftButton);
359     releaseEvent.setButtons(Qt::LeftButton);
360     QApplication::sendEvent(scene, &releaseEvent);
361
362     QVERIFY(!canvas->rootObject()->property("clicked").toBool());
363     QVERIFY(canvas->rootObject()->property("held").toBool());
364
365     delete canvas;
366 }
367
368 void tst_QDeclarativeMouseArea::onMousePressRejected()
369 {
370     QDeclarativeView *canvas = createView();
371     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/rejectEvent.qml"));
372     canvas->show();
373     canvas->setFocus();
374     QVERIFY(canvas->rootObject() != 0);
375     QVERIFY(canvas->rootObject()->property("enabled").toBool());
376
377     QVERIFY(!canvas->rootObject()->property("mr1_pressed").toBool());
378     QVERIFY(!canvas->rootObject()->property("mr1_released").toBool());
379     QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool());
380     QVERIFY(!canvas->rootObject()->property("mr2_pressed").toBool());
381     QVERIFY(!canvas->rootObject()->property("mr2_released").toBool());
382     QVERIFY(!canvas->rootObject()->property("mr2_canceled").toBool());
383
384     QGraphicsScene *scene = canvas->scene();
385     QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
386     pressEvent.setScenePos(QPointF(100, 100));
387     pressEvent.setButton(Qt::LeftButton);
388     pressEvent.setButtons(Qt::LeftButton);
389     QApplication::sendEvent(scene, &pressEvent);
390
391     QVERIFY(canvas->rootObject()->property("mr1_pressed").toBool());
392     QVERIFY(!canvas->rootObject()->property("mr1_released").toBool());
393     QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool());
394     QVERIFY(canvas->rootObject()->property("mr2_pressed").toBool());
395     QVERIFY(!canvas->rootObject()->property("mr2_released").toBool());
396     QVERIFY(canvas->rootObject()->property("mr2_canceled").toBool());
397
398     QTest::qWait(200);
399
400     QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
401     releaseEvent.setScenePos(QPointF(100, 100));
402     releaseEvent.setButton(Qt::LeftButton);
403     releaseEvent.setButtons(Qt::LeftButton);
404     QApplication::sendEvent(scene, &releaseEvent);
405
406     QVERIFY(canvas->rootObject()->property("mr1_released").toBool());
407     QVERIFY(!canvas->rootObject()->property("mr1_canceled").toBool());
408     QVERIFY(!canvas->rootObject()->property("mr2_released").toBool());
409
410     delete canvas;
411 }
412
413 void tst_QDeclarativeMouseArea::doubleClick()
414 {
415     QDeclarativeView *canvas = createView();
416     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/doubleclick.qml"));
417     canvas->show();
418     canvas->setFocus();
419     QVERIFY(canvas->rootObject() != 0);
420
421     QGraphicsScene *scene = canvas->scene();
422     QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
423     pressEvent.setScenePos(QPointF(100, 100));
424     pressEvent.setButton(Qt::LeftButton);
425     pressEvent.setButtons(Qt::LeftButton);
426     QApplication::sendEvent(scene, &pressEvent);
427
428     QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
429     releaseEvent.setScenePos(QPointF(100, 100));
430     releaseEvent.setButton(Qt::LeftButton);
431     releaseEvent.setButtons(Qt::LeftButton);
432     QApplication::sendEvent(scene, &releaseEvent);
433
434     QCOMPARE(canvas->rootObject()->property("released").toInt(), 1);
435
436     QGraphicsSceneMouseEvent dblClickEvent(QEvent::GraphicsSceneMouseDoubleClick);
437     dblClickEvent.setScenePos(QPointF(100, 100));
438     dblClickEvent.setButton(Qt::LeftButton);
439     dblClickEvent.setButtons(Qt::LeftButton);
440     QApplication::sendEvent(scene, &dblClickEvent);
441
442     QApplication::sendEvent(scene, &releaseEvent);
443
444     QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 1);
445     QCOMPARE(canvas->rootObject()->property("doubleClicked").toInt(), 1);
446     QCOMPARE(canvas->rootObject()->property("released").toInt(), 2);
447
448     delete canvas;
449 }
450
451 // QTBUG-14832
452 void tst_QDeclarativeMouseArea::clickTwice()
453 {
454     QDeclarativeView *canvas = createView();
455     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/clicktwice.qml"));
456     canvas->show();
457     canvas->setFocus();
458     QVERIFY(canvas->rootObject() != 0);
459
460     QGraphicsScene *scene = canvas->scene();
461     QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
462     pressEvent.setScenePos(QPointF(100, 100));
463     pressEvent.setButton(Qt::LeftButton);
464     pressEvent.setButtons(Qt::LeftButton);
465     QApplication::sendEvent(scene, &pressEvent);
466
467     QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
468     releaseEvent.setScenePos(QPointF(100, 100));
469     releaseEvent.setButton(Qt::LeftButton);
470     releaseEvent.setButtons(Qt::LeftButton);
471     QApplication::sendEvent(scene, &releaseEvent);
472
473     QCOMPARE(canvas->rootObject()->property("pressed").toInt(), 1);
474     QCOMPARE(canvas->rootObject()->property("released").toInt(), 1);
475     QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 1);
476
477     QGraphicsSceneMouseEvent dblClickEvent(QEvent::GraphicsSceneMouseDoubleClick);
478     dblClickEvent.setScenePos(QPointF(100, 100));
479     dblClickEvent.setButton(Qt::LeftButton);
480     dblClickEvent.setButtons(Qt::LeftButton);
481     QApplication::sendEvent(scene, &dblClickEvent);
482
483     QApplication::sendEvent(scene, &pressEvent);
484     QApplication::sendEvent(scene, &releaseEvent);
485
486     QCOMPARE(canvas->rootObject()->property("pressed").toInt(), 2);
487     QCOMPARE(canvas->rootObject()->property("released").toInt(), 2);
488     QCOMPARE(canvas->rootObject()->property("clicked").toInt(), 2);
489
490     delete canvas;
491 }
492
493 void tst_QDeclarativeMouseArea::pressedOrdering()
494 {
495     QDeclarativeView *canvas = createView();
496     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/pressedOrdering.qml"));
497     canvas->show();
498     canvas->setFocus();
499     QVERIFY(canvas->rootObject() != 0);
500
501     QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("base"));
502
503     QGraphicsScene *scene = canvas->scene();
504     QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
505     pressEvent.setScenePos(QPointF(100, 100));
506     pressEvent.setButton(Qt::LeftButton);
507     pressEvent.setButtons(Qt::LeftButton);
508     QApplication::sendEvent(scene, &pressEvent);
509
510     QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("pressed"));
511
512     QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
513     releaseEvent.setScenePos(QPointF(100, 100));
514     releaseEvent.setButton(Qt::LeftButton);
515     releaseEvent.setButtons(Qt::LeftButton);
516     QApplication::sendEvent(scene, &releaseEvent);
517
518     QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("toggled"));
519
520     QApplication::sendEvent(scene, &pressEvent);
521
522     QCOMPARE(canvas->rootObject()->property("value").toString(), QLatin1String("pressed"));
523
524     delete canvas;
525 }
526
527 void tst_QDeclarativeMouseArea::preventStealing()
528 {
529     QDeclarativeView *canvas = createView();
530
531     canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/preventstealing.qml"));
532     canvas->show();
533     canvas->setFocus();
534     QVERIFY(canvas->rootObject() != 0);
535
536     QDeclarativeFlickable *flickable = qobject_cast<QDeclarativeFlickable*>(canvas->rootObject());
537     QVERIFY(flickable != 0);
538
539     QDeclarativeMouseArea *mouseArea = canvas->rootObject()->findChild<QDeclarativeMouseArea*>("mousearea");
540     QVERIFY(mouseArea != 0);
541
542     QSignalSpy mousePositionSpy(mouseArea, SIGNAL(positionChanged(QDeclarativeMouseEvent*)));
543
544     QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(80, 80)));
545
546     // Without preventStealing, mouse movement over MouseArea would
547     // cause the Flickable to steal mouse and trigger content movement.
548     QGraphicsScene *scene = canvas->scene();
549     QGraphicsSceneMouseEvent moveEvent(QEvent::GraphicsSceneMouseMove);
550     moveEvent.setScenePos(QPointF(70, 70));
551     moveEvent.setButton(Qt::LeftButton);
552     moveEvent.setButtons(Qt::LeftButton);
553     QApplication::sendEvent(scene, &moveEvent);
554
555     moveEvent.setScenePos(QPointF(60, 60));
556     moveEvent.setButton(Qt::LeftButton);
557     moveEvent.setButtons(Qt::LeftButton);
558     QApplication::sendEvent(scene, &moveEvent);
559
560     moveEvent.setScenePos(QPointF(50, 50));
561     moveEvent.setButton(Qt::LeftButton);
562     moveEvent.setButtons(Qt::LeftButton);
563     QApplication::sendEvent(scene, &moveEvent);
564
565     // We should have received all three move events
566     QCOMPARE(mousePositionSpy.count(), 3);
567     QVERIFY(mouseArea->pressed());
568
569     // Flickable content should not have moved.
570     QCOMPARE(flickable->contentX(), 0.);
571     QCOMPARE(flickable->contentY(), 0.);
572
573     QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(50, 50)));
574
575     // Now allow stealing and confirm Flickable does its thing.
576     canvas->rootObject()->setProperty("stealing", false);
577
578     QTest::mousePress(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(80, 80)));
579
580     // Without preventStealing, mouse movement over MouseArea would
581     // cause the Flickable to steal mouse and trigger content movement.
582     moveEvent.setScenePos(QPointF(70, 70));
583     QApplication::sendEvent(scene, &moveEvent);
584
585     moveEvent.setScenePos(QPointF(60, 60));
586     QApplication::sendEvent(scene, &moveEvent);
587
588     moveEvent.setScenePos(QPointF(50, 50));
589     QApplication::sendEvent(scene, &moveEvent);
590
591     // We should only have received the first move event
592     QCOMPARE(mousePositionSpy.count(), 4);
593     // Our press should be taken away
594     QVERIFY(!mouseArea->pressed());
595
596     // Flickable content should have moved.
597     QCOMPARE(flickable->contentX(), 10.);
598     QCOMPARE(flickable->contentY(), 10.);
599
600     QTest::mouseRelease(canvas->viewport(), Qt::LeftButton, 0, canvas->mapFromScene(QPoint(50, 50)));
601
602     delete canvas;
603 }
604
605 void tst_QDeclarativeMouseArea::testQtQuick11Attributes()
606 {
607     QFETCH(QString, code);
608     QFETCH(QString, warning);
609     QFETCH(QString, error);
610
611     QDeclarativeEngine engine;
612     QObject *obj;
613
614     QDeclarativeComponent valid(&engine);
615     valid.setData("import QtQuick 1.1; MouseArea { " + code.toUtf8() + " }", QUrl(""));
616     obj = valid.create();
617     QVERIFY(obj);
618     QVERIFY(valid.errorString().isEmpty());
619     delete obj;
620
621     QDeclarativeComponent invalid(&engine);
622     invalid.setData("import QtQuick 1.0; MouseArea { " + code.toUtf8() + " }", QUrl(""));
623     QTest::ignoreMessage(QtWarningMsg, warning.toUtf8());
624     obj = invalid.create();
625     QCOMPARE(invalid.errorString(), error);
626     delete obj;
627 }
628
629 void tst_QDeclarativeMouseArea::testQtQuick11Attributes_data()
630 {
631     QTest::addColumn<QString>("code");
632     QTest::addColumn<QString>("warning");
633     QTest::addColumn<QString>("error");
634
635     QTest::newRow("preventStealing") << "preventStealing: true"
636         << "QDeclarativeComponent: Component is not ready"
637         << ":1 \"MouseArea.preventStealing\" is not available in QtQuick 1.0.\n";
638 }
639
640 QTEST_MAIN(tst_QDeclarativeMouseArea)
641
642 #include "tst_qdeclarativemousearea.moc"