bug fix for pointer id in test gestures (#63816)

This commit is contained in:
Ming Lyu (CareF) 2020-08-15 13:41:02 -04:00 committed by GitHub
parent d1583fc39b
commit c2368bdd6f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 184 additions and 53 deletions

View file

@ -2216,7 +2216,7 @@ void main() {
final Offset textfieldStart = tester.getTopLeft(find.byType(CupertinoTextField));
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(
textfieldStart + const Offset(150.0, 5.0),
@ -2256,7 +2256,7 @@ void main() {
final Offset textfieldStart = tester.getTopLeft(find.byType(CupertinoTextField));
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(
textfieldStart + const Offset(150.0, 5.0),

View file

@ -6988,7 +6988,7 @@ void main() {
final Offset offset = tester.getTopLeft(find.byType(TextField)) + const Offset(150.0, 9.0);
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(
offset,
@ -7026,7 +7026,7 @@ void main() {
final Offset textfieldStart = tester.getTopLeft(find.byType(TextField));
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final Offset offset = textfieldStart + const Offset(150.0, 9.0);
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(
@ -7077,7 +7077,7 @@ void main() {
final Offset textfieldStart = tester.getTopLeft(find.byType(TextField));
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final Offset offset = textfieldStart + const Offset(150.0, 9.0);
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(

View file

@ -501,12 +501,12 @@ void main() {
),
),
);
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(
forcePressOffset,
const PointerDownEvent(
PointerDownEvent(
pointer: pointerValue,
position: forcePressOffset,
pressure: 0.0,
@ -515,31 +515,73 @@ void main() {
),
);
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.3, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.3,
pressureMin: 0,
pressureMax: 1,
));
expect(forcePressStart, 0);
expect(forcePressPeaked, 0);
expect(forcePressUpdate, 0);
expect(forcePressEnded, 0);
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.5, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.5,
pressureMin: 0,
pressureMax: 1
));
expect(forcePressStart, 1);
expect(forcePressPeaked, 0);
expect(forcePressUpdate, 1);
expect(forcePressEnded, 0);
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.6, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.7, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.2, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.3, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.6,
pressureMin: 0,
pressureMax: 1,
));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.7,
pressureMin: 0,
pressureMax: 1
));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.2,
pressureMin: 0,
pressureMax: 1
));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.3,
pressureMin: 0,
pressureMax: 1
));
expect(forcePressStart, 1);
expect(forcePressPeaked, 0);
expect(forcePressUpdate, 5);
expect(forcePressEnded, 0);
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.9, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.9,
pressureMin: 0,
pressureMax: 1,
));
expect(forcePressStart, 1);
expect(forcePressPeaked, 1);
@ -573,14 +615,14 @@ void main() {
),
);
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
const double maxPressure = 6.0;
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(
forcePressOffset,
const PointerDownEvent(
PointerDownEvent(
pointer: pointerValue,
position: forcePressOffset,
pressure: 0.0,
@ -589,7 +631,13 @@ void main() {
),
);
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(400.0, 50.0), pressure: 0.3, pressureMin: 0, pressureMax: maxPressure));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(400.0, 50.0),
pressure: 0.3,
pressureMin: 0,
pressureMax: maxPressure
));
expect(forcePressStart, 0);
expect(longPressTimes, 0);
@ -601,7 +649,13 @@ void main() {
expect(forcePressStart, 0);
// Failed attempt to trigger the force press.
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(400.0, 50.0), pressure: 0.5, pressureMin: 0, pressureMax: maxPressure));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(400.0, 50.0),
pressure: 0.5,
pressureMin: 0,
pressureMax: maxPressure
));
expect(longPressTimes, 1);
expect(forcePressStart, 0);
@ -626,13 +680,13 @@ void main() {
),
);
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(
forcePressOffset,
const PointerDownEvent(
PointerDownEvent(
pointer: pointerValue,
position: forcePressOffset,
pressure: 0.0,
@ -641,7 +695,13 @@ void main() {
),
);
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.3, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.3,
pressureMin: 0,
pressureMax: 1
));
expect(forcePressStart, 0);
expect(horizontalDragStart, 0);
@ -653,7 +713,13 @@ void main() {
expect(forcePressStart, 0);
// Failed attempt to trigger the force press.
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.5, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.5,
pressureMin: 0,
pressureMax: 1,
));
expect(horizontalDragStart, 1);
expect(forcePressStart, 0);

View file

@ -3117,7 +3117,7 @@ void main() {
final Offset offset = tester.getTopLeft(find.byType(SelectableText)) + const Offset(150.0, 5.0);
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(
offset,
@ -3153,7 +3153,7 @@ void main() {
final Offset selectableTextStart = tester.getTopLeft(find.byType(SelectableText));
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final Offset offset = selectableTextStart + const Offset(150.0, 5.0);
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(
@ -3194,7 +3194,7 @@ void main() {
final Offset selectableTextStart = tester.getTopLeft(find.byType(SelectableText));
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final Offset offset = selectableTextStart + const Offset(150.0, 5.0);
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(

View file

@ -198,13 +198,13 @@ void main() {
testWidgets('a force press initiates a force press', (WidgetTester tester) async {
await pumpGestureDetector(tester);
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(
forcePressOffset,
const PointerDownEvent(
PointerDownEvent(
pointer: pointerValue,
position: forcePressOffset,
pressure: 0.0,
@ -213,13 +213,19 @@ void main() {
),
);
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.5, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.5,
pressureMin: 0,
pressureMax: 1,
));
await gesture.up();
await tester.pumpAndSettle();
await gesture.downWithCustomEvent(
forcePressOffset,
const PointerDownEvent(
PointerDownEvent(
pointer: pointerValue,
position: forcePressOffset,
pressure: 0.0,
@ -227,13 +233,19 @@ void main() {
pressureMin: 0.0,
),
);
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.5, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.5,
pressureMin: 0,
pressureMax: 1,
));
await gesture.up();
await tester.pump(const Duration(milliseconds: 20));
await gesture.downWithCustomEvent(
forcePressOffset,
const PointerDownEvent(
PointerDownEvent(
pointer: pointerValue,
position: forcePressOffset,
pressure: 0.0,
@ -241,13 +253,19 @@ void main() {
pressureMin: 0.0,
),
);
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.5, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.5,
pressureMin: 0,
pressureMax: 1,
));
await gesture.up();
await tester.pump(const Duration(milliseconds: 20));
await gesture.downWithCustomEvent(
forcePressOffset,
const PointerDownEvent(
PointerDownEvent(
pointer: pointerValue,
position: forcePressOffset,
pressure: 0.0,
@ -255,7 +273,13 @@ void main() {
pressureMin: 0.0,
),
);
await gesture.updateWithCustomEvent(const PointerMoveEvent(pointer: pointerValue, position: Offset(0.0, 0.0), pressure: 0.5, pressureMin: 0, pressureMax: 1));
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: const Offset(0.0, 0.0),
pressure: 0.5,
pressureMin: 0,
pressureMax: 1,
));
await gesture.up();
expect(forcePressStartCount, 4);
@ -264,11 +288,11 @@ void main() {
testWidgets('a tap and then force press initiates a force press and not a double tap', (WidgetTester tester) async {
await pumpGestureDetector(tester);
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.createGesture();
await gesture.downWithCustomEvent(
forcePressOffset,
const PointerDownEvent(
PointerDownEvent(
pointer: pointerValue,
position: forcePressOffset,
pressure: 0.0,
@ -279,9 +303,9 @@ void main() {
);
// Initiate a quick tap.
await gesture.updateWithCustomEvent(
const PointerMoveEvent(
PointerMoveEvent(
pointer: pointerValue,
position: Offset(0.0, 0.0),
position: const Offset(0.0, 0.0),
pressure: 0.0,
pressureMin: 0,
pressureMax: 1,
@ -293,7 +317,7 @@ void main() {
// Initiate a force tap.
await gesture.downWithCustomEvent(
forcePressOffset,
const PointerDownEvent(
PointerDownEvent(
pointer: pointerValue,
position: forcePressOffset,
pressure: 0.0,
@ -301,9 +325,9 @@ void main() {
pressureMin: 0.0,
),
);
await gesture.updateWithCustomEvent(const PointerMoveEvent(
await gesture.updateWithCustomEvent(PointerMoveEvent(
pointer: pointerValue,
position: Offset(0.0, 0.0),
position: const Offset(0.0, 0.0),
pressure: 0.5,
pressureMin: 0,
pressureMax: 1,
@ -321,7 +345,7 @@ void main() {
testWidgets('a long press from a touch device is recognized as a long single tap', (WidgetTester tester) async {
await pumpGestureDetector(tester);
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.startGesture(
const Offset(200.0, 200.0),
pointer: pointerValue,
@ -340,7 +364,7 @@ void main() {
testWidgets('a long press from a mouse is just a tap', (WidgetTester tester) async {
await pumpGestureDetector(tester);
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.startGesture(
const Offset(200.0, 200.0),
pointer: pointerValue,
@ -359,7 +383,7 @@ void main() {
testWidgets('a touch drag is not recognized for text selection', (WidgetTester tester) async {
await pumpGestureDetector(tester);
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.startGesture(
const Offset(200.0, 200.0),
pointer: pointerValue,
@ -382,7 +406,7 @@ void main() {
testWidgets('a mouse drag is recognized for text selection', (WidgetTester tester) async {
await pumpGestureDetector(tester);
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.startGesture(
const Offset(200.0, 200.0),
pointer: pointerValue,
@ -405,7 +429,7 @@ void main() {
testWidgets('a slow mouse drag is still recognized for text selection', (WidgetTester tester) async {
await pumpGestureDetector(tester);
const int pointerValue = 1;
final int pointerValue = tester.nextPointer;
final TestGesture gesture = await tester.startGesture(
const Offset(200.0, 200.0),
pointer: pointerValue,

View file

@ -662,6 +662,7 @@ abstract class WidgetController {
assert(frequency > 0);
final int intervals = duration.inMicroseconds * frequency ~/ 1E6;
assert(intervals > 1);
pointer ??= _getNextPointer();
final List<Duration> timeStamps = <Duration>[
for (int t = 0; t <= intervals; t += 1)
duration * t ~/ intervals,
@ -701,8 +702,8 @@ abstract class WidgetController {
timeStamp: duration,
position: offsets.last,
pointer: pointer,
// The PointerData recieved from the engine with
// chagne = PointerChnage.up, which translates to PointerUpEvent,
// The PointerData received from the engine with
// change = PointerChange.up, which translates to PointerUpEvent,
// doesn't provide the button field.
// buttons: buttons,
)
@ -717,11 +718,13 @@ abstract class WidgetController {
///
/// This is the default pointer identifier that will be used the next time the
/// [startGesture] method is called without an explicit pointer identifier.
int nextPointer = 1;
int get nextPointer => _nextPointer;
int _getNextPointer() {
final int result = nextPointer;
nextPointer += 1;
static int _nextPointer = 1;
static int _getNextPointer() {
final int result = _nextPointer;
_nextPointer += 1;
return result;
}

View file

@ -577,7 +577,7 @@ void main() {
}
});
testWidgets(
testWidgets(
'WidgetTester.timedDrag must respect buttons',
(WidgetTester tester) async {
final List<String> logs = <String>[];
@ -614,6 +614,44 @@ void main() {
},
);
testWidgets(
'WidgetTester.timedDrag uses correct pointer',
(WidgetTester tester) async {
final List<String> logs = <String>[];
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: Listener(
onPointerDown: (PointerDownEvent event) => logs.add('down ${event.pointer}'),
child: const Text('test'),
),
),
);
await tester.timedDrag(
find.text('test'),
const Offset(-200.0, 0.0),
const Duration(seconds: 1),
buttons: kSecondaryMouseButton,
);
await tester.pumpAndSettle();
await tester.timedDrag(
find.text('test'),
const Offset(200.0, 0.0),
const Duration(seconds: 1),
buttons: kSecondaryMouseButton,
);
await tester.pumpAndSettle();
expect(logs.length, 2);
expect(logs[0], isNotNull);
expect(logs[1], isNotNull);
expect(logs[1] != logs[0], isTrue);
},
);
testWidgets(
'ensureVisible: scrolls to make widget visible',
(WidgetTester tester) async {