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

14
void main() {
15 16

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

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

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

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

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

Ian Hickson's avatar
Ian Hickson committed
44
  const PointerMoveEvent move3 = const PointerMoveEvent(
45
    pointer: 3,
Ian Hickson's avatar
Ian Hickson committed
46
    position: const Point(25.0, 25.0)
47 48
  );

Ian Hickson's avatar
Ian Hickson committed
49
  const PointerUpEvent up3 = const PointerUpEvent(
50
    pointer: 3,
Ian Hickson's avatar
Ian Hickson committed
51
    position: const Point(25.0, 25.0)
52 53
  );

54 55
  test('Should recognize tap', () {
    PointerRouter router = new PointerRouter();
Ian Hickson's avatar
Ian Hickson committed
56 57 58 59 60
    GestureArena gestureArena = new GestureArena();
    TapGestureRecognizer tap = new TapGestureRecognizer(
      router: router,
      gestureArena: gestureArena
    );
61 62 63 64 65 66

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

67
    tap.addPointer(down1);
Ian Hickson's avatar
Ian Hickson committed
68
    gestureArena.close(1);
69 70 71 72 73 74
    expect(tapRecognized, isFalse);
    router.route(down1);
    expect(tapRecognized, isFalse);

    router.route(up1);
    expect(tapRecognized, isTrue);
Ian Hickson's avatar
Ian Hickson committed
75
    gestureArena.sweep(1);
76 77 78 79 80
    expect(tapRecognized, isTrue);

    tap.dispose();
  });

81 82
  test('No duplicate tap events', () {
    PointerRouter router = new PointerRouter();
Ian Hickson's avatar
Ian Hickson committed
83 84 85 86 87
    GestureArena gestureArena = new GestureArena();
    TapGestureRecognizer tap = new TapGestureRecognizer(
      router: router,
      gestureArena: gestureArena
    );
88 89 90 91 92 93 94

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

    tap.addPointer(down1);
Ian Hickson's avatar
Ian Hickson committed
95
    gestureArena.close(1);
96 97 98 99 100 101
    expect(tapsRecognized, 0);
    router.route(down1);
    expect(tapsRecognized, 0);

    router.route(up1);
    expect(tapsRecognized, 1);
Ian Hickson's avatar
Ian Hickson committed
102
    gestureArena.sweep(1);
103 104 105
    expect(tapsRecognized, 1);

    tap.addPointer(down1);
Ian Hickson's avatar
Ian Hickson committed
106
    gestureArena.close(1);
107 108 109 110 111 112
    expect(tapsRecognized, 1);
    router.route(down1);
    expect(tapsRecognized, 1);

    router.route(up1);
    expect(tapsRecognized, 2);
Ian Hickson's avatar
Ian Hickson committed
113
    gestureArena.sweep(1);
114 115 116 117 118
    expect(tapsRecognized, 2);

    tap.dispose();
  });

119
  test('Should not recognize two overlapping taps', () {
120
    PointerRouter router = new PointerRouter();
Ian Hickson's avatar
Ian Hickson committed
121 122 123 124 125
    GestureArena gestureArena = new GestureArena();
    TapGestureRecognizer tap = new TapGestureRecognizer(
      router: router,
      gestureArena: gestureArena
    );
126 127 128 129 130

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

132
    tap.addPointer(down1);
Ian Hickson's avatar
Ian Hickson committed
133
    gestureArena.close(1);
134 135 136 137 138
    expect(tapsRecognized, 0);
    router.route(down1);
    expect(tapsRecognized, 0);

    tap.addPointer(down2);
Ian Hickson's avatar
Ian Hickson committed
139
    gestureArena.close(2);
140 141 142 143 144 145 146
    expect(tapsRecognized, 0);
    router.route(down1);
    expect(tapsRecognized, 0);


    router.route(up1);
    expect(tapsRecognized, 1);
Ian Hickson's avatar
Ian Hickson committed
147
    gestureArena.sweep(1);
148 149 150
    expect(tapsRecognized, 1);

    router.route(up2);
151
    expect(tapsRecognized, 1);
Ian Hickson's avatar
Ian Hickson committed
152
    gestureArena.sweep(2);
153
    expect(tapsRecognized, 1);
154 155 156 157 158 159

    tap.dispose();
  });

  test('Distance cancels tap', () {
    PointerRouter router = new PointerRouter();
Ian Hickson's avatar
Ian Hickson committed
160 161 162 163 164
    GestureArena gestureArena = new GestureArena();
    TapGestureRecognizer tap = new TapGestureRecognizer(
      router: router,
      gestureArena: gestureArena
    );
165 166 167 168 169

    bool tapRecognized = false;
    tap.onTap = () {
      tapRecognized = true;
    };
Ian Hickson's avatar
Ian Hickson committed
170 171 172 173
    bool tapCanceled = false;
    tap.onTapCancel = () {
      tapCanceled = true;
    };
174 175

    tap.addPointer(down3);
Ian Hickson's avatar
Ian Hickson committed
176
    gestureArena.close(3);
177
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
178
    expect(tapCanceled, isFalse);
179
    router.route(down3);
180
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
181
    expect(tapCanceled, isFalse);
182

183 184
    router.route(move3);
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
185
    expect(tapCanceled, isTrue);
186 187
    router.route(up3);
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
188
    expect(tapCanceled, isTrue);
Ian Hickson's avatar
Ian Hickson committed
189
    gestureArena.sweep(3);
190
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
191
    expect(tapCanceled, isTrue);
192

193 194 195
    tap.dispose();
  });

196
  test('Timeout does not cancel tap', () {
197
    PointerRouter router = new PointerRouter();
Ian Hickson's avatar
Ian Hickson committed
198 199 200 201 202
    GestureArena gestureArena = new GestureArena();
    TapGestureRecognizer tap = new TapGestureRecognizer(
      router: router,
      gestureArena: gestureArena
    );
203 204 205 206 207 208 209 210

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

    new FakeAsync().run((FakeAsync async) {
      tap.addPointer(down1);
Ian Hickson's avatar
Ian Hickson committed
211
      gestureArena.close(1);
212 213 214 215 216 217 218
      expect(tapRecognized, isFalse);
      router.route(down1);
      expect(tapRecognized, isFalse);

      async.elapse(new Duration(milliseconds: 500));
      expect(tapRecognized, isFalse);
      router.route(up1);
219
      expect(tapRecognized, isTrue);
Ian Hickson's avatar
Ian Hickson committed
220
      gestureArena.sweep(1);
221
      expect(tapRecognized, isTrue);
222 223 224 225 226 227 228
    });

    tap.dispose();
  });

  test('Should yield to other arena members', () {
    PointerRouter router = new PointerRouter();
Ian Hickson's avatar
Ian Hickson committed
229 230 231 232 233
    GestureArena gestureArena = new GestureArena();
    TapGestureRecognizer tap = new TapGestureRecognizer(
      router: router,
      gestureArena: gestureArena
    );
234 235 236 237 238 239 240 241

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

    tap.addPointer(down1);
    TestGestureArenaMember member = new TestGestureArenaMember();
Ian Hickson's avatar
Ian Hickson committed
242 243 244
    GestureArenaEntry entry = gestureArena.add(1, member);
    gestureArena.hold(1);
    gestureArena.close(1);
245 246 247 248 249 250
    expect(tapRecognized, isFalse);
    router.route(down1);
    expect(tapRecognized, isFalse);

    router.route(up1);
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
251
    gestureArena.sweep(1);
252 253 254 255 256 257 258 259 260 261
    expect(tapRecognized, isFalse);

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

    tap.dispose();
  });

  test('Should trigger on release of held arena', () {
    PointerRouter router = new PointerRouter();
Ian Hickson's avatar
Ian Hickson committed
262 263 264 265 266
    GestureArena gestureArena = new GestureArena();
    TapGestureRecognizer tap = new TapGestureRecognizer(
      router: router,
      gestureArena: gestureArena
    );
267 268 269 270 271 272 273 274

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

    tap.addPointer(down1);
    TestGestureArenaMember member = new TestGestureArenaMember();
Ian Hickson's avatar
Ian Hickson committed
275 276 277
    GestureArenaEntry entry = gestureArena.add(1, member);
    gestureArena.hold(1);
    gestureArena.close(1);
278 279 280 281 282 283
    expect(tapRecognized, isFalse);
    router.route(down1);
    expect(tapRecognized, isFalse);

    router.route(up1);
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
284
    gestureArena.sweep(1);
285 286 287
    expect(tapRecognized, isFalse);

    entry.resolve(GestureDisposition.rejected);
288 289 290 291
    expect(tapRecognized, isTrue);

    tap.dispose();
  });
292

293
}