// 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/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { test('ButtonBarThemeData null fields by default', () { const ButtonBarThemeData buttonBarTheme = ButtonBarThemeData(); expect(buttonBarTheme.alignment, null); expect(buttonBarTheme.mainAxisSize, null); expect(buttonBarTheme.buttonTextTheme, null); expect(buttonBarTheme.buttonMinWidth, null); expect(buttonBarTheme.buttonHeight, null); expect(buttonBarTheme.buttonPadding, null); expect(buttonBarTheme.buttonAlignedDropdown, null); expect(buttonBarTheme.layoutBehavior, null); expect(buttonBarTheme.overflowDirection, null); }); test('ThemeData uses default ButtonBarThemeData', () { expect(ThemeData().buttonBarTheme, equals(const ButtonBarThemeData())); }); test('ButtonBarThemeData copyWith, ==, hashCode basics', () { expect(const ButtonBarThemeData(), const ButtonBarThemeData().copyWith()); expect(const ButtonBarThemeData().hashCode, const ButtonBarThemeData().copyWith().hashCode); }); testWidgets('ButtonBarThemeData lerps correctly', (WidgetTester tester) async { const ButtonBarThemeData barThemePrimary = ButtonBarThemeData( alignment: MainAxisAlignment.end, mainAxisSize: MainAxisSize.min, buttonTextTheme: ButtonTextTheme.primary, buttonMinWidth: 20.0, buttonHeight: 20.0, buttonPadding: EdgeInsets.symmetric(vertical: 5.0), buttonAlignedDropdown: false, layoutBehavior: ButtonBarLayoutBehavior.padded, overflowDirection: VerticalDirection.down, ); const ButtonBarThemeData barThemeAccent = ButtonBarThemeData( alignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.max, buttonTextTheme: ButtonTextTheme.accent, buttonMinWidth: 10.0, buttonHeight: 40.0, buttonPadding: EdgeInsets.symmetric(horizontal: 10.0), buttonAlignedDropdown: true, layoutBehavior: ButtonBarLayoutBehavior.constrained, overflowDirection: VerticalDirection.up, ); final ButtonBarThemeData lerp = ButtonBarThemeData.lerp(barThemePrimary, barThemeAccent, 0.5)!; expect(lerp.alignment, equals(MainAxisAlignment.center)); expect(lerp.mainAxisSize, equals(MainAxisSize.max)); expect(lerp.buttonTextTheme, equals(ButtonTextTheme.accent)); expect(lerp.buttonMinWidth, equals(15.0)); expect(lerp.buttonHeight, equals(30.0)); expect(lerp.buttonPadding, equals(const EdgeInsets.fromLTRB(5.0, 2.5, 5.0, 2.5))); expect(lerp.buttonAlignedDropdown, isTrue); expect(lerp.layoutBehavior, equals(ButtonBarLayoutBehavior.constrained)); expect(lerp.overflowDirection, equals(VerticalDirection.up)); }); testWidgets('Default ButtonBarThemeData debugFillProperties', (WidgetTester tester) async { final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); const ButtonBarThemeData().debugFillProperties(builder); final List<String> description = builder.properties .where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)) .map((DiagnosticsNode node) => node.toString()) .toList(); expect(description, <String>[]); }); testWidgets('ButtonBarThemeData implements debugFillProperties', (WidgetTester tester) async { final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); const ButtonBarThemeData( alignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.max, buttonTextTheme: ButtonTextTheme.accent, buttonMinWidth: 10.0, buttonHeight: 42.0, buttonPadding: EdgeInsets.symmetric(horizontal: 7.3), buttonAlignedDropdown: true, layoutBehavior: ButtonBarLayoutBehavior.constrained, overflowDirection: VerticalDirection.up, ).debugFillProperties(builder); final List<String> description = builder.properties .where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)) .map((DiagnosticsNode node) => node.toString()) .toList(); expect(description, <String>[ 'alignment: MainAxisAlignment.center', 'mainAxisSize: MainAxisSize.max', 'textTheme: ButtonTextTheme.accent', 'minWidth: 10.0', 'height: 42.0', 'padding: EdgeInsets(7.3, 0.0, 7.3, 0.0)', 'dropdown width matches button', 'layoutBehavior: ButtonBarLayoutBehavior.constrained', 'overflowDirection: VerticalDirection.up', ]); }); testWidgets('ButtonBarTheme.of falls back to ThemeData.buttonBarTheme', (WidgetTester tester) async { const ButtonBarThemeData buttonBarTheme = ButtonBarThemeData(buttonMinWidth: 42.0); late BuildContext capturedContext; await tester.pumpWidget( MaterialApp( theme: ThemeData(buttonBarTheme: buttonBarTheme), home: Builder( builder: (BuildContext context) { capturedContext = context; return Container(); }, ), ), ); expect(ButtonBarTheme.of(capturedContext), equals(buttonBarTheme)); expect(ButtonBarTheme.of(capturedContext).buttonMinWidth, equals(42.0)); }); testWidgets('ButtonBarTheme overrides ThemeData.buttonBarTheme', (WidgetTester tester) async { const ButtonBarThemeData defaultBarTheme = ButtonBarThemeData(buttonMinWidth: 42.0); const ButtonBarThemeData buttonBarTheme = ButtonBarThemeData(buttonMinWidth: 84.0); late BuildContext capturedContext; await tester.pumpWidget( MaterialApp( theme: ThemeData(buttonBarTheme: defaultBarTheme), home: Builder( builder: (BuildContext context) { return ButtonBarTheme( data: buttonBarTheme, child: Builder( builder: (BuildContext context) { capturedContext = context; return Container(); }, ), ); }, ), ), ); expect(ButtonBarTheme.of(capturedContext), equals(buttonBarTheme)); expect(ButtonBarTheme.of(capturedContext).buttonMinWidth, equals(84.0)); }); }