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