pointer_router_test.dart 4.58 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.

Adam Barth's avatar
Adam Barth committed
5
import 'package:flutter_test/flutter_test.dart';
6
import 'package:flutter/foundation.dart';
7
import 'package:flutter/gestures.dart';
8 9 10 11

void main() {
  test('Should route pointers', () {
    bool callbackRan = false;
Ian Hickson's avatar
Ian Hickson committed
12
    void callback(PointerEvent event) {
13 14 15
      callbackRan = true;
    }

16 17
    final TestPointer pointer2 = new TestPointer(2);
    final TestPointer pointer3 = new TestPointer(3);
18

19
    final PointerRouter router = new PointerRouter();
20
    router.addRoute(3, callback);
21
    router.route(pointer2.down(Offset.zero));
22
    expect(callbackRan, isFalse);
23
    router.route(pointer3.down(Offset.zero));
24 25 26
    expect(callbackRan, isTrue);
    callbackRan = false;
    router.removeRoute(3, callback);
27
    router.route(pointer3.up());
28 29
    expect(callbackRan, isFalse);
  });
30 31 32 33 34 35

  test('Supports re-entrant cancellation', () {
    bool callbackRan = false;
    void callback(PointerEvent event) {
      callbackRan = true;
    }
36
    final PointerRouter router = new PointerRouter();
37 38 39 40
    router.addRoute(2, (PointerEvent event) {
      router.removeRoute(2, callback);
    });
    router.addRoute(2, callback);
41
    final TestPointer pointer2 = new TestPointer(2);
42
    router.route(pointer2.down(Offset.zero));
43 44
    expect(callbackRan, isFalse);
  });
45 46 47 48 49 50 51 52

  test('Supports global callbacks', () {
    bool secondCallbackRan = false;
    void secondCallback(PointerEvent event) {
      secondCallbackRan = true;
    }

    bool firstCallbackRan = false;
53
    final PointerRouter router = new PointerRouter();
54 55 56 57 58
    router.addGlobalRoute((PointerEvent event) {
      firstCallbackRan = true;
      router.addGlobalRoute(secondCallback);
    });

59
    final TestPointer pointer2 = new TestPointer(2);
60
    router.route(pointer2.down(Offset.zero));
61 62 63 64 65 66 67 68 69
    expect(firstCallbackRan, isTrue);
    expect(secondCallbackRan, isFalse);
  });

  test('Supports re-entrant global cancellation', () {
    bool callbackRan = false;
    void callback(PointerEvent event) {
      callbackRan = true;
    }
70
    final PointerRouter router = new PointerRouter();
71 72 73 74
    router.addGlobalRoute((PointerEvent event) {
      router.removeGlobalRoute(callback);
    });
    router.addGlobalRoute(callback);
75
    final TestPointer pointer2 = new TestPointer(2);
76
    router.route(pointer2.down(Offset.zero));
77 78 79 80 81 82 83 84
    expect(callbackRan, isFalse);
  });

  test('Per-pointer callbacks cannot re-entrantly add global routes', () {
    bool callbackRan = false;
    void callback(PointerEvent event) {
      callbackRan = true;
    }
85
    final PointerRouter router = new PointerRouter();
86 87 88 89 90
    bool perPointerCallbackRan = false;
    router.addRoute(2, (PointerEvent event) {
      perPointerCallbackRan = true;
      router.addGlobalRoute(callback);
    });
91
    final TestPointer pointer2 = new TestPointer(2);
92
    router.route(pointer2.down(Offset.zero));
93 94 95 96 97
    expect(perPointerCallbackRan, isTrue);
    expect(callbackRan, isFalse);
  });

  test('Per-pointer callbacks happen before global callbacks', () {
98 99
    final List<String> log = <String>[];
    final PointerRouter router = new PointerRouter();
100 101 102 103 104 105 106 107 108 109 110 111
    router.addGlobalRoute((PointerEvent event) {
      log.add('global 1');
    });
    router.addRoute(2, (PointerEvent event) {
      log.add('per-pointer 1');
    });
    router.addGlobalRoute((PointerEvent event) {
      log.add('global 2');
    });
    router.addRoute(2, (PointerEvent event) {
      log.add('per-pointer 2');
    });
112
    final TestPointer pointer2 = new TestPointer(2);
113
    router.route(pointer2.down(Offset.zero));
114 115 116 117 118 119 120
    expect(log, equals(<String>[
      'per-pointer 1',
      'per-pointer 2',
      'global 1',
      'global 2',
    ]));
  });
121 122

  test('Exceptions do not stop pointer routing', () {
123 124
    final List<String> log = <String>[];
    final PointerRouter router = new PointerRouter();
125 126 127 128 129 130 131 132 133 134 135
    router.addRoute(2, (PointerEvent event) {
      log.add('per-pointer 1');
    });
    router.addRoute(2, (PointerEvent event) {
      log.add('per-pointer 2');
      throw "Having a bad day!";
    });
    router.addRoute(2, (PointerEvent event) {
      log.add('per-pointer 3');
    });

136
    final FlutterExceptionHandler previousErrorHandler = FlutterError.onError;
137 138 139 140
    FlutterError.onError = (FlutterErrorDetails details) {
      log.add('error report');
    };

141
    final TestPointer pointer2 = new TestPointer(2);
142
    router.route(pointer2.down(Offset.zero));
143 144 145 146 147 148 149 150 151
    expect(log, equals(<String>[
      'per-pointer 1',
      'per-pointer 2',
      'error report',
      'per-pointer 3',
    ]));

    FlutterError.onError = previousErrorHandler;
  });
152
}