
Instead of using a custom WidgetController, which is very brittle, we just use the usual infrastructure. Also, use structured data instead of an array. This adds offsetMoreOrLessEquals to handle small floating point errors in offsets.
268 lines
7.2 KiB
Dart
268 lines
7.2 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';
|
|
|
|
class TestDragData {
|
|
const TestDragData(
|
|
this.slop,
|
|
this.dragDistance,
|
|
this.expectedOffsets,
|
|
);
|
|
|
|
final Offset slop;
|
|
final Offset dragDistance;
|
|
final List<Offset> expectedOffsets;
|
|
}
|
|
|
|
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 {
|
|
// 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.
|
|
const List<TestDragData> offsetResults = <TestDragData>[
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(-150.0, 200.0),
|
|
<Offset>[
|
|
Offset(-7.5, 10.0),
|
|
Offset(-2.5, 3.333333333333333),
|
|
Offset(-140.0, 186.66666666666666),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(150, -200),
|
|
<Offset>[
|
|
Offset(7.5, -10),
|
|
Offset(2.5, -3.333333333333333),
|
|
Offset(140.0, -186.66666666666666),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(-200, 150),
|
|
<Offset>[
|
|
Offset(-10, 7.5),
|
|
Offset(-3.333333333333333, 2.5),
|
|
Offset(-186.66666666666666, 140.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(200.0, -150.0),
|
|
<Offset>[
|
|
Offset(10, -7.5),
|
|
Offset(3.333333333333333, -2.5),
|
|
Offset(186.66666666666666, -140.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(-150.0, -200.0),
|
|
<Offset>[
|
|
Offset(-7.5, -10.0),
|
|
Offset(-2.5, -3.333333333333333),
|
|
Offset(-140.0, -186.66666666666666),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(8.0, 3.0),
|
|
<Offset>[
|
|
Offset(8.0, 3.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(3.0, 8.0),
|
|
<Offset>[
|
|
Offset(3.0, 8.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(20.0, 5.0),
|
|
<Offset>[
|
|
Offset(10.0, 2.5),
|
|
Offset(10.0, 2.5),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(5.0, 20.0),
|
|
<Offset>[
|
|
Offset(2.5, 10.0),
|
|
Offset(2.5, 10.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(20.0, 15.0),
|
|
<Offset>[
|
|
Offset(10.0, 7.5),
|
|
Offset(3.333333333333333, 2.5),
|
|
Offset(6.666666666666668, 5.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(15.0, 20.0),
|
|
<Offset>[
|
|
Offset(7.5, 10.0),
|
|
Offset(2.5, 3.333333333333333),
|
|
Offset(5.0, 6.666666666666668),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(20.0, 20.0),
|
|
<Offset>[
|
|
Offset(10.0, 10.0),
|
|
Offset(10.0, 10.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(10.0, 10.0),
|
|
Offset(0.0, 5.0),
|
|
<Offset>[
|
|
Offset(0.0, 5.0),
|
|
],
|
|
),
|
|
|
|
//// Varying touch slops
|
|
TestDragData(
|
|
Offset(12.0, 5.0),
|
|
Offset(0.0, 5.0),
|
|
<Offset>[
|
|
Offset(0.0, 5.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(12.0, 5.0),
|
|
Offset(20.0, 5.0),
|
|
<Offset>[
|
|
Offset(12.0, 3.0),
|
|
Offset(8.0, 2.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(12.0, 5.0),
|
|
Offset(5.0, 20.0),
|
|
<Offset>[
|
|
Offset(1.25, 5.0),
|
|
Offset(3.75, 15.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(5.0, 12.0),
|
|
Offset(5.0, 20.0),
|
|
<Offset>[
|
|
Offset(3.0, 12.0),
|
|
Offset(2.0, 8.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(5.0, 12.0),
|
|
Offset(20.0, 5.0),
|
|
<Offset>[
|
|
Offset(5.0, 1.25),
|
|
Offset(15.0, 3.75),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(18.0, 18.0),
|
|
Offset(0.0, 150.0),
|
|
<Offset>[
|
|
Offset(0.0, 18.0),
|
|
Offset(0.0, 132.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(18.0, 18.0),
|
|
Offset(0.0, -150.0),
|
|
<Offset>[
|
|
Offset(0.0, -18.0),
|
|
Offset(0.0, -132.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(18.0, 18.0),
|
|
Offset(-150.0, 0.0),
|
|
<Offset>[
|
|
Offset(-18.0, 0.0),
|
|
Offset(-132.0, 0.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(0.0, 0.0),
|
|
Offset(-150.0, 0.0),
|
|
<Offset>[
|
|
Offset(-150.0, 0.0),
|
|
],
|
|
),
|
|
TestDragData(
|
|
Offset(18.0, 18.0),
|
|
Offset(-32.0, 0.0),
|
|
<Offset>[
|
|
Offset(-18.0, 0.0),
|
|
Offset(-14.0, 0.0),
|
|
],
|
|
),
|
|
];
|
|
|
|
final List<Offset> dragOffsets = <Offset>[];
|
|
|
|
await tester.pumpWidget(
|
|
Listener(
|
|
onPointerMove: (PointerMoveEvent event) {
|
|
dragOffsets.add(event.delta);
|
|
},
|
|
child: const Text('test', textDirection: TextDirection.ltr),
|
|
),
|
|
);
|
|
|
|
for (int resultIndex = 0; resultIndex < offsetResults.length; resultIndex += 1) {
|
|
final TestDragData testResult = offsetResults[resultIndex];
|
|
await tester.drag(
|
|
find.text('test'),
|
|
testResult.dragDistance,
|
|
touchSlopX: testResult.slop.dx,
|
|
touchSlopY: testResult.slop.dy,
|
|
);
|
|
expect(
|
|
testResult.expectedOffsets.length,
|
|
dragOffsets.length,
|
|
reason:
|
|
'There is a difference in the number of expected and actual split offsets for the drag with:\n'
|
|
'Touch Slop: ${testResult.slop}\n'
|
|
'Delta: ${testResult.dragDistance}\n',
|
|
);
|
|
for (int valueIndex = 0; valueIndex < offsetResults[resultIndex].expectedOffsets.length; valueIndex += 1) {
|
|
expect(
|
|
testResult.expectedOffsets[valueIndex],
|
|
offsetMoreOrLessEquals(dragOffsets[valueIndex]),
|
|
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.slop}\n'
|
|
'Delta: ${testResult.dragDistance}\n'
|
|
);
|
|
}
|
|
dragOffsets.clear();
|
|
}
|
|
},
|
|
);
|
|
}
|