tap_test.dart 6.59 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 7
import 'package:test/test.dart';

8 9
import 'gesture_tester.dart';

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

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

18
void main() {
19
  setUp(ensureGestureBinding);
20 21

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

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

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

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

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

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

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

59
  testGesture('Should recognize tap', (GestureTester tester) {
60
    TapGestureRecognizer tap = new TapGestureRecognizer();
61 62 63 64 65 66

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

67
    tap.addPointer(down1);
68
    tester.closeArena(1);
69
    expect(tapRecognized, isFalse);
70
    tester.route(down1);
71 72
    expect(tapRecognized, isFalse);

73
    tester.route(up1);
74
    expect(tapRecognized, isTrue);
75
    GestureBinding.instance.gestureArena.sweep(1);
76 77 78 79 80
    expect(tapRecognized, isTrue);

    tap.dispose();
  });

81
  testGesture('No duplicate tap events', (GestureTester tester) {
82
    TapGestureRecognizer tap = new TapGestureRecognizer();
83 84 85 86 87 88 89

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

    tap.addPointer(down1);
90
    tester.closeArena(1);
91
    expect(tapsRecognized, 0);
92
    tester.route(down1);
93 94
    expect(tapsRecognized, 0);

95
    tester.route(up1);
96
    expect(tapsRecognized, 1);
97
    GestureBinding.instance.gestureArena.sweep(1);
98 99 100
    expect(tapsRecognized, 1);

    tap.addPointer(down1);
101
    tester.closeArena(1);
102
    expect(tapsRecognized, 1);
103
    tester.route(down1);
104 105
    expect(tapsRecognized, 1);

106
    tester.route(up1);
107
    expect(tapsRecognized, 2);
108
    GestureBinding.instance.gestureArena.sweep(1);
109 110 111 112 113
    expect(tapsRecognized, 2);

    tap.dispose();
  });

114
  testGesture('Should not recognize two overlapping taps', (GestureTester tester) {
115
    TapGestureRecognizer tap = new TapGestureRecognizer();
116 117 118 119 120

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

122
    tap.addPointer(down1);
123
    tester.closeArena(1);
124
    expect(tapsRecognized, 0);
125
    tester.route(down1);
126 127 128
    expect(tapsRecognized, 0);

    tap.addPointer(down2);
129
    tester.closeArena(2);
130
    expect(tapsRecognized, 0);
131
    tester.route(down1);
132 133 134
    expect(tapsRecognized, 0);


135
    tester.route(up1);
136
    expect(tapsRecognized, 1);
137
    GestureBinding.instance.gestureArena.sweep(1);
138 139
    expect(tapsRecognized, 1);

140
    tester.route(up2);
141
    expect(tapsRecognized, 1);
142
    GestureBinding.instance.gestureArena.sweep(2);
143
    expect(tapsRecognized, 1);
144 145 146 147

    tap.dispose();
  });

148
  testGesture('Distance cancels tap', (GestureTester tester) {
149
    TapGestureRecognizer tap = new TapGestureRecognizer();
150 151 152 153 154

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

    tap.addPointer(down3);
161
    tester.closeArena(3);
162
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
163
    expect(tapCanceled, isFalse);
164
    tester.route(down3);
165
    expect(tapRecognized, isFalse);
Ian Hickson's avatar
Ian Hickson committed
166
    expect(tapCanceled, isFalse);
167

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

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

181
  testGesture('Timeout does not cancel tap', (GestureTester tester) {
182
    TapGestureRecognizer tap = new TapGestureRecognizer();
183 184 185 186 187 188

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

189 190 191 192 193 194 195 196 197 198 199 200
    tap.addPointer(down1);
    tester.closeArena(1);
    expect(tapRecognized, isFalse);
    tester.route(down1);
    expect(tapRecognized, isFalse);

    tester.async.elapse(new Duration(milliseconds: 500));
    expect(tapRecognized, isFalse);
    tester.route(up1);
    expect(tapRecognized, isTrue);
    GestureBinding.instance.gestureArena.sweep(1);
    expect(tapRecognized, isTrue);
201 202 203 204

    tap.dispose();
  });

205
  testGesture('Should yield to other arena members', (GestureTester tester) {
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
    GestureArenaEntry entry = GestureBinding.instance.gestureArena.add(1, member);
    GestureBinding.instance.gestureArena.hold(1);
217
    tester.closeArena(1);
218
    expect(tapRecognized, isFalse);
219
    tester.route(down1);
220 221
    expect(tapRecognized, isFalse);

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

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

    tap.dispose();
  });

233
  testGesture('Should trigger on release of held arena', (GestureTester tester) {
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
    GestureArenaEntry entry = GestureBinding.instance.gestureArena.add(1, member);
    GestureBinding.instance.gestureArena.hold(1);
245
    tester.closeArena(1);
246
    expect(tapRecognized, isFalse);
247
    tester.route(down1);
248 249
    expect(tapRecognized, isFalse);

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

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

    tap.dispose();
  });
261

262
}