// 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_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/radio_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>);
