KWin
Loading...
Searching...
No Matches
test_gestures.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2017 Martin Gräßlin <mgraesslin@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#include "gestures.h"
10
11#include <QSignalSpy>
12#include <QTest>
13#include <QtWidgets/qaction.h>
14#include <iostream>
15
16using namespace KWin;
17
20
21class GestureTest : public QObject
22{
23 Q_OBJECT
24private Q_SLOTS:
25 void testSwipeMinFinger_data();
26 void testSwipeMinFinger();
27 void testPinchMinFinger_data();
28 void testPinchMinFinger();
29
30 void testSwipeMaxFinger_data();
31 void testSwipeMaxFinger();
32 void testPinchMaxFinger_data();
33 void testPinchMaxFinger();
34
35 void testSwipeDirection_data();
36 void testSwipeDirection();
37 void testPinchDirection_data();
38 void testPinchDirection();
39
40 // swipe only
41 void testMinimumX_data();
42 void testMinimumX();
43 void testMinimumY_data();
44 void testMinimumY();
45 void testMaximumX_data();
46 void testMaximumX();
47 void testMaximumY_data();
48 void testMaximumY();
49 void testStartGeometry();
50
51 // swipe and pinch
52 void testSetMinimumDelta();
53 void testMinimumDeltaReached_data();
54 void testMinimumDeltaReached();
55 void testMinimumScaleDelta();
56 void testUnregisterSwipeCancels();
57 void testUnregisterPinchCancels();
58 void testDeleteSwipeCancels();
59 void testSwipeCancel_data();
60 void testSwipeCancel();
61 void testSwipeUpdateTrigger_data();
62 void testSwipeUpdateTrigger();
63
64 // both
65 void testSwipeMinFingerStart_data();
66 void testSwipeMinFingerStart();
67 void testSwipeMaxFingerStart_data();
68 void testSwipeMaxFingerStart();
69 void testNotEmitCallbacksBeforeDirectionDecided();
70
71 // swipe only
72 void testSwipeGeometryStart_data();
73 void testSwipeGeometryStart();
74};
75
76void GestureTest::testSwipeMinFinger_data()
77{
78 QTest::addColumn<uint>("count");
79 QTest::addColumn<uint>("expectedCount");
80
81 QTest::newRow("0") << 0u << 0u;
82 QTest::newRow("1") << 1u << 1u;
83 QTest::newRow("10") << 10u << 10u;
84}
85
86void GestureTest::testSwipeMinFinger()
87{
88 SwipeGesture swipeGesture;
89 QCOMPARE(swipeGesture.minimumFingerCountIsRelevant(), false);
90 QCOMPARE(swipeGesture.minimumFingerCount(), 0u);
91 QFETCH(uint, count);
92 swipeGesture.setMinimumFingerCount(count);
93 QCOMPARE(swipeGesture.minimumFingerCountIsRelevant(), true);
94 QTEST(swipeGesture.minimumFingerCount(), "expectedCount");
95 swipeGesture.setMinimumFingerCount(0);
96 QCOMPARE(swipeGesture.minimumFingerCountIsRelevant(), true);
97 QCOMPARE(swipeGesture.minimumFingerCount(), 0u);
98}
99
100void GestureTest::testPinchMinFinger_data()
101{
102 QTest::addColumn<uint>("count");
103 QTest::addColumn<uint>("expectedCount");
104
105 QTest::newRow("0") << 0u << 0u;
106 QTest::newRow("1") << 1u << 1u;
107 QTest::newRow("10") << 10u << 10u;
108}
109
110void GestureTest::testPinchMinFinger()
111{
112 PinchGesture pinchGesture;
113 QCOMPARE(pinchGesture.minimumFingerCountIsRelevant(), false);
114 QCOMPARE(pinchGesture.minimumFingerCount(), 0u);
115 QFETCH(uint, count);
116 pinchGesture.setMinimumFingerCount(count);
117 QCOMPARE(pinchGesture.minimumFingerCountIsRelevant(), true);
118 QTEST(pinchGesture.minimumFingerCount(), "expectedCount");
119 pinchGesture.setMinimumFingerCount(0);
120 QCOMPARE(pinchGesture.minimumFingerCountIsRelevant(), true);
121 QCOMPARE(pinchGesture.minimumFingerCount(), 0u);
122}
123
124void GestureTest::testSwipeMaxFinger_data()
125{
126 QTest::addColumn<uint>("count");
127 QTest::addColumn<uint>("expectedCount");
128
129 QTest::newRow("0") << 0u << 0u;
130 QTest::newRow("1") << 1u << 1u;
131 QTest::newRow("10") << 10u << 10u;
132}
133
134void GestureTest::testSwipeMaxFinger()
135{
136 SwipeGesture gesture;
137 QCOMPARE(gesture.maximumFingerCountIsRelevant(), false);
138 QCOMPARE(gesture.maximumFingerCount(), 0u);
139 QFETCH(uint, count);
140 gesture.setMaximumFingerCount(count);
141 QCOMPARE(gesture.maximumFingerCountIsRelevant(), true);
142 QTEST(gesture.maximumFingerCount(), "expectedCount");
143 gesture.setMaximumFingerCount(0);
144 QCOMPARE(gesture.maximumFingerCountIsRelevant(), true);
145 QCOMPARE(gesture.maximumFingerCount(), 0u);
146}
147
148void GestureTest::testPinchMaxFinger_data()
149{
150 QTest::addColumn<uint>("count");
151 QTest::addColumn<uint>("expectedCount");
152
153 QTest::newRow("0") << 0u << 0u;
154 QTest::newRow("1") << 1u << 1u;
155 QTest::newRow("10") << 10u << 10u;
156}
157
158void GestureTest::testPinchMaxFinger()
159{
160 PinchGesture gesture;
161 QCOMPARE(gesture.maximumFingerCountIsRelevant(), false);
162 QCOMPARE(gesture.maximumFingerCount(), 0u);
163 QFETCH(uint, count);
164 gesture.setMaximumFingerCount(count);
165 QCOMPARE(gesture.maximumFingerCountIsRelevant(), true);
166 QTEST(gesture.maximumFingerCount(), "expectedCount");
167 gesture.setMaximumFingerCount(0);
168 QCOMPARE(gesture.maximumFingerCountIsRelevant(), true);
169 QCOMPARE(gesture.maximumFingerCount(), 0u);
170}
171
172void GestureTest::testSwipeDirection_data()
173{
174 QTest::addColumn<SwipeDirection>("swipe_direction");
175
176 QTest::newRow("Up") << SwipeDirection::Up;
177 QTest::newRow("Left") << SwipeDirection::Left;
178 QTest::newRow("Right") << SwipeDirection::Right;
179 QTest::newRow("Down") << SwipeDirection::Down;
180}
181
182void GestureTest::testSwipeDirection()
183{
184 SwipeGesture gesture;
185 QCOMPARE(gesture.direction(), SwipeDirection::Down);
186 QFETCH(SwipeDirection, swipe_direction);
187 gesture.setDirection(swipe_direction);
188 QCOMPARE(gesture.direction(), swipe_direction);
189 // back to down
190 gesture.setDirection(SwipeDirection::Down);
191 QCOMPARE(gesture.direction(), SwipeDirection::Down);
192}
193
194void GestureTest::testPinchDirection_data()
195{
196 QTest::addColumn<PinchDirection>("pinch_direction");
197
198 QTest::newRow("Contracting") << PinchDirection::Contracting;
199 QTest::newRow("Expanding") << PinchDirection::Expanding;
200}
201
202void GestureTest::testPinchDirection()
203{
204 PinchGesture gesture;
205 QCOMPARE(gesture.direction(), PinchDirection::Expanding);
206 QFETCH(PinchDirection, pinch_direction);
207 gesture.setDirection(pinch_direction);
208 QCOMPARE(gesture.direction(), pinch_direction);
209 // back to down
210 gesture.setDirection(PinchDirection::Expanding);
211 QCOMPARE(gesture.direction(), PinchDirection::Expanding);
212}
213
214void GestureTest::testMinimumX_data()
215{
216 QTest::addColumn<int>("min");
217
218 QTest::newRow("0") << 0;
219 QTest::newRow("-1") << -1;
220 QTest::newRow("1") << 1;
221}
222
223void GestureTest::testMinimumX()
224{
225 SwipeGesture gesture;
226 QCOMPARE(gesture.minimumX(), 0);
227 QCOMPARE(gesture.minimumXIsRelevant(), false);
228 QFETCH(int, min);
229 gesture.setMinimumX(min);
230 QCOMPARE(gesture.minimumX(), min);
231 QCOMPARE(gesture.minimumXIsRelevant(), true);
232}
233
234void GestureTest::testMinimumY_data()
235{
236 QTest::addColumn<int>("min");
237
238 QTest::newRow("0") << 0;
239 QTest::newRow("-1") << -1;
240 QTest::newRow("1") << 1;
241}
242
243void GestureTest::testMinimumY()
244{
245 SwipeGesture gesture;
246 QCOMPARE(gesture.minimumY(), 0);
247 QCOMPARE(gesture.minimumYIsRelevant(), false);
248 QFETCH(int, min);
249 gesture.setMinimumY(min);
250 QCOMPARE(gesture.minimumY(), min);
251 QCOMPARE(gesture.minimumYIsRelevant(), true);
252}
253
254void GestureTest::testMaximumX_data()
255{
256 QTest::addColumn<int>("max");
257
258 QTest::newRow("0") << 0;
259 QTest::newRow("-1") << -1;
260 QTest::newRow("1") << 1;
261}
262
263void GestureTest::testMaximumX()
264{
265 SwipeGesture gesture;
266 QCOMPARE(gesture.maximumX(), 0);
267 QCOMPARE(gesture.maximumXIsRelevant(), false);
268 QFETCH(int, max);
269 gesture.setMaximumX(max);
270 QCOMPARE(gesture.maximumX(), max);
271 QCOMPARE(gesture.maximumXIsRelevant(), true);
272}
273
274void GestureTest::testMaximumY_data()
275{
276 QTest::addColumn<int>("max");
277
278 QTest::newRow("0") << 0;
279 QTest::newRow("-1") << -1;
280 QTest::newRow("1") << 1;
281}
282
283void GestureTest::testMaximumY()
284{
285 SwipeGesture gesture;
286 QCOMPARE(gesture.maximumY(), 0);
287 QCOMPARE(gesture.maximumYIsRelevant(), false);
288 QFETCH(int, max);
289 gesture.setMaximumY(max);
290 QCOMPARE(gesture.maximumY(), max);
291 QCOMPARE(gesture.maximumYIsRelevant(), true);
292}
293
294void GestureTest::testStartGeometry()
295{
296 SwipeGesture gesture;
297 gesture.setStartGeometry(QRect(1, 2, 20, 30));
298 QCOMPARE(gesture.minimumXIsRelevant(), true);
299 QCOMPARE(gesture.minimumYIsRelevant(), true);
300 QCOMPARE(gesture.maximumXIsRelevant(), true);
301 QCOMPARE(gesture.maximumYIsRelevant(), true);
302 QCOMPARE(gesture.minimumX(), 1);
303 QCOMPARE(gesture.minimumY(), 2);
304 QCOMPARE(gesture.maximumX(), 21);
305 QCOMPARE(gesture.maximumY(), 32);
306}
307
308void GestureTest::testSetMinimumDelta()
309{
310 SwipeGesture swipeGesture;
311 QCOMPARE(swipeGesture.isMinimumDeltaRelevant(), false);
312 QCOMPARE(swipeGesture.minimumDelta(), QPointF());
313 QCOMPARE(swipeGesture.minimumDeltaReached(QPointF()), true);
314 swipeGesture.setMinimumDelta(QPointF(2, 3));
315 QCOMPARE(swipeGesture.isMinimumDeltaRelevant(), true);
316 QCOMPARE(swipeGesture.minimumDelta(), QPointF(2, 3));
317 QCOMPARE(swipeGesture.minimumDeltaReached(QPointF()), false);
318 QCOMPARE(swipeGesture.minimumDeltaReached(QPointF(2, 3)), true);
319
320 PinchGesture pinchGesture;
321 QCOMPARE(pinchGesture.isMinimumScaleDeltaRelevant(), false);
322 QCOMPARE(pinchGesture.minimumScaleDelta(), DEFAULT_UNIT_SCALE_DELTA);
323 QCOMPARE(pinchGesture.minimumScaleDeltaReached(1.25), true);
324 pinchGesture.setMinimumScaleDelta(.5);
325 QCOMPARE(pinchGesture.isMinimumScaleDeltaRelevant(), true);
326 QCOMPARE(pinchGesture.minimumScaleDelta(), .5);
327 QCOMPARE(pinchGesture.minimumScaleDeltaReached(1.24), false);
328 QCOMPARE(pinchGesture.minimumScaleDeltaReached(1.5), true);
329}
330
331void GestureTest::testMinimumDeltaReached_data()
332{
333 QTest::addColumn<SwipeDirection>("direction");
334 QTest::addColumn<QPointF>("minimumDelta");
335 QTest::addColumn<QPointF>("delta");
336 QTest::addColumn<bool>("reached");
337 QTest::addColumn<qreal>("progress");
338
339 QTest::newRow("Up (more)") << SwipeDirection::Up << QPointF(0, -30) << QPointF(0, -40) << true << 1.0;
340 QTest::newRow("Up (exact)") << SwipeDirection::Up << QPointF(0, -30) << QPointF(0, -30) << true << 1.0;
341 QTest::newRow("Up (less)") << SwipeDirection::Up << QPointF(0, -30) << QPointF(0, -29) << false << 29.0 / 30.0;
342 QTest::newRow("Left (more)") << SwipeDirection::Left << QPointF(-30, -30) << QPointF(-40, 20) << true << 1.0;
343 QTest::newRow("Left (exact)") << SwipeDirection::Left << QPointF(-30, -40) << QPointF(-30, 0) << true << 1.0;
344 QTest::newRow("Left (less)") << SwipeDirection::Left << QPointF(-30, -30) << QPointF(-29, 0) << false << 29.0 / 30.0;
345 QTest::newRow("Right (more)") << SwipeDirection::Right << QPointF(30, -30) << QPointF(40, 20) << true << 1.0;
346 QTest::newRow("Right (exact)") << SwipeDirection::Right << QPointF(30, -40) << QPointF(30, 0) << true << 1.0;
347 QTest::newRow("Right (less)") << SwipeDirection::Right << QPointF(30, -30) << QPointF(29, 0) << false << 29.0 / 30.0;
348 QTest::newRow("Down (more)") << SwipeDirection::Down << QPointF(0, 30) << QPointF(0, 40) << true << 1.0;
349 QTest::newRow("Down (exact)") << SwipeDirection::Down << QPointF(0, 30) << QPointF(0, 30) << true << 1.0;
350 QTest::newRow("Down (less)") << SwipeDirection::Down << QPointF(0, 30) << QPointF(0, 29) << false << 29.0 / 30.0;
351}
352
353void GestureTest::testMinimumDeltaReached()
354{
355 GestureRecognizer recognizer;
356
357 // swipe gesture
358 SwipeGesture gesture;
359 QFETCH(SwipeDirection, direction);
360 gesture.setDirection(direction);
361 QFETCH(QPointF, minimumDelta);
362 gesture.setMinimumDelta(minimumDelta);
363 QFETCH(QPointF, delta);
364 QFETCH(bool, reached);
365 QCOMPARE(gesture.minimumDeltaReached(delta), reached);
366
367 recognizer.registerSwipeGesture(&gesture);
368
369 QSignalSpy startedSpy(&gesture, &SwipeGesture::started);
370 QSignalSpy triggeredSpy(&gesture, &SwipeGesture::triggered);
371 QSignalSpy cancelledSpy(&gesture, &SwipeGesture::cancelled);
372 QSignalSpy progressSpy(&gesture, &SwipeGesture::progress);
373
374 recognizer.startSwipeGesture(1);
375 QCOMPARE(startedSpy.count(), 1);
376 QCOMPARE(triggeredSpy.count(), 0);
377 QCOMPARE(cancelledSpy.count(), 0);
378 QCOMPARE(progressSpy.count(), 0);
379
380 recognizer.updateSwipeGesture(delta);
381 QCOMPARE(startedSpy.count(), 1);
382 QCOMPARE(triggeredSpy.count(), 0);
383 QCOMPARE(cancelledSpy.count(), 0);
384 QCOMPARE(progressSpy.count(), 1);
385 QTEST(progressSpy.first().first().value<qreal>(), "progress");
386
387 recognizer.endSwipeGesture();
388 QCOMPARE(startedSpy.count(), 1);
389 QCOMPARE(progressSpy.count(), 1);
390 QCOMPARE(triggeredSpy.isEmpty(), !reached);
391 QCOMPARE(cancelledSpy.isEmpty(), reached);
392}
393
394void GestureTest::testMinimumScaleDelta()
395{
396 // pinch gesture
397 PinchGesture gesture;
398 gesture.setDirection(PinchDirection::Contracting);
399 gesture.setMinimumScaleDelta(.5);
400 gesture.setMinimumFingerCount(3);
401 gesture.setMaximumFingerCount(4);
402
403 QCOMPARE(gesture.minimumScaleDeltaReached(1.25), false);
404 QCOMPARE(gesture.minimumScaleDeltaReached(1.5), true);
405
406 GestureRecognizer recognizer;
407 recognizer.registerPinchGesture(&gesture);
408
409 QSignalSpy startedSpy(&gesture, &PinchGesture::started);
410 QSignalSpy triggeredSpy(&gesture, &PinchGesture::triggered);
411 QSignalSpy cancelledSpy(&gesture, &PinchGesture::cancelled);
412 QSignalSpy progressSpy(&gesture, &PinchGesture::progress);
413
414 recognizer.startPinchGesture(4);
415 QCOMPARE(startedSpy.count(), 1);
416 QCOMPARE(triggeredSpy.count(), 0);
417 QCOMPARE(cancelledSpy.count(), 0);
418 QCOMPARE(progressSpy.count(), 0);
419}
420
421void GestureTest::testUnregisterSwipeCancels()
422{
423 GestureRecognizer recognizer;
424 std::unique_ptr<SwipeGesture> gesture(new SwipeGesture);
425 QSignalSpy startedSpy(gesture.get(), &SwipeGesture::started);
426 QSignalSpy cancelledSpy(gesture.get(), &SwipeGesture::cancelled);
427
428 recognizer.registerSwipeGesture(gesture.get());
429 recognizer.startSwipeGesture(1);
430 QCOMPARE(startedSpy.count(), 1);
431 QCOMPARE(cancelledSpy.count(), 0);
432 recognizer.unregisterSwipeGesture(gesture.get());
433 QCOMPARE(cancelledSpy.count(), 1);
434
435 // delete the gesture should not trigger cancel
436 gesture.reset();
437 QCOMPARE(cancelledSpy.count(), 1);
438}
439
440void GestureTest::testUnregisterPinchCancels()
441{
442 GestureRecognizer recognizer;
443 std::unique_ptr<PinchGesture> gesture(new PinchGesture);
444 QSignalSpy startedSpy(gesture.get(), &PinchGesture::started);
445 QSignalSpy cancelledSpy(gesture.get(), &PinchGesture::cancelled);
446
447 recognizer.registerPinchGesture(gesture.get());
448 recognizer.startPinchGesture(1);
449 QCOMPARE(startedSpy.count(), 1);
450 QCOMPARE(cancelledSpy.count(), 0);
451 recognizer.unregisterPinchGesture(gesture.get());
452 QCOMPARE(cancelledSpy.count(), 1);
453
454 // delete the gesture should not trigger cancel
455 gesture.reset();
456 QCOMPARE(cancelledSpy.count(), 1);
457}
458
459void GestureTest::testDeleteSwipeCancels()
460{
461 GestureRecognizer recognizer;
462 std::unique_ptr<SwipeGesture> gesture(new SwipeGesture);
463 QSignalSpy startedSpy(gesture.get(), &SwipeGesture::started);
464 QSignalSpy cancelledSpy(gesture.get(), &SwipeGesture::cancelled);
465
466 recognizer.registerSwipeGesture(gesture.get());
467 recognizer.startSwipeGesture(1);
468 QCOMPARE(startedSpy.count(), 1);
469 QCOMPARE(cancelledSpy.count(), 0);
470 gesture.reset();
471 QCOMPARE(cancelledSpy.count(), 1);
472}
473
474void GestureTest::testSwipeCancel_data()
475{
476 QTest::addColumn<SwipeDirection>("direction");
477
478 QTest::newRow("Up") << SwipeDirection::Up;
479 QTest::newRow("Left") << SwipeDirection::Left;
480 QTest::newRow("Right") << SwipeDirection::Right;
481 QTest::newRow("Down") << SwipeDirection::Down;
482}
483
484void GestureTest::testSwipeCancel()
485{
486 GestureRecognizer recognizer;
487 std::unique_ptr<SwipeGesture> gesture(new SwipeGesture);
488 QFETCH(SwipeDirection, direction);
489 gesture->setDirection(direction);
490 QSignalSpy startedSpy(gesture.get(), &SwipeGesture::started);
491 QSignalSpy cancelledSpy(gesture.get(), &SwipeGesture::cancelled);
492 QSignalSpy triggeredSpy(gesture.get(), &SwipeGesture::triggered);
493
494 recognizer.registerSwipeGesture(gesture.get());
495 recognizer.startSwipeGesture(1);
496 QCOMPARE(startedSpy.count(), 1);
497 QCOMPARE(cancelledSpy.count(), 0);
498 recognizer.cancelSwipeGesture();
499 QCOMPARE(cancelledSpy.count(), 1);
500 QCOMPARE(triggeredSpy.count(), 0);
501}
502
503void GestureTest::testSwipeUpdateTrigger_data()
504{
505 QTest::addColumn<SwipeDirection>("direction");
506 QTest::addColumn<QPointF>("delta");
507
508 QTest::newRow("Up") << SwipeDirection::Up << QPointF(2, -3);
509 QTest::newRow("Left") << SwipeDirection::Left << QPointF(-3, 1);
510 QTest::newRow("Right") << SwipeDirection::Right << QPointF(20, -19);
511 QTest::newRow("Down") << SwipeDirection::Down << QPointF(0, 50);
512}
513
514void GestureTest::testSwipeUpdateTrigger()
515{
516 GestureRecognizer recognizer;
517 SwipeGesture gesture;
518 QFETCH(SwipeDirection, direction);
519 gesture.setDirection(direction);
520
521 QSignalSpy triggeredSpy(&gesture, &SwipeGesture::triggered);
522 QSignalSpy cancelledSpy(&gesture, &SwipeGesture::cancelled);
523
524 recognizer.registerSwipeGesture(&gesture);
525
526 recognizer.startSwipeGesture(1);
527 QFETCH(QPointF, delta);
528 recognizer.updateSwipeGesture(delta);
529 QCOMPARE(cancelledSpy.count(), 0);
530 QCOMPARE(triggeredSpy.count(), 0);
531
532 recognizer.endSwipeGesture();
533 QCOMPARE(cancelledSpy.count(), 0);
534 QCOMPARE(triggeredSpy.count(), 1);
535}
536
537void GestureTest::testSwipeMinFingerStart_data()
538{
539 QTest::addColumn<uint>("min");
540 QTest::addColumn<uint>("count");
541 QTest::addColumn<bool>("started");
542
543 QTest::newRow("same") << 1u << 1u << true;
544 QTest::newRow("less") << 2u << 1u << false;
545 QTest::newRow("more") << 1u << 2u << true;
546}
547
548void GestureTest::testSwipeMinFingerStart()
549{
550 GestureRecognizer recognizer;
551 SwipeGesture gesture;
552 QFETCH(uint, min);
553 gesture.setMinimumFingerCount(min);
554
555 QSignalSpy startedSpy(&gesture, &SwipeGesture::started);
556
557 recognizer.registerSwipeGesture(&gesture);
558 QFETCH(uint, count);
559 recognizer.startSwipeGesture(count);
560 QTEST(!startedSpy.isEmpty(), "started");
561}
562
563void GestureTest::testSwipeMaxFingerStart_data()
564{
565 QTest::addColumn<uint>("max");
566 QTest::addColumn<uint>("count");
567 QTest::addColumn<bool>("started");
568
569 QTest::newRow("same") << 1u << 1u << true;
570 QTest::newRow("less") << 2u << 1u << true;
571 QTest::newRow("more") << 1u << 2u << false;
572}
573
574void GestureTest::testSwipeMaxFingerStart()
575{
576 GestureRecognizer recognizer;
577 SwipeGesture gesture;
578 QFETCH(uint, max);
579 gesture.setMaximumFingerCount(max);
580
581 QSignalSpy startedSpy(&gesture, &SwipeGesture::started);
582
583 recognizer.registerSwipeGesture(&gesture);
584 QFETCH(uint, count);
585 recognizer.startSwipeGesture(count);
586 QTEST(!startedSpy.isEmpty(), "started");
587}
588
589void GestureTest::testNotEmitCallbacksBeforeDirectionDecided()
590{
591 GestureRecognizer recognizer;
592 SwipeGesture up;
593 SwipeGesture down;
594 SwipeGesture right;
595 PinchGesture expand;
596 PinchGesture contract;
597 up.setDirection(SwipeDirection::Up);
598 down.setDirection(SwipeDirection::Down);
599 right.setDirection(SwipeDirection::Right);
600 expand.setDirection(PinchDirection::Expanding);
601 contract.setDirection(PinchDirection::Contracting);
602 recognizer.registerSwipeGesture(&up);
603 recognizer.registerSwipeGesture(&down);
604 recognizer.registerSwipeGesture(&right);
605 recognizer.registerPinchGesture(&expand);
606 recognizer.registerPinchGesture(&contract);
607
608 QSignalSpy upSpy(&up, &SwipeGesture::progress);
609 QSignalSpy downSpy(&down, &SwipeGesture::progress);
610 QSignalSpy rightSpy(&right, &SwipeGesture::progress);
611 QSignalSpy expandSpy(&expand, &PinchGesture::progress);
612 QSignalSpy contractSpy(&contract, &PinchGesture::progress);
613
614 // don't release callback until we know the direction of swipe gesture
615 recognizer.startSwipeGesture(4);
616 QCOMPARE(upSpy.count(), 0);
617 QCOMPARE(downSpy.count(), 0);
618 QCOMPARE(rightSpy.count(), 0);
619
620 // up (negative y)
621 recognizer.updateSwipeGesture(QPointF(0, -1.5));
622 QCOMPARE(upSpy.count(), 1);
623 QCOMPARE(downSpy.count(), 0);
624 QCOMPARE(rightSpy.count(), 0);
625
626 // down (positive y)
627 // recognizer.updateSwipeGesture(QPointF(0, 0));
628 recognizer.updateSwipeGesture(QPointF(0, 3));
629 QCOMPARE(upSpy.count(), 1);
630 QCOMPARE(downSpy.count(), 1);
631 QCOMPARE(rightSpy.count(), 0);
632
633 // right
634 recognizer.cancelSwipeGesture();
635 recognizer.startSwipeGesture(4);
636 recognizer.updateSwipeGesture(QPointF(1, 0));
637 QCOMPARE(upSpy.count(), 1);
638 QCOMPARE(downSpy.count(), 1);
639 QCOMPARE(rightSpy.count(), 1);
640
641 recognizer.cancelSwipeGesture();
642
643 // same test for pinch gestures
644 recognizer.startPinchGesture(4);
645 QCOMPARE(expandSpy.count(), 0);
646 QCOMPARE(contractSpy.count(), 0);
647
648 // contracting
649 recognizer.updatePinchGesture(.5, 0, QPointF(0, 0));
650 QCOMPARE(expandSpy.count(), 0);
651 QCOMPARE(contractSpy.count(), 1);
652
653 // expanding
654 recognizer.updatePinchGesture(1.5, 0, QPointF(0, 0));
655 QCOMPARE(expandSpy.count(), 1);
656 QCOMPARE(contractSpy.count(), 1);
657}
658
659void GestureTest::testSwipeGeometryStart_data()
660{
661 QTest::addColumn<QRect>("geometry");
662 QTest::addColumn<QPointF>("startPos");
663 QTest::addColumn<bool>("started");
664
665 QTest::newRow("top left") << QRect(0, 0, 10, 20) << QPointF(0, 0) << true;
666 QTest::newRow("top right") << QRect(0, 0, 10, 20) << QPointF(10, 0) << true;
667 QTest::newRow("bottom left") << QRect(0, 0, 10, 20) << QPointF(0, 20) << true;
668 QTest::newRow("bottom right") << QRect(0, 0, 10, 20) << QPointF(10, 20) << true;
669 QTest::newRow("x too small") << QRect(10, 20, 30, 40) << QPointF(9, 25) << false;
670 QTest::newRow("y too small") << QRect(10, 20, 30, 40) << QPointF(25, 19) << false;
671 QTest::newRow("x too large") << QRect(10, 20, 30, 40) << QPointF(41, 25) << false;
672 QTest::newRow("y too large") << QRect(10, 20, 30, 40) << QPointF(25, 61) << false;
673 QTest::newRow("inside") << QRect(10, 20, 30, 40) << QPointF(25, 25) << true;
674}
675
676void GestureTest::testSwipeGeometryStart()
677{
678 GestureRecognizer recognizer;
679 SwipeGesture gesture;
680 QFETCH(QRect, geometry);
681 gesture.setStartGeometry(geometry);
682
683 QSignalSpy startedSpy(&gesture, &SwipeGesture::started);
684
685 recognizer.registerSwipeGesture(&gesture);
686 QFETCH(QPointF, startPos);
687 recognizer.startSwipeGesture(startPos);
688 QTEST(!startedSpy.isEmpty(), "started");
689}
690
692#include "test_gestures.moc"
int startPinchGesture(uint fingerCount)
Definition gestures.cpp:305
void updateSwipeGesture(const QPointF &delta)
Definition gestures.cpp:199
void unregisterSwipeGesture(SwipeGesture *gesture)
Definition gestures.cpp:99
void registerSwipeGesture(SwipeGesture *gesture)
Definition gestures.cpp:91
void updatePinchGesture(qreal scale, qreal angleDelta, const QPointF &posDelta)
Definition gestures.cpp:332
void registerPinchGesture(PinchGesture *gesture)
Definition gestures.cpp:112
int startSwipeGesture(uint fingerCount)
Definition gestures.cpp:571
void unregisterPinchGesture(PinchGesture *gesture)
Definition gestures.cpp:120
void setMinimumScaleDelta(const qreal &scaleDelta)
Definition gestures.cpp:560
void setDirection(PinchDirection direction)
Definition gestures.cpp:550
uint minimumFingerCount() const
Definition gestures.cpp:524
bool minimumScaleDeltaReached(const qreal &scaleDelta) const
Definition gestures.cpp:79
bool minimumFingerCountIsRelevant() const
Definition gestures.cpp:513
bool isMinimumScaleDeltaRelevant() const
Definition gestures.cpp:566
PinchDirection direction() const
Definition gestures.cpp:545
void setMinimumFingerCount(uint count)
Definition gestures.cpp:518
bool maximumFingerCountIsRelevant() const
Definition gestures.cpp:529
void setMaximumFingerCount(uint count)
Definition gestures.cpp:534
uint maximumFingerCount() const
Definition gestures.cpp:540
qreal minimumScaleDelta() const
Definition gestures.cpp:555
void setDirection(SwipeDirection direction)
Definition gestures.cpp:428
void setMaximumY(int y)
Definition gestures.cpp:481
SwipeDirection direction() const
Definition gestures.cpp:423
bool maximumFingerCountIsRelevant() const
Definition gestures.cpp:391
bool isMinimumDeltaRelevant() const
Definition gestures.cpp:508
void setMinimumX(int x)
Definition gestures.cpp:433
bool maximumYIsRelevant() const
Definition gestures.cpp:492
void progress(qreal)
uint minimumFingerCount() const
Definition gestures.cpp:396
QPointF minimumDelta() const
Definition gestures.cpp:497
bool maximumXIsRelevant() const
Definition gestures.cpp:476
uint maximumFingerCount() const
Definition gestures.cpp:418
void setMaximumX(int x)
Definition gestures.cpp:465
void setMinimumFingerCount(uint count)
Definition gestures.cpp:401
int maximumY() const
Definition gestures.cpp:487
void setMinimumY(int y)
Definition gestures.cpp:449
void setMinimumDelta(const QPointF &delta)
Definition gestures.cpp:502
bool minimumDeltaReached(const QPointF &delta) const
Definition gestures.cpp:62
int minimumX() const
Definition gestures.cpp:439
void setMaximumFingerCount(uint count)
Definition gestures.cpp:412
bool minimumYIsRelevant() const
Definition gestures.cpp:460
void setStartGeometry(const QRect &geometry)
Definition gestures.cpp:33
bool minimumFingerCountIsRelevant() const
Definition gestures.cpp:407
bool minimumXIsRelevant() const
Definition gestures.cpp:444
int minimumY() const
Definition gestures.cpp:455
int maximumX() const
Definition gestures.cpp:471
PinchDirection
Definition globals.h:123
SwipeDirection
Directions for swipe gestures.
Definition globals.h:115
QTEST_MAIN(OnScreenNotificationTest)
Q_DECLARE_METATYPE(SwipeDirection)