tap_test.dart 7.03 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1 2 3 4
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5
import 'package:flutter/gestures.dart';
6
import 'package:quiver/testing/async.dart';
7 8
import 'package:test/test.dart';

9 10
import 'gesture_tester.dart';

11
class TestGestureArenaMember extends GestureArenaMember {
12
  @override
13
  void acceptGesture(int key) {}
14 15

  @override
16
  void rejectGesture(int key) {}
17 18
}

19
void main() {
20
  setUp(ensureGesturer);
21 22

  // Down/up pair 1: normal tap sequence
Ian Hickson's avatar
Ian Hickson committed
23
  const PointerDownEvent down1 = const PointerDownEvent(
24
    pointer: 1,
Ian Hickson's avatar
Ian Hickson committed
25
    position: const Point(10.0, 10.0)
26 27
  );

Ian Hickson's avatar
Ian Hickson committed
28
  const PointerUpEvent up1 = const PointerUpEvent(
29
    pointer: 1,
Ian Hickson's avatar
Ian Hickson committed
30
    position: const Point(11.0, 9.0)
31 32 33
  );

  // Down/up pair 2: normal tap sequence far away from pair 1
Ian Hickson's avatar
Ian Hickson committed
34
  const PointerDownEvent down2 = const PointerDownEvent(
35
    pointer: 2,
Ian Hickson's avatar
Ian Hickson committed
36
    position: const Point(30.0, 30.0)
37 38
  );

Ian Hickson's avatar
Ian Hickson committed
39
  const PointerUpEvent up2 = const PointerUpEvent(
40
    pointer: 2,
Ian Hickson's avatar
Ian Hickson committed
41
    position: const Point(31.0, 29.0)
42 43 44
  );

  // Down/move/up sequence 3: intervening motion
Ian Hickson's avatar
Ian Hickson committed
45
  const PointerDownEvent down3 = const PointerDownEvent(
46
    pointer: 3,
Ian Hickson's avatar
Ian Hickson committed
47
    position: const Point(10.0, 10.0)
48 49
  );

Ian Hickson's avatar
Ian Hickson committed
50
  const PointerMoveEvent move3 = const PointerMoveEvent(
51
    pointer: 3,
Ian Hickson's avatar
Ian Hickson committed
52
    position: const Point(25.0, 25.0)
53 54
  );

Ian Hickson's avatar
Ian Hickson committed
55
  const PointerUpEvent up3 = const PointerUpEvent(
56
    pointer: 3,
Ian Hickson's avatar
Ian Hickson committed
57
    position: const Point(25.0, 25.0)
58 59
  );

60
  test('Should recognize tap', () {
61
    TapGestureRecognizer tap = new TapGestureRecognizer();
62 63 64 65 66 67

    bool tapRecognized = false;
    tap.onTap = () {
      tapRecognized = true;
    };

68
    tap.addPointer(down1);
69
    Gesturer.instance.gestureArena.close(1);
70
    expect(tapRecognized, isFalse);
71
    Gesturer.instance.pointerRouter.route(down1);
72 73
    expect(tapRecognized, isFalse);

74
    Gesturer.instance.pointerRouter.route(up1);
75
    expect(tapRecognized, isTrue);
76
    Gesturer.instance.gestureArena.sweep(1);
77 78 79 80 81
    expect(tapRecognized, isTrue);

    tap.dispose();
  });

82
  test('No duplicate tap events', () {
83
    TapGestureRecognizer tap = new TapGestureRecognizer();
84 85 86 87 88 89 90

    int tapsRecognized = 0;
    tap.onTap = () {
      tapsRecognized++;
    };

    tap.addPointer(down1);
91
    Gesturer.instance.gestureArena.close(1);
92
    expect(tapsRecognized, 0);
93
    Gesturer.instance.pointerRouter.route(down1);
94 95
    expect(tapsRecognized, 0);

96
    Gesturer.instance.pointerRouter.route(up1);
97
    expect(tapsRecognized, 1);
98
    Gesturer.instance.gestureArena.sweep(1);
99 100 101
    expect(tapsRecognized, 1);

    tap.addPointer(down1);
102
    Gesturer.instance.gestureArena.close(1);
103
    expect(tapsRecognized, 1);
104
    Gesturer.instance.pointerRouter.route(down1);
105 106
    expect(tapsRecognized, 1);

107
    Gesturer.instance.pointerRouter.route(up1);
108
    expect(tapsRecognized, 2);
109
    Gesturer.instance.gestureArena.sweep(1);
110 111 112 113 114
    expect(tapsRecognized, 2);

    tap.dispose();
  });

115
  test('Should not recognize two overlapping taps', () {
116
    TapGestureRecognizer tap = new TapGestureRecognizer();
117 118 119 120 121

    int tapsRecognized = 0;
    tap.onTap = () {
      tapsRecognized++;
    };
122

123
    tap.addPointer(down1);
124
    Gesturer.instance.gestureArena.close(1);
125
    expect(tapsRecognized, 0);
126
    Gesturer.instance.pointerRouter.route(down1);
127 128 129
    expect(tapsRecognized, 0);

    tap.addPointer(down2);
130
    Gesturer.instance.gestureArena.close(2);
131
    expect(tapsRecognized, 0);
132
    Gesturer.instance.pointerRouter.route(down1);
133 134 135
    expect(tapsRecognized, 0);


136
    Gesturer.instance.pointerRouter.route(up1);
137
    expect(tapsRecognized, 1);
138
    Gesturer.instance.gestureArena.sweep(1);
139 140
    expect(tapsRecognized, 1);

141
    Gesturer.instance.pointerRouter.route(up2);
142
    expect(tapsRecognized, 1);
143
    Gesturer.instance.gestureArena.sweep(2);
144
    expect(tapsRecognized, 1);
145 146 147 148 149

    tap.dispose();
  });

  test('Distance cancels tap', () {
150
    TapGestureRecognizer tap = new TapGestureRecognizer();
151 152 153 154 155

    bool tapRecognized = false;
    tap.onTap = () {
      tapRecognized = true;
    };
Ian Hickson's avatar
Ian Hickson committed
156 157 158 159
    bool tapCanceled = false;
    tap.onTapCancel = () {
      tapCanceled = true;
    };
160 161

    tap.addPointer(down3);
162
    Gesturer.instance.gestureArena.close(3);
163
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
164
    expect(tapCanceled, isFalse);
165
    Gesturer.instance.pointerRouter.route(down3);
166
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
167
    expect(tapCanceled, isFalse);
168

169
    Gesturer.instance.pointerRouter.route(move3);
170
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
171
    expect(tapCanceled, isTrue);
172
    Gesturer.instance.pointerRouter.route(up3);
173
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
174
    expect(tapCanceled, isTrue);
175
    Gesturer.instance.gestureArena.sweep(3);
176
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
177
    expect(tapCanceled, isTrue);
178

179 180 181
    tap.dispose();
  });

182
  test('Timeout does not cancel tap', () {
183
    TapGestureRecognizer tap = new TapGestureRecognizer();
184 185 186 187 188 189 190 191

    bool tapRecognized = false;
    tap.onTap = () {
      tapRecognized = true;
    };

    new FakeAsync().run((FakeAsync async) {
      tap.addPointer(down1);
192
      Gesturer.instance.gestureArena.close(1);
193
      expect(tapRecognized, isFalse);
194
      Gesturer.instance.pointerRouter.route(down1);
195 196 197 198
      expect(tapRecognized, isFalse);

      async.elapse(new Duration(milliseconds: 500));
      expect(tapRecognized, isFalse);
199
      Gesturer.instance.pointerRouter.route(up1);
200
      expect(tapRecognized, isTrue);
201
      Gesturer.instance.gestureArena.sweep(1);
202
      expect(tapRecognized, isTrue);
203 204 205 206 207 208
    });

    tap.dispose();
  });

  test('Should yield to other arena members', () {
209
    TapGestureRecognizer tap = new TapGestureRecognizer();
210 211 212 213 214 215 216 217

    bool tapRecognized = false;
    tap.onTap = () {
      tapRecognized = true;
    };

    tap.addPointer(down1);
    TestGestureArenaMember member = new TestGestureArenaMember();
218 219 220
    GestureArenaEntry entry = Gesturer.instance.gestureArena.add(1, member);
    Gesturer.instance.gestureArena.hold(1);
    Gesturer.instance.gestureArena.close(1);
221
    expect(tapRecognized, isFalse);
222
    Gesturer.instance.pointerRouter.route(down1);
223 224
    expect(tapRecognized, isFalse);

225
    Gesturer.instance.pointerRouter.route(up1);
226
    expect(tapRecognized, isFalse);
227
    Gesturer.instance.gestureArena.sweep(1);
228 229 230 231 232 233 234 235 236
    expect(tapRecognized, isFalse);

    entry.resolve(GestureDisposition.accepted);
    expect(tapRecognized, isFalse);

    tap.dispose();
  });

  test('Should trigger on release of held arena', () {
237
    TapGestureRecognizer tap = new TapGestureRecognizer();
238 239 240 241 242 243 244 245

    bool tapRecognized = false;
    tap.onTap = () {
      tapRecognized = true;
    };

    tap.addPointer(down1);
    TestGestureArenaMember member = new TestGestureArenaMember();
246 247 248
    GestureArenaEntry entry = Gesturer.instance.gestureArena.add(1, member);
    Gesturer.instance.gestureArena.hold(1);
    Gesturer.instance.gestureArena.close(1);
249
    expect(tapRecognized, isFalse);
250
    Gesturer.instance.pointerRouter.route(down1);
251 252
    expect(tapRecognized, isFalse);

253
    Gesturer.instance.pointerRouter.route(up1);
254
    expect(tapRecognized, isFalse);
255
    Gesturer.instance.gestureArena.sweep(1);
256 257 258
    expect(tapRecognized, isFalse);

    entry.resolve(GestureDisposition.rejected);
259 260 261 262
    expect(tapRecognized, isTrue);

    tap.dispose();
  });
263

264
}