blob: fa3c625ea5394821523604ca7a1ae5f4a78ec191 [file] [log] [blame]
// 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);
});
});
}