2
* This file is part of unity-2d
4
* Copyright 2010 Canonical Ltd.
7
* - Aurélien Gâteau <aurelien.gateau@canonical.com>
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation; version 3.
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
18
* You should have received a copy of the GNU General Public License
19
* along with this program. If not, see <http://www.gnu.org/licenses/>.
23
#include <unitytestmacro.h>
24
#include <pointerbarrier.h>
27
#include <QApplication>
32
#include <X11/extensions/XTest.h>
34
class DisableTriggerZoneOnTriggerHelper : public QObject
38
DisableTriggerZoneOnTriggerHelper(PointerBarrierWrapper *barrier)
41
connect(barrier, SIGNAL(triggered()), this, SLOT(disable()));
47
m_barrier->setTriggerZoneEnabled(false);
51
PointerBarrierWrapper *m_barrier;
54
class PointerBarrierTest : public QObject
60
Display *display = QX11Info::display();
61
PointerBarrierWrapper barrier;
63
QSignalSpy brokenSpy(&barrier, SIGNAL(broken()));
64
QSignalSpy triggeredSpy(&barrier, SIGNAL(triggered()));
66
XTestFakeMotionEvent(display, -1, 50, 50, 0);
67
QCOMPARE(QCursor::pos(), QPoint(50, 50));
69
barrier.setP1(QPointF(100, 0));
70
barrier.setP2(QPointF(100, 100));
71
barrier.setThreshold(6500);
72
barrier.setMaxVelocityMultiplier(2);
73
barrier.setDecayRate(1500);
74
barrier.setBreakPressure(2000);
76
XTestFakeRelativeMotionEvent(display, 300, 0, 0);
77
// We are stopped by the barrier and instead in 350, 50 we are in 99, 50
78
QCOMPARE(QCursor::pos(), QPoint(99, 50));
80
QCOMPARE(brokenSpy.count(), 0);
81
QCOMPARE(triggeredSpy.count(), 0);
83
for (int i = 0; i < 10; ++i) {
84
XTestFakeRelativeMotionEvent(display, 100, 0, 0);
87
// We have broken the barrier and are somewhere else
88
QVERIFY(QCursor::pos() != QPoint(99, 50));
89
QCOMPARE(brokenSpy.count(), 1);
90
QCOMPARE(triggeredSpy.count(), 0);
95
Display *display = QX11Info::display();
96
PointerBarrierWrapper barrier;
98
QSignalSpy brokenSpy(&barrier, SIGNAL(broken()));
99
QSignalSpy triggeredSpy(&barrier, SIGNAL(triggered()));
101
XTestFakeMotionEvent(display, -1, 50, 150, 0);
102
QCOMPARE(QCursor::pos(), QPoint(50, 150));
104
barrier.setP1(QPointF(100, 0));
105
barrier.setP2(QPointF(100, 100));
106
barrier.setThreshold(6500);
107
barrier.setMaxVelocityMultiplier(2);
108
barrier.setDecayRate(1500);
109
barrier.setBreakPressure(2000);
111
XTestFakeRelativeMotionEvent(display, 300, 0, 0);
112
// We are not stopped by the barrier because it's above us
113
// and are in 350, 150
114
QCOMPARE(QCursor::pos(), QPoint(350, 150));
116
QCOMPARE(brokenSpy.count(), 0);
117
QCOMPARE(triggeredSpy.count(), 0);
122
Display *display = QX11Info::display();
123
PointerBarrierWrapper barrier;
125
QSignalSpy brokenSpy(&barrier, SIGNAL(broken()));
126
QSignalSpy triggeredSpy(&barrier, SIGNAL(triggered()));
128
XTestFakeMotionEvent(display, -1, 50, 50, 0);
129
QCOMPARE(QCursor::pos(), QPoint(50, 50));
131
barrier.setP1(QPointF(100, 0));
132
barrier.setP2(QPointF(100, 100));
133
barrier.setTriggerZoneP1(QPointF(100, 0));
134
barrier.setTriggerZoneP2(QPointF(100, 100));
135
barrier.setTriggerZoneEnabled(true);
136
barrier.setThreshold(6500);
137
barrier.setMaxVelocityMultiplier(2);
138
barrier.setDecayRate(1500);
139
barrier.setTriggerPressure(2000);
140
barrier.setBreakPressure(2000);
142
XTestFakeRelativeMotionEvent(display, 300, 0, 0);
143
// We are stopped by the barrier and instead in 350, 50 we are in 99, 50
144
QCOMPARE(QCursor::pos(), QPoint(99, 50));
146
QCOMPARE(brokenSpy.count(), 0);
147
QCOMPARE(triggeredSpy.count(), 0);
149
for (int i = 0; i < 10; ++i) {
150
XTestFakeRelativeMotionEvent(display, 100, 0, 0);
153
// We have triggered the barrier and are still there
154
QCOMPARE(QCursor::pos(), QPoint(99, 50));
155
QCOMPARE(brokenSpy.count(), 0);
156
QVERIFY(triggeredSpy.count() >= 1);
159
void testTriggerAndBreak()
161
Display *display = QX11Info::display();
162
PointerBarrierWrapper barrier;
164
QSignalSpy brokenSpy(&barrier, SIGNAL(broken()));
165
QSignalSpy triggeredSpy(&barrier, SIGNAL(triggered()));
167
XTestFakeMotionEvent(display, -1, 50, 50, 0);
168
QCOMPARE(QCursor::pos(), QPoint(50, 50));
170
barrier.setP1(QPointF(100, 0));
171
barrier.setP2(QPointF(100, 100));
172
barrier.setTriggerZoneP1(QPointF(100, 0));
173
barrier.setTriggerZoneP2(QPointF(100, 100));
174
barrier.setTriggerZoneEnabled(true);
175
barrier.setThreshold(6500);
176
barrier.setMaxVelocityMultiplier(2);
177
barrier.setDecayRate(1500);
178
barrier.setTriggerPressure(2000);
179
barrier.setBreakPressure(2000);
181
DisableTriggerZoneOnTriggerHelper helper(&barrier);
183
XTestFakeRelativeMotionEvent(display, 300, 0, 0);
184
// We are stopped by the barrier and instead in 350, 50 we are in 99, 50
185
QCOMPARE(QCursor::pos(), QPoint(99, 50));
187
QCOMPARE(brokenSpy.count(), 0);
188
QCOMPARE(triggeredSpy.count(), 0);
190
for (int i = 0; i < 10; ++i) {
191
XTestFakeRelativeMotionEvent(display, 100, 0, 0);
194
// We have triggered and broken the barrier and somewhere else
195
QVERIFY(QCursor::pos() != QPoint(99, 50));
196
QCOMPARE(brokenSpy.count(), 1);
197
QCOMPARE(triggeredSpy.count(), 1);
200
void testTriggerWithoutAndBreak()
202
Display *display = QX11Info::display();
203
PointerBarrierWrapper barrier;
205
QSignalSpy brokenSpy(&barrier, SIGNAL(broken()));
206
QSignalSpy triggeredSpy(&barrier, SIGNAL(triggered()));
208
XTestFakeMotionEvent(display, -1, 50, 50, 0);
209
QCOMPARE(QCursor::pos(), QPoint(50, 50));
211
barrier.setP1(QPointF(100, 0));
212
barrier.setP2(QPointF(100, 100));
213
barrier.setTriggerZoneP1(QPointF(100, 0));
214
barrier.setTriggerZoneP2(QPointF(100, 100));
215
barrier.setTriggerZoneEnabled(true);
216
barrier.setThreshold(6500);
217
barrier.setMaxVelocityMultiplier(2);
218
barrier.setDecayRate(1500);
219
barrier.setTriggerPressure(2000);
220
barrier.setBreakPressure(2000);
222
DisableTriggerZoneOnTriggerHelper helper(&barrier);
224
XTestFakeRelativeMotionEvent(display, 300, 0, 0);
225
// We are stopped by the barrier and instead in 350, 50 we are in 99, 50
226
QCOMPARE(QCursor::pos(), QPoint(99, 50));
228
QCOMPARE(brokenSpy.count(), 0);
229
QCOMPARE(triggeredSpy.count(), 0);
231
for (int i = 0; i < 10 && barrier.triggerZoneEnabled(); ++i) {
232
XTestFakeRelativeMotionEvent(display, 100, 0, 0);
235
// We have triggered the barrier
236
QCOMPARE(QCursor::pos(), QPoint(99, 50));
237
QCOMPARE(brokenSpy.count(), 0);
238
QCOMPARE(triggeredSpy.count(), 1);
240
// We can push a bit more without breaking the barrier
241
for (int i = 0; i < 2; ++i) {
242
XTestFakeRelativeMotionEvent(display, 100, 0, 0);
245
QCOMPARE(QCursor::pos(), QPoint(99, 50));
246
QCOMPARE(brokenSpy.count(), 0);
247
QCOMPARE(triggeredSpy.count(), 1);
250
void testTriggerAndBreakZones()
252
Display *display = QX11Info::display();
253
PointerBarrierWrapper barrier;
255
QSignalSpy brokenSpy(&barrier, SIGNAL(broken()));
256
QSignalSpy triggeredSpy(&barrier, SIGNAL(triggered()));
258
XTestFakeMotionEvent(display, -1, 50, 25, 0);
259
QCOMPARE(QCursor::pos(), QPoint(50, 25));
261
barrier.setP1(QPointF(100, 0));
262
barrier.setP2(QPointF(100, 200));
263
barrier.setTriggerZoneP1(QPointF(100, 50));
264
barrier.setTriggerZoneP2(QPointF(100, 150));
265
barrier.setTriggerZoneEnabled(true);
266
barrier.setThreshold(6500);
267
barrier.setMaxVelocityMultiplier(2);
268
barrier.setDecayRate(1500);
269
barrier.setTriggerPressure(2000);
270
barrier.setBreakPressure(2000);
272
DisableTriggerZoneOnTriggerHelper helper(&barrier);
274
XTestFakeRelativeMotionEvent(display, 300, 0, 0);
275
// We are stopped by the barrier and instead in 350, 25 we are in 99, 25
276
QCOMPARE(QCursor::pos(), QPoint(99, 25));
278
QCOMPARE(brokenSpy.count(), 0);
279
QCOMPARE(triggeredSpy.count(), 0);
281
for (int i = 0; i < 10; ++i) {
282
XTestFakeRelativeMotionEvent(display, 100, 0, 0);
286
// We are above the trigger zone so we have only broke the barrier
287
QVERIFY(QCursor::pos() != QPoint(99, 25));
288
QCOMPARE(brokenSpy.count(), 1);
289
QCOMPARE(triggeredSpy.count(), 0);
292
XTestFakeMotionEvent(display, -1, 50, 100, 0);
294
XTestFakeRelativeMotionEvent(display, 300, 0, 0);
295
// We are stopped by the barrier and instead in 350, 100 we are in 99, 100
296
QCOMPARE(QCursor::pos(), QPoint(99, 100));
298
for (int i = 0; i < 10; ++i) {
299
XTestFakeRelativeMotionEvent(display, 100, 0, 0);
303
// We are in the trigger zone so we have triggered and broken the barrier
304
QVERIFY(QCursor::pos() != QPoint(99, 100));
305
QCOMPARE(brokenSpy.count(), 2);
306
QCOMPARE(triggeredSpy.count(), 1);
310
UAPP_TEST_MAIN(PointerBarrierTest)
312
#include "pointerbarriertest.moc"