// 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_api_samples/material/dropdown_menu/dropdown_menu.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('DropdownMenu', (WidgetTester tester) async {
    await tester.pumpWidget(
      const example.DropdownMenuExample(),
    );

    expect(find.text('You selected a Blue Smile'), findsNothing);

    final Finder colorMenu = find.byType(DropdownMenu<example.ColorLabel>);
    final Finder iconMenu = find.byType(DropdownMenu<example.IconLabel>);
    expect(colorMenu, findsOneWidget);
    expect(iconMenu, findsOneWidget);

    Finder findMenuItem(String label) {
      return find.widgetWithText(MenuItemButton, label).last;
    }

    await tester.tap(colorMenu);
    await tester.pumpAndSettle();
    expect(findMenuItem('Blue'), findsOneWidget);
    expect(findMenuItem('Pink'), findsOneWidget);
    expect(findMenuItem('Green'), findsOneWidget);
    expect(findMenuItem('Orange'), findsOneWidget);
    expect(findMenuItem('Grey'), findsOneWidget);

    await tester.tap(findMenuItem('Blue'));

    // The DropdownMenu's onSelected callback is delayed
    // with SchedulerBinding.instance.addPostFrameCallback
    // to give the focus a chance to return to where it was
    // before the menu appeared. The pumpAndSettle()
    // give the callback a chance to run.
    await tester.pumpAndSettle();

    await tester.tap(iconMenu);
    await tester.pumpAndSettle();
    expect(findMenuItem('Smile'), findsOneWidget);
    expect(findMenuItem('Cloud'), findsOneWidget);
    expect(findMenuItem('Brush'), findsOneWidget);
    expect(findMenuItem('Heart'), findsOneWidget);

    await tester.tap(findMenuItem('Smile'));
    await tester.pumpAndSettle();

    expect(find.text('You selected a Blue Smile'), findsOneWidget);
  });

  testWidgets('DropdownMenu has focus when tapping on the text field', (WidgetTester tester) async {
    await tester.pumpWidget(
      const example.DropdownMenuExample(),
    );

    // Make sure the dropdown menus are there.
    final Finder colorMenu = find.byType(DropdownMenu<example.ColorLabel>);
    final Finder iconMenu = find.byType(DropdownMenu<example.IconLabel>);
    expect(colorMenu, findsOneWidget);
    expect(iconMenu, findsOneWidget);

    // Tap on the color menu and make sure it is focused.
    await tester.tap(colorMenu);
    await tester.pumpAndSettle();
    expect(FocusScope.of(tester.element(colorMenu)).hasFocus, isTrue);

    // Tap on the icon menu and make sure it is focused.
    await tester.tap(iconMenu);
    await tester.pumpAndSettle();
    expect(FocusScope.of(tester.element(iconMenu)).hasFocus, isTrue);
  });
}
