mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

* Breaking change which sets the default DragStartBehavior to DragStartBehavior.start and changes WidgetTester.drag and WidgetTester.dragFrom by breaking the moveBy function call into multiple pieces.
283 lines
8.6 KiB
Dart
283 lines
8.6 KiB
Dart
// 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';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:flutter/gestures.dart';
|
|
|
|
void main() {
|
|
testWidgets(
|
|
'WidgetTester.drag must break the offset into multiple parallel components if'
|
|
'the drag goes outside the touch slop values',
|
|
(WidgetTester tester) async {
|
|
// The first Offset in every sub array (ie. offsetResults[i][0]) is (touchSlopX, touchSlopY).
|
|
// The second Offset in every sub array (ie. offsetResults[i][1]) will be the total move offset.
|
|
// The remaining values in every sub array are the expected separated drag offsets.
|
|
|
|
// This test checks to make sure that the total drag will be correctly split into
|
|
// pieces such that the first (and potentially second) moveBy function call(s) in
|
|
// controller.drag() will never have a component greater than the touch
|
|
// slop in that component's respective axis.
|
|
final List<List<Offset>> offsetResults = <List<Offset>>[
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(-150.0, 200.0),
|
|
const Offset(-7.5, 10.0),
|
|
const Offset(-2.5, 3.333333333333333),
|
|
const Offset(-140.0, 186.66666666666666),
|
|
],
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(150, -200),
|
|
const Offset(7.5, -10),
|
|
const Offset(2.5, -3.333333333333333),
|
|
const Offset(140.0, -186.66666666666666),
|
|
],
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(-200, 150),
|
|
const Offset(-10, 7.5),
|
|
const Offset(-3.333333333333333, 2.5),
|
|
const Offset(-186.66666666666666, 140.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(200.0, -150.0),
|
|
const Offset(10, -7.5),
|
|
const Offset(3.333333333333333, -2.5),
|
|
const Offset(186.66666666666666, -140.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(-150.0, -200.0),
|
|
const Offset(-7.5, -10.0),
|
|
const Offset(-2.5, -3.333333333333333),
|
|
const Offset(-140.0, -186.66666666666666),
|
|
],
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(8.0, 3.0),
|
|
const Offset(8.0, 3.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(3.0, 8.0),
|
|
const Offset(3.0, 8.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(20.0, 5.0),
|
|
const Offset(10.0, 2.5),
|
|
const Offset(10.0, 2.5),
|
|
],
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(5.0, 20.0),
|
|
const Offset(2.5, 10.0),
|
|
const Offset(2.5, 10.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(20.0, 15.0),
|
|
const Offset(10.0, 7.5),
|
|
const Offset(3.333333333333333, 2.5),
|
|
const Offset(6.666666666666668, 5.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(15.0, 20.0),
|
|
const Offset(7.5, 10.0),
|
|
const Offset(2.5, 3.333333333333333),
|
|
const Offset(5.0, 6.666666666666668),
|
|
],
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(20.0, 20.0),
|
|
const Offset(10.0, 10.0),
|
|
const Offset(10.0, 10.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(10.0, 10.0),
|
|
const Offset(0.0, 5.0),
|
|
const Offset(0.0, 5.0),
|
|
],
|
|
|
|
//// [VARYING TOUCH SLOP] ////
|
|
<Offset>[
|
|
const Offset(12.0, 5.0),
|
|
const Offset(0.0, 5.0),
|
|
const Offset(0.0, 5.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(12.0, 5.0),
|
|
const Offset(20.0, 5.0),
|
|
const Offset(12.0, 3.0),
|
|
const Offset(8.0, 2.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(12.0, 5.0),
|
|
const Offset(5.0, 20.0),
|
|
const Offset(1.25, 5.0),
|
|
const Offset(3.75, 15.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(5.0, 12.0),
|
|
const Offset(5.0, 20.0),
|
|
const Offset(3.0, 12.0),
|
|
const Offset(2.0, 8.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(5.0, 12.0),
|
|
const Offset(20.0, 5.0),
|
|
const Offset(5.0, 1.25),
|
|
const Offset(15.0, 3.75),
|
|
],
|
|
<Offset>[
|
|
const Offset(18.0, 18.0),
|
|
const Offset(0.0, 150.0),
|
|
const Offset(0.0, 18.0),
|
|
const Offset(0.0, 132.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(18.0, 18.0),
|
|
const Offset(0.0, -150.0),
|
|
const Offset(0.0, -18.0),
|
|
const Offset(0.0, -132.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(18.0, 18.0),
|
|
const Offset(-150.0, 0.0),
|
|
const Offset(-18.0, 0.0),
|
|
const Offset(-132.0, 0.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(0.0, 0.0),
|
|
const Offset(-150.0, 0.0),
|
|
const Offset(-150.0, 0.0),
|
|
],
|
|
<Offset>[
|
|
const Offset(18.0, 18.0),
|
|
const Offset(-32.0, 0.0),
|
|
const Offset(-18.0, 0.0),
|
|
const Offset(-14.0, 0.0),
|
|
],
|
|
];
|
|
|
|
await tester.pumpWidget(
|
|
const Directionality(
|
|
textDirection: TextDirection.ltr,
|
|
child: Text('test'),
|
|
),
|
|
);
|
|
|
|
final WidgetControllerSpy spyController = WidgetControllerSpy(tester.binding);
|
|
|
|
for (int resultIndex = 0; resultIndex < offsetResults.length; resultIndex += 1) {
|
|
final List<Offset> testResult = offsetResults[resultIndex];
|
|
await spyController.drag(
|
|
find.text('test'),
|
|
testResult[1],
|
|
touchSlopX: testResult[0].dx,
|
|
touchSlopY: testResult[0].dy,
|
|
);
|
|
final List<Offset> dragOffsets = spyController.testGestureSpy.offsets;
|
|
expect(
|
|
offsetResults[resultIndex].length - 2,
|
|
dragOffsets.length,
|
|
|
|
reason:
|
|
'There is a difference in the number of expected and actual split offsets for the drag with:\n'
|
|
'Touch Slop: ' + testResult[0].toString() + '\n'
|
|
'Delta: ' + testResult[1].toString() + '\n',
|
|
);
|
|
for (int valueIndex = 2; valueIndex < offsetResults[resultIndex].length; valueIndex += 1) {
|
|
expect(
|
|
offsetResults[resultIndex][valueIndex],
|
|
dragOffsets[valueIndex - 2],
|
|
reason:
|
|
'There is a difference in the expected and actual value of the ' +
|
|
(valueIndex == 2 ? 'first' : valueIndex == 3 ? 'second' : 'third') +
|
|
' split offset for the drag with:\n'
|
|
'Touch slop: ' + testResult[0].toString() + '\n'
|
|
'Delta: ' + testResult[1].toString() + '\n',
|
|
);
|
|
}
|
|
spyController.testGestureSpy.clearOffsets();
|
|
}
|
|
},
|
|
);
|
|
}
|
|
|
|
class WidgetControllerSpy extends WidgetController {
|
|
WidgetControllerSpy(
|
|
TestWidgetsFlutterBinding binding
|
|
) : super(binding) {
|
|
_binding = binding;
|
|
}
|
|
|
|
TestWidgetsFlutterBinding _binding;
|
|
|
|
@override
|
|
Future<void> pump(Duration duration) async {
|
|
if (duration != null)
|
|
await Future<void>.delayed(duration);
|
|
_binding.scheduleFrame();
|
|
await _binding.endOfFrame;
|
|
}
|
|
|
|
int _getNextPointer() {
|
|
final int result = nextPointer;
|
|
nextPointer += 1;
|
|
return result;
|
|
}
|
|
|
|
@override
|
|
Future<void> sendEventToBinding(PointerEvent event, HitTestResult result) {
|
|
return TestAsyncUtils.guard<void>(() async {
|
|
_binding.dispatchEvent(event, result, source: TestBindingEventSource.test);
|
|
});
|
|
}
|
|
|
|
TestGestureSpy testGestureSpy;
|
|
|
|
@override
|
|
Future<TestGesture> createGesture({int pointer, PointerDeviceKind kind = PointerDeviceKind.touch}) async {
|
|
return testGestureSpy = TestGestureSpy(
|
|
pointer: pointer ?? _getNextPointer(),
|
|
kind: kind,
|
|
dispatcher: sendEventToBinding,
|
|
hitTester: hitTestOnBinding
|
|
);
|
|
}
|
|
}
|
|
|
|
class TestGestureSpy extends TestGesture {
|
|
TestGestureSpy({
|
|
int pointer,
|
|
PointerDeviceKind kind,
|
|
EventDispatcher dispatcher,
|
|
HitTester hitTester
|
|
}) : super(
|
|
pointer: pointer,
|
|
kind: kind,
|
|
dispatcher: dispatcher,
|
|
hitTester: hitTester
|
|
);
|
|
|
|
List<Offset> offsets = <Offset>[];
|
|
|
|
void clearOffsets() {
|
|
offsets = <Offset>[];
|
|
}
|
|
|
|
@override
|
|
Future<void> moveBy(Offset offset, {Duration timeStamp = Duration.zero}) {
|
|
offsets.add(offset);
|
|
return super.moveBy(offset, timeStamp: timeStamp);
|
|
}
|
|
}
|