// 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/toggle_buttons/toggle_buttons.1.dart' as example; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('ToggleButtons allows multiple or no selection', (WidgetTester tester) async { final ThemeData theme = ThemeData(useMaterial3: true); Finder findButton(String text) { return find.descendant( of: find.byType(ToggleButtons), matching: find.widgetWithText(TextButton, text), ); } await tester.pumpWidget(const example.ToggleButtonsApp()); TextButton toggleMButton = tester.widget(findButton('M')); TextButton toggleXLButton = tester.widget(findButton('XL')); // Initially, only M is selected. expect( toggleMButton.style!.backgroundColor!.resolve(enabled), theme.colorScheme.primary.withOpacity(0.12), ); expect( toggleXLButton.style!.backgroundColor!.resolve(enabled), theme.colorScheme.surface.withOpacity(0.0), ); // Tap on XL. await tester.tap(findButton('XL')); await tester.pumpAndSettle(); // Now both M and XL are selected. toggleMButton = tester.widget(findButton('M')); toggleXLButton = tester.widget(findButton('XL')); expect( toggleMButton.style!.backgroundColor!.resolve(enabled), theme.colorScheme.primary.withOpacity(0.12), ); expect( toggleXLButton.style!.backgroundColor!.resolve(enabled), theme.colorScheme.primary.withOpacity(0.12), ); // Tap M to deselect it. await tester.tap(findButton('M')); await tester.pumpAndSettle(); // Tap XL to deselect it. await tester.tap(findButton('XL')); await tester.pumpAndSettle(); // Now neither M nor XL are selected. toggleMButton = tester.widget(findButton('M')); toggleXLButton = tester.widget(findButton('XL')); expect( toggleMButton.style!.backgroundColor!.resolve(enabled), theme.colorScheme.surface.withOpacity(0.0), ); expect( toggleXLButton.style!.backgroundColor!.resolve(enabled), theme.colorScheme.surface.withOpacity(0.0), ); }); testWidgets('SegmentedButton allows multiple or no selection', (WidgetTester tester) async { final ThemeData theme = ThemeData(useMaterial3: true); Finder findButton(String text) { return find.descendant( of: find.byType(SegmentedButton), matching: find.widgetWithText(TextButton, text), ); } await tester.pumpWidget(const example.ToggleButtonsApp()); Material segmentMButton = tester.widget(find.descendant( of: findButton('M'), matching: find.byType(Material), )); Material segmentXLButton = tester.widget(find.descendant( of: findButton('XL'), matching: find.byType(Material), )); // Initially, only M is selected. expect(segmentMButton.color, theme.colorScheme.secondaryContainer); expect(segmentXLButton.color, Colors.transparent); // Tap on XL. await tester.tap(findButton('XL')); await tester.pumpAndSettle(); // // Now both M and XL are selected. segmentMButton = tester.widget(find.descendant( of: findButton('M'), matching: find.byType(Material), )); segmentXLButton = tester.widget(find.descendant( of: findButton('XL'), matching: find.byType(Material), )); expect(segmentMButton.color, theme.colorScheme.secondaryContainer); expect(segmentXLButton.color, theme.colorScheme.secondaryContainer); // Tap M to deselect it. await tester.tap(findButton('M')); await tester.pumpAndSettle(); // Tap XL to deselect it. await tester.tap(findButton('XL')); await tester.pumpAndSettle(); // Now neither M nor XL are selected. segmentMButton = tester.widget(find.descendant( of: findButton('M'), matching: find.byType(Material), )); segmentXLButton = tester.widget(find.descendant( of: findButton('XL'), matching: find.byType(Material), )); expect(segmentMButton.color, Colors.transparent); expect(segmentXLButton.color, Colors.transparent); }); } Set enabled = { };