multidrag_test.dart 3.42 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
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 8 9 10 11
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/gestures.dart';

import 'gesture_tester.dart';

12
class TestDrag extends Drag { }
13 14 15 16

void main() {
  setUp(ensureGestureBinding);

17
  testGesture('MultiDrag: moving before delay rejects', (GestureTester tester) {
18
    final DelayedMultiDragGestureRecognizer drag = DelayedMultiDragGestureRecognizer();
19 20

    bool didStartDrag = false;
21
    drag.onStart = (Offset position) {
22
      didStartDrag = true;
23
      return TestDrag();
24 25
    };

26
    final TestPointer pointer = TestPointer(5);
27
    final PointerDownEvent down = pointer.down(const Offset(10.0, 10.0));
28 29 30 31 32
    drag.addPointer(down);
    tester.closeArena(5);
    expect(didStartDrag, isFalse);
    tester.async.flushMicrotasks();
    expect(didStartDrag, isFalse);
33 34 35 36 37 38 39 40 41 42
    tester.route(pointer.move(const Offset(20.0, 60.0))); // move more than touch slop before delay expires
    expect(didStartDrag, isFalse);
    tester.async.elapse(kLongPressTimeout * 2); // expire delay
    expect(didStartDrag, isFalse);
    tester.route(pointer.move(const Offset(30.0, 120.0))); // move some more after delay expires
    expect(didStartDrag, isFalse);
    drag.dispose();
  });

  testGesture('MultiDrag: delay triggers', (GestureTester tester) {
43
    final DelayedMultiDragGestureRecognizer drag = DelayedMultiDragGestureRecognizer();
44 45 46 47

    bool didStartDrag = false;
    drag.onStart = (Offset position) {
      didStartDrag = true;
48
      return TestDrag();
49 50
    };

51
    final TestPointer pointer = TestPointer(5);
52 53 54
    final PointerDownEvent down = pointer.down(const Offset(10.0, 10.0));
    drag.addPointer(down);
    tester.closeArena(5);
55
    expect(didStartDrag, isFalse);
56
    tester.async.flushMicrotasks();
57
    expect(didStartDrag, isFalse);
58
    tester.route(pointer.move(const Offset(20.0, 20.0))); // move less than touch slop before delay expires
59
    expect(didStartDrag, isFalse);
60 61 62 63
    tester.async.elapse(kLongPressTimeout * 2); // expire delay
    expect(didStartDrag, isTrue);
    tester.route(pointer.move(const Offset(30.0, 70.0))); // move more than touch slop after delay expires
    expect(didStartDrag, isTrue);
64 65
    drag.dispose();
  });
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

  testGesture('MultiDrag: can filter based on device kind', (GestureTester tester) {
    final DelayedMultiDragGestureRecognizer drag =
        DelayedMultiDragGestureRecognizer(kind: PointerDeviceKind.touch);

    bool didStartDrag = false;
    drag.onStart = (Offset position) {
      didStartDrag = true;
      return TestDrag();
    };

    final TestPointer mousePointer = TestPointer(5, PointerDeviceKind.mouse);
    final PointerDownEvent down = mousePointer.down(const Offset(10.0, 10.0));
    drag.addPointer(down);
    tester.closeArena(5);
    expect(didStartDrag, isFalse);
    tester.async.flushMicrotasks();
    expect(didStartDrag, isFalse);
    tester.route(mousePointer.move(const Offset(20.0, 20.0))); // move less than touch slop before delay expires
    expect(didStartDrag, isFalse);
    tester.async.elapse(kLongPressTimeout * 2); // expire delay
    // Still false because it shouldn't recognize mouse events.
    expect(didStartDrag, isFalse);
    tester.route(mousePointer.move(const Offset(30.0, 70.0))); // move more than touch slop after delay expires
    // And still false.
    expect(didStartDrag, isFalse);
    drag.dispose();
  });
94
}