| // Copyright 2014 The Flutter 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 'package:flutter/gestures.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| |
| import 'gesture_tester.dart'; |
| |
| class TestDrag extends Drag { } |
| |
| void main() { |
| TestWidgetsFlutterBinding.ensureInitialized(); |
| |
| testGesture('MultiDrag: moving before delay rejects', (GestureTester tester) { |
| final DelayedMultiDragGestureRecognizer drag = DelayedMultiDragGestureRecognizer(); |
| |
| bool didStartDrag = false; |
| drag.onStart = (Offset position) { |
| didStartDrag = true; |
| return TestDrag(); |
| }; |
| |
| final TestPointer pointer = TestPointer(5); |
| final PointerDownEvent down = pointer.down(const Offset(10.0, 10.0)); |
| drag.addPointer(down); |
| tester.closeArena(5); |
| expect(didStartDrag, isFalse); |
| tester.async.flushMicrotasks(); |
| expect(didStartDrag, isFalse); |
| 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) { |
| final DelayedMultiDragGestureRecognizer drag = DelayedMultiDragGestureRecognizer(); |
| |
| bool didStartDrag = false; |
| drag.onStart = (Offset position) { |
| didStartDrag = true; |
| return TestDrag(); |
| }; |
| |
| final TestPointer pointer = TestPointer(5); |
| final PointerDownEvent down = pointer.down(const Offset(10.0, 10.0)); |
| drag.addPointer(down); |
| tester.closeArena(5); |
| expect(didStartDrag, isFalse); |
| tester.async.flushMicrotasks(); |
| expect(didStartDrag, isFalse); |
| tester.route(pointer.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 |
| expect(didStartDrag, isTrue); |
| tester.route(pointer.move(const Offset(30.0, 70.0))); // move more than touch slop after delay expires |
| expect(didStartDrag, isTrue); |
| drag.dispose(); |
| }); |
| |
| 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(); |
| }); |
| |
| testWidgets('ImmediateMultiGestureRecognizer asserts when kind and supportedDevices are both set', (WidgetTester tester) async { |
| try { |
| ImmediateMultiDragGestureRecognizer( |
| kind: PointerDeviceKind.touch, |
| supportedDevices: <PointerDeviceKind>{ PointerDeviceKind.touch }, |
| ); |
| } catch(error) { |
| expect(error, isAssertionError); |
| expect(error.toString(), contains('kind == null || supportedDevices == null')); |
| } |
| }); |
| |
| testWidgets('HorizontalMultiDragGestureRecognizer asserts when kind and supportedDevices are both set', (WidgetTester tester) async { |
| expect( |
| () { |
| HorizontalMultiDragGestureRecognizer( |
| kind: PointerDeviceKind.touch, |
| supportedDevices: <PointerDeviceKind>{ PointerDeviceKind.touch }, |
| ); |
| }, |
| throwsA( |
| isA<AssertionError>().having((AssertionError error) => error.toString(), |
| 'description', contains('kind == null || supportedDevices == null')), |
| ), |
| ); |
| }); |
| |
| testWidgets('VerticalMultiDragGestureRecognizer asserts when kind and supportedDevices are both set', (WidgetTester tester) async { |
| expect( |
| () { |
| VerticalMultiDragGestureRecognizer( |
| kind: PointerDeviceKind.touch, |
| supportedDevices: <PointerDeviceKind>{ PointerDeviceKind.touch }, |
| ); |
| }, |
| throwsA( |
| isA<AssertionError>().having((AssertionError error) => error.toString(), |
| 'description', contains('kind == null || supportedDevices == null')), |
| ), |
| ); |
| }); |
| |
| testWidgets('DelayedMultiDragGestureRecognizer asserts when kind and supportedDevices are both set', (WidgetTester tester) async { |
| expect( |
| () { |
| DelayedMultiDragGestureRecognizer( |
| kind: PointerDeviceKind.touch, |
| supportedDevices: <PointerDeviceKind>{ PointerDeviceKind.touch }, |
| ); |
| }, |
| throwsA( |
| isA<AssertionError>().having((AssertionError error) => error.toString(), |
| 'description', contains('kind == null || supportedDevices == null')), |
| ), |
| ); |
| }); |
| } |