expansion_panels_demo_test.dart 1.96 KB
// 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>);