227 lines
6.4 KiB
Dart
227 lines
6.4 KiB
Dart
// Copyright 2015 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 'package:flutter_test/flutter_test.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
void main() {
|
|
testWidgets('Uncontested scrolls start immediately', (WidgetTester tester) async {
|
|
bool didStartDrag = false;
|
|
double updatedDragDelta;
|
|
bool didEndDrag = false;
|
|
|
|
Widget widget = new GestureDetector(
|
|
onVerticalDragStart: (DragStartDetails details) {
|
|
didStartDrag = true;
|
|
},
|
|
onVerticalDragUpdate: (DragUpdateDetails details) {
|
|
updatedDragDelta = details.primaryDelta;
|
|
},
|
|
onVerticalDragEnd: (DragEndDetails details) {
|
|
didEndDrag = true;
|
|
},
|
|
child: new Container(
|
|
decoration: const BoxDecoration(
|
|
backgroundColor: const Color(0xFF00FF00)
|
|
)
|
|
)
|
|
);
|
|
|
|
await tester.pumpWidget(widget);
|
|
expect(didStartDrag, isFalse);
|
|
expect(updatedDragDelta, isNull);
|
|
expect(didEndDrag, isFalse);
|
|
|
|
Point firstLocation = new Point(10.0, 10.0);
|
|
TestGesture gesture = await tester.startGesture(firstLocation, pointer: 7);
|
|
expect(didStartDrag, isTrue);
|
|
didStartDrag = false;
|
|
expect(updatedDragDelta, isNull);
|
|
expect(didEndDrag, isFalse);
|
|
|
|
Point secondLocation = new Point(10.0, 9.0);
|
|
await gesture.moveTo(secondLocation);
|
|
expect(didStartDrag, isFalse);
|
|
expect(updatedDragDelta, -1.0);
|
|
updatedDragDelta = null;
|
|
expect(didEndDrag, isFalse);
|
|
|
|
await gesture.up();
|
|
expect(didStartDrag, isFalse);
|
|
expect(updatedDragDelta, isNull);
|
|
expect(didEndDrag, isTrue);
|
|
didEndDrag = false;
|
|
|
|
await tester.pumpWidget(new Container());
|
|
});
|
|
|
|
testWidgets('Match two scroll gestures in succession', (WidgetTester tester) async {
|
|
int gestureCount = 0;
|
|
double dragDistance = 0.0;
|
|
|
|
Point downLocation = new Point(10.0, 10.0);
|
|
Point upLocation = new Point(10.0, 20.0);
|
|
|
|
Widget widget = new GestureDetector(
|
|
onVerticalDragUpdate: (DragUpdateDetails details) { dragDistance += details.primaryDelta; },
|
|
onVerticalDragEnd: (DragEndDetails details) { gestureCount += 1; },
|
|
onHorizontalDragUpdate: (DragUpdateDetails details) { fail("gesture should not match"); },
|
|
onHorizontalDragEnd: (DragEndDetails details) { fail("gesture should not match"); },
|
|
child: new Container(
|
|
decoration: const BoxDecoration(
|
|
backgroundColor: const Color(0xFF00FF00)
|
|
)
|
|
)
|
|
);
|
|
await tester.pumpWidget(widget);
|
|
|
|
TestGesture gesture = await tester.startGesture(downLocation, pointer: 7);
|
|
await gesture.moveTo(upLocation);
|
|
await gesture.up();
|
|
|
|
gesture = await tester.startGesture(downLocation, pointer: 7);
|
|
await gesture.moveTo(upLocation);
|
|
await gesture.up();
|
|
|
|
expect(gestureCount, 2);
|
|
expect(dragDistance, 20.0);
|
|
|
|
await tester.pumpWidget(new Container());
|
|
});
|
|
|
|
testWidgets('Pan doesn\'t crash', (WidgetTester tester) async {
|
|
bool didStartPan = false;
|
|
Offset panDelta;
|
|
bool didEndPan = false;
|
|
|
|
await tester.pumpWidget(
|
|
new GestureDetector(
|
|
onPanStart: (DragStartDetails details) {
|
|
didStartPan = true;
|
|
},
|
|
onPanUpdate: (DragUpdateDetails details) {
|
|
panDelta = details.delta;
|
|
},
|
|
onPanEnd: (DragEndDetails details) {
|
|
didEndPan = true;
|
|
},
|
|
child: new Container(
|
|
decoration: const BoxDecoration(
|
|
backgroundColor: const Color(0xFF00FF00)
|
|
)
|
|
)
|
|
)
|
|
);
|
|
|
|
expect(didStartPan, isFalse);
|
|
expect(panDelta, isNull);
|
|
expect(didEndPan, isFalse);
|
|
|
|
await tester.scrollAt(new Point(10.0, 10.0), new Offset(20.0, 30.0));
|
|
|
|
expect(didStartPan, isTrue);
|
|
expect(panDelta.dx, 20.0);
|
|
expect(panDelta.dy, 30.0);
|
|
expect(didEndPan, isTrue);
|
|
});
|
|
|
|
testWidgets('Translucent', (WidgetTester tester) async {
|
|
bool didReceivePointerDown;
|
|
bool didTap;
|
|
|
|
Future<Null> pumpWidgetTree(HitTestBehavior behavior) {
|
|
return tester.pumpWidget(
|
|
new Stack(
|
|
children: <Widget>[
|
|
new Listener(
|
|
onPointerDown: (_) {
|
|
didReceivePointerDown = true;
|
|
},
|
|
child: new Container(
|
|
width: 100.0,
|
|
height: 100.0,
|
|
decoration: const BoxDecoration(
|
|
backgroundColor: const Color(0xFF00FF00)
|
|
)
|
|
)
|
|
),
|
|
new Container(
|
|
width: 100.0,
|
|
height: 100.0,
|
|
child: new GestureDetector(
|
|
onTap: () {
|
|
didTap = true;
|
|
},
|
|
behavior: behavior
|
|
)
|
|
)
|
|
]
|
|
)
|
|
);
|
|
}
|
|
|
|
didReceivePointerDown = false;
|
|
didTap = false;
|
|
await pumpWidgetTree(null);
|
|
await tester.tapAt(new Point(10.0, 10.0));
|
|
expect(didReceivePointerDown, isTrue);
|
|
expect(didTap, isTrue);
|
|
|
|
didReceivePointerDown = false;
|
|
didTap = false;
|
|
await pumpWidgetTree(HitTestBehavior.deferToChild);
|
|
await tester.tapAt(new Point(10.0, 10.0));
|
|
expect(didReceivePointerDown, isTrue);
|
|
expect(didTap, isFalse);
|
|
|
|
didReceivePointerDown = false;
|
|
didTap = false;
|
|
await pumpWidgetTree(HitTestBehavior.opaque);
|
|
await tester.tapAt(new Point(10.0, 10.0));
|
|
expect(didReceivePointerDown, isFalse);
|
|
expect(didTap, isTrue);
|
|
|
|
didReceivePointerDown = false;
|
|
didTap = false;
|
|
await pumpWidgetTree(HitTestBehavior.translucent);
|
|
await tester.tapAt(new Point(10.0, 10.0));
|
|
expect(didReceivePointerDown, isTrue);
|
|
expect(didTap, isTrue);
|
|
|
|
});
|
|
|
|
testWidgets('Empty', (WidgetTester tester) async {
|
|
bool didTap = false;
|
|
await tester.pumpWidget(
|
|
new Center(
|
|
child: new GestureDetector(
|
|
onTap: () {
|
|
didTap = true;
|
|
},
|
|
)
|
|
)
|
|
);
|
|
expect(didTap, isFalse);
|
|
await tester.tapAt(new Point(10.0, 10.0));
|
|
expect(didTap, isTrue);
|
|
});
|
|
|
|
testWidgets('Only container', (WidgetTester tester) async {
|
|
bool didTap = false;
|
|
await tester.pumpWidget(
|
|
new Center(
|
|
child: new GestureDetector(
|
|
onTap: () {
|
|
didTap = true;
|
|
},
|
|
child: new Container(),
|
|
)
|
|
)
|
|
);
|
|
expect(didTap, isFalse);
|
|
await tester.tapAt(new Point(10.0, 10.0));
|
|
expect(didTap, isFalse);
|
|
});
|
|
}
|