44d277618d5d008de9130a07c399e2f91a661659
[profile/ivi/qtdeclarative.git] / tests / auto / qtquick2 / qquickmultipointtoucharea / tst_qquickmultipointtoucharea.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 ** 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.
17 **
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.
21 **
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.
29 **
30 ** Other Usage
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.
33 **
34 **
35 **
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include <QtTest/QtTest>
43 #include <QtTest/QSignalSpy>
44 #include <private/qquickmultipointtoucharea_p.h>
45 #include <private/qquickflickable_p.h>
46 #include <QtQuick/qquickview.h>
47
48 class tst_QQuickMultiPointTouchArea: public QObject
49 {
50     Q_OBJECT
51 public:
52     tst_QQuickMultiPointTouchArea() : device(0) { }
53 private slots:
54     void initTestCase() {
55         if (!device) {
56             device = new QTouchDevice;
57             device->setType(QTouchDevice::TouchScreen);
58             QWindowSystemInterface::registerTouchDevice(device);
59         }
60     }
61     void cleanupTestCase() {}
62
63     void properties();
64     void signalTest();
65     void release();
66     void reuse();
67     void nonOverlapping();
68     void nested();
69     void inFlickable();
70
71 private:
72     QQuickView *createAndShowView(const QString &file);
73     QTouchDevice *device;
74 };
75
76 void tst_QQuickMultiPointTouchArea::properties()
77 {
78     QQuickView *canvas = createAndShowView("properties.qml");
79     QVERIFY(canvas->rootObject() != 0);
80
81     QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(canvas->rootObject());
82     QVERIFY(area != 0);
83
84     QCOMPARE(area->minimumTouchPoints(), 2);
85     QCOMPARE(area->maximumTouchPoints(), 4);
86
87     QDeclarativeListReference ref(area, "touchPoints");
88     QCOMPARE(ref.count(), 4);
89
90     delete canvas;
91 }
92
93 void tst_QQuickMultiPointTouchArea::signalTest()
94 {
95     QQuickView *canvas = createAndShowView("signalTest.qml");
96     QVERIFY(canvas->rootObject() != 0);
97
98     QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(canvas->rootObject());
99     QVERIFY(area != 0);
100
101     QPoint p1(20,100);
102     QPoint p2(40,100);
103     QPoint p3(60,100);
104     QPoint p4(80,100);
105     QPoint p5(100,100);
106
107     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
108
109     sequence.press(0, p1).press(1, p2).commit();
110
111     QCOMPARE(area->property("touchPointPressCount").toInt(), 2);
112     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
113     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
114     QCOMPARE(area->property("touchCount").toInt(), 2);
115     QMetaObject::invokeMethod(area, "clearCounts");
116
117     sequence.stationary(0).stationary(1).press(2, p3).commit();
118
119     QCOMPARE(area->property("touchPointPressCount").toInt(), 1);
120     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
121     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
122     QCOMPARE(area->property("touchCount").toInt(), 3);
123     QMetaObject::invokeMethod(area, "clearCounts");
124
125     p1 -= QPoint(10,10);
126     p2 += QPoint(10,10);
127     sequence.move(0, p1).move(1, p2).stationary(2).commit();
128
129     QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
130     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 2);
131     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
132     QCOMPARE(area->property("touchCount").toInt(), 3);
133     QMetaObject::invokeMethod(area, "clearCounts");
134
135     p3 += QPoint(10,10);
136     sequence.release(0, p1).release(1, p2)
137             .move(2, p3).press(3, p4).press(4, p5).commit();
138
139     QCOMPARE(area->property("touchPointPressCount").toInt(), 2);
140     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 1);
141     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 2);
142     QCOMPARE(area->property("touchCount").toInt(), 3);
143     QMetaObject::invokeMethod(area, "clearCounts");
144
145     sequence.release(2, p3).release(3, p4).release(4, p5).commit();
146
147     QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
148     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
149     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 3);
150     QCOMPARE(area->property("touchCount").toInt(), 0);
151     QMetaObject::invokeMethod(area, "clearCounts");
152
153     delete canvas;
154 }
155
156 void tst_QQuickMultiPointTouchArea::release()
157 {
158     QQuickView *canvas = createAndShowView("basic.qml");
159     QVERIFY(canvas->rootObject() != 0);
160
161     QQuickTouchPoint *point1 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
162
163     QCOMPARE(point1->pressed(), false);
164
165     QPoint p1(20,100);
166
167     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
168
169     sequence.press(0, p1).commit();
170
171     QCOMPARE(point1->pressed(), true);
172
173     p1 += QPoint(0,10);
174
175     sequence.move(0, p1).commit();
176
177     QCOMPARE(point1->pressed(), true);
178     QCOMPARE(point1->x(), qreal(20)); QCOMPARE(point1->y(), qreal(110));
179
180     p1 += QPoint(4,10);
181
182     sequence.release(0, p1).commit();
183
184     //test that a release without a prior move to the release position successfully updates the point's position
185     QCOMPARE(point1->pressed(), false);
186     QCOMPARE(point1->x(), qreal(24)); QCOMPARE(point1->y(), qreal(120));
187
188     delete canvas;
189 }
190
191 void tst_QQuickMultiPointTouchArea::reuse()
192 {
193     QQuickView *canvas = createAndShowView("basic.qml");
194     QVERIFY(canvas->rootObject() != 0);
195
196     QQuickTouchPoint *point1 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
197     QQuickTouchPoint *point2 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point2");
198     QQuickTouchPoint *point3 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point3");
199
200     QCOMPARE(point1->pressed(), false);
201     QCOMPARE(point2->pressed(), false);
202
203     QPoint p1(20,100);
204     QPoint p2(40,100);
205     QPoint p3(60,100);
206     QPoint p4(80,100);
207
208     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
209
210     sequence.press(0, p1).press(1, p2).commit();
211
212     QCOMPARE(point1->pressed(), true);
213     QCOMPARE(point2->pressed(), true);
214     QCOMPARE(point3->pressed(), false);
215
216     sequence.release(0, p1).stationary(1).press(2, p3).commit();
217
218     //we shouldn't reuse point 1 yet
219     QCOMPARE(point1->pressed(), false);
220     QCOMPARE(point2->pressed(), true);
221     QCOMPARE(point3->pressed(), true);
222
223     //back to base state (no touches)
224     sequence.release(1, p2).release(2, p3).commit();
225
226     QCOMPARE(point1->pressed(), false);
227     QCOMPARE(point2->pressed(), false);
228     QCOMPARE(point3->pressed(), false);
229
230     sequence.press(0, p1).press(1, p2).commit();
231
232     QCOMPARE(point1->pressed(), true);
233     QCOMPARE(point2->pressed(), true);
234     QCOMPARE(point3->pressed(), false);
235
236     sequence.release(0, p1).stationary(1).commit();
237
238     QCOMPARE(point1->pressed(), false);
239     QCOMPARE(point2->pressed(), true);
240     QCOMPARE(point3->pressed(), false);
241
242     sequence.press(4, p4).stationary(1).commit();
243
244     //the new touch point should reuse point 1
245     QCOMPARE(point1->pressed(), true);
246     QCOMPARE(point2->pressed(), true);
247     QCOMPARE(point3->pressed(), false);
248
249     QCOMPARE(point1->x(), qreal(80)); QCOMPARE(point1->y(), qreal(100));
250
251     delete canvas;
252 }
253
254 void tst_QQuickMultiPointTouchArea::nonOverlapping()
255 {
256     QQuickView *canvas = createAndShowView("nonOverlapping.qml");
257     QVERIFY(canvas->rootObject() != 0);
258
259     QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point11");
260     QQuickTouchPoint *point12 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point12");
261     QQuickTouchPoint *point21 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point21");
262     QQuickTouchPoint *point22 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point22");
263     QQuickTouchPoint *point23 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point23");
264
265     QCOMPARE(point11->pressed(), false);
266     QCOMPARE(point12->pressed(), false);
267     QCOMPARE(point21->pressed(), false);
268     QCOMPARE(point22->pressed(), false);
269     QCOMPARE(point23->pressed(), false);
270
271     QPoint p1(20,100);
272     QPoint p2(40,100);
273     QPoint p3(60,180);
274     QPoint p4(80,180);
275     QPoint p5(100,180);
276
277     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
278
279     sequence.press(0, p1).commit();
280
281     QCOMPARE(point11->pressed(), false);
282     QCOMPARE(point12->pressed(), false);
283     QCOMPARE(point21->pressed(), false);
284     QCOMPARE(point22->pressed(), false);
285     QCOMPARE(point23->pressed(), false);
286
287     sequence.stationary(0).press(1, p2).commit();
288
289     QCOMPARE(point11->pressed(), true);
290     QCOMPARE(point12->pressed(), true);
291     QCOMPARE(point21->pressed(), false);
292     QCOMPARE(point22->pressed(), false);
293     QCOMPARE(point23->pressed(), false);
294
295     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(100));
296     QCOMPARE(point12->x(), qreal(40)); QCOMPARE(point12->y(), qreal(100));
297
298     p1 += QPoint(0,10);
299     p2 += QPoint(5,0);
300     sequence.move(0, p1).move(1, p2).commit();
301
302     QCOMPARE(point11->pressed(), true);
303     QCOMPARE(point12->pressed(), true);
304     QCOMPARE(point21->pressed(), false);
305     QCOMPARE(point22->pressed(), false);
306     QCOMPARE(point23->pressed(), false);
307
308     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
309     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
310
311     sequence.stationary(0).stationary(1).press(2, p3).commit();
312
313     QCOMPARE(point11->pressed(), true);
314     QCOMPARE(point12->pressed(), true);
315     QCOMPARE(point21->pressed(), false);
316     QCOMPARE(point22->pressed(), false);
317     QCOMPARE(point23->pressed(), false);
318
319     sequence.stationary(0).stationary(1).stationary(2).press(3, p4).press(4, p5).commit();
320
321     QCOMPARE(point11->pressed(), true);
322     QCOMPARE(point12->pressed(), true);
323     QCOMPARE(point21->pressed(), true);
324     QCOMPARE(point22->pressed(), true);
325     QCOMPARE(point23->pressed(), true);
326
327     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
328     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
329     QCOMPARE(point21->x(), qreal(60)); QCOMPARE(point21->y(), qreal(20));
330     QCOMPARE(point22->x(), qreal(80)); QCOMPARE(point22->y(), qreal(20));
331     QCOMPARE(point23->x(), qreal(100)); QCOMPARE(point23->y(), qreal(20));
332
333     p1 += QPoint(4,10);
334     p2 += QPoint(17,17);
335     p3 += QPoint(3,0);
336     p4 += QPoint(1,-1);
337     p5 += QPoint(-7,10);
338     sequence.move(0, p1).move(1, p2).move(2, p3).move(3, p4).move(4, p5).commit();
339
340     QCOMPARE(point11->pressed(), true);
341     QCOMPARE(point12->pressed(), true);
342     QCOMPARE(point21->pressed(), true);
343     QCOMPARE(point22->pressed(), true);
344     QCOMPARE(point23->pressed(), true);
345
346     QCOMPARE(point11->x(), qreal(24)); QCOMPARE(point11->y(), qreal(120));
347     QCOMPARE(point12->x(), qreal(62)); QCOMPARE(point12->y(), qreal(117));
348     QCOMPARE(point21->x(), qreal(63)); QCOMPARE(point21->y(), qreal(20));
349     QCOMPARE(point22->x(), qreal(81)); QCOMPARE(point22->y(), qreal(19));
350     QCOMPARE(point23->x(), qreal(93)); QCOMPARE(point23->y(), qreal(30));
351
352     sequence.release(0, p1).release(1, p2).release(2, p3).release(3, p4).release(4, p5).commit();
353
354     QCOMPARE(point11->pressed(), false);
355     QCOMPARE(point12->pressed(), false);
356     QCOMPARE(point21->pressed(), false);
357     QCOMPARE(point22->pressed(), false);
358     QCOMPARE(point23->pressed(), false);
359
360     delete canvas;
361 }
362
363 void tst_QQuickMultiPointTouchArea::nested()
364 {
365     QQuickView *canvas = createAndShowView("nested.qml");
366     QVERIFY(canvas->rootObject() != 0);
367
368     QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point11");
369     QQuickTouchPoint *point12 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point12");
370     QQuickTouchPoint *point21 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point21");
371     QQuickTouchPoint *point22 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point22");
372     QQuickTouchPoint *point23 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point23");
373
374     QCOMPARE(point11->pressed(), false);
375     QCOMPARE(point12->pressed(), false);
376     QCOMPARE(point21->pressed(), false);
377     QCOMPARE(point22->pressed(), false);
378     QCOMPARE(point23->pressed(), false);
379
380     QPoint p1(20,100);
381     QPoint p2(40,100);
382     QPoint p3(60,180);
383
384     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
385
386     sequence.press(0, p1).commit();
387
388     QCOMPARE(point11->pressed(), false);
389     QCOMPARE(point12->pressed(), false);
390     QCOMPARE(point21->pressed(), false);
391     QCOMPARE(point22->pressed(), false);
392     QCOMPARE(point23->pressed(), false);
393
394     sequence.stationary(0).press(1, p2).commit();
395
396     QCOMPARE(point11->pressed(), true);
397     QCOMPARE(point12->pressed(), true);
398     QCOMPARE(point21->pressed(), false);
399     QCOMPARE(point22->pressed(), false);
400     QCOMPARE(point23->pressed(), false);
401
402     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(100));
403     QCOMPARE(point12->x(), qreal(40)); QCOMPARE(point12->y(), qreal(100));
404
405     p1 += QPoint(0,10);
406     p2 += QPoint(5,0);
407     sequence.move(0, p1).move(1, p2).commit();
408
409     QCOMPARE(point11->pressed(), true);
410     QCOMPARE(point12->pressed(), true);
411     QCOMPARE(point21->pressed(), false);
412     QCOMPARE(point22->pressed(), false);
413     QCOMPARE(point23->pressed(), false);
414
415     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
416     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
417
418     sequence.stationary(0).stationary(1).press(2, p3).commit();
419
420     QCOMPARE(point11->pressed(), true);
421     QCOMPARE(point12->pressed(), true);
422     QCOMPARE(point21->pressed(), true);
423     QCOMPARE(point22->pressed(), true);
424     QCOMPARE(point23->pressed(), true);
425
426     //point11 should be same as point21, point12 same as point22
427     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
428     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
429     QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
430     QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
431     QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
432
433     sequence.stationary(0).stationary(1).stationary(2).press(3, QPoint(80,180)).press(4, QPoint(100,180)).commit();
434
435     QCOMPARE(point11->pressed(), true);
436     QCOMPARE(point12->pressed(), true);
437     QCOMPARE(point21->pressed(), true);
438     QCOMPARE(point22->pressed(), true);
439     QCOMPARE(point23->pressed(), true);
440
441     //new touch points should be ignored (have no impact on our existing touch points)
442     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
443     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
444     QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
445     QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
446     QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
447
448     sequence.stationary(0).stationary(1).stationary(2).release(3, QPoint(80,180)).release(4, QPoint(100,180)).commit();
449
450     p1 += QPoint(4,10);
451     p2 += QPoint(17,17);
452     p3 += QPoint(3,0);
453     sequence.move(0, p1).move(1, p2).move(2, p3).commit();
454
455     QCOMPARE(point11->pressed(), true);
456     QCOMPARE(point12->pressed(), true);
457     QCOMPARE(point21->pressed(), true);
458     QCOMPARE(point22->pressed(), true);
459     QCOMPARE(point23->pressed(), true);
460
461     QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
462     QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
463     QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
464     QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
465     QCOMPARE(point23->x(), qreal(63)); QCOMPARE(point23->y(), qreal(180));
466
467     p1 += QPoint(4,10);
468     p2 += QPoint(17,17);
469     p3 += QPoint(3,0);
470     sequence.move(0, p1).move(1, p2).move(2, p3).commit();
471
472     QCOMPARE(point11->pressed(), false);
473     QCOMPARE(point12->pressed(), false);
474     QCOMPARE(point21->pressed(), true);
475     QCOMPARE(point22->pressed(), true);
476     QCOMPARE(point23->pressed(), true);
477
478     //first two remain the same (touches now grabbed by inner touch area)
479     QCOMPARE(point11->x(), qreal(24)); QCOMPARE(point11->y(), qreal(120));
480     QCOMPARE(point12->x(), qreal(62)); QCOMPARE(point12->y(), qreal(117));
481     QCOMPARE(point21->x(), qreal(28)); QCOMPARE(point21->y(), qreal(130));
482     QCOMPARE(point22->x(), qreal(79)); QCOMPARE(point22->y(), qreal(134));
483     QCOMPARE(point23->x(), qreal(66)); QCOMPARE(point23->y(), qreal(180));
484
485     sequence.release(0, p1).release(1, p2).release(2, p3).commit();
486
487     sequence.press(0, p1).commit();
488
489     QCOMPARE(point11->pressed(), false);
490     QCOMPARE(point12->pressed(), false);
491     QCOMPARE(point21->pressed(), false);
492     QCOMPARE(point22->pressed(), false);
493     QCOMPARE(point23->pressed(), false);
494
495     sequence.release(0, p1).commit();
496
497     //test with grabbing turned off
498     canvas->rootObject()->setProperty("grabInnerArea", false);
499
500     sequence.press(0, p1).press(1, p2).press(2, p3).commit();
501
502     QCOMPARE(point11->pressed(), true);
503     QCOMPARE(point12->pressed(), true);
504     QCOMPARE(point21->pressed(), true);
505     QCOMPARE(point22->pressed(), true);
506     QCOMPARE(point23->pressed(), true);
507
508     p1 -= QPoint(4,10);
509     p2 -= QPoint(17,17);
510     p3 -= QPoint(3,0);
511     sequence.move(0, p1).move(1, p2).move(2, p3).commit();
512
513     QCOMPARE(point11->pressed(), true);
514     QCOMPARE(point12->pressed(), true);
515     QCOMPARE(point21->pressed(), true);
516     QCOMPARE(point22->pressed(), true);
517     QCOMPARE(point23->pressed(), true);
518
519     QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
520     QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
521     QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
522     QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
523     QCOMPARE(point23->x(), qreal(63)); QCOMPARE(point23->y(), qreal(180));
524
525     p1 -= QPoint(4,10);
526     p2 -= QPoint(17,17);
527     p3 -= QPoint(3,0);
528     sequence.move(0, p1).move(1, p2).move(2, p3).commit();
529
530     QCOMPARE(point11->pressed(), true);
531     QCOMPARE(point12->pressed(), true);
532     QCOMPARE(point21->pressed(), true);
533     QCOMPARE(point22->pressed(), true);
534     QCOMPARE(point23->pressed(), true);
535
536     //all change (touches not grabbed by inner touch area)
537     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
538     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
539     QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
540     QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
541     QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
542
543     sequence.release(0, p1).release(1, p2).release(2, p3).commit();
544
545     delete canvas;
546 }
547
548 void tst_QQuickMultiPointTouchArea::inFlickable()
549 {
550     QQuickView *canvas = createAndShowView("inFlickable.qml");
551     QVERIFY(canvas->rootObject() != 0);
552
553     QQuickFlickable *flickable = qobject_cast<QQuickFlickable *>(canvas->rootObject());
554     QVERIFY(flickable != 0);
555
556     QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
557     QQuickTouchPoint *point12 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point2");
558
559     QCOMPARE(point11->pressed(), false);
560     QCOMPARE(point12->pressed(), false);
561
562     QPoint p1(20,100);
563     QPoint p2(40,100);
564
565     //moving one point vertically
566     QTest::touchEvent(canvas, device).press(0, p1);
567     QTest::mousePress(canvas, Qt::LeftButton, 0, p1);
568
569     p1 += QPoint(0,15);
570     QTest::touchEvent(canvas, device).move(0, p1);
571     QTest::mouseMove(canvas, p1);
572
573     p1 += QPoint(0,15);
574     QTest::touchEvent(canvas, device).move(0, p1);
575     QTest::mouseMove(canvas, p1);
576
577     p1 += QPoint(0,15);
578     QTest::touchEvent(canvas, device).move(0, p1);
579     QTest::mouseMove(canvas, p1);
580
581     p1 += QPoint(0,15);
582     QTest::touchEvent(canvas, device).move(0, p1);
583     QTest::mouseMove(canvas, p1);
584
585     QVERIFY(flickable->contentY() < 0);
586     QCOMPARE(point11->pressed(), false);
587     QCOMPARE(point12->pressed(), false);
588
589     QTest::touchEvent(canvas, device).release(0, p1);
590     QTest::mouseRelease(canvas,Qt::LeftButton, 0, p1);
591     QTest::qWait(50);
592
593     QTRY_VERIFY(!flickable->isMoving());
594
595     //moving two points vertically
596     p1 = QPoint(20,100);
597     QTest::touchEvent(canvas, device).press(0, p1).press(1, p2);
598     QTest::mousePress(canvas, Qt::LeftButton, 0, p1);
599
600     QCOMPARE(point11->pressed(), true);
601     QCOMPARE(point12->pressed(), true);
602
603     p1 += QPoint(0,15); p2 += QPoint(0,15);
604     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
605     QTest::mouseMove(canvas, p1);
606
607     p1 += QPoint(0,15); p2 += QPoint(0,15);
608     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
609     QTest::mouseMove(canvas, p1);
610
611     p1 += QPoint(0,15); p2 += QPoint(0,15);
612     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
613     QTest::mouseMove(canvas, p1);
614
615     p1 += QPoint(0,15); p2 += QPoint(0,15);
616     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
617     QTest::mouseMove(canvas, p1);
618
619     QVERIFY(flickable->contentY() < 0);
620     QCOMPARE(point11->pressed(), false);
621     QCOMPARE(point12->pressed(), false);
622
623     QTest::touchEvent(canvas, device).release(0, p1).release(1, p2);
624     QTest::mouseRelease(canvas,Qt::LeftButton, 0, p1);
625     QTest::qWait(50);
626
627     QTRY_VERIFY(!flickable->isMoving());
628
629     //moving two points horizontally, then one point vertically
630     p1 = QPoint(20,100);
631     p2 = QPoint(40,100);
632     QTest::touchEvent(canvas, device).press(0, p1).press(1, p2);
633     QTest::mousePress(canvas, Qt::LeftButton, 0, p1);
634
635     QCOMPARE(point11->pressed(), true);
636     QCOMPARE(point12->pressed(), true);
637
638     p1 += QPoint(15,0); p2 += QPoint(15,0);
639     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
640     QTest::mouseMove(canvas, p1);
641
642     p1 += QPoint(15,0); p2 += QPoint(15,0);
643     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
644     QTest::mouseMove(canvas, p1);
645
646     p1 += QPoint(15,0); p2 += QPoint(15,0);
647     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
648     QTest::mouseMove(canvas, p1);
649
650     p1 += QPoint(15,0); p2 += QPoint(15,0);
651     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
652     QTest::mouseMove(canvas, p1);
653
654     p1 += QPoint(0,15); p2 += QPoint(0,15);
655     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
656     QTest::mouseMove(canvas, p1);
657
658     p1 += QPoint(0,15); p2 += QPoint(0,15);
659     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
660     QTest::mouseMove(canvas, p1);
661
662     p1 += QPoint(0,15); p2 += QPoint(0,15);
663     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
664     QTest::mouseMove(canvas, p1);
665
666     p1 += QPoint(0,15); p2 += QPoint(0,15);
667     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
668     QTest::mouseMove(canvas, p1);
669
670     QVERIFY(flickable->contentY() == 0);
671     QCOMPARE(point11->pressed(), true);
672     QCOMPARE(point12->pressed(), true);
673
674     QTest::touchEvent(canvas, device).release(0, p1).release(1, p2);
675     QTest::mouseRelease(canvas,Qt::LeftButton, 0, p1);
676     QTest::qWait(50);
677
678     delete canvas;
679 }
680
681 QQuickView *tst_QQuickMultiPointTouchArea::createAndShowView(const QString &file)
682 {
683     QQuickView *canvas = new QQuickView(0);
684     canvas->setSource(QUrl::fromLocalFile(QCoreApplication::applicationDirPath() + QLatin1String("/data/") + file));
685     canvas->show();
686     canvas->requestActivateWindow();
687     QTest::qWaitForWindowShown(canvas);
688
689     return canvas;
690 }
691
692 QTEST_MAIN(tst_QQuickMultiPointTouchArea)
693
694 #include "tst_qquickmultipointtoucharea.moc"