arena_test.dart 4.92 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
Ian Hickson's avatar
Ian Hickson committed
2 3 4
// 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:flutter_test/flutter_test.dart';
Adam Barth's avatar
Adam Barth committed
7

8
typedef GestureArenaCallback = void Function(Object key);
Adam Barth's avatar
Adam Barth committed
9

Hixie's avatar
Hixie committed
10 11
const int primaryKey = 4;

Adam Barth's avatar
Adam Barth committed
12
class TestGestureArenaMember extends GestureArenaMember {
Hixie's avatar
Hixie committed
13
  bool acceptRan = false;
14 15

  @override
16
  void acceptGesture(int key) {
Hixie's avatar
Hixie committed
17 18 19 20
    expect(key, equals(primaryKey));
    acceptRan = true;
  }
  bool rejectRan = false;
21 22

  @override
23
  void rejectGesture(int key) {
Hixie's avatar
Hixie committed
24 25 26 27
    expect(key, equals(primaryKey));
    rejectRan = true;
  }
}
Adam Barth's avatar
Adam Barth committed
28

Hixie's avatar
Hixie committed
29
class GestureTester {
30 31 32
  GestureArenaManager arena = GestureArenaManager();
  TestGestureArenaMember first = TestGestureArenaMember();
  TestGestureArenaMember second = TestGestureArenaMember();
Adam Barth's avatar
Adam Barth committed
33

34
  late GestureArenaEntry firstEntry;
Hixie's avatar
Hixie committed
35 36
  void addFirst() {
    firstEntry = arena.add(primaryKey, first);
Adam Barth's avatar
Adam Barth committed
37 38
  }

39
  late GestureArenaEntry secondEntry;
Hixie's avatar
Hixie committed
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
  void addSecond() {
    secondEntry = arena.add(primaryKey, second);
  }

  void expectNothing() {
    expect(first.acceptRan, isFalse);
    expect(first.rejectRan, isFalse);
    expect(second.acceptRan, isFalse);
    expect(second.rejectRan, isFalse);
  }

  void expectFirstWin() {
    expect(first.acceptRan, isTrue);
    expect(first.rejectRan, isFalse);
    expect(second.acceptRan, isFalse);
    expect(second.rejectRan, isTrue);
  }

  void expectSecondWin() {
    expect(first.acceptRan, isFalse);
    expect(first.rejectRan, isTrue);
    expect(second.acceptRan, isTrue);
    expect(second.rejectRan, isFalse);
Adam Barth's avatar
Adam Barth committed
63 64 65 66 67
  }
}

void main() {
  test('Should win by accepting', () {
68
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
69 70 71 72 73 74
    tester.addFirst();
    tester.addSecond();
    tester.arena.close(primaryKey);
    tester.expectNothing();
    tester.firstEntry.resolve(GestureDisposition.accepted);
    tester.expectFirstWin();
Adam Barth's avatar
Adam Barth committed
75
  });
76 77

  test('Should win by sweep', () {
78
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
79 80 81 82 83 84
    tester.addFirst();
    tester.addSecond();
    tester.arena.close(primaryKey);
    tester.expectNothing();
    tester.arena.sweep(primaryKey);
    tester.expectFirstWin();
85 86 87
  });

  test('Should win on release after hold sweep release', () {
88
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
89 90 91 92 93 94 95 96 97 98
    tester.addFirst();
    tester.addSecond();
    tester.arena.close(primaryKey);
    tester.expectNothing();
    tester.arena.hold(primaryKey);
    tester.expectNothing();
    tester.arena.sweep(primaryKey);
    tester.expectNothing();
    tester.arena.release(primaryKey);
    tester.expectFirstWin();
99 100 101
  });

  test('Should win on sweep after hold release sweep', () {
102
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
103 104 105 106 107 108 109 110 111 112 113 114 115
    tester.addFirst();
    tester.addSecond();
    tester.arena.close(primaryKey);
    tester.expectNothing();
    tester.arena.hold(primaryKey);
    tester.expectNothing();
    tester.arena.release(primaryKey);
    tester.expectNothing();
    tester.arena.sweep(primaryKey);
    tester.expectFirstWin();
  });

  test('Only first winner should win', () {
116
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
117 118 119 120 121 122 123 124 125 126
    tester.addFirst();
    tester.addSecond();
    tester.arena.close(primaryKey);
    tester.expectNothing();
    tester.firstEntry.resolve(GestureDisposition.accepted);
    tester.secondEntry.resolve(GestureDisposition.accepted);
    tester.expectFirstWin();
  });

  test('Only first winner should win, regardless of order', () {
127
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
128 129 130 131 132 133 134 135 136 137
    tester.addFirst();
    tester.addSecond();
    tester.arena.close(primaryKey);
    tester.expectNothing();
    tester.secondEntry.resolve(GestureDisposition.accepted);
    tester.firstEntry.resolve(GestureDisposition.accepted);
    tester.expectSecondWin();
  });

  test('Win before close is delayed to close', () {
138
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
139 140 141 142 143 144 145 146 147 148
    tester.addFirst();
    tester.addSecond();
    tester.expectNothing();
    tester.firstEntry.resolve(GestureDisposition.accepted);
    tester.expectNothing();
    tester.arena.close(primaryKey);
    tester.expectFirstWin();
  });

  test('Win before close is delayed to close, and only first winner should win', () {
149
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
150 151 152 153 154 155 156 157 158 159 160
    tester.addFirst();
    tester.addSecond();
    tester.expectNothing();
    tester.firstEntry.resolve(GestureDisposition.accepted);
    tester.secondEntry.resolve(GestureDisposition.accepted);
    tester.expectNothing();
    tester.arena.close(primaryKey);
    tester.expectFirstWin();
  });

  test('Win before close is delayed to close, and only first winner should win, regardless of order', () {
161
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
162 163 164 165 166 167 168 169
    tester.addFirst();
    tester.addSecond();
    tester.expectNothing();
    tester.secondEntry.resolve(GestureDisposition.accepted);
    tester.firstEntry.resolve(GestureDisposition.accepted);
    tester.expectNothing();
    tester.arena.close(primaryKey);
    tester.expectSecondWin();
170
  });
Adam Barth's avatar
Adam Barth committed
171
}