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