team_test.dart 4.28 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6 7 8 9 10 11 12 13
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/gestures.dart';

import 'gesture_tester.dart';

void main() {
  setUp(ensureGestureBinding);

  testGesture('GestureArenaTeam rejection test', (GestureTester tester) {
14 15 16 17
    final GestureArenaTeam team = GestureArenaTeam();
    final HorizontalDragGestureRecognizer horizontalDrag = HorizontalDragGestureRecognizer()..team = team;
    final VerticalDragGestureRecognizer verticalDrag = VerticalDragGestureRecognizer()..team = team;
    final TapGestureRecognizer tap = TapGestureRecognizer();
18 19 20 21 22

    expect(horizontalDrag.team, equals(team));
    expect(verticalDrag.team, equals(team));
    expect(tap.team, isNull);

23
    final List<String> log = <String>[];
24

Josh Soref's avatar
Josh Soref committed
25
    horizontalDrag.onStart = (DragStartDetails details) { log.add('horizontal-drag-start'); };
26 27 28 29
    verticalDrag.onStart = (DragStartDetails details) { log.add('vertical-drag-start'); };
    tap.onTap = () { log.add('tap'); };

    void test(Offset delta) {
30
      const Offset origin = Offset(10.0, 10.0);
31
      final TestPointer pointer = TestPointer(5);
32
      final PointerDownEvent down = pointer.down(origin);
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
      horizontalDrag.addPointer(down);
      verticalDrag.addPointer(down);
      tap.addPointer(down);
      expect(log, isEmpty);
      tester.closeArena(5);
      expect(log, isEmpty);
      tester.route(down);
      expect(log, isEmpty);
      tester.route(pointer.move(origin + delta));
      tester.route(pointer.up());
    }

    test(Offset.zero);
    expect(log, <String>['tap']);
    log.clear();

    test(const Offset(0.0, 30.0));
    expect(log, <String>['vertical-drag-start']);
    log.clear();

    horizontalDrag.dispose();
    verticalDrag.dispose();
    tap.dispose();
  });
57 58

  testGesture('GestureArenaTeam captain', (GestureTester tester) {
59 60 61 62 63
    final GestureArenaTeam team = GestureArenaTeam();
    final PassiveGestureRecognizer captain = PassiveGestureRecognizer()..team = team;
    final HorizontalDragGestureRecognizer horizontalDrag = HorizontalDragGestureRecognizer()..team = team;
    final VerticalDragGestureRecognizer verticalDrag = VerticalDragGestureRecognizer()..team = team;
    final TapGestureRecognizer tap = TapGestureRecognizer();
64 65 66 67 68 69 70 71 72 73 74 75

    team.captain = captain;

    final List<String> log = <String>[];

    captain.onGestureAccepted = () { log.add('captain accepted gesture'); };
    horizontalDrag.onStart = (DragStartDetails details) { log.add('horizontal-drag-start'); };
    verticalDrag.onStart = (DragStartDetails details) { log.add('vertical-drag-start'); };
    tap.onTap = () { log.add('tap'); };

    void test(Offset delta) {
      const Offset origin = Offset(10.0, 10.0);
76
      final TestPointer pointer = TestPointer(5);
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
      final PointerDownEvent down = pointer.down(origin);
      captain.addPointer(down);
      horizontalDrag.addPointer(down);
      verticalDrag.addPointer(down);
      tap.addPointer(down);
      expect(log, isEmpty);
      tester.closeArena(5);
      expect(log, isEmpty);
      tester.route(down);
      expect(log, isEmpty);
      tester.route(pointer.move(origin + delta));
      tester.route(pointer.up());
    }

    test(Offset.zero);
    expect(log, <String>['tap']);
    log.clear();

    test(const Offset(0.0, 30.0));
    expect(log, <String>['captain accepted gesture']);
    log.clear();

    horizontalDrag.dispose();
    verticalDrag.dispose();
    tap.dispose();
    captain.dispose();
  });
}

106
typedef GestureAcceptedCallback = void Function();
107 108

class PassiveGestureRecognizer extends OneSequenceGestureRecognizer {
109
  GestureAcceptedCallback? onGestureAccepted;
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

  @override
  void addPointer(PointerDownEvent event) {
    startTrackingPointer(event.pointer);
  }

  @override
  String get debugDescription => 'passive';

  @override
  void didStopTrackingLastPointer(int pointer) {
    resolve(GestureDisposition.rejected);
  }

  @override
  void handleEvent(PointerEvent event) {
    if (event is PointerUpEvent || event is PointerCancelEvent) {
      stopTrackingPointer(event.pointer);
    }
  }

  @override
  void acceptGesture(int pointer) {
    if (onGestureAccepted != null) {
134
      onGestureAccepted!();
135 136 137 138 139
    }
  }

  @override
  void rejectGesture(int pointer) { }
140
}