diff --git a/dev/bots/check_code_samples.dart b/dev/bots/check_code_samples.dart index 018efa450e..dd659f97a7 100644 --- a/dev/bots/check_code_samples.dart +++ b/dev/bots/check_code_samples.dart @@ -392,7 +392,6 @@ final Set _knownMissingTests = { 'examples/api/test/widgets/navigator/restorable_route_future.0_test.dart', 'examples/api/test/widgets/navigator/navigator_state.restorable_push.0_test.dart', 'examples/api/test/widgets/focus_manager/focus_node.unfocus.0_test.dart', - 'examples/api/test/widgets/focus_manager/focus_node.0_test.dart', 'examples/api/test/widgets/framework/build_owner.0_test.dart', 'examples/api/test/widgets/framework/error_widget.0_test.dart', 'examples/api/test/widgets/inherited_theme/inherited_theme.0_test.dart', diff --git a/examples/api/test/widgets/focus_manager/focus_node.0_test.dart b/examples/api/test/widgets/focus_manager/focus_node.0_test.dart new file mode 100644 index 0000000000..bd017976f7 --- /dev/null +++ b/examples/api/test/widgets/focus_manager/focus_node.0_test.dart @@ -0,0 +1,191 @@ +// 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/services.dart'; +import 'package:flutter_api_samples/widgets/focus_manager/focus_node.0.dart' + as example; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets( + 'FocusNode gets focused and unfocused on ColorfulButton tap', + (WidgetTester tester) async { + await tester.pumpWidget( + const example.FocusNodeExampleApp(), + ); + + final Element button = tester.element( + find.byType(example.ColorfulButton), + ); + + expect( + tester.binding.focusManager.primaryFocus?.context, + isNot(equals(button)), + ); + + // Tapping on ColorfulButton to focus on FocusNode. + await tester.tap(find.byType(example.ColorfulButton)); + await tester.pump(); + + expect( + tester.binding.focusManager.primaryFocus?.context, + equals(button), + ); + + // Tapping on ColorfulButton to unfocus from FocusNode. + await tester.tap(find.byType(example.ColorfulButton)); + await tester.pump(); + + expect( + tester.binding.focusManager.primaryFocus?.context, + isNot(equals(button)), + ); + }, + ); + + testWidgets( + 'FocusNode updates the text label when focused or unfocused', + (WidgetTester tester) async { + await tester.pumpWidget( + const example.FocusNodeExampleApp(), + ); + + expect(find.text('Press to focus'), findsOneWidget); + expect(find.text("I'm in color! Press R,G,B!"), findsNothing); + + // Tapping on ColorfulButton to focus on FocusNode. + await tester.tap(find.byType(example.ColorfulButton)); + await tester.pump(); + + expect(find.text('Press to focus'), findsNothing); + expect(find.text("I'm in color! Press R,G,B!"), findsOneWidget); + + // Tapping on ColorfulButton to unfocus from FocusNode. + await tester.tap(find.byType(example.ColorfulButton)); + await tester.pump(); + + expect(find.text('Press to focus'), findsOneWidget); + expect(find.text("I'm in color! Press R,G,B!"), findsNothing); + }, + ); + + testWidgets( + 'FocusNode updates color of the Container according to the key events when focused', + (WidgetTester tester) async { + await tester.pumpWidget( + const example.FocusNodeExampleApp(), + ); + + // Tapping on ColorfulButton to focus on FocusNode. + await tester.tap(find.byType(example.ColorfulButton)); + await tester.pump(); + + final Finder containerFinder = find.descendant( + of: find.byType(example.ColorfulButton), + matching: find.byType(Container), + ); + + Container container = tester.widget(containerFinder); + expect(container.color, equals(Colors.white)); + + await tester.sendKeyEvent(LogicalKeyboardKey.keyR); + await tester.pump(); + + container = tester.widget(containerFinder); + expect(container.color, equals(Colors.red)); + + await tester.sendKeyEvent(LogicalKeyboardKey.keyG); + await tester.pump(); + + container = tester.widget(containerFinder); + expect(container.color, equals(Colors.green)); + + await tester.sendKeyEvent(LogicalKeyboardKey.keyB); + await tester.pump(); + + container = tester.widget(containerFinder); + expect(container.color, equals(Colors.blue)); + }, + ); + + testWidgets( + 'FocusNode does not listen to the key events when unfocused', + (WidgetTester tester) async { + await tester.pumpWidget( + const example.FocusNodeExampleApp(), + ); + + final Finder containerFinder = find.descendant( + of: find.byType(example.ColorfulButton), + matching: find.byType(Container), + ); + + Container container = tester.widget(containerFinder); + expect(container.color, equals(Colors.white)); + + await tester.sendKeyEvent(LogicalKeyboardKey.keyR); + await tester.pump(); + + container = tester.widget(containerFinder); + expect(container.color, equals(Colors.white)); + + await tester.sendKeyEvent(LogicalKeyboardKey.keyG); + await tester.pump(); + + container = tester.widget(containerFinder); + expect(container.color, equals(Colors.white)); + + await tester.sendKeyEvent(LogicalKeyboardKey.keyB); + await tester.pump(); + + container = tester.widget(containerFinder); + expect(container.color, equals(Colors.white)); + }, + ); + + testWidgets( + 'FocusNode sets color to the white when unfocused and sets it back to the selected one when focused', + (WidgetTester tester) async { + await tester.pumpWidget( + const example.FocusNodeExampleApp(), + ); + + final Finder containerFinder = find.descendant( + of: find.byType(example.ColorfulButton), + matching: find.byType(Container), + ); + + Container container = tester.widget(containerFinder); + expect(container.color, equals(Colors.white)); + + // Tapping on ColorfulButton to focus on FocusNode. + await tester.tap(find.byType(example.ColorfulButton)); + await tester.pump(); + + container = tester.widget(containerFinder); + expect(container.color, equals(Colors.white)); + + await tester.sendKeyEvent(LogicalKeyboardKey.keyR); + await tester.pump(); + + container = tester.widget(containerFinder); + expect(container.color, equals(Colors.red)); + + // Tapping on ColorfulButton to unfocus from FocusNode. + await tester.tap(find.byType(example.ColorfulButton)); + await tester.pump(); + + container = tester.widget(containerFinder); + expect(container.color, equals(Colors.white)); + + // Tapping on ColorfulButton to focus on FocusNode. + await tester.tap(find.byType(example.ColorfulButton)); + await tester.pump(); + + container = tester.widget(containerFinder); + expect(container.color, equals(Colors.red)); + }, + ); +}