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