Remove "All rights reserved" line from license headers.
[profile/ivi/qtdeclarative.git] / tests / auto / qtquick2 / qquickmultipointtoucharea / tst_qquickmultipointtoucharea.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the test suite of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
16 **
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
20 **
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
28 **
29 ** Other Usage
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
32 **
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     void invisible();
71
72 private:
73     QQuickView *createAndShowView(const QString &file);
74     QTouchDevice *device;
75 };
76
77 void tst_QQuickMultiPointTouchArea::properties()
78 {
79     QQuickView *canvas = createAndShowView("properties.qml");
80     QVERIFY(canvas->rootObject() != 0);
81
82     QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(canvas->rootObject());
83     QVERIFY(area != 0);
84
85     QCOMPARE(area->minimumTouchPoints(), 2);
86     QCOMPARE(area->maximumTouchPoints(), 4);
87
88     QDeclarativeListReference ref(area, "touchPoints");
89     QCOMPARE(ref.count(), 4);
90
91     delete canvas;
92 }
93
94 void tst_QQuickMultiPointTouchArea::signalTest()
95 {
96     QQuickView *canvas = createAndShowView("signalTest.qml");
97     QVERIFY(canvas->rootObject() != 0);
98
99     QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(canvas->rootObject());
100     QVERIFY(area != 0);
101
102     QPoint p1(20,100);
103     QPoint p2(40,100);
104     QPoint p3(60,100);
105     QPoint p4(80,100);
106     QPoint p5(100,100);
107
108     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
109
110     sequence.press(0, p1).press(1, p2).commit();
111
112     QCOMPARE(area->property("touchPointPressCount").toInt(), 2);
113     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
114     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
115     QCOMPARE(area->property("touchCount").toInt(), 2);
116     QMetaObject::invokeMethod(area, "clearCounts");
117
118     sequence.stationary(0).stationary(1).press(2, p3).commit();
119
120     QCOMPARE(area->property("touchPointPressCount").toInt(), 1);
121     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
122     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
123     QCOMPARE(area->property("touchCount").toInt(), 3);
124     QMetaObject::invokeMethod(area, "clearCounts");
125
126     p1 -= QPoint(10,10);
127     p2 += QPoint(10,10);
128     sequence.move(0, p1).move(1, p2).stationary(2).commit();
129
130     QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
131     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 2);
132     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
133     QCOMPARE(area->property("touchCount").toInt(), 3);
134     QMetaObject::invokeMethod(area, "clearCounts");
135
136     p3 += QPoint(10,10);
137     sequence.release(0, p1).release(1, p2)
138             .move(2, p3).press(3, p4).press(4, p5).commit();
139
140     QCOMPARE(area->property("touchPointPressCount").toInt(), 2);
141     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 1);
142     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 2);
143     QCOMPARE(area->property("touchCount").toInt(), 3);
144     QMetaObject::invokeMethod(area, "clearCounts");
145
146     sequence.release(2, p3).release(3, p4).release(4, p5).commit();
147
148     QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
149     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
150     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 3);
151     QCOMPARE(area->property("touchCount").toInt(), 0);
152     QCOMPARE(area->property("touchUpdatedHandled").toBool(), true);
153     QMetaObject::invokeMethod(area, "clearCounts");
154
155     delete canvas;
156 }
157
158 void tst_QQuickMultiPointTouchArea::release()
159 {
160     QQuickView *canvas = createAndShowView("basic.qml");
161     QVERIFY(canvas->rootObject() != 0);
162
163     QQuickTouchPoint *point1 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
164
165     QCOMPARE(point1->pressed(), false);
166
167     QPoint p1(20,100);
168
169     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
170
171     sequence.press(0, p1).commit();
172
173     QCOMPARE(point1->pressed(), true);
174
175     p1 += QPoint(0,10);
176
177     sequence.move(0, p1).commit();
178
179     QCOMPARE(point1->pressed(), true);
180     QCOMPARE(point1->x(), qreal(20)); QCOMPARE(point1->y(), qreal(110));
181
182     p1 += QPoint(4,10);
183
184     sequence.release(0, p1).commit();
185
186     //test that a release without a prior move to the release position successfully updates the point's position
187     QCOMPARE(point1->pressed(), false);
188     QCOMPARE(point1->x(), qreal(24)); QCOMPARE(point1->y(), qreal(120));
189
190     delete canvas;
191 }
192
193 void tst_QQuickMultiPointTouchArea::reuse()
194 {
195     QQuickView *canvas = createAndShowView("basic.qml");
196     QVERIFY(canvas->rootObject() != 0);
197
198     QQuickTouchPoint *point1 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
199     QQuickTouchPoint *point2 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point2");
200     QQuickTouchPoint *point3 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point3");
201
202     QCOMPARE(point1->pressed(), false);
203     QCOMPARE(point2->pressed(), false);
204
205     QPoint p1(20,100);
206     QPoint p2(40,100);
207     QPoint p3(60,100);
208     QPoint p4(80,100);
209
210     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
211
212     sequence.press(0, p1).press(1, p2).commit();
213
214     QCOMPARE(point1->pressed(), true);
215     QCOMPARE(point2->pressed(), true);
216     QCOMPARE(point3->pressed(), false);
217
218     sequence.release(0, p1).stationary(1).press(2, p3).commit();
219
220     //we shouldn't reuse point 1 yet
221     QCOMPARE(point1->pressed(), false);
222     QCOMPARE(point2->pressed(), true);
223     QCOMPARE(point3->pressed(), true);
224
225     //back to base state (no touches)
226     sequence.release(1, p2).release(2, p3).commit();
227
228     QCOMPARE(point1->pressed(), false);
229     QCOMPARE(point2->pressed(), false);
230     QCOMPARE(point3->pressed(), false);
231
232     sequence.press(0, p1).press(1, p2).commit();
233
234     QCOMPARE(point1->pressed(), true);
235     QCOMPARE(point2->pressed(), true);
236     QCOMPARE(point3->pressed(), false);
237
238     sequence.release(0, p1).stationary(1).commit();
239
240     QCOMPARE(point1->pressed(), false);
241     QCOMPARE(point2->pressed(), true);
242     QCOMPARE(point3->pressed(), false);
243
244     sequence.press(4, p4).stationary(1).commit();
245
246     //the new touch point should reuse point 1
247     QCOMPARE(point1->pressed(), true);
248     QCOMPARE(point2->pressed(), true);
249     QCOMPARE(point3->pressed(), false);
250
251     QCOMPARE(point1->x(), qreal(80)); QCOMPARE(point1->y(), qreal(100));
252
253     delete canvas;
254 }
255
256 void tst_QQuickMultiPointTouchArea::nonOverlapping()
257 {
258     QQuickView *canvas = createAndShowView("nonOverlapping.qml");
259     QVERIFY(canvas->rootObject() != 0);
260
261     QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point11");
262     QQuickTouchPoint *point12 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point12");
263     QQuickTouchPoint *point21 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point21");
264     QQuickTouchPoint *point22 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point22");
265     QQuickTouchPoint *point23 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point23");
266
267     QCOMPARE(point11->pressed(), false);
268     QCOMPARE(point12->pressed(), false);
269     QCOMPARE(point21->pressed(), false);
270     QCOMPARE(point22->pressed(), false);
271     QCOMPARE(point23->pressed(), false);
272
273     QPoint p1(20,100);
274     QPoint p2(40,100);
275     QPoint p3(60,180);
276     QPoint p4(80,180);
277     QPoint p5(100,180);
278
279     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
280
281     sequence.press(0, p1).commit();
282
283     QCOMPARE(point11->pressed(), false);
284     QCOMPARE(point12->pressed(), false);
285     QCOMPARE(point21->pressed(), false);
286     QCOMPARE(point22->pressed(), false);
287     QCOMPARE(point23->pressed(), false);
288
289     sequence.stationary(0).press(1, p2).commit();
290
291     QCOMPARE(point11->pressed(), true);
292     QCOMPARE(point12->pressed(), true);
293     QCOMPARE(point21->pressed(), false);
294     QCOMPARE(point22->pressed(), false);
295     QCOMPARE(point23->pressed(), false);
296
297     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(100));
298     QCOMPARE(point12->x(), qreal(40)); QCOMPARE(point12->y(), qreal(100));
299
300     p1 += QPoint(0,10);
301     p2 += QPoint(5,0);
302     sequence.move(0, p1).move(1, p2).commit();
303
304     QCOMPARE(point11->pressed(), true);
305     QCOMPARE(point12->pressed(), true);
306     QCOMPARE(point21->pressed(), false);
307     QCOMPARE(point22->pressed(), false);
308     QCOMPARE(point23->pressed(), false);
309
310     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
311     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
312
313     sequence.stationary(0).stationary(1).press(2, p3).commit();
314
315     QCOMPARE(point11->pressed(), true);
316     QCOMPARE(point12->pressed(), true);
317     QCOMPARE(point21->pressed(), false);
318     QCOMPARE(point22->pressed(), false);
319     QCOMPARE(point23->pressed(), false);
320
321     sequence.stationary(0).stationary(1).stationary(2).press(3, p4).press(4, p5).commit();
322
323     QCOMPARE(point11->pressed(), true);
324     QCOMPARE(point12->pressed(), true);
325     QCOMPARE(point21->pressed(), true);
326     QCOMPARE(point22->pressed(), true);
327     QCOMPARE(point23->pressed(), true);
328
329     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
330     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
331     QCOMPARE(point21->x(), qreal(60)); QCOMPARE(point21->y(), qreal(20));
332     QCOMPARE(point22->x(), qreal(80)); QCOMPARE(point22->y(), qreal(20));
333     QCOMPARE(point23->x(), qreal(100)); QCOMPARE(point23->y(), qreal(20));
334
335     p1 += QPoint(4,10);
336     p2 += QPoint(17,17);
337     p3 += QPoint(3,0);
338     p4 += QPoint(1,-1);
339     p5 += QPoint(-7,10);
340     sequence.move(0, p1).move(1, p2).move(2, p3).move(3, p4).move(4, p5).commit();
341
342     QCOMPARE(point11->pressed(), true);
343     QCOMPARE(point12->pressed(), true);
344     QCOMPARE(point21->pressed(), true);
345     QCOMPARE(point22->pressed(), true);
346     QCOMPARE(point23->pressed(), true);
347
348     QCOMPARE(point11->x(), qreal(24)); QCOMPARE(point11->y(), qreal(120));
349     QCOMPARE(point12->x(), qreal(62)); QCOMPARE(point12->y(), qreal(117));
350     QCOMPARE(point21->x(), qreal(63)); QCOMPARE(point21->y(), qreal(20));
351     QCOMPARE(point22->x(), qreal(81)); QCOMPARE(point22->y(), qreal(19));
352     QCOMPARE(point23->x(), qreal(93)); QCOMPARE(point23->y(), qreal(30));
353
354     sequence.release(0, p1).release(1, p2).release(2, p3).release(3, p4).release(4, p5).commit();
355
356     QCOMPARE(point11->pressed(), false);
357     QCOMPARE(point12->pressed(), false);
358     QCOMPARE(point21->pressed(), false);
359     QCOMPARE(point22->pressed(), false);
360     QCOMPARE(point23->pressed(), false);
361
362     delete canvas;
363 }
364
365 void tst_QQuickMultiPointTouchArea::nested()
366 {
367     QQuickView *canvas = createAndShowView("nested.qml");
368     QVERIFY(canvas->rootObject() != 0);
369
370     QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point11");
371     QQuickTouchPoint *point12 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point12");
372     QQuickTouchPoint *point21 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point21");
373     QQuickTouchPoint *point22 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point22");
374     QQuickTouchPoint *point23 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point23");
375
376     QCOMPARE(point11->pressed(), false);
377     QCOMPARE(point12->pressed(), false);
378     QCOMPARE(point21->pressed(), false);
379     QCOMPARE(point22->pressed(), false);
380     QCOMPARE(point23->pressed(), false);
381
382     QPoint p1(20,100);
383     QPoint p2(40,100);
384     QPoint p3(60,180);
385
386     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
387
388     sequence.press(0, p1).commit();
389
390     QCOMPARE(point11->pressed(), false);
391     QCOMPARE(point12->pressed(), false);
392     QCOMPARE(point21->pressed(), false);
393     QCOMPARE(point22->pressed(), false);
394     QCOMPARE(point23->pressed(), false);
395
396     sequence.stationary(0).press(1, p2).commit();
397
398     QCOMPARE(point11->pressed(), true);
399     QCOMPARE(point12->pressed(), true);
400     QCOMPARE(point21->pressed(), false);
401     QCOMPARE(point22->pressed(), false);
402     QCOMPARE(point23->pressed(), false);
403
404     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(100));
405     QCOMPARE(point12->x(), qreal(40)); QCOMPARE(point12->y(), qreal(100));
406
407     p1 += QPoint(0,10);
408     p2 += QPoint(5,0);
409     sequence.move(0, p1).move(1, p2).commit();
410
411     QCOMPARE(point11->pressed(), true);
412     QCOMPARE(point12->pressed(), true);
413     QCOMPARE(point21->pressed(), false);
414     QCOMPARE(point22->pressed(), false);
415     QCOMPARE(point23->pressed(), false);
416
417     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
418     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
419
420     sequence.stationary(0).stationary(1).press(2, p3).commit();
421
422     QCOMPARE(point11->pressed(), true);
423     QCOMPARE(point12->pressed(), true);
424     QCOMPARE(point21->pressed(), true);
425     QCOMPARE(point22->pressed(), true);
426     QCOMPARE(point23->pressed(), true);
427
428     //point11 should be same as point21, point12 same as point22
429     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
430     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
431     QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
432     QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
433     QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
434
435     sequence.stationary(0).stationary(1).stationary(2).press(3, QPoint(80,180)).press(4, QPoint(100,180)).commit();
436
437     QCOMPARE(point11->pressed(), true);
438     QCOMPARE(point12->pressed(), true);
439     QCOMPARE(point21->pressed(), true);
440     QCOMPARE(point22->pressed(), true);
441     QCOMPARE(point23->pressed(), true);
442
443     //new touch points should be ignored (have no impact on our existing touch points)
444     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
445     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
446     QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
447     QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
448     QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
449
450     sequence.stationary(0).stationary(1).stationary(2).release(3, QPoint(80,180)).release(4, QPoint(100,180)).commit();
451
452     p1 += QPoint(4,10);
453     p2 += QPoint(17,17);
454     p3 += QPoint(3,0);
455     sequence.move(0, p1).move(1, p2).move(2, p3).commit();
456
457     QCOMPARE(point11->pressed(), true);
458     QCOMPARE(point12->pressed(), true);
459     QCOMPARE(point21->pressed(), true);
460     QCOMPARE(point22->pressed(), true);
461     QCOMPARE(point23->pressed(), true);
462
463     QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
464     QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
465     QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
466     QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
467     QCOMPARE(point23->x(), qreal(63)); QCOMPARE(point23->y(), qreal(180));
468
469     p1 += QPoint(4,10);
470     p2 += QPoint(17,17);
471     p3 += QPoint(3,0);
472     sequence.move(0, p1).move(1, p2).move(2, p3).commit();
473
474     QCOMPARE(point11->pressed(), false);
475     QCOMPARE(point12->pressed(), false);
476     QCOMPARE(point21->pressed(), true);
477     QCOMPARE(point22->pressed(), true);
478     QCOMPARE(point23->pressed(), true);
479
480     //first two remain the same (touches now grabbed by inner touch area)
481     QCOMPARE(point11->x(), qreal(24)); QCOMPARE(point11->y(), qreal(120));
482     QCOMPARE(point12->x(), qreal(62)); QCOMPARE(point12->y(), qreal(117));
483     QCOMPARE(point21->x(), qreal(28)); QCOMPARE(point21->y(), qreal(130));
484     QCOMPARE(point22->x(), qreal(79)); QCOMPARE(point22->y(), qreal(134));
485     QCOMPARE(point23->x(), qreal(66)); QCOMPARE(point23->y(), qreal(180));
486
487     sequence.release(0, p1).release(1, p2).release(2, p3).commit();
488
489     sequence.press(0, p1).commit();
490
491     QCOMPARE(point11->pressed(), false);
492     QCOMPARE(point12->pressed(), false);
493     QCOMPARE(point21->pressed(), false);
494     QCOMPARE(point22->pressed(), false);
495     QCOMPARE(point23->pressed(), false);
496
497     sequence.release(0, p1).commit();
498
499     //test with grabbing turned off
500     canvas->rootObject()->setProperty("grabInnerArea", false);
501
502     sequence.press(0, p1).press(1, p2).press(2, p3).commit();
503
504     QCOMPARE(point11->pressed(), true);
505     QCOMPARE(point12->pressed(), true);
506     QCOMPARE(point21->pressed(), true);
507     QCOMPARE(point22->pressed(), true);
508     QCOMPARE(point23->pressed(), true);
509
510     p1 -= QPoint(4,10);
511     p2 -= QPoint(17,17);
512     p3 -= QPoint(3,0);
513     sequence.move(0, p1).move(1, p2).move(2, p3).commit();
514
515     QCOMPARE(point11->pressed(), true);
516     QCOMPARE(point12->pressed(), true);
517     QCOMPARE(point21->pressed(), true);
518     QCOMPARE(point22->pressed(), true);
519     QCOMPARE(point23->pressed(), true);
520
521     QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
522     QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
523     QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
524     QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
525     QCOMPARE(point23->x(), qreal(63)); QCOMPARE(point23->y(), qreal(180));
526
527     p1 -= QPoint(4,10);
528     p2 -= QPoint(17,17);
529     p3 -= QPoint(3,0);
530     sequence.move(0, p1).move(1, p2).move(2, p3).commit();
531
532     QCOMPARE(point11->pressed(), true);
533     QCOMPARE(point12->pressed(), true);
534     QCOMPARE(point21->pressed(), true);
535     QCOMPARE(point22->pressed(), true);
536     QCOMPARE(point23->pressed(), true);
537
538     //all change (touches not grabbed by inner touch area)
539     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
540     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
541     QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
542     QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
543     QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
544
545     sequence.release(0, p1).release(1, p2).release(2, p3).commit();
546
547     delete canvas;
548 }
549
550 void tst_QQuickMultiPointTouchArea::inFlickable()
551 {
552     QQuickView *canvas = createAndShowView("inFlickable.qml");
553     QVERIFY(canvas->rootObject() != 0);
554
555     QQuickFlickable *flickable = qobject_cast<QQuickFlickable *>(canvas->rootObject());
556     QVERIFY(flickable != 0);
557
558     QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
559     QQuickTouchPoint *point12 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point2");
560
561     QCOMPARE(point11->pressed(), false);
562     QCOMPARE(point12->pressed(), false);
563
564     QPoint p1(20,100);
565     QPoint p2(40,100);
566
567     //moving one point vertically
568     QTest::touchEvent(canvas, device).press(0, p1);
569     QTest::mousePress(canvas, Qt::LeftButton, 0, p1);
570
571     p1 += QPoint(0,15);
572     QTest::touchEvent(canvas, device).move(0, p1);
573     QTest::mouseMove(canvas, p1);
574
575     p1 += QPoint(0,15);
576     QTest::touchEvent(canvas, device).move(0, p1);
577     QTest::mouseMove(canvas, p1);
578
579     p1 += QPoint(0,15);
580     QTest::touchEvent(canvas, device).move(0, p1);
581     QTest::mouseMove(canvas, p1);
582
583     p1 += QPoint(0,15);
584     QTest::touchEvent(canvas, device).move(0, p1);
585     QTest::mouseMove(canvas, p1);
586
587     QVERIFY(flickable->contentY() < 0);
588     QCOMPARE(point11->pressed(), false);
589     QCOMPARE(point12->pressed(), false);
590
591     QTest::touchEvent(canvas, device).release(0, p1);
592     QTest::mouseRelease(canvas,Qt::LeftButton, 0, p1);
593     QTest::qWait(50);
594
595     QTRY_VERIFY(!flickable->isMoving());
596
597     //moving two points vertically
598     p1 = QPoint(20,100);
599     QTest::touchEvent(canvas, device).press(0, p1).press(1, p2);
600     QTest::mousePress(canvas, Qt::LeftButton, 0, p1);
601
602     QCOMPARE(point11->pressed(), true);
603     QCOMPARE(point12->pressed(), true);
604     QCOMPARE(flickable->property("cancelCount").toInt(), 0);
605     QCOMPARE(flickable->property("touchCount").toInt(), 2);
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     p1 += QPoint(0,15); p2 += QPoint(0,15);
620     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
621     QTest::mouseMove(canvas, p1);
622
623     QVERIFY(flickable->contentY() < 0);
624     QCOMPARE(point11->pressed(), false);
625     QCOMPARE(point12->pressed(), false);
626     QCOMPARE(flickable->property("cancelCount").toInt(), 2);
627     QCOMPARE(flickable->property("touchCount").toInt(), 0);
628
629     QTest::touchEvent(canvas, device).release(0, p1).release(1, p2);
630     QTest::mouseRelease(canvas,Qt::LeftButton, 0, p1);
631     QTest::qWait(50);
632
633     QTRY_VERIFY(!flickable->isMoving());
634
635     //moving two points horizontally, then one point vertically
636     p1 = QPoint(20,100);
637     p2 = QPoint(40,100);
638     QTest::touchEvent(canvas, device).press(0, p1).press(1, p2);
639     QTest::mousePress(canvas, Qt::LeftButton, 0, p1);
640
641     QCOMPARE(point11->pressed(), true);
642     QCOMPARE(point12->pressed(), true);
643
644     p1 += QPoint(15,0); p2 += QPoint(15,0);
645     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
646     QTest::mouseMove(canvas, p1);
647
648     p1 += QPoint(15,0); p2 += QPoint(15,0);
649     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
650     QTest::mouseMove(canvas, p1);
651
652     p1 += QPoint(15,0); p2 += QPoint(15,0);
653     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
654     QTest::mouseMove(canvas, p1);
655
656     p1 += QPoint(15,0); p2 += QPoint(15,0);
657     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
658     QTest::mouseMove(canvas, p1);
659
660     p1 += QPoint(0,15); p2 += QPoint(0,15);
661     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
662     QTest::mouseMove(canvas, p1);
663
664     p1 += QPoint(0,15); p2 += QPoint(0,15);
665     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
666     QTest::mouseMove(canvas, p1);
667
668     p1 += QPoint(0,15); p2 += QPoint(0,15);
669     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
670     QTest::mouseMove(canvas, p1);
671
672     p1 += QPoint(0,15); p2 += QPoint(0,15);
673     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
674     QTest::mouseMove(canvas, p1);
675
676     QVERIFY(flickable->contentY() == 0);
677     QCOMPARE(point11->pressed(), true);
678     QCOMPARE(point12->pressed(), true);
679
680     QTest::touchEvent(canvas, device).release(0, p1).release(1, p2);
681     QTest::mouseRelease(canvas,Qt::LeftButton, 0, p1);
682     QTest::qWait(50);
683
684     delete canvas;
685 }
686
687 // QTBUG-23327
688 void tst_QQuickMultiPointTouchArea::invisible()
689 {
690     QQuickView *canvas = createAndShowView("signalTest.qml");
691     QVERIFY(canvas->rootObject() != 0);
692
693     QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(canvas->rootObject());
694     QVERIFY(area != 0);
695
696     area->setVisible(false);
697
698     QPoint p1(20,100);
699     QPoint p2(40,100);
700
701     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
702
703     sequence.press(0, p1).press(1, p2).commit();
704
705     QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
706     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
707     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
708     QCOMPARE(area->property("touchCount").toInt(), 0);
709
710     delete canvas;
711 }
712
713
714 QQuickView *tst_QQuickMultiPointTouchArea::createAndShowView(const QString &file)
715 {
716     QQuickView *canvas = new QQuickView(0);
717     canvas->setSource(QUrl::fromLocalFile(QCoreApplication::applicationDirPath() + QLatin1String("/data/") + file));
718     canvas->show();
719     canvas->requestActivateWindow();
720     QTest::qWaitForWindowShown(canvas);
721
722     return canvas;
723 }
724
725 QTEST_MAIN(tst_QQuickMultiPointTouchArea)
726
727 #include "tst_qquickmultipointtoucharea.moc"