mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
This makes it possible to substitute 'flutter run' for 'flutter test'
and actually watch a test run on a device.
For any test that depends on flutter_test:
1. Remove any import of 'package:test/test.dart'.
2. Replace `testWidgets('...', (WidgetTester tester) {`
with `testWidgets('...', (WidgetTester tester) async {`
3. Add an "await" in front of calls to any of the following:
* tap()
* tapAt()
* fling()
* flingFrom()
* scroll()
* scrollAt()
* pump()
* pumpWidget()
4. Replace any calls to `tester.flushMicrotasks()` with calls to
`await tester.idle()`.
There's a guarding API that you can use, if you have particularly
complicated tests, to get better error messages. Search for
TestAsyncUtils.
198 lines
5.3 KiB
Dart
198 lines
5.3 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';
|
|
|
|
class TestFocusable extends StatelessWidget {
|
|
TestFocusable({
|
|
GlobalKey key,
|
|
this.no,
|
|
this.yes,
|
|
this.autofocus: true
|
|
}) : super(key: key);
|
|
|
|
final String no;
|
|
final String yes;
|
|
final bool autofocus;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
bool focused = Focus.at(context, autofocus: autofocus);
|
|
return new GestureDetector(
|
|
onTap: () { Focus.moveTo(key); },
|
|
child: new Text(focused ? yes : no)
|
|
);
|
|
}
|
|
}
|
|
|
|
void main() {
|
|
testWidgets('Can have multiple focused children and they update accordingly', (WidgetTester tester) async {
|
|
GlobalKey keyFocus = new GlobalKey();
|
|
GlobalKey keyA = new GlobalKey();
|
|
GlobalKey keyB = new GlobalKey();
|
|
await tester.pumpWidget(
|
|
new Focus(
|
|
key: keyFocus,
|
|
child: new Column(
|
|
children: <Widget>[
|
|
new TestFocusable(
|
|
key: keyA,
|
|
no: 'a',
|
|
yes: 'A FOCUSED'
|
|
),
|
|
new TestFocusable(
|
|
key: keyB,
|
|
no: 'b',
|
|
yes: 'B FOCUSED'
|
|
),
|
|
]
|
|
)
|
|
)
|
|
);
|
|
expect(find.text('a'), findsNothing);
|
|
expect(find.text('A FOCUSED'), findsOneWidget);
|
|
expect(find.text('b'), findsOneWidget);
|
|
expect(find.text('B FOCUSED'), findsNothing);
|
|
await tester.tap(find.text('A FOCUSED'));
|
|
await tester.pump();
|
|
expect(find.text('a'), findsNothing);
|
|
expect(find.text('A FOCUSED'), findsOneWidget);
|
|
expect(find.text('b'), findsOneWidget);
|
|
expect(find.text('B FOCUSED'), findsNothing);
|
|
await tester.tap(find.text('A FOCUSED'));
|
|
await tester.pump();
|
|
expect(find.text('a'), findsNothing);
|
|
expect(find.text('A FOCUSED'), findsOneWidget);
|
|
expect(find.text('b'), findsOneWidget);
|
|
expect(find.text('B FOCUSED'), findsNothing);
|
|
await tester.tap(find.text('b'));
|
|
await tester.pump();
|
|
expect(find.text('a'), findsOneWidget);
|
|
expect(find.text('A FOCUSED'), findsNothing);
|
|
expect(find.text('b'), findsNothing);
|
|
expect(find.text('B FOCUSED'), findsOneWidget);
|
|
await tester.tap(find.text('a'));
|
|
await tester.pump();
|
|
expect(find.text('a'), findsNothing);
|
|
expect(find.text('A FOCUSED'), findsOneWidget);
|
|
expect(find.text('b'), findsOneWidget);
|
|
expect(find.text('B FOCUSED'), findsNothing);
|
|
});
|
|
|
|
testWidgets('Can blur', (WidgetTester tester) async {
|
|
GlobalKey keyFocus = new GlobalKey();
|
|
GlobalKey keyA = new GlobalKey();
|
|
await tester.pumpWidget(
|
|
new Focus(
|
|
key: keyFocus,
|
|
child: new TestFocusable(
|
|
key: keyA,
|
|
no: 'a',
|
|
yes: 'A FOCUSED',
|
|
autofocus: false
|
|
)
|
|
)
|
|
);
|
|
|
|
expect(find.text('a'), findsOneWidget);
|
|
expect(find.text('A FOCUSED'), findsNothing);
|
|
|
|
Focus.moveTo(keyA);
|
|
await tester.pump();
|
|
|
|
expect(find.text('a'), findsNothing);
|
|
expect(find.text('A FOCUSED'), findsOneWidget);
|
|
|
|
Focus.clear(keyA.currentContext);
|
|
await tester.pump();
|
|
|
|
expect(find.text('a'), findsOneWidget);
|
|
expect(find.text('A FOCUSED'), findsNothing);
|
|
});
|
|
|
|
testWidgets('Can move focus to scope', (WidgetTester tester) async {
|
|
GlobalKey keyParentFocus = new GlobalKey();
|
|
GlobalKey keyChildFocus = new GlobalKey();
|
|
GlobalKey keyA = new GlobalKey();
|
|
await tester.pumpWidget(
|
|
new Focus(
|
|
key: keyParentFocus,
|
|
child: new Row(
|
|
children: <Widget>[
|
|
new TestFocusable(
|
|
key: keyA,
|
|
no: 'a',
|
|
yes: 'A FOCUSED',
|
|
autofocus: false
|
|
)
|
|
]
|
|
)
|
|
)
|
|
);
|
|
|
|
expect(find.text('a'), findsOneWidget);
|
|
expect(find.text('A FOCUSED'), findsNothing);
|
|
|
|
Focus.moveTo(keyA);
|
|
await tester.pump();
|
|
|
|
expect(find.text('a'), findsNothing);
|
|
expect(find.text('A FOCUSED'), findsOneWidget);
|
|
|
|
Focus.moveScopeTo(keyChildFocus, context: keyA.currentContext);
|
|
|
|
await tester.pumpWidget(
|
|
new Focus(
|
|
key: keyParentFocus,
|
|
child: new Row(
|
|
children: <Widget>[
|
|
new TestFocusable(
|
|
key: keyA,
|
|
no: 'a',
|
|
yes: 'A FOCUSED',
|
|
autofocus: false
|
|
),
|
|
new Focus(
|
|
key: keyChildFocus,
|
|
child: new Container(
|
|
width: 50.0,
|
|
height: 50.0
|
|
)
|
|
)
|
|
]
|
|
)
|
|
)
|
|
);
|
|
|
|
expect(find.text('a'), findsOneWidget);
|
|
expect(find.text('A FOCUSED'), findsNothing);
|
|
|
|
await tester.pumpWidget(
|
|
new Focus(
|
|
key: keyParentFocus,
|
|
child: new Row(
|
|
children: <Widget>[
|
|
new TestFocusable(
|
|
key: keyA,
|
|
no: 'a',
|
|
yes: 'A FOCUSED',
|
|
autofocus: false
|
|
)
|
|
]
|
|
)
|
|
)
|
|
);
|
|
|
|
// Focus has received the removal notification but we haven't rebuilt yet.
|
|
expect(find.text('a'), findsOneWidget);
|
|
expect(find.text('A FOCUSED'), findsNothing);
|
|
|
|
await tester.pump();
|
|
|
|
expect(find.text('a'), findsNothing);
|
|
expect(find.text('A FOCUSED'), findsOneWidget);
|
|
});
|
|
}
|