mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
150 lines
5.5 KiB
Dart
150 lines
5.5 KiB
Dart
// 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')),
|
|
),
|
|
);
|
|
});
|
|
}
|