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 6
// @dart = 2.8

7
import 'package:flutter/gestures.dart';
8 9

import '../flutter_test_alternative.dart';
Adam Barth's avatar
Adam Barth committed
10

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

Hixie's avatar
Hixie committed
13 14
const int primaryKey = 4;

Adam Barth's avatar
Adam Barth committed
15
class TestGestureArenaMember extends GestureArenaMember {
Hixie's avatar
Hixie committed
16
  bool acceptRan = false;
17 18

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

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

Hixie's avatar
Hixie committed
32
class GestureTester {
33 34 35
  GestureArenaManager arena = GestureArenaManager();
  TestGestureArenaMember first = TestGestureArenaMember();
  TestGestureArenaMember second = TestGestureArenaMember();
Adam Barth's avatar
Adam Barth committed
36

Hixie's avatar
Hixie committed
37 38 39
  GestureArenaEntry firstEntry;
  void addFirst() {
    firstEntry = arena.add(primaryKey, first);
Adam Barth's avatar
Adam Barth committed
40 41
  }

Hixie's avatar
Hixie committed
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
  GestureArenaEntry secondEntry;
  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
66 67 68 69 70
  }
}

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

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

  test('Should win on release after hold sweep release', () {
91
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
92 93 94 95 96 97 98 99 100 101
    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();
102 103 104
  });

  test('Should win on sweep after hold release sweep', () {
105
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
106 107 108 109 110 111 112 113 114 115 116 117 118
    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', () {
119
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
120 121 122 123 124 125 126 127 128 129
    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', () {
130
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
131 132 133 134 135 136 137 138 139 140
    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', () {
141
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
142 143 144 145 146 147 148 149 150 151
    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', () {
152
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
153 154 155 156 157 158 159 160 161 162 163
    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', () {
164
    final GestureTester tester = GestureTester();
Hixie's avatar
Hixie committed
165 166 167 168 169 170 171 172
    tester.addFirst();
    tester.addSecond();
    tester.expectNothing();
    tester.secondEntry.resolve(GestureDisposition.accepted);
    tester.firstEntry.resolve(GestureDisposition.accepted);
    tester.expectNothing();
    tester.arena.close(primaryKey);
    tester.expectSecondWin();
173
  });
Adam Barth's avatar
Adam Barth committed
174
}