blob: 29c940bdd3e8ae811ad1df00a420ba08d6993546 [file] [log] [blame]
// Copyright 2018 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/material.dart';
import 'package:flutter_gallery/demo/material/expansion_panels_demo.dart';
import 'package:flutter_test/flutter_test.dart';
Future<void> main() async {
testWidgets('Expansion panel demo: radio tile selection changes on tap',
(WidgetTester tester) async {
await tester.pumpWidget(MaterialApp(home: ExpansionPanelsDemo()));
expect(_expandIcons, findsNWidgets(3));
await tester.tap(find.byWidget(_radioPanelExpandIcon));
await tester.pumpAndSettle();
expect(_radioFinder, findsNWidgets(3));
const int i = 1;
expect(_isRadioSelected(0), isTrue);
expect(_isRadioSelected(i), isFalse);
await tester.tap(find.byWidget(_radioListTiles[i]));
await tester.pumpAndSettle();
expect(_isRadioSelected(0), isFalse);
expect(_isRadioSelected(i), isTrue);
});
}
Finder get _expandIcons => find.byType(ExpandIcon);
Widget get _radioPanelExpandIcon => _expandIcons.evaluate().toList()[1].widget;
bool _isRadioSelected(int index) =>
_radios[index].value == _radios[index].groupValue;
List<Radio<Location>> get _radios => List<Radio<Location>>.from(
_radioFinder.evaluate().map<Widget>((Element e) => e.widget));
// [find.byType] and [find.widgetWithText] do not match subclasses; `Radio` is not sufficient to find a `Radio<_Location>`.
// Another approach is to grab the `runtimeType` of a dummy instance; see packages/flutter/test/material/control_list_tile_test.dart.
Finder get _radioFinder =>
find.byWidgetPredicate((Widget w) => w is Radio<Location>);
List<RadioListTile<Location>> get _radioListTiles =>
List<RadioListTile<Location>>.from(
_radioListTilesFinder.evaluate().map<Widget>((Element e) => e.widget));
Finder get _radioListTilesFinder =>
find.byWidgetPredicate((Widget w) => w is RadioListTile<Location>);