// Copyright 2016 The Chromium 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_test/flutter_test.dart'; void main() { testWidgets('ButtonBar default control smoketest', (WidgetTester tester) async { await tester.pumpWidget( const Directionality( textDirection: TextDirection.ltr, child: ButtonBar(), ), ); }); group('alignment', () { testWidgets('default alignment is MainAxisAlignment.end', (WidgetTester tester) async { await tester.pumpWidget( const MaterialApp( home: ButtonBar( children: <Widget>[ SizedBox(width: 10.0, height: 10.0), ], ), ) ); final Finder child = find.byType(SizedBox); // Should be positioned to the right of the bar, expect(tester.getRect(child).left, 782.0); // bar width - default padding - 10 expect(tester.getRect(child).right, 792.0); // bar width - default padding }); testWidgets('ButtonBarTheme.alignment overrides default', (WidgetTester tester) async { await tester.pumpWidget( const MaterialApp( home: ButtonBarTheme( data: ButtonBarThemeData( alignment: MainAxisAlignment.center, ), child: ButtonBar( children: <Widget>[ SizedBox(width: 10.0, height: 10.0), ], ), ), ) ); final Finder child = find.byType(SizedBox); // Should be positioned in the center expect(tester.getRect(child).left, 395.0); // (bar width - padding) / 2 - 10 / 2 expect(tester.getRect(child).right, 405.0); // (bar width - padding) / 2 - 10 / 2 + 10 }); testWidgets('ButtonBar.alignment overrides ButtonBarTheme.alignment and default', (WidgetTester tester) async { await tester.pumpWidget( const MaterialApp( home: ButtonBarTheme( data: ButtonBarThemeData( alignment: MainAxisAlignment.center, ), child: ButtonBar( alignment: MainAxisAlignment.start, children: <Widget>[ SizedBox(width: 10.0, height: 10.0), ], ), ), ) ); final Finder child = find.byType(SizedBox); // Should be positioned on the left expect(tester.getRect(child).left, 8.0); // padding expect(tester.getRect(child).right, 18.0); // padding + 10 }); }); group('mainAxisSize', () { testWidgets('default mainAxisSize is MainAxisSize.max', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( home: ButtonBar( children: <Widget>[ Container(), ], ), ) ); // ButtonBar uses a Row internally to implement this final Row row = tester.widget(find.byType(Row)); expect(row.mainAxisSize, equals(MainAxisSize.max)); }); testWidgets('ButtonBarTheme.mainAxisSize overrides default', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( home: ButtonBarTheme( data: const ButtonBarThemeData( mainAxisSize: MainAxisSize.min, ), child: ButtonBar( children: <Widget>[ Container(), ], ), ), ) ); // ButtonBar uses a Row internally to implement this final Row row = tester.widget(find.byType(Row)); expect(row.mainAxisSize, equals(MainAxisSize.min)); }); testWidgets('ButtonBar.mainAxisSize overrides ButtonBarTheme.mainAxisSize and default', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( home: ButtonBarTheme( data: const ButtonBarThemeData( mainAxisSize: MainAxisSize.min, ), child: ButtonBar( mainAxisSize: MainAxisSize.max, children: <Widget>[ Container(), ], ), ), ) ); // ButtonBar uses a Row internally to implement this final Row row = tester.widget(find.byType(Row)); expect(row.mainAxisSize, equals(MainAxisSize.max)); }); }); group('button properies override ButtonTheme', () { testWidgets('default button properties override ButtonTheme properties', (WidgetTester tester) async { BuildContext capturedContext; await tester.pumpWidget( MaterialApp( home: ButtonBar( children: <Widget>[ Builder(builder: (BuildContext context) { capturedContext = context; return Container(); }) ], ), ) ); final ButtonThemeData buttonTheme = ButtonTheme.of(capturedContext); expect(buttonTheme.textTheme, equals(ButtonTextTheme.primary)); expect(buttonTheme.minWidth, equals(64.0)); expect(buttonTheme.height, equals(36.0)); expect(buttonTheme.padding, equals(const EdgeInsets.symmetric(horizontal: 8.0))); expect(buttonTheme.alignedDropdown, equals(false)); expect(buttonTheme.layoutBehavior, equals(ButtonBarLayoutBehavior.padded)); }); testWidgets('ButtonBarTheme button properties override defaults and ButtonTheme properties', (WidgetTester tester) async { BuildContext capturedContext; await tester.pumpWidget( MaterialApp( home: ButtonBarTheme( data: const ButtonBarThemeData( buttonTextTheme: ButtonTextTheme.primary, buttonMinWidth: 42.0, buttonHeight: 84.0, buttonPadding: EdgeInsets.fromLTRB(10, 20, 30, 40), buttonAlignedDropdown: true, layoutBehavior: ButtonBarLayoutBehavior.constrained, ), child: ButtonBar( children: <Widget>[ Builder(builder: (BuildContext context) { capturedContext = context; return Container(); }) ], ), ), ) ); final ButtonThemeData buttonTheme = ButtonTheme.of(capturedContext); expect(buttonTheme.textTheme, equals(ButtonTextTheme.primary)); expect(buttonTheme.minWidth, equals(42.0)); expect(buttonTheme.height, equals(84.0)); expect(buttonTheme.padding, equals(const EdgeInsets.fromLTRB(10, 20, 30, 40))); expect(buttonTheme.alignedDropdown, equals(true)); expect(buttonTheme.layoutBehavior, equals(ButtonBarLayoutBehavior.constrained)); }); testWidgets('ButtonBar button properties override ButtonBarTheme, defaults and ButtonTheme properties', (WidgetTester tester) async { BuildContext capturedContext; await tester.pumpWidget( MaterialApp( home: ButtonBarTheme( data: const ButtonBarThemeData( buttonTextTheme: ButtonTextTheme.accent, buttonMinWidth: 4242.0, buttonHeight: 8484.0, buttonPadding: EdgeInsets.fromLTRB(50, 60, 70, 80), buttonAlignedDropdown: false, layoutBehavior: ButtonBarLayoutBehavior.padded, ), child: ButtonBar( buttonTextTheme: ButtonTextTheme.primary, buttonMinWidth: 42.0, buttonHeight: 84.0, buttonPadding: const EdgeInsets.fromLTRB(10, 20, 30, 40), buttonAlignedDropdown: true, layoutBehavior: ButtonBarLayoutBehavior.constrained, children: <Widget>[ Builder(builder: (BuildContext context) { capturedContext = context; return Container(); }) ], ), ), ) ); final ButtonThemeData buttonTheme = ButtonTheme.of(capturedContext); expect(buttonTheme.textTheme, equals(ButtonTextTheme.primary)); expect(buttonTheme.minWidth, equals(42.0)); expect(buttonTheme.height, equals(84.0)); expect(buttonTheme.padding, equals(const EdgeInsets.fromLTRB(10, 20, 30, 40))); expect(buttonTheme.alignedDropdown, equals(true)); expect(buttonTheme.layoutBehavior, equals(ButtonBarLayoutBehavior.constrained)); }); }); group('layoutBehavior', () { testWidgets('ButtonBar has a min height of 52 when using ButtonBarLayoutBehavior.constrained', (WidgetTester tester) async { await tester.pumpWidget( SingleChildScrollView( child: ListBody( children: const <Widget>[ Directionality( textDirection: TextDirection.ltr, child: ButtonBar( layoutBehavior: ButtonBarLayoutBehavior.constrained, children: <Widget>[ SizedBox(width: 10.0, height: 10.0), ], ), ), ], ), ), ); final Finder buttonBar = find.byType(ButtonBar); expect(tester.getBottomRight(buttonBar).dy - tester.getTopRight(buttonBar).dy, 52.0); }); testWidgets('ButtonBar has padding applied when using ButtonBarLayoutBehavior.padded', (WidgetTester tester) async { await tester.pumpWidget( SingleChildScrollView( child: ListBody( children: const <Widget>[ Directionality( textDirection: TextDirection.ltr, child: ButtonBar( layoutBehavior: ButtonBarLayoutBehavior.padded, children: <Widget>[ SizedBox(width: 10.0, height: 10.0), ], ), ), ], ), ), ); final Finder buttonBar = find.byType(ButtonBar); expect(tester.getBottomRight(buttonBar).dy - tester.getTopRight(buttonBar).dy, 26.0); }); }); }