// 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('DividerThemeData copyWith, ==, hashCode basics', () { expect(const DividerThemeData(), const DividerThemeData().copyWith()); expect(const DividerThemeData().hashCode, const DividerThemeData().copyWith().hashCode); }); test('DividerThemeData null fields by default', () { const DividerThemeData dividerTheme = DividerThemeData(); expect(dividerTheme.color, null); expect(dividerTheme.space, null); expect(dividerTheme.thickness, null); expect(dividerTheme.indent, null); expect(dividerTheme.endIndent, null); }); testWidgets('Default DividerThemeData debugFillProperties', (WidgetTester tester) async { final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); const DividerThemeData().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('DividerThemeData implements debugFillProperties', (WidgetTester tester) async { final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); const DividerThemeData( color: Color(0xFFFFFFFF), space: 5.0, thickness: 4.0, indent: 3.0, endIndent: 2.0, ).debugFillProperties(builder); final List<String> description = builder.properties .where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)) .map((DiagnosticsNode node) => node.toString()) .toList(); expect(description, <String>[ 'color: Color(0xffffffff)', 'space: 5.0', 'thickness: 4.0', 'indent: 3.0', 'endIndent: 2.0', ]); }); group('Horizontal Divider', () { testWidgets('Passing no DividerThemeData returns defaults', (WidgetTester tester) async { await tester.pumpWidget(const MaterialApp( home: Scaffold( body: Divider(), ), )); final RenderBox box = tester.firstRenderObject(find.byType(Divider)); expect(box.size.height, 16.0); final Container container = tester.widget(find.byType(Container)); final BoxDecoration decoration = container.decoration! as BoxDecoration; expect(decoration.border!.bottom.width, 0.0); final ThemeData theme = ThemeData(); expect(decoration.border!.bottom.color, theme.dividerColor); final Rect dividerRect = tester.getRect(find.byType(Divider)); final Rect lineRect = tester.getRect(find.byType(DecoratedBox)); expect(lineRect.left, dividerRect.left); expect(lineRect.right, dividerRect.right); }); testWidgets('Uses values from DividerThemeData', (WidgetTester tester) async { final DividerThemeData dividerTheme = _dividerTheme(); await tester.pumpWidget(MaterialApp( theme: ThemeData(dividerTheme: dividerTheme), home: const Scaffold( body: Divider(), ), )); final RenderBox box = tester.firstRenderObject(find.byType(Divider)); expect(box.size.height, dividerTheme.space); final Container container = tester.widget(find.byType(Container)); final BoxDecoration decoration = container.decoration! as BoxDecoration; expect(decoration.border!.bottom.width, dividerTheme.thickness); expect(decoration.border!.bottom.color, dividerTheme.color); final Rect dividerRect = tester.getRect(find.byType(Divider)); final Rect lineRect = tester.getRect(find.byType(DecoratedBox)); expect(lineRect.left, dividerRect.left + dividerTheme.indent!); expect(lineRect.right, dividerRect.right - dividerTheme.endIndent!); }); testWidgets('Widget properties take priority over theme', (WidgetTester tester) async { const Color color = Colors.purple; const double height = 10.0; const double thickness = 5.0; const double indent = 8.0; const double endIndent = 9.0; final DividerThemeData dividerTheme = _dividerTheme(); await tester.pumpWidget(MaterialApp( theme: ThemeData(dividerTheme: dividerTheme), home: const Scaffold( body: Divider( color: color, height: height, thickness: thickness, indent: indent, endIndent: endIndent, ), ), )); final RenderBox box = tester.firstRenderObject(find.byType(Divider)); expect(box.size.height, height); final Container container = tester.widget(find.byType(Container)); final BoxDecoration decoration = container.decoration! as BoxDecoration; expect(decoration.border!.bottom.width, thickness); expect(decoration.border!.bottom.color, color); final Rect dividerRect = tester.getRect(find.byType(Divider)); final Rect lineRect = tester.getRect(find.byType(DecoratedBox)); expect(lineRect.left, dividerRect.left + indent); expect(lineRect.right, dividerRect.right - endIndent); }); }); group('Vertical Divider', () { testWidgets('Passing no DividerThemeData returns defaults', (WidgetTester tester) async { await tester.pumpWidget(const MaterialApp( home: Scaffold( body: VerticalDivider(), ), )); final RenderBox box = tester.firstRenderObject(find.byType(VerticalDivider)); expect(box.size.width, 16.0); final Container container = tester.widget(find.byType(Container)); final BoxDecoration decoration = container.decoration! as BoxDecoration; final Border border = decoration.border! as Border; expect(border.left.width, 0.0); final ThemeData theme = ThemeData(); expect(border.left.color, theme.dividerColor); final Rect dividerRect = tester.getRect(find.byType(VerticalDivider)); final Rect lineRect = tester.getRect(find.byType(DecoratedBox)); expect(lineRect.top, dividerRect.top); expect(lineRect.bottom, dividerRect.bottom); }); testWidgets('Uses values from DividerThemeData', (WidgetTester tester) async { final DividerThemeData dividerTheme = _dividerTheme(); await tester.pumpWidget(MaterialApp( theme: ThemeData(dividerTheme: dividerTheme), home: const Scaffold( body: VerticalDivider(), ), )); final RenderBox box = tester.firstRenderObject(find.byType(VerticalDivider)); expect(box.size.width, dividerTheme.space); final Container container = tester.widget(find.byType(Container)); final BoxDecoration decoration = container.decoration! as BoxDecoration; final Border border = decoration.border! as Border; expect(border.left.width, dividerTheme.thickness); expect(border.left.color, dividerTheme.color); final Rect dividerRect = tester.getRect(find.byType(VerticalDivider)); final Rect lineRect = tester.getRect(find.byType(DecoratedBox)); expect(lineRect.top, dividerRect.top + dividerTheme.indent!); expect(lineRect.bottom, dividerRect.bottom - dividerTheme.endIndent!); }); testWidgets('Widget properties take priority over theme', (WidgetTester tester) async { const Color color = Colors.purple; const double width = 10.0; const double thickness = 5.0; const double indent = 8.0; const double endIndent = 9.0; final DividerThemeData dividerTheme = _dividerTheme(); await tester.pumpWidget(MaterialApp( theme: ThemeData(dividerTheme: dividerTheme), home: const Scaffold( body: VerticalDivider( color: color, width: width, thickness: thickness, indent: indent, endIndent: endIndent, ), ), )); final RenderBox box = tester.firstRenderObject(find.byType(VerticalDivider)); expect(box.size.width, width); final Container container = tester.widget(find.byType(Container)); final BoxDecoration decoration = container.decoration! as BoxDecoration; final Border border = decoration.border! as Border; expect(border.left.width, thickness); expect(border.left.color, color); final Rect dividerRect = tester.getRect(find.byType(VerticalDivider)); final Rect lineRect = tester.getRect(find.byType(DecoratedBox)); expect(lineRect.top, dividerRect.top + indent); expect(lineRect.bottom, dividerRect.bottom - endIndent); }); }); } DividerThemeData _dividerTheme() { return const DividerThemeData( color: Colors.orange, space: 12.0, thickness: 2.0, indent: 7.0, endIndent: 5.0, ); }