tap_test.dart 7.01 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 12 13 14 15
class TestGestureArenaMember extends GestureArenaMember {
  void acceptGesture(Object key) {}
  void rejectGesture(Object key) {}
}

16
void main() {
17
  setUp(ensureGesturer);
18 19

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

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

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

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

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

Ian Hickson's avatar
Ian Hickson committed
47
  const PointerMoveEvent move3 = const PointerMoveEvent(
48
    pointer: 3,
Ian Hickson's avatar
Ian Hickson committed
49
    position: const Point(25.0, 25.0)
50 51
  );

Ian Hickson's avatar
Ian Hickson committed
52
  const PointerUpEvent up3 = const PointerUpEvent(
53
    pointer: 3,
Ian Hickson's avatar
Ian Hickson committed
54
    position: const Point(25.0, 25.0)
55 56
  );

57
  test('Should recognize tap', () {
58
    TapGestureRecognizer tap = new TapGestureRecognizer();
59 60 61 62 63 64

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

65
    tap.addPointer(down1);
66
    Gesturer.instance.gestureArena.close(1);
67
    expect(tapRecognized, isFalse);
68
    Gesturer.instance.pointerRouter.route(down1);
69 70
    expect(tapRecognized, isFalse);

71
    Gesturer.instance.pointerRouter.route(up1);
72
    expect(tapRecognized, isTrue);
73
    Gesturer.instance.gestureArena.sweep(1);
74 75 76 77 78
    expect(tapRecognized, isTrue);

    tap.dispose();
  });

79
  test('No duplicate tap events', () {
80
    TapGestureRecognizer tap = new TapGestureRecognizer();
81 82 83 84 85 86 87

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

    tap.addPointer(down1);
88
    Gesturer.instance.gestureArena.close(1);
89
    expect(tapsRecognized, 0);
90
    Gesturer.instance.pointerRouter.route(down1);
91 92
    expect(tapsRecognized, 0);

93
    Gesturer.instance.pointerRouter.route(up1);
94
    expect(tapsRecognized, 1);
95
    Gesturer.instance.gestureArena.sweep(1);
96 97 98
    expect(tapsRecognized, 1);

    tap.addPointer(down1);
99
    Gesturer.instance.gestureArena.close(1);
100
    expect(tapsRecognized, 1);
101
    Gesturer.instance.pointerRouter.route(down1);
102 103
    expect(tapsRecognized, 1);

104
    Gesturer.instance.pointerRouter.route(up1);
105
    expect(tapsRecognized, 2);
106
    Gesturer.instance.gestureArena.sweep(1);
107 108 109 110 111
    expect(tapsRecognized, 2);

    tap.dispose();
  });

112
  test('Should not recognize two overlapping taps', () {
113
    TapGestureRecognizer tap = new TapGestureRecognizer();
114 115 116 117 118

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

120
    tap.addPointer(down1);
121
    Gesturer.instance.gestureArena.close(1);
122
    expect(tapsRecognized, 0);
123
    Gesturer.instance.pointerRouter.route(down1);
124 125 126
    expect(tapsRecognized, 0);

    tap.addPointer(down2);
127
    Gesturer.instance.gestureArena.close(2);
128
    expect(tapsRecognized, 0);
129
    Gesturer.instance.pointerRouter.route(down1);
130 131 132
    expect(tapsRecognized, 0);


133
    Gesturer.instance.pointerRouter.route(up1);
134
    expect(tapsRecognized, 1);
135
    Gesturer.instance.gestureArena.sweep(1);
136 137
    expect(tapsRecognized, 1);

138
    Gesturer.instance.pointerRouter.route(up2);
139
    expect(tapsRecognized, 1);
140
    Gesturer.instance.gestureArena.sweep(2);
141
    expect(tapsRecognized, 1);
142 143 144 145 146

    tap.dispose();
  });

  test('Distance cancels tap', () {
147
    TapGestureRecognizer tap = new TapGestureRecognizer();
148 149 150 151 152

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

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

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

176 177 178
    tap.dispose();
  });

179
  test('Timeout does not cancel tap', () {
180
    TapGestureRecognizer tap = new TapGestureRecognizer();
181 182 183 184 185 186 187 188

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

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

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

    tap.dispose();
  });

  test('Should yield to other arena members', () {
206
    TapGestureRecognizer tap = new TapGestureRecognizer();
207 208 209 210 211 212 213 214

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

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

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

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

    tap.dispose();
  });

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

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

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

250
    Gesturer.instance.pointerRouter.route(up1);
251
    expect(tapRecognized, isFalse);
252
    Gesturer.instance.gestureArena.sweep(1);
253 254 255
    expect(tapRecognized, isFalse);

    entry.resolve(GestureDisposition.rejected);
256 257 258 259
    expect(tapRecognized, isTrue);

    tap.dispose();
  });
260

261
}