blob: 282edc52888a1b828acf55f8f425d325d6e62522 [file] [log] [blame]
// Copyright 2014 The Flutter 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/material.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('AutofillGroup has the right clients', (WidgetTester tester) async {
const Key outerKey = Key('outer');
const Key innerKey = Key('inner');
const TextField client1 = TextField(autofillHints: <String>['1']);
const TextField client2 = TextField(autofillHints: <String>['2']);
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: AutofillGroup(
key: outerKey,
child: Column(children: <Widget>[
client1,
AutofillGroup(
key: innerKey,
child: Column(children: const <Widget>[client2, TextField()]),
),
]),
),
),
),
);
final AutofillGroupState innerState = tester.state<AutofillGroupState>(find.byKey(innerKey));
final AutofillGroupState outerState = tester.state<AutofillGroupState>(find.byKey(outerKey));
final EditableTextState clientState1 = tester.state<EditableTextState>(
find.descendant(of: find.byWidget(client1), matching: find.byType(EditableText)),
);
final EditableTextState clientState2 = tester.state<EditableTextState>(
find.descendant(of: find.byWidget(client2), matching: find.byType(EditableText)),
);
expect(outerState.autofillClients, <EditableTextState>[clientState1]);
expect(innerState.autofillClients, <EditableTextState>[clientState2]);
});
testWidgets('new clients can be added & removed to a scope', (WidgetTester tester) async {
const Key scopeKey = Key('scope');
final List<String> hints = <String>[];
const TextField client1 = TextField(autofillHints: <String>['1']);
final TextField client2 = TextField(autofillHints: hints);
StateSetter setState;
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: AutofillGroup(
key: scopeKey,
child: StatefulBuilder(
builder: (BuildContext context, StateSetter setter) {
setState = setter;
return Column(children: <Widget>[client1, client2]);
},
),
),
),
),
);
final AutofillGroupState scopeState = tester.state<AutofillGroupState>(find.byKey(scopeKey));
final EditableTextState clientState1 = tester.state<EditableTextState>(
find.descendant(of: find.byWidget(client1), matching: find.byType(EditableText)),
);
final EditableTextState clientState2 = tester.state<EditableTextState>(
find.descendant(of: find.byWidget(client2), matching: find.byType(EditableText)),
);
expect(scopeState.autofillClients, <EditableTextState>[clientState1]);
// Add to scope.
setState(() { hints.add('2'); });
await tester.pump();
expect(scopeState.autofillClients.length, 2);
expect(scopeState.autofillClients, contains(clientState1));
expect(scopeState.autofillClients, contains(clientState2));
// Remove from scope again.
setState(() { hints.clear(); });
await tester.pump();
expect(scopeState.autofillClients, <EditableTextState>[clientState1]);
});
testWidgets('AutofillGroup has the right clients after reparenting', (WidgetTester tester) async {
const Key outerKey = Key('outer');
const Key innerKey = Key('inner');
final GlobalKey keyClient3 = GlobalKey();
const TextField client1 = TextField(autofillHints: <String>['1']);
const TextField client2 = TextField(autofillHints: <String>['2']);
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: AutofillGroup(
key: outerKey,
child: Column(children: <Widget>[
client1,
AutofillGroup(
key: innerKey,
child: Column(children: <Widget>[
client2,
TextField(key: keyClient3, autofillHints: const <String>['3']),
]),
),
]),
),
),
),
);
final AutofillGroupState innerState = tester.state<AutofillGroupState>(find.byKey(innerKey));
final AutofillGroupState outerState = tester.state<AutofillGroupState>(find.byKey(outerKey));
final EditableTextState clientState1 = tester.state<EditableTextState>(
find.descendant(of: find.byWidget(client1), matching: find.byType(EditableText)),
);
final EditableTextState clientState2 = tester.state<EditableTextState>(
find.descendant(of: find.byWidget(client2), matching: find.byType(EditableText)),
);
final EditableTextState clientState3 = tester.state<EditableTextState>(
find.descendant(of: find.byKey(keyClient3), matching: find.byType(EditableText)),
);
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: AutofillGroup(
key: outerKey,
child: Column(children: <Widget>[
client1,
TextField(key: keyClient3, autofillHints: const <String>['3']),
AutofillGroup(
key: innerKey,
child: Column(children: const <Widget>[client2]),
),
]),
),
),
),
);
expect(outerState.autofillClients.length, 2);
expect(outerState.autofillClients, contains(clientState1));
expect(outerState.autofillClients, contains(clientState3));
expect(innerState.autofillClients, <EditableTextState>[clientState2]);
});
}