f657268ab44c13a6bce28be9b0d272d881e73701
[profile/ivi/qtdeclarative.git] / tests / auto / quick / 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 #include "../../shared/util.h"
48
49 class tst_QQuickMultiPointTouchArea : public QQmlDataTest
50 {
51     Q_OBJECT
52 public:
53     tst_QQuickMultiPointTouchArea() : device(0) { }
54 private slots:
55     void initTestCase() {
56         QQmlDataTest::initTestCase();
57         if (!device) {
58             device = new QTouchDevice;
59             device->setType(QTouchDevice::TouchScreen);
60             QWindowSystemInterface::registerTouchDevice(device);
61         }
62     }
63     void cleanupTestCase() {}
64
65     void properties();
66     void signalTest();
67     void release();
68     void reuse();
69     void nonOverlapping();
70     void nested();
71     void inFlickable();
72     void inFlickable2();
73     void invisible();
74     void transformedTouchArea_data();
75     void transformedTouchArea();
76
77 private:
78     QQuickView *createAndShowView(const QString &file);
79     QTouchDevice *device;
80 };
81
82 void tst_QQuickMultiPointTouchArea::properties()
83 {
84     QQuickView *canvas = createAndShowView("properties.qml");
85     QVERIFY(canvas->rootObject() != 0);
86
87     QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(canvas->rootObject());
88     QVERIFY(area != 0);
89
90     QCOMPARE(area->minimumTouchPoints(), 2);
91     QCOMPARE(area->maximumTouchPoints(), 4);
92
93     QQmlListReference ref(area, "touchPoints");
94     QCOMPARE(ref.count(), 4);
95
96     delete canvas;
97 }
98
99 void tst_QQuickMultiPointTouchArea::signalTest()
100 {
101     QQuickView *canvas = createAndShowView("signalTest.qml");
102     QVERIFY(canvas->rootObject() != 0);
103
104     QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(canvas->rootObject());
105     QVERIFY(area != 0);
106
107     QPoint p1(20,100);
108     QPoint p2(40,100);
109     QPoint p3(60,100);
110     QPoint p4(80,100);
111     QPoint p5(100,100);
112
113     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
114
115     sequence.press(0, p1).press(1, p2).commit();
116
117     QCOMPARE(area->property("touchPointPressCount").toInt(), 2);
118     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
119     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
120     QCOMPARE(area->property("touchCount").toInt(), 2);
121     QMetaObject::invokeMethod(area, "clearCounts");
122
123     sequence.stationary(0).stationary(1).press(2, p3).commit();
124
125     QCOMPARE(area->property("touchPointPressCount").toInt(), 1);
126     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
127     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
128     QCOMPARE(area->property("touchCount").toInt(), 3);
129     QMetaObject::invokeMethod(area, "clearCounts");
130
131     p1 -= QPoint(10,10);
132     p2 += QPoint(10,10);
133     sequence.move(0, p1).move(1, p2).stationary(2).commit();
134
135     QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
136     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 2);
137     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
138     QCOMPARE(area->property("touchCount").toInt(), 3);
139     QMetaObject::invokeMethod(area, "clearCounts");
140
141     p3 += QPoint(10,10);
142     sequence.release(0, p1).release(1, p2)
143             .move(2, p3).press(3, p4).press(4, p5).commit();
144
145     QCOMPARE(area->property("touchPointPressCount").toInt(), 2);
146     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 1);
147     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 2);
148     QCOMPARE(area->property("touchCount").toInt(), 3);
149     QMetaObject::invokeMethod(area, "clearCounts");
150
151     sequence.release(2, p3).release(3, p4).release(4, p5).commit();
152
153     QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
154     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
155     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 3);
156     QCOMPARE(area->property("touchCount").toInt(), 0);
157     QCOMPARE(area->property("touchUpdatedHandled").toBool(), true);
158     QMetaObject::invokeMethod(area, "clearCounts");
159
160     delete canvas;
161 }
162
163 void tst_QQuickMultiPointTouchArea::release()
164 {
165     QQuickView *canvas = createAndShowView("basic.qml");
166     QVERIFY(canvas->rootObject() != 0);
167
168     QQuickTouchPoint *point1 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
169
170     QCOMPARE(point1->pressed(), false);
171
172     QPoint p1(20,100);
173
174     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
175
176     sequence.press(0, p1).commit();
177
178     QCOMPARE(point1->pressed(), true);
179
180     p1 += QPoint(0,10);
181
182     sequence.move(0, p1).commit();
183
184     QCOMPARE(point1->pressed(), true);
185     QCOMPARE(point1->x(), qreal(20)); QCOMPARE(point1->y(), qreal(110));
186
187     p1 += QPoint(4,10);
188
189     sequence.release(0, p1).commit();
190
191     //test that a release without a prior move to the release position successfully updates the point's position
192     QCOMPARE(point1->pressed(), false);
193     QCOMPARE(point1->x(), qreal(24)); QCOMPARE(point1->y(), qreal(120));
194
195     delete canvas;
196 }
197
198 void tst_QQuickMultiPointTouchArea::reuse()
199 {
200     QQuickView *canvas = createAndShowView("basic.qml");
201     QVERIFY(canvas->rootObject() != 0);
202
203     QQuickTouchPoint *point1 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
204     QQuickTouchPoint *point2 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point2");
205     QQuickTouchPoint *point3 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point3");
206
207     QCOMPARE(point1->pressed(), false);
208     QCOMPARE(point2->pressed(), false);
209
210     QPoint p1(20,100);
211     QPoint p2(40,100);
212     QPoint p3(60,100);
213     QPoint p4(80,100);
214
215     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
216
217     sequence.press(0, p1).press(1, p2).commit();
218
219     QCOMPARE(point1->pressed(), true);
220     QCOMPARE(point2->pressed(), true);
221     QCOMPARE(point3->pressed(), false);
222
223     sequence.release(0, p1).stationary(1).press(2, p3).commit();
224
225     //we shouldn't reuse point 1 yet
226     QCOMPARE(point1->pressed(), false);
227     QCOMPARE(point2->pressed(), true);
228     QCOMPARE(point3->pressed(), true);
229
230     //back to base state (no touches)
231     sequence.release(1, p2).release(2, p3).commit();
232
233     QCOMPARE(point1->pressed(), false);
234     QCOMPARE(point2->pressed(), false);
235     QCOMPARE(point3->pressed(), false);
236
237     sequence.press(0, p1).press(1, p2).commit();
238
239     QCOMPARE(point1->pressed(), true);
240     QCOMPARE(point2->pressed(), true);
241     QCOMPARE(point3->pressed(), false);
242
243     sequence.release(0, p1).stationary(1).commit();
244
245     QCOMPARE(point1->pressed(), false);
246     QCOMPARE(point2->pressed(), true);
247     QCOMPARE(point3->pressed(), false);
248
249     sequence.press(4, p4).stationary(1).commit();
250
251     //the new touch point should reuse point 1
252     QCOMPARE(point1->pressed(), true);
253     QCOMPARE(point2->pressed(), true);
254     QCOMPARE(point3->pressed(), false);
255
256     QCOMPARE(point1->x(), qreal(80)); QCOMPARE(point1->y(), qreal(100));
257
258     delete canvas;
259 }
260
261 void tst_QQuickMultiPointTouchArea::nonOverlapping()
262 {
263     QQuickView *canvas = createAndShowView("nonOverlapping.qml");
264     QVERIFY(canvas->rootObject() != 0);
265
266     QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point11");
267     QQuickTouchPoint *point12 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point12");
268     QQuickTouchPoint *point21 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point21");
269     QQuickTouchPoint *point22 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point22");
270     QQuickTouchPoint *point23 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point23");
271
272     QCOMPARE(point11->pressed(), false);
273     QCOMPARE(point12->pressed(), false);
274     QCOMPARE(point21->pressed(), false);
275     QCOMPARE(point22->pressed(), false);
276     QCOMPARE(point23->pressed(), false);
277
278     QPoint p1(20,100);
279     QPoint p2(40,100);
280     QPoint p3(60,180);
281     QPoint p4(80,180);
282     QPoint p5(100,180);
283
284     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
285
286     sequence.press(0, p1).commit();
287
288     QCOMPARE(point11->pressed(), false);
289     QCOMPARE(point12->pressed(), false);
290     QCOMPARE(point21->pressed(), false);
291     QCOMPARE(point22->pressed(), false);
292     QCOMPARE(point23->pressed(), false);
293
294     sequence.stationary(0).press(1, p2).commit();
295
296     QCOMPARE(point11->pressed(), true);
297     QCOMPARE(point12->pressed(), true);
298     QCOMPARE(point21->pressed(), false);
299     QCOMPARE(point22->pressed(), false);
300     QCOMPARE(point23->pressed(), false);
301
302     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(100));
303     QCOMPARE(point12->x(), qreal(40)); QCOMPARE(point12->y(), qreal(100));
304
305     p1 += QPoint(0,10);
306     p2 += QPoint(5,0);
307     sequence.move(0, p1).move(1, p2).commit();
308
309     QCOMPARE(point11->pressed(), true);
310     QCOMPARE(point12->pressed(), true);
311     QCOMPARE(point21->pressed(), false);
312     QCOMPARE(point22->pressed(), false);
313     QCOMPARE(point23->pressed(), false);
314
315     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
316     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
317
318     sequence.stationary(0).stationary(1).press(2, p3).commit();
319
320     QCOMPARE(point11->pressed(), true);
321     QCOMPARE(point12->pressed(), true);
322     QCOMPARE(point21->pressed(), false);
323     QCOMPARE(point22->pressed(), false);
324     QCOMPARE(point23->pressed(), false);
325
326     sequence.stationary(0).stationary(1).stationary(2).press(3, p4).press(4, p5).commit();
327
328     QCOMPARE(point11->pressed(), true);
329     QCOMPARE(point12->pressed(), true);
330     QCOMPARE(point21->pressed(), true);
331     QCOMPARE(point22->pressed(), true);
332     QCOMPARE(point23->pressed(), true);
333
334     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
335     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
336     QCOMPARE(point21->x(), qreal(60)); QCOMPARE(point21->y(), qreal(20));
337     QCOMPARE(point22->x(), qreal(80)); QCOMPARE(point22->y(), qreal(20));
338     QCOMPARE(point23->x(), qreal(100)); QCOMPARE(point23->y(), qreal(20));
339
340     p1 += QPoint(4,10);
341     p2 += QPoint(17,17);
342     p3 += QPoint(3,0);
343     p4 += QPoint(1,-1);
344     p5 += QPoint(-7,10);
345     sequence.move(0, p1).move(1, p2).move(2, p3).move(3, p4).move(4, p5).commit();
346
347     QCOMPARE(point11->pressed(), true);
348     QCOMPARE(point12->pressed(), true);
349     QCOMPARE(point21->pressed(), true);
350     QCOMPARE(point22->pressed(), true);
351     QCOMPARE(point23->pressed(), true);
352
353     QCOMPARE(point11->x(), qreal(24)); QCOMPARE(point11->y(), qreal(120));
354     QCOMPARE(point12->x(), qreal(62)); QCOMPARE(point12->y(), qreal(117));
355     QCOMPARE(point21->x(), qreal(63)); QCOMPARE(point21->y(), qreal(20));
356     QCOMPARE(point22->x(), qreal(81)); QCOMPARE(point22->y(), qreal(19));
357     QCOMPARE(point23->x(), qreal(93)); QCOMPARE(point23->y(), qreal(30));
358
359     sequence.release(0, p1).release(1, p2).release(2, p3).release(3, p4).release(4, p5).commit();
360
361     QCOMPARE(point11->pressed(), false);
362     QCOMPARE(point12->pressed(), false);
363     QCOMPARE(point21->pressed(), false);
364     QCOMPARE(point22->pressed(), false);
365     QCOMPARE(point23->pressed(), false);
366
367     delete canvas;
368 }
369
370 void tst_QQuickMultiPointTouchArea::nested()
371 {
372     QQuickView *canvas = createAndShowView("nested.qml");
373     QVERIFY(canvas->rootObject() != 0);
374
375     QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point11");
376     QQuickTouchPoint *point12 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point12");
377     QQuickTouchPoint *point21 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point21");
378     QQuickTouchPoint *point22 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point22");
379     QQuickTouchPoint *point23 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point23");
380
381     QCOMPARE(point11->pressed(), false);
382     QCOMPARE(point12->pressed(), false);
383     QCOMPARE(point21->pressed(), false);
384     QCOMPARE(point22->pressed(), false);
385     QCOMPARE(point23->pressed(), false);
386
387     QPoint p1(20,100);
388     QPoint p2(40,100);
389     QPoint p3(60,180);
390
391     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
392
393     sequence.press(0, p1).commit();
394
395     QCOMPARE(point11->pressed(), false);
396     QCOMPARE(point12->pressed(), false);
397     QCOMPARE(point21->pressed(), false);
398     QCOMPARE(point22->pressed(), false);
399     QCOMPARE(point23->pressed(), false);
400
401     sequence.stationary(0).press(1, p2).commit();
402
403     QCOMPARE(point11->pressed(), true);
404     QCOMPARE(point12->pressed(), true);
405     QCOMPARE(point21->pressed(), false);
406     QCOMPARE(point22->pressed(), false);
407     QCOMPARE(point23->pressed(), false);
408
409     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(100));
410     QCOMPARE(point12->x(), qreal(40)); QCOMPARE(point12->y(), qreal(100));
411
412     p1 += QPoint(0,10);
413     p2 += QPoint(5,0);
414     sequence.move(0, p1).move(1, p2).commit();
415
416     QCOMPARE(point11->pressed(), true);
417     QCOMPARE(point12->pressed(), true);
418     QCOMPARE(point21->pressed(), false);
419     QCOMPARE(point22->pressed(), false);
420     QCOMPARE(point23->pressed(), false);
421
422     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
423     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
424
425     sequence.stationary(0).stationary(1).press(2, p3).commit();
426
427     QCOMPARE(point11->pressed(), true);
428     QCOMPARE(point12->pressed(), true);
429     QCOMPARE(point21->pressed(), true);
430     QCOMPARE(point22->pressed(), true);
431     QCOMPARE(point23->pressed(), true);
432
433     //point11 should be same as point21, point12 same as point22
434     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
435     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
436     QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
437     QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
438     QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
439
440     sequence.stationary(0).stationary(1).stationary(2).press(3, QPoint(80,180)).press(4, QPoint(100,180)).commit();
441
442     QCOMPARE(point11->pressed(), true);
443     QCOMPARE(point12->pressed(), true);
444     QCOMPARE(point21->pressed(), true);
445     QCOMPARE(point22->pressed(), true);
446     QCOMPARE(point23->pressed(), true);
447
448     //new touch points should be ignored (have no impact on our existing touch points)
449     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
450     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
451     QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
452     QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
453     QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
454
455     sequence.stationary(0).stationary(1).stationary(2).release(3, QPoint(80,180)).release(4, QPoint(100,180)).commit();
456
457     p1 += QPoint(4,10);
458     p2 += QPoint(17,17);
459     p3 += QPoint(3,0);
460     sequence.move(0, p1).move(1, p2).move(2, p3).commit();
461
462     QCOMPARE(point11->pressed(), true);
463     QCOMPARE(point12->pressed(), true);
464     QCOMPARE(point21->pressed(), true);
465     QCOMPARE(point22->pressed(), true);
466     QCOMPARE(point23->pressed(), true);
467
468     QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
469     QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
470     QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
471     QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
472     QCOMPARE(point23->x(), qreal(63)); QCOMPARE(point23->y(), qreal(180));
473
474     p1 += QPoint(4,10);
475     p2 += QPoint(17,17);
476     p3 += QPoint(3,0);
477     sequence.move(0, p1).move(1, p2).move(2, p3).commit();
478
479     QCOMPARE(point11->pressed(), false);
480     QCOMPARE(point12->pressed(), false);
481     QCOMPARE(point21->pressed(), true);
482     QCOMPARE(point22->pressed(), true);
483     QCOMPARE(point23->pressed(), true);
484
485     //first two remain the same (touches now grabbed by inner touch area)
486     QCOMPARE(point11->x(), qreal(24)); QCOMPARE(point11->y(), qreal(120));
487     QCOMPARE(point12->x(), qreal(62)); QCOMPARE(point12->y(), qreal(117));
488     QCOMPARE(point21->x(), qreal(28)); QCOMPARE(point21->y(), qreal(130));
489     QCOMPARE(point22->x(), qreal(79)); QCOMPARE(point22->y(), qreal(134));
490     QCOMPARE(point23->x(), qreal(66)); QCOMPARE(point23->y(), qreal(180));
491
492     sequence.release(0, p1).release(1, p2).release(2, p3).commit();
493
494     sequence.press(0, p1).commit();
495
496     QCOMPARE(point11->pressed(), false);
497     QCOMPARE(point12->pressed(), false);
498     QCOMPARE(point21->pressed(), false);
499     QCOMPARE(point22->pressed(), false);
500     QCOMPARE(point23->pressed(), false);
501
502     sequence.release(0, p1).commit();
503
504     //test with grabbing turned off
505     canvas->rootObject()->setProperty("grabInnerArea", false);
506
507     sequence.press(0, p1).press(1, p2).press(2, p3).commit();
508
509     QCOMPARE(point11->pressed(), true);
510     QCOMPARE(point12->pressed(), true);
511     QCOMPARE(point21->pressed(), true);
512     QCOMPARE(point22->pressed(), true);
513     QCOMPARE(point23->pressed(), true);
514
515     p1 -= QPoint(4,10);
516     p2 -= QPoint(17,17);
517     p3 -= QPoint(3,0);
518     sequence.move(0, p1).move(1, p2).move(2, p3).commit();
519
520     QCOMPARE(point11->pressed(), true);
521     QCOMPARE(point12->pressed(), true);
522     QCOMPARE(point21->pressed(), true);
523     QCOMPARE(point22->pressed(), true);
524     QCOMPARE(point23->pressed(), true);
525
526     QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
527     QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
528     QCOMPARE(point21->x(), qreal(24)); QCOMPARE(point21->y(), qreal(120));
529     QCOMPARE(point22->x(), qreal(62)); QCOMPARE(point22->y(), qreal(117));
530     QCOMPARE(point23->x(), qreal(63)); QCOMPARE(point23->y(), qreal(180));
531
532     p1 -= QPoint(4,10);
533     p2 -= QPoint(17,17);
534     p3 -= QPoint(3,0);
535     sequence.move(0, p1).move(1, p2).move(2, p3).commit();
536
537     QCOMPARE(point11->pressed(), true);
538     QCOMPARE(point12->pressed(), true);
539     QCOMPARE(point21->pressed(), true);
540     QCOMPARE(point22->pressed(), true);
541     QCOMPARE(point23->pressed(), true);
542
543     //all change (touches not grabbed by inner touch area)
544     QCOMPARE(point11->x(), qreal(20)); QCOMPARE(point11->y(), qreal(110));
545     QCOMPARE(point12->x(), qreal(45)); QCOMPARE(point12->y(), qreal(100));
546     QCOMPARE(point21->x(), qreal(20)); QCOMPARE(point21->y(), qreal(110));
547     QCOMPARE(point22->x(), qreal(45)); QCOMPARE(point22->y(), qreal(100));
548     QCOMPARE(point23->x(), qreal(60)); QCOMPARE(point23->y(), qreal(180));
549
550     sequence.release(0, p1).release(1, p2).release(2, p3).commit();
551
552     delete canvas;
553 }
554
555 void tst_QQuickMultiPointTouchArea::inFlickable()
556 {
557     QQuickView *canvas = createAndShowView("inFlickable.qml");
558     QVERIFY(canvas->rootObject() != 0);
559
560     QQuickFlickable *flickable = qobject_cast<QQuickFlickable *>(canvas->rootObject());
561     QVERIFY(flickable != 0);
562
563     QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
564     QQuickTouchPoint *point12 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point2");
565
566     QCOMPARE(point11->pressed(), false);
567     QCOMPARE(point12->pressed(), false);
568
569     QPoint p1(20,100);
570     QPoint p2(40,100);
571
572     //moving one point vertically
573     QTest::touchEvent(canvas, device).press(0, p1);
574
575     p1 += QPoint(0,15);
576     QTest::touchEvent(canvas, device).move(0, p1);
577
578     p1 += QPoint(0,15);
579     QTest::touchEvent(canvas, device).move(0, p1);
580
581     p1 += QPoint(0,15);
582     QTest::touchEvent(canvas, device).move(0, p1);
583
584     p1 += QPoint(0,15);
585     QTest::touchEvent(canvas, device).move(0, 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::qWait(50);
593
594     QTRY_VERIFY(!flickable->isMoving());
595
596     //moving two points vertically
597     p1 = QPoint(20,100);
598     QTest::touchEvent(canvas, device).press(0, p1).press(1, p2);
599     QTest::mousePress(canvas, Qt::LeftButton, 0, p1);
600
601     QCOMPARE(point11->pressed(), true);
602     QCOMPARE(point12->pressed(), true);
603     QCOMPARE(flickable->property("cancelCount").toInt(), 0);
604     QCOMPARE(flickable->property("touchCount").toInt(), 2);
605
606     p1 += QPoint(0,15); p2 += QPoint(0,15);
607     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
608     QTest::mouseMove(canvas, p1);
609
610     p1 += QPoint(0,15); p2 += QPoint(0,15);
611     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
612     QTest::mouseMove(canvas, p1);
613
614     p1 += QPoint(0,15); p2 += QPoint(0,15);
615     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
616     QTest::mouseMove(canvas, p1);
617
618     p1 += QPoint(0,15); p2 += QPoint(0,15);
619     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
620     QTest::mouseMove(canvas, p1);
621
622     QVERIFY(flickable->contentY() < 0);
623     QCOMPARE(point11->pressed(), false);
624     QCOMPARE(point12->pressed(), false);
625     QCOMPARE(flickable->property("cancelCount").toInt(), 2);
626     QCOMPARE(flickable->property("touchCount").toInt(), 0);
627
628     QTest::touchEvent(canvas, device).release(0, p1).release(1, p2);
629     QTest::mouseRelease(canvas,Qt::LeftButton, 0, p1);
630     QTest::qWait(50);
631
632     QTRY_VERIFY(!flickable->isMoving());
633
634     //moving two points horizontally, then one point vertically
635     p1 = QPoint(20,100);
636     p2 = QPoint(40,100);
637     QTest::touchEvent(canvas, device).press(0, p1).press(1, p2);
638     QTest::mousePress(canvas, Qt::LeftButton, 0, p1);
639
640     QCOMPARE(point11->pressed(), true);
641     QCOMPARE(point12->pressed(), true);
642
643     p1 += QPoint(15,0); p2 += QPoint(15,0);
644     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
645     QTest::mouseMove(canvas, p1);
646
647     p1 += QPoint(15,0); p2 += QPoint(15,0);
648     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
649     QTest::mouseMove(canvas, p1);
650
651     p1 += QPoint(15,0); p2 += QPoint(15,0);
652     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
653     QTest::mouseMove(canvas, p1);
654
655     p1 += QPoint(15,0); p2 += QPoint(15,0);
656     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
657     QTest::mouseMove(canvas, p1);
658
659     p1 += QPoint(0,15); p2 += QPoint(0,15);
660     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
661     QTest::mouseMove(canvas, p1);
662
663     p1 += QPoint(0,15); p2 += QPoint(0,15);
664     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
665     QTest::mouseMove(canvas, p1);
666
667     p1 += QPoint(0,15); p2 += QPoint(0,15);
668     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
669     QTest::mouseMove(canvas, p1);
670
671     p1 += QPoint(0,15); p2 += QPoint(0,15);
672     QTest::touchEvent(canvas, device).move(0, p1).move(1, p2);
673     QTest::mouseMove(canvas, p1);
674
675     QVERIFY(flickable->contentY() == 0);
676     QCOMPARE(point11->pressed(), true);
677     QCOMPARE(point12->pressed(), true);
678
679     QTest::touchEvent(canvas, device).release(0, p1).release(1, p2);
680     QTest::mouseRelease(canvas,Qt::LeftButton, 0, p1);
681     QTest::qWait(50);
682
683     delete canvas;
684 }
685
686 // test that dragging out of a Flickable containing a MPTA doesn't harm Flickable's state.
687 void tst_QQuickMultiPointTouchArea::inFlickable2()
688 {
689     QQuickView *canvas = createAndShowView("inFlickable2.qml");
690     QVERIFY(canvas->rootObject() != 0);
691
692     QQuickFlickable *flickable = canvas->rootObject()->findChild<QQuickFlickable*>("flickable");
693     QVERIFY(flickable != 0);
694
695     QQuickTouchPoint *point11 = canvas->rootObject()->findChild<QQuickTouchPoint*>("point1");
696     QVERIFY(point11);
697
698     QCOMPARE(point11->pressed(), false);
699
700     QPoint p1(50,100);
701
702     // move point horizontally, out of Flickable area
703     QTest::touchEvent(canvas, device).press(0, p1);
704     QTest::mousePress(canvas, Qt::LeftButton, 0, p1);
705
706     p1 += QPoint(15,0);
707     QTest::touchEvent(canvas, device).move(0, p1);
708     QTest::mouseMove(canvas, p1);
709
710     p1 += QPoint(15,0);
711     QTest::touchEvent(canvas, device).move(0, p1);
712     QTest::mouseMove(canvas, p1);
713
714     p1 += QPoint(15,0);
715     QTest::touchEvent(canvas, device).move(0, p1);
716     QTest::mouseMove(canvas, p1);
717
718     p1 += QPoint(15,0);
719     QTest::touchEvent(canvas, device).move(0, p1);
720     QTest::mouseMove(canvas, p1);
721
722     QVERIFY(!flickable->isMoving());
723     QVERIFY(point11->pressed());
724
725     QTest::touchEvent(canvas, device).release(0, p1);
726     QTest::mouseRelease(canvas,Qt::LeftButton, 0, p1);
727     QTest::qWait(50);
728
729     QTRY_VERIFY(!flickable->isMoving());
730
731     // Check that we can still move the Flickable
732     p1 = QPoint(50,100);
733     QTest::touchEvent(canvas, device).press(0, p1);
734
735     QCOMPARE(point11->pressed(), true);
736
737     p1 += QPoint(0,15);
738     QTest::touchEvent(canvas, device).move(0, p1);
739
740     p1 += QPoint(0,15);
741     QTest::touchEvent(canvas, device).move(0, p1);
742
743     p1 += QPoint(0,15);
744     QTest::touchEvent(canvas, device).move(0, p1);
745
746     p1 += QPoint(0,15);
747     QTest::touchEvent(canvas, device).move(0, p1);
748
749     QVERIFY(flickable->contentY() < 0);
750     QVERIFY(flickable->isMoving());
751     QCOMPARE(point11->pressed(), true);
752
753     QTest::touchEvent(canvas, device).release(0, p1);
754     QTest::qWait(50);
755
756     QTRY_VERIFY(!flickable->isMoving());
757
758
759     delete canvas;
760 }
761
762 // QTBUG-23327
763 void tst_QQuickMultiPointTouchArea::invisible()
764 {
765     QQuickView *canvas = createAndShowView("signalTest.qml");
766     QVERIFY(canvas->rootObject() != 0);
767
768     QQuickMultiPointTouchArea *area = qobject_cast<QQuickMultiPointTouchArea *>(canvas->rootObject());
769     QVERIFY(area != 0);
770
771     area->setVisible(false);
772
773     QPoint p1(20,100);
774     QPoint p2(40,100);
775
776     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
777
778     sequence.press(0, p1).press(1, p2).commit();
779
780     QCOMPARE(area->property("touchPointPressCount").toInt(), 0);
781     QCOMPARE(area->property("touchPointUpdateCount").toInt(), 0);
782     QCOMPARE(area->property("touchPointReleaseCount").toInt(), 0);
783     QCOMPARE(area->property("touchCount").toInt(), 0);
784
785     delete canvas;
786 }
787
788 void tst_QQuickMultiPointTouchArea::transformedTouchArea_data()
789 {
790     QTest::addColumn<QPoint>("p1");
791     QTest::addColumn<QPoint>("p2");
792     QTest::addColumn<QPoint>("p3");
793     QTest::addColumn<int>("total1");
794     QTest::addColumn<int>("total2");
795     QTest::addColumn<int>("total3");
796
797     QTest::newRow("1st point inside")
798         << QPoint(140, 200) << QPoint(260, 260) << QPoint(0, 140) << 1 << 1 << 1;
799
800     QTest::newRow("2nd point inside")
801         << QPoint(260, 260) << QPoint(200, 200) << QPoint(0, 0) << 0 << 1 << 1;
802
803     QTest::newRow("3rd point inside")
804         << QPoint(140, 260) << QPoint(260, 140) << QPoint(200, 140) << 0 << 0 << 1;
805
806     QTest::newRow("all points inside")
807         << QPoint(200, 140) << QPoint(200, 260) << QPoint(140, 200) << 1 << 2 << 3;
808
809     QTest::newRow("all points outside")
810         << QPoint(140, 140) << QPoint(260, 260) << QPoint(260, 140) << 0 << 0 << 0;
811
812     QTest::newRow("1st and 2nd points inside")
813         << QPoint(200, 260) << QPoint(200, 140) << QPoint(140, 140) << 1 << 2 << 2;
814
815     QTest::newRow("1st and 3rd points inside")
816         << QPoint(200, 200) << QPoint(0, 0) << QPoint(200, 260) << 1 << 1 << 2;
817 }
818
819 void tst_QQuickMultiPointTouchArea::transformedTouchArea()
820 {
821     QFETCH(QPoint, p1);
822     QFETCH(QPoint, p2);
823     QFETCH(QPoint, p3);
824     QFETCH(int, total1);
825     QFETCH(int, total2);
826     QFETCH(int, total3);
827
828     QQuickView *canvas = createAndShowView("transformedMultiPointTouchArea.qml");
829     QVERIFY(canvas->rootObject() != 0);
830
831     QQuickMultiPointTouchArea *area = canvas->rootObject()->findChild<QQuickMultiPointTouchArea *>("touchArea");
832     QVERIFY(area != 0);
833
834     QTest::QTouchEventSequence sequence = QTest::touchEvent(canvas, device);
835
836     sequence.press(0, p1).commit();
837     QCOMPARE(area->property("pointCount").toInt(), total1);
838
839     sequence.stationary(0).press(1, p2).commit();
840     QCOMPARE(area->property("pointCount").toInt(), total2);
841
842     sequence.stationary(0).stationary(1).press(2, p3).commit();
843     QCOMPARE(area->property("pointCount").toInt(), total3);
844
845     delete canvas;
846 }
847
848 QQuickView *tst_QQuickMultiPointTouchArea::createAndShowView(const QString &file)
849 {
850     QQuickView *canvas = new QQuickView(0);
851     canvas->setSource(testFileUrl(file));
852     canvas->show();
853     canvas->requestActivateWindow();
854     QTest::qWaitForWindowShown(canvas);
855
856     return canvas;
857 }
858
859 QTEST_MAIN(tst_QQuickMultiPointTouchArea)
860
861 #include "tst_qquickmultipointtoucharea.moc"