// Copyright 2019 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/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { test('BottomSheetThemeData copyWith, ==, hashCode basics', () { expect(const BottomSheetThemeData(), const BottomSheetThemeData().copyWith()); expect(const BottomSheetThemeData().hashCode, const BottomSheetThemeData().copyWith().hashCode); }); test('BottomSheetThemeData null fields by default', () { const BottomSheetThemeData bottomSheetTheme = BottomSheetThemeData(); expect(bottomSheetTheme.backgroundColor, null); expect(bottomSheetTheme.elevation, null); expect(bottomSheetTheme.shape, null); }); testWidgets('Default BottomSheetThemeData debugFillProperties', (WidgetTester tester) async { final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); const BottomSheetThemeData().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('BottomSheetThemeData implements debugFillProperties', (WidgetTester tester) async { final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); BottomSheetThemeData( backgroundColor: const Color(0xFFFFFFFF), elevation: 2.0, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(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>[ 'backgroundColor: Color(0xffffffff)', 'elevation: 2.0', 'shape: RoundedRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.circular(2.0))', ]); }); testWidgets('Passing no BottomSheetThemeData returns defaults', (WidgetTester tester) async { await tester.pumpWidget(MaterialApp( home: Scaffold( body: BottomSheet( onClosing: () {}, builder: (BuildContext context) { return Container(); }, ), ), )); final Material material = tester.widget<Material>( find.descendant( of: find.byType(BottomSheet), matching: find.byType(Material), ).first, ); expect(material.color, null); expect(material.elevation, 0.0); expect(material.shape, null); }); testWidgets('BottomSheet uses values from BottomSheetThemeData', (WidgetTester tester) async { final BottomSheetThemeData bottomSheetTheme = _bottomSheetTheme(); await tester.pumpWidget(MaterialApp( theme: ThemeData(bottomSheetTheme: bottomSheetTheme), home: Scaffold( body: BottomSheet( onClosing: () {}, builder: (BuildContext context) { return Container(); }, ), ), )); final Material material = tester.widget<Material>( find.descendant( of: find.byType(BottomSheet), matching: find.byType(Material), ).first, ); expect(material.color, bottomSheetTheme.backgroundColor); expect(material.elevation, bottomSheetTheme.elevation); expect(material.shape, bottomSheetTheme.shape); }); testWidgets('BottomSheet widget properties take priority over theme', (WidgetTester tester) async { const Color backgroundColor = Colors.purple; const double elevation = 7.0; const ShapeBorder shape = RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(9.0)), ); await tester.pumpWidget(MaterialApp( theme: ThemeData(bottomSheetTheme: _bottomSheetTheme()), home: Scaffold( body: BottomSheet( backgroundColor: backgroundColor, elevation: elevation, shape: shape, onClosing: () {}, builder: (BuildContext context) { return Container(); }, ), ), )); final Material material = tester.widget<Material>( find.descendant( of: find.byType(BottomSheet), matching: find.byType(Material), ).first, ); expect(material.color, backgroundColor); expect(material.elevation, elevation); expect(material.shape, shape); }); } BottomSheetThemeData _bottomSheetTheme() { return BottomSheetThemeData( backgroundColor: Colors.orange, elevation: 12.0, shape: BeveledRectangleBorder(borderRadius: BorderRadius.circular(12)), ); }