gesture_binding_test.dart 6.27 KB
Newer Older
1 2 3 4 5 6
// Copyright 2016 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.

import 'dart:ui' as ui;

7
import 'package:flutter/foundation.dart';
8 9 10 11 12
import 'package:flutter/gestures.dart';
import 'package:test/test.dart';

typedef void HandleEventCallback(PointerEvent event);

13
class TestGestureFlutterBinding extends BindingBase with GestureBinding {
14 15 16 17 18 19 20
  HandleEventCallback callback;

  @override
  void handleEvent(PointerEvent event, HitTestEntry entry) {
    if (callback != null)
      callback(event);
    super.handleEvent(event, entry);
21
  }
22 23 24 25
}

TestGestureFlutterBinding _binding = new TestGestureFlutterBinding();

26
void ensureTestGestureBinding() {
27
  _binding ??= new TestGestureFlutterBinding();
28
  assert(GestureBinding.instance != null);
29 30 31
}

void main() {
32
  setUp(ensureTestGestureBinding);
33 34

  test('Pointer tap events', () {
35
    final ui.PointerDataPacket packet = const ui.PointerDataPacket(
36 37 38
      data: const <ui.PointerData>[
        const ui.PointerData(change: ui.PointerChange.down),
        const ui.PointerData(change: ui.PointerChange.up),
39 40
      ]
    );
41

42
    final List<PointerEvent> events = <PointerEvent>[];
43
    _binding.callback = events.add;
44

45
    ui.window.onPointerDataPacket(packet);
46
    expect(events.length, 2);
47 48 49 50
    expect(events[0].runtimeType, equals(PointerDownEvent));
    expect(events[1].runtimeType, equals(PointerUpEvent));
  });

51
  test('Pointer move events', () {
52
    final ui.PointerDataPacket packet = const ui.PointerDataPacket(
53 54 55 56
      data: const <ui.PointerData>[
        const ui.PointerData(change: ui.PointerChange.down),
        const ui.PointerData(change: ui.PointerChange.move),
        const ui.PointerData(change: ui.PointerChange.up),
57 58
      ]
    );
59

60
    final List<PointerEvent> events = <PointerEvent>[];
61
    _binding.callback = events.add;
62

63
    ui.window.onPointerDataPacket(packet);
64 65 66 67 68 69
    expect(events.length, 3);
    expect(events[0].runtimeType, equals(PointerDownEvent));
    expect(events[1].runtimeType, equals(PointerMoveEvent));
    expect(events[2].runtimeType, equals(PointerUpEvent));
  });

70
  test('Synthetic move events', () {
71 72 73
    final ui.PointerDataPacket packet = new ui.PointerDataPacket(
      data: <ui.PointerData>[
        new ui.PointerData(
74
          change: ui.PointerChange.down,
75 76
          physicalX: 1.0 * ui.window.devicePixelRatio,
          physicalY: 3.0 * ui.window.devicePixelRatio,
77
        ),
78
        new ui.PointerData(
79
          change: ui.PointerChange.up,
80 81
          physicalX: 10.0 * ui.window.devicePixelRatio,
          physicalY: 15.0 * ui.window.devicePixelRatio,
82 83 84
        ),
      ]
    );
85

86
    final List<PointerEvent> events = <PointerEvent>[];
87
    _binding.callback = events.add;
88

89
    ui.window.onPointerDataPacket(packet);
90 91 92 93 94 95 96
    expect(events.length, 3);
    expect(events[0].runtimeType, equals(PointerDownEvent));
    expect(events[1].runtimeType, equals(PointerMoveEvent));
    expect(events[1].delta, equals(const Offset(9.0, 12.0)));
    expect(events[2].runtimeType, equals(PointerUpEvent));
  });

97
  test('Pointer cancel events', () {
98
    final ui.PointerDataPacket packet = const ui.PointerDataPacket(
99 100 101
      data: const <ui.PointerData>[
        const ui.PointerData(change: ui.PointerChange.down),
        const ui.PointerData(change: ui.PointerChange.cancel),
102 103
      ]
    );
104

105
    final List<PointerEvent> events = <PointerEvent>[];
106
    _binding.callback = events.add;
107

108
    ui.window.onPointerDataPacket(packet);
109 110 111 112 113 114
    expect(events.length, 2);
    expect(events[0].runtimeType, equals(PointerDownEvent));
    expect(events[1].runtimeType, equals(PointerCancelEvent));
  });

  test('Can cancel pointers', () {
115
    final ui.PointerDataPacket packet = const ui.PointerDataPacket(
116 117 118
      data: const <ui.PointerData>[
        const ui.PointerData(change: ui.PointerChange.down),
        const ui.PointerData(change: ui.PointerChange.up),
119 120
      ]
    );
121

122
    final List<PointerEvent> events = <PointerEvent>[];
123 124 125 126 127 128
    _binding.callback = (PointerEvent event) {
      events.add(event);
      if (event is PointerDownEvent)
        _binding.cancelPointer(event.pointer);
    };

129
    ui.window.onPointerDataPacket(packet);
130
    expect(events.length, 2);
131 132 133
    expect(events[0].runtimeType, equals(PointerDownEvent));
    expect(events[1].runtimeType, equals(PointerCancelEvent));
  });
134 135

  test('Can expand add and hover pointers', () {
136
    final ui.PointerDataPacket packet = const ui.PointerDataPacket(
137 138 139 140 141 142 143 144
      data: const <ui.PointerData>[
        const ui.PointerData(change: ui.PointerChange.add, device: 24),
        const ui.PointerData(change: ui.PointerChange.hover, device: 24),
        const ui.PointerData(change: ui.PointerChange.remove, device: 24),
        const ui.PointerData(change: ui.PointerChange.hover, device: 24),
      ]
    );

145
    final List<PointerEvent> events = PointerEventConverter.expand(
146 147 148 149 150 151 152 153 154 155 156
      packet.data, ui.window.devicePixelRatio).toList();

    expect(events.length, 5);
    expect(events[0].runtimeType, equals(PointerAddedEvent));
    expect(events[1].runtimeType, equals(PointerHoverEvent));
    expect(events[2].runtimeType, equals(PointerRemovedEvent));
    expect(events[3].runtimeType, equals(PointerAddedEvent));
    expect(events[4].runtimeType, equals(PointerHoverEvent));
  });

  test('Synthetic hover and cancel for misplaced down and remove', () {
157 158 159 160
    final ui.PointerDataPacket packet = new ui.PointerDataPacket(
      data: <ui.PointerData>[
        new ui.PointerData(change: ui.PointerChange.add, device: 25, physicalX: 10.0 * ui.window.devicePixelRatio, physicalY: 10.0 * ui.window.devicePixelRatio),
        new ui.PointerData(change: ui.PointerChange.down, device: 25, physicalX: 15.0 * ui.window.devicePixelRatio, physicalY: 17.0 * ui.window.devicePixelRatio),
161 162 163 164
        const ui.PointerData(change: ui.PointerChange.remove, device: 25),
      ]
    );

165
    final List<PointerEvent> events = PointerEventConverter.expand(
166 167 168 169 170
      packet.data, ui.window.devicePixelRatio).toList();

    expect(events.length, 5);
    expect(events[0].runtimeType, equals(PointerAddedEvent));
    expect(events[1].runtimeType, equals(PointerHoverEvent));
171
    expect(events[1].delta, equals(const Offset(5.0, 7.0)));
172 173 174 175
    expect(events[2].runtimeType, equals(PointerDownEvent));
    expect(events[3].runtimeType, equals(PointerCancelEvent));
    expect(events[4].runtimeType, equals(PointerRemovedEvent));
  });
176
}