diff --git a/dev/bots/check_code_samples.dart b/dev/bots/check_code_samples.dart index af7713fdf706..0f346a020850 100644 --- a/dev/bots/check_code_samples.dart +++ b/dev/bots/check_code_samples.dart @@ -336,7 +336,6 @@ final Set _knownMissingTests = { 'examples/api/test/material/scaffold/scaffold_messenger_state.show_material_banner.0_test.dart', 'examples/api/test/material/scaffold/scaffold_messenger.of.1_test.dart', 'examples/api/test/material/scaffold/scaffold_messenger_state.show_snack_bar.0_test.dart', - 'examples/api/test/material/segmented_button/segmented_button.0_test.dart', 'examples/api/test/material/app_bar/sliver_app_bar.2_test.dart', 'examples/api/test/material/app_bar/sliver_app_bar.3_test.dart', 'examples/api/test/material/navigation_rail/navigation_rail.extended_animation.0_test.dart', diff --git a/examples/api/test/material/segmented_button/segmented_button.0_test.dart b/examples/api/test/material/segmented_button/segmented_button.0_test.dart new file mode 100644 index 000000000000..f33de9163f82 --- /dev/null +++ b/examples/api/test/material/segmented_button/segmented_button.0_test.dart @@ -0,0 +1,110 @@ +// 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/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_api_samples/material/segmented_button/segmented_button.0.dart' + as example; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Segmented button can be used with a single selection', (WidgetTester tester) async { + await tester.pumpWidget( + const example.SegmentedButtonApp(), + ); + + void expectOneCalendarButton(example.Calendar period) { + expect( + find.byWidgetPredicate( + (Widget widget) => widget is SegmentedButton && setEquals(widget.selected, {period}), + ), + findsOne, + ); + } + + expect(find.text('Single choice'), findsOne); + expect(find.text('Day'), findsOne); + expect(find.text('Week'), findsOne); + expect(find.text('Month'), findsOne); + expect(find.text('Year'), findsOne); + + expectOneCalendarButton(example.Calendar.day); + + // Select the day. + await tester.tap(find.text('Week')); + await tester.pump(); + + expectOneCalendarButton(example.Calendar.week); + + // Select the month. + await tester.tap(find.text('Month')); + await tester.pump(); + + expectOneCalendarButton(example.Calendar.month); + + // Select the year. + await tester.tap(find.text('Year')); + await tester.pump(); + + expectOneCalendarButton(example.Calendar.year); + + // Select the day. + await tester.tap(find.text('Day')); + await tester.pump(); + + expectOneCalendarButton(example.Calendar.day); + + // Try to unselect the day. + await tester.tap(find.text('Day')); + await tester.pump(); + + expectOneCalendarButton(example.Calendar.day); + }); + + testWidgets('Segmented button can be used with a multiple selection', (WidgetTester tester) async { + await tester.pumpWidget( + const example.SegmentedButtonApp(), + ); + + void expectSizeButtons(Set sizes) { + expect( + find.byWidgetPredicate( + (Widget widget) => widget is SegmentedButton && setEquals(widget.selected, sizes), + ), + findsOne, + ); + } + + expect(find.text('Multiple choice'), findsOne); + expect(find.text('XS'), findsOne); + expect(find.text('S'), findsOne); + expect(find.text('M'), findsOne); + expect(find.text('L'), findsOne); + expect(find.text('XL'), findsOne); + + expectSizeButtons(const {example.Sizes.large, example.Sizes.extraLarge}); + + // Select everything. + await tester.tap(find.text('XS')); + await tester.pump(); + await tester.tap(find.text('S')); + await tester.pump(); + await tester.tap(find.text('M')); + await tester.pump(); + + expectSizeButtons(example.Sizes.values.toSet()); + + // Unselect everything but XS. + await tester.tap(find.text('S')); + await tester.pump(); + await tester.tap(find.text('M')); + await tester.pump(); + await tester.tap(find.text('L')); + await tester.pump(); + await tester.tap(find.text('XL')); + await tester.pump(); + + expectSizeButtons(const {example.Sizes.extraSmall}); + }); +}