From a9faaf26835ca4d0f1ce0e9b66b3c2286e64a46c Mon Sep 17 00:00:00 2001 From: Yegor Date: Sat, 20 Jan 2024 16:32:34 -0800 Subject: [PATCH] Add RadioListItem use-case to a11y_assessments (#140984) Adds a use-case screen for `RadioListTile`, similar to the `CheckBoxListTile`. This screen can help test scenarios such as the one reported in https://github.com/flutter/flutter/issues/126805. --- .../lib/use_cases/dialog.dart | 23 ++++++-- .../lib/use_cases/radio_list_tile.dart | 59 +++++++++++++++++++ .../lib/use_cases/use_cases.dart | 2 + .../test/check_box_list_tile_test.dart | 16 +++++ dev/a11y_assessments/test/dialog_test.dart | 18 ++++-- .../test/radio_list_tile_test.dart | 16 +++++ 6 files changed, 123 insertions(+), 11 deletions(-) create mode 100644 dev/a11y_assessments/lib/use_cases/radio_list_tile.dart create mode 100644 dev/a11y_assessments/test/check_box_list_tile_test.dart create mode 100644 dev/a11y_assessments/test/radio_list_tile_test.dart diff --git a/dev/a11y_assessments/lib/use_cases/dialog.dart b/dev/a11y_assessments/lib/use_cases/dialog.dart index e110259f5c..682bf31aea 100644 --- a/dev/a11y_assessments/lib/use_cases/dialog.dart +++ b/dev/a11y_assessments/lib/use_cases/dialog.dart @@ -41,12 +41,23 @@ class _MainWidget extends StatelessWidget { children: [ const Text('This is a typical dialog.'), const SizedBox(height: 15), - TextButton( - autofocus: true, - onPressed: () { - Navigator.pop(context); - }, - child: const Text('Close'), + Row( + children: [ + TextButton( + autofocus: true, + onPressed: () { + Navigator.pop(context); + }, + child: const Text('OK'), + ), + TextButton( + autofocus: true, + onPressed: () { + Navigator.pop(context); + }, + child: const Text('Cancel'), + ), + ], ), ], ), diff --git a/dev/a11y_assessments/lib/use_cases/radio_list_tile.dart b/dev/a11y_assessments/lib/use_cases/radio_list_tile.dart new file mode 100644 index 0000000000..9bcf120009 --- /dev/null +++ b/dev/a11y_assessments/lib/use_cases/radio_list_tile.dart @@ -0,0 +1,59 @@ +// 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 'use_cases.dart'; + +class RadioListTileUseCase extends UseCase { + + @override + String get name => 'RadioListTile'; + + @override + String get route => '/radio-list-tile'; + + @override + Widget build(BuildContext context) => _MainWidget(); +} + +class _MainWidget extends StatefulWidget { + @override + State<_MainWidget> createState() => _MainWidgetState(); +} + +enum SingingCharacter { lafayette, jefferson } + +class _MainWidgetState extends State<_MainWidget> { + SingingCharacter _value = SingingCharacter.lafayette; + + void _onChanged(SingingCharacter? value) { + setState(() { + _value = value!; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Radio button')), + body: ListView( + children: [ + RadioListTile( + title: const Text('Lafayette'), + value: SingingCharacter.lafayette, + groupValue: _value, + onChanged: _onChanged, + ), + RadioListTile( + title: const Text('Jefferson'), + value: SingingCharacter.jefferson, + groupValue: _value, + onChanged: _onChanged, + ), + ], + ), + ); + } +} diff --git a/dev/a11y_assessments/lib/use_cases/use_cases.dart b/dev/a11y_assessments/lib/use_cases/use_cases.dart index ab10c33c1b..094fdbb469 100644 --- a/dev/a11y_assessments/lib/use_cases/use_cases.dart +++ b/dev/a11y_assessments/lib/use_cases/use_cases.dart @@ -11,6 +11,7 @@ import 'date_picker.dart'; import 'dialog.dart'; import 'material_banner.dart'; import 'navigation_bar.dart'; +import 'radio_list_tile.dart'; import 'slider.dart'; import 'text_button.dart'; import 'text_field.dart'; @@ -34,4 +35,5 @@ final List useCases = [ MaterialBannerUseCase(), NavigationBarUseCase(), TextButtonUseCase(), + RadioListTileUseCase(), ]; diff --git a/dev/a11y_assessments/test/check_box_list_tile_test.dart b/dev/a11y_assessments/test/check_box_list_tile_test.dart new file mode 100644 index 0000000000..8e653d5d55 --- /dev/null +++ b/dev/a11y_assessments/test/check_box_list_tile_test.dart @@ -0,0 +1,16 @@ +// 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:a11y_assessments/use_cases/check_box_list_tile.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'test_utils.dart'; + +void main() { + testWidgets('check box list tile use-case renders check boxes', (WidgetTester tester) async { + await pumpsUseCase(tester, CheckBoxListTile()); + expect(find.text('a check box list title'), findsOneWidget); + expect(find.text('a disabled check box list title'), findsOneWidget); + }); +} diff --git a/dev/a11y_assessments/test/dialog_test.dart b/dev/a11y_assessments/test/dialog_test.dart index 98d8c71bb7..70c5c71417 100644 --- a/dev/a11y_assessments/test/dialog_test.dart +++ b/dev/a11y_assessments/test/dialog_test.dart @@ -12,12 +12,20 @@ void main() { await pumpsUseCase(tester, DialogUseCase()); expect(find.text('Show Dialog'), findsOneWidget); - await tester.tap(find.text('Show Dialog')); - await tester.pumpAndSettle(); - expect(find.text('This is a typical dialog.'), findsOneWidget); + Future invokeDialog() async { + await tester.tap(find.text('Show Dialog')); + await tester.pumpAndSettle(); + expect(find.text('This is a typical dialog.'), findsOneWidget); + } - await tester.tap(find.text('Close')); + await invokeDialog(); + await tester.tap(find.text('OK')); await tester.pumpAndSettle(); - expect(find.text('Show Dialog'), findsOneWidget); + expect(find.text('This is a typical dialog.'), findsNothing); + + await invokeDialog(); + await tester.tap(find.text('Cancel')); + await tester.pumpAndSettle(); + expect(find.text('This is a typical dialog.'), findsNothing); }); } diff --git a/dev/a11y_assessments/test/radio_list_tile_test.dart b/dev/a11y_assessments/test/radio_list_tile_test.dart new file mode 100644 index 0000000000..499bf3bd88 --- /dev/null +++ b/dev/a11y_assessments/test/radio_list_tile_test.dart @@ -0,0 +1,16 @@ +// 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:a11y_assessments/use_cases/radio_list_tile.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'test_utils.dart'; + +void main() { + testWidgets('radio list tile use-case renders radio buttons', (WidgetTester tester) async { + await pumpsUseCase(tester, RadioListTileUseCase()); + expect(find.text('Lafayette'), findsOneWidget); + expect(find.text('Jefferson'), findsOneWidget); + }); +}