23
23
#include <QtCore/QEvent>
25
25
#include "inversemouseareatype.h"
26
27
#include <private/qquickevents_p_p.h>
28
#include <qpa/qwindowsysteminterface.h>
30
#define DOUBLECLICK_TIMEOUT 400
32
using QTest::QTouchEventSequence;
28
34
class tst_InverseMouseAreaTest : public QObject
33
tst_InverseMouseAreaTest() {}
39
tst_InverseMouseAreaTest() :
40
quickView(0), quickEngine(0), device(0)
36
44
QQuickView *quickView;
37
45
QQmlEngine *quickEngine;
38
47
QObjectCleanupHandler eventCleanup;
40
InverseMouseAreaType *testArea(const QString &document)
49
InverseMouseAreaType *testArea(const QString &document, const QString &imaName = QString())
42
51
// delete previous root
43
52
QObject *rootObject = quickView->rootObject();
76
QPoint guPoint(qreal guX, qreal guY)
78
return QPointF(UCUnits::instance().gu(guX), UCUnits::instance().gu(guY)).toPoint();
81
void touchClick(QWindow *window, const QPoint &point)
83
QTest::touchEvent(window, device).press(0, point, window);
85
QTest::touchEvent(window, device).release(0, point, window);
65
89
void capturePressed(QQuickMouseEvent *event)
77
101
quickView = new QQuickView(0);
78
102
quickEngine = quickView->engine();
104
device = new QTouchDevice;
105
device->setType(QTouchDevice::TouchScreen);
106
QWindowSystemInterface::registerTouchDevice(device);
80
108
quickView->setGeometry(0,0, 240, 320);
81
109
//add modules folder so we have access to the plugin from QML
82
110
QStringList imports = quickEngine->importPathList();
175
203
QSignalSpy ma1Spy(ma1, SIGNAL(pressed(QQuickMouseEvent*)));
176
204
QSignalSpy ma2Spy(ma2, SIGNAL(pressed(QQuickMouseEvent*)));
178
// click in the top rectangle
179
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(10, 10));
180
QTest::waitForEvents();
181
QCOMPARE(ma1Spy.count(), 0);
182
QCOMPARE(ma2Spy.count(), 0);
183
QCOMPARE(imaSpy.count(), 1);
186
// click in the second rectangle
187
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(10, 65));
188
QTest::waitForEvents();
189
QCOMPARE(ma1Spy.count(), 0);
190
QCOMPARE(ma2Spy.count(), 0);
191
QCOMPARE(imaSpy.count(), 1);
194
// click in teh button
195
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(25, 85));
206
// click in the top rectangle, use 800msec delay to prevent dblclick detection
207
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(10, 10), DOUBLECLICK_TIMEOUT);
208
QTest::waitForEvents();
209
QCOMPARE(ma1Spy.count(), 0);
210
QCOMPARE(ma2Spy.count(), 0);
211
QCOMPARE(imaSpy.count(), 1);
214
// click in the second rectangle, use 800msec delay to prevent dblclick detection
215
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(10, 65), DOUBLECLICK_TIMEOUT);
216
QTest::waitForEvents();
217
QCOMPARE(ma1Spy.count(), 0);
218
QCOMPARE(ma2Spy.count(), 0);
219
QCOMPARE(imaSpy.count(), 1);
222
// click in the button, use 800msec delay to prevent dblclick detection
223
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(25, 85), DOUBLECLICK_TIMEOUT);
196
224
QTest::waitForEvents();
197
225
QCOMPARE(ma1Spy.count(), 0);
198
226
QCOMPARE(ma2Spy.count(), 1);
199
227
QCOMPARE(imaSpy.count(), 0);
229
// double click in the second rectangle
201
230
QSignalSpy imaDSpy(area, SIGNAL(doubleClicked(QQuickMouseEvent*)));
202
231
QTest::mouseDClick(quickView, Qt::LeftButton, 0, QPoint(10, 65));
232
QTest::waitForEvents();
233
// FIXME: this is flaky
203
234
QCOMPARE(imaDSpy.count(), 1);
237
// double click in the first rectangle
206
238
QTest::mouseDClick(quickView, Qt::LeftButton, 0, QPoint(10, 10));
239
QTest::waitForEvents();
207
240
QCOMPARE(imaDSpy.count(), 1);
224
257
QSignalSpy ma1Spy(ma1, SIGNAL(pressed(QQuickMouseEvent*)));
225
258
QSignalSpy ma2Spy(ma2, SIGNAL(pressed(QQuickMouseEvent*)));
227
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(10, 10));
260
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(10, 10), DOUBLECLICK_TIMEOUT);
228
261
QTest::waitForEvents();
229
262
QCOMPARE(ma1Spy.count(), 1);
230
263
QCOMPARE(ma2Spy.count(), 0);
231
264
QCOMPARE(imaSpy.count(), 1);
232
265
ma1Spy.clear(); imaSpy.clear();
234
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(10, 65));
267
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(10, 65), DOUBLECLICK_TIMEOUT);
235
268
QTest::waitForEvents();
236
269
QCOMPARE(ma1Spy.count(), 0);
237
270
QCOMPARE(ma2Spy.count(), 1);
238
271
QCOMPARE(imaSpy.count(), 1);
239
272
ma2Spy.clear(); imaSpy.clear();
241
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(25, 80));
274
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(25, 80), DOUBLECLICK_TIMEOUT);
242
275
QTest::waitForEvents();
243
276
QCOMPARE(ma1Spy.count(), 0);
244
277
QCOMPARE(ma2Spy.count(), 1);
269
302
QSignalSpy imaSpy(area, SIGNAL(pressed(QQuickMouseEvent*)));
270
303
QSignalSpy ma2Spy(ma2, SIGNAL(pressed(QQuickMouseEvent*)));
272
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(10, 10));
273
QTest::waitForEvents();
274
QCOMPARE(ma2Spy.count(), 0);
275
QCOMPARE(imaSpy.count(), 1);
278
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(10, 65));
279
QTest::waitForEvents();
280
QCOMPARE(ma2Spy.count(), 0);
281
QCOMPARE(imaSpy.count(), 1);
284
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(25, 80));
305
// click on the topmost rectangle
306
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(10, 10), DOUBLECLICK_TIMEOUT);
307
QTest::waitForEvents();
308
QCOMPARE(ma2Spy.count(), 0);
309
QCOMPARE(imaSpy.count(), 1);
312
// click on the second rectangle
313
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(10, 65), DOUBLECLICK_TIMEOUT);
314
QTest::waitForEvents();
315
QCOMPARE(ma2Spy.count(), 0);
316
QCOMPARE(imaSpy.count(), 1);
319
// click on the button
320
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(25, 85), DOUBLECLICK_TIMEOUT);
285
321
QTest::waitForEvents();
286
322
QCOMPARE(ma2Spy.count(), 1);
287
323
QCOMPARE(imaSpy.count(), 0);
325
// double click on the second rectangle
289
326
QSignalSpy imaDSpy(area, SIGNAL(doubleClicked(QQuickMouseEvent*)));
290
327
QTest::mouseDClick(quickView, Qt::LeftButton, 0, QPoint(10, 65));
291
328
QCOMPARE(imaDSpy.count(), 1);
331
// double click on the first rectangle
294
332
QTest::mouseDClick(quickView, Qt::LeftButton, 0, QPoint(10, 10));
295
333
QCOMPARE(imaDSpy.count(), 1);
309
347
QSignalSpy enteredSpy(area, SIGNAL(entered()));
310
348
QSignalSpy exitedSpy(area, SIGNAL(exited()));
312
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(5, 5));
350
QTest::mouseClick(quickView, Qt::LeftButton, 0, QPoint(5, 5), DOUBLECLICK_TIMEOUT);
313
351
QCOMPARE(pressSpy.count(), 1);
314
352
QCOMPARE(releaseSpy.count(), 1);
315
353
QCOMPARE(clickSpy.count(), 1);
362
400
QSignalSpy maSpy(ma, SIGNAL(pressed(QQuickMouseEvent*)));
363
401
QSignalSpy imaDblClick(ima, SIGNAL(doubleClicked(QQuickMouseEvent*)));
365
QTest::mouseClick(quickView, Qt::LeftButton, Qt::NoModifier, QPoint(15, 15));
403
QTest::mouseClick(quickView, Qt::LeftButton, Qt::NoModifier, QPoint(15, 15), DOUBLECLICK_TIMEOUT);
366
404
QCOMPARE(imaSpy.count(), 0);
367
405
QCOMPARE(maSpy.count(), 0);
369
QTest::mouseClick(quickView, Qt::LeftButton, Qt::NoModifier, QPoint(115, 15));
407
QTest::mouseClick(quickView, Qt::LeftButton, Qt::NoModifier, QPoint(115, 15), DOUBLECLICK_TIMEOUT);
370
408
QCOMPARE(imaSpy.count(), 1);
371
409
QCOMPARE(maSpy.count(), 0);
374
QTest::mouseClick(quickView, Qt::LeftButton, Qt::NoModifier, QPoint(115, 115));
412
QTest::mouseClick(quickView, Qt::LeftButton, Qt::NoModifier, QPoint(115, 115), DOUBLECLICK_TIMEOUT);
375
413
QCOMPARE(imaSpy.count(), 1);
376
414
QCOMPARE(maSpy.count(), 0);
452
490
QCOMPARE(imaSpy.count(), 0);
493
void test_MouseClicksOnHeaderNotSeen_bug1288876_data()
495
QTest::addColumn<QString>("document");
497
QTest::newRow("InverseMouseArea in a Page") << "InverseMouseAreaInPage.qml";
498
QTest::newRow("InverseMouseArea with clip") << "InverseMouseAreaClip.qml";
499
QTest::newRow("InverseMouseArea parent clipped") << "InverseMouseAreaParentClipped.qml";
500
QTest::newRow("InverseMouseArea in a ListView") << "InverseMouseAreaInListView.qml";
501
QTest::newRow("InverseMouseArea in a Flickable") << "InverseMouseAreaInFlickable.qml";
504
void test_MouseClicksOnHeaderNotSeen_bug1288876()
506
QFETCH(QString, document);
508
InverseMouseAreaType *ima = quickView->rootObject()->
509
property("ima").value<InverseMouseAreaType*>();
511
QCOMPARE(ima->objectName(), QString("Test_IMA"));
513
QTest::qWaitForWindowExposed(quickView);
515
QSignalSpy imaSpy(ima, SIGNAL(clicked(QQuickMouseEvent*)));
517
// make sure we click on the header
518
QTest::mouseClick(quickView, Qt::LeftButton, Qt::NoModifier, guPoint(20, 5));
519
QCOMPARE(imaSpy.count(), 1);
522
touchClick(quickView, guPoint(20, 5));
523
QCOMPARE(imaSpy.count(), 1);
457
528
QTEST_MAIN(tst_InverseMouseAreaTest)