// 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_test/flutter_test.dart'; import 'package:flutter/widgets.dart'; void main() { testWidgets('OverflowBar documented defaults', (WidgetTester tester) async { final OverflowBar bar = OverflowBar(); expect(bar.spacing, 0); expect(bar.overflowSpacing, 0); expect(bar.overflowDirection, VerticalDirection.down); expect(bar.textDirection, null); expect(bar.clipBehavior, Clip.none); expect(bar.children, const <Widget>[]); }); testWidgets('Empty OverflowBar', (WidgetTester tester) async { const Size size = Size(16, 24); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: Center( child: ConstrainedBox( constraints: BoxConstraints.tight(size), child: OverflowBar(), ), ), ), ); expect(tester.getSize(find.byType(OverflowBar)), size); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: Center( child: OverflowBar(), ), ), ); expect(tester.getSize(find.byType(OverflowBar)), Size.zero); }); testWidgets('OverflowBar horizontal layout', (WidgetTester tester) async { final Key child1Key = UniqueKey(); final Key child2Key = UniqueKey(); final Key child3Key = UniqueKey(); Widget buildFrame({ required double spacing, required TextDirection textDirection }) { return Directionality( textDirection: textDirection, child: Align( alignment: Alignment.topLeft, child: OverflowBar( spacing: spacing, children: <Widget>[ SizedBox(width: 48, height: 48, key: child1Key), SizedBox(width: 64, height: 64, key: child2Key), SizedBox(width: 32, height: 32, key: child3Key), ], ), ), ); } // Children are vertically centered, start at x=0 await tester.pumpWidget(buildFrame(spacing: 0, textDirection: TextDirection.ltr)); expect(tester.getRect(find.byKey(child1Key)), const Rect.fromLTRB(0, 8, 48, 56)); expect(tester.getRect(find.byKey(child2Key)), const Rect.fromLTRB(48, 0, 112, 64)); expect(tester.getRect(find.byKey(child3Key)), const Rect.fromLTRB(112, 16, 144, 48)); // Children are vertically centered, start at x=0 await tester.pumpWidget(buildFrame(spacing: 10, textDirection: TextDirection.ltr)); expect(tester.getRect(find.byKey(child1Key)), const Rect.fromLTRB(0, 8, 48, 56)); expect(tester.getRect(find.byKey(child2Key)), const Rect.fromLTRB(10.0 + 48, 0, 10.0 + 112, 64)); expect(tester.getRect(find.byKey(child3Key)), const Rect.fromLTRB(10.0 + 112 + 10.0, 16, 10.0 + 10.0 + 144, 48)); // Children appear in reverse order for RTL await tester.pumpWidget(buildFrame(spacing: 0, textDirection: TextDirection.rtl)); expect(tester.getRect(find.byKey(child3Key)), const Rect.fromLTRB(0, 16, 32, 48)); expect(tester.getRect(find.byKey(child2Key)), const Rect.fromLTRB(32, 0, 96, 64)); expect(tester.getRect(find.byKey(child1Key)), const Rect.fromLTRB(96, 8, 144, 56)); // Children appear in reverse order for RTL await tester.pumpWidget(buildFrame(spacing: 10, textDirection: TextDirection.rtl)); expect(tester.getRect(find.byKey(child3Key)), const Rect.fromLTRB(0, 16, 32, 48)); expect(tester.getRect(find.byKey(child2Key)), const Rect.fromLTRB(10.0 + 32, 0, 10.0 + 96, 64)); expect(tester.getRect(find.byKey(child1Key)), const Rect.fromLTRB(10.0 + 96 + 10.0, 8, 10.0 + 10.0 + 144, 56)); }); testWidgets('OverflowBar vertical layout', (WidgetTester tester) async { final Key child1Key = UniqueKey(); final Key child2Key = UniqueKey(); final Key child3Key = UniqueKey(); Widget buildFrame({ double overflowSpacing = 0, VerticalDirection overflowDirection = VerticalDirection.down, OverflowBarAlignment overflowAlignment = OverflowBarAlignment.start, TextDirection textDirection = TextDirection.ltr, }) { return Directionality( textDirection: textDirection, child: Align( alignment: Alignment.topLeft, child: ConstrainedBox( constraints: BoxConstraints.loose(const Size(100, double.infinity)), child: OverflowBar( overflowSpacing: overflowSpacing, overflowAlignment: overflowAlignment, overflowDirection: overflowDirection, children: <Widget>[ SizedBox(width: 48, height: 48, key: child1Key), SizedBox(width: 64, height: 64, key: child2Key), SizedBox(width: 32, height: 32, key: child3Key), ], ), ), ), ); } // Children are left aligned await tester.pumpWidget(buildFrame()); expect(tester.getRect(find.byKey(child1Key)), const Rect.fromLTRB(0, 0, 48, 48)); expect(tester.getRect(find.byKey(child2Key)), const Rect.fromLTRB(0, 48, 64, 112)); expect(tester.getRect(find.byKey(child3Key)), const Rect.fromLTRB(0, 112, 32, 144)); // Children are left aligned await tester.pumpWidget(buildFrame(overflowAlignment: OverflowBarAlignment.end, textDirection: TextDirection.rtl)); expect(tester.getRect(find.byKey(child1Key)), const Rect.fromLTRB(0, 0, 48, 48)); expect(tester.getRect(find.byKey(child2Key)), const Rect.fromLTRB(0, 48, 64, 112)); expect(tester.getRect(find.byKey(child3Key)), const Rect.fromLTRB(0, 112, 32, 144)); // Spaced children are left aligned await tester.pumpWidget(buildFrame(overflowSpacing: 10)); expect(tester.getRect(find.byKey(child1Key)), const Rect.fromLTRB(0, 0, 48, 48)); expect(tester.getRect(find.byKey(child2Key)), const Rect.fromLTRB(0, 10.0 + 48, 64, 10.0 + 112)); expect(tester.getRect(find.byKey(child3Key)), const Rect.fromLTRB(0, 10.0 + 112 + 10.0, 32, 10.0 + 10.0 + 144)); // Left-aligned children appear in reverse order for VerticalDirection.up await tester.pumpWidget(buildFrame(overflowDirection: VerticalDirection.up)); expect(tester.getRect(find.byKey(child3Key)), const Rect.fromLTRB(0, 0, 32, 32)); expect(tester.getRect(find.byKey(child2Key)), const Rect.fromLTRB(0, 32, 64, 96)); expect(tester.getRect(find.byKey(child1Key)), const Rect.fromLTRB(0, 96, 48, 144)); // Left-aligned spaced children appear in reverse order for VerticalDirection.up await tester.pumpWidget(buildFrame(overflowSpacing: 10, overflowDirection: VerticalDirection.up)); expect(tester.getRect(find.byKey(child3Key)), const Rect.fromLTRB(0, 0, 32, 32)); expect(tester.getRect(find.byKey(child2Key)), const Rect.fromLTRB(0, 10.0 + 32, 64, 10.0 + 96)); expect(tester.getRect(find.byKey(child1Key)), const Rect.fromLTRB(0, 10.0 + 10.0 + 96, 48, 10.0 + 10.0 + 144)); // Children are right aligned await tester.pumpWidget(buildFrame(overflowAlignment: OverflowBarAlignment.end)); expect(tester.getRect(find.byKey(child1Key)), const Rect.fromLTRB(100.0 - 48, 0, 100, 48)); expect(tester.getRect(find.byKey(child2Key)), const Rect.fromLTRB(100.0 - 64, 48, 100, 112)); expect(tester.getRect(find.byKey(child3Key)), const Rect.fromLTRB(100.0 - 32, 112, 100, 144)); // Children are right aligned await tester.pumpWidget(buildFrame(overflowAlignment: OverflowBarAlignment.start, textDirection: TextDirection.rtl)); expect(tester.getRect(find.byKey(child1Key)), const Rect.fromLTRB(100.0 - 48, 0, 100, 48)); expect(tester.getRect(find.byKey(child2Key)), const Rect.fromLTRB(100.0 - 64, 48, 100, 112)); expect(tester.getRect(find.byKey(child3Key)), const Rect.fromLTRB(100.0 - 32, 112, 100, 144)); // Children are centered await tester.pumpWidget(buildFrame(overflowAlignment: OverflowBarAlignment.center)); expect(tester.getRect(find.byKey(child1Key)), const Rect.fromLTRB(100.0/2.0 - 48/2, 0, 100.0/2.0 + 48/2, 48)); expect(tester.getRect(find.byKey(child2Key)), const Rect.fromLTRB(100.0/2.0 - 64/2, 48, 100.0/2.0 + 64/2, 112)); expect(tester.getRect(find.byKey(child3Key)), const Rect.fromLTRB(100.0/2.0 - 32/2, 112, 100.0/2.0 + 32/2, 144)); }); testWidgets('OverflowBar intrinsic width', (WidgetTester tester) async { Widget buildFrame({ required double width }) { return Directionality( textDirection: TextDirection.ltr, child: Center( child: Container( width: width, alignment: Alignment.topLeft, child: IntrinsicWidth( child: OverflowBar( spacing: 4, overflowSpacing: 8, children: const <Widget>[ SizedBox(width: 48, height: 50), SizedBox(width: 64, height: 25), SizedBox(width: 32, height: 75), ], ), ), ), ), ); } await tester.pumpWidget(buildFrame(width: 800)); expect(tester.getSize(find.byType(OverflowBar)).width, 152); // 152 = 48 + 4 + 64 + 4 + 32 await tester.pumpWidget(buildFrame(width: 150)); expect(tester.getSize(find.byType(OverflowBar)).width, 150); }); testWidgets('OverflowBar intrinsic height', (WidgetTester tester) async { Widget buildFrame({ required double maxWidth }) { return Directionality( textDirection: TextDirection.ltr, child: Center( child: Container( width: maxWidth, alignment: Alignment.topLeft, child: IntrinsicHeight( child: OverflowBar( spacing: 4, overflowSpacing: 8, children: const <Widget>[ SizedBox(width: 48, height: 50), SizedBox(width: 64, height: 25), SizedBox(width: 32, height: 75), ], ), ), ), ), ); } await tester.pumpWidget(buildFrame(maxWidth: 800)); expect(tester.getSize(find.byType(OverflowBar)).height, 75); // 75 = max(50, 25, 75) await tester.pumpWidget(buildFrame(maxWidth: 150)); expect(tester.getSize(find.byType(OverflowBar)).height, 166); // 166 = 50 + 8 + 25 + 8 + 75 }); }