// 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/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { test('FloatingActionButtonThemeData copyWith, ==, hashCode basics', () { expect(const FloatingActionButtonThemeData(), const FloatingActionButtonThemeData().copyWith()); expect(const FloatingActionButtonThemeData().hashCode, const FloatingActionButtonThemeData().copyWith().hashCode); }); testWidgets('Default values are used when no FloatingActionButton or FloatingActionButtonThemeData properties are specified', (WidgetTester tester) async { await tester.pumpWidget(MaterialApp( home: Scaffold( floatingActionButton: FloatingActionButton( onPressed: () { }, child: const Icon(Icons.add), ), ), )); // The color scheme values are guaranteed to be non null since the default // [ThemeData] creates it with [ColorScheme.fromSwatch]. expect(_getRawMaterialButton(tester).fillColor, ThemeData().colorScheme.secondary); expect(_getRichText(tester).text.style.color, ThemeData().colorScheme.onSecondary); // These defaults come directly from the [FloatingActionButton]. expect(_getRawMaterialButton(tester).elevation, 6); expect(_getRawMaterialButton(tester).highlightElevation, 12); expect(_getRawMaterialButton(tester).shape, const CircleBorder()); expect(_getRawMaterialButton(tester).splashColor, ThemeData().splashColor); }); testWidgets('FloatingActionButtonThemeData values are used when no FloatingActionButton properties are specified', (WidgetTester tester) async { const Color backgroundColor = Color(0xBEEFBEEF); const Color foregroundColor = Color(0xFACEFACE); const Color splashColor = Color(0xCAFEFEED); const double elevation = 7; const double disabledElevation = 1; const double highlightElevation = 13; const ShapeBorder shape = StadiumBorder(); await tester.pumpWidget(MaterialApp( theme: ThemeData().copyWith( floatingActionButtonTheme: const FloatingActionButtonThemeData( backgroundColor: backgroundColor, foregroundColor: foregroundColor, splashColor: splashColor, elevation: elevation, disabledElevation: disabledElevation, highlightElevation: highlightElevation, shape: shape, ), ), home: Scaffold( floatingActionButton: FloatingActionButton( onPressed: () { }, child: const Icon(Icons.add), ), ), )); expect(_getRawMaterialButton(tester).fillColor, backgroundColor); expect(_getRichText(tester).text.style.color, foregroundColor); expect(_getRawMaterialButton(tester).elevation, elevation); expect(_getRawMaterialButton(tester).disabledElevation, disabledElevation); expect(_getRawMaterialButton(tester).highlightElevation, highlightElevation); expect(_getRawMaterialButton(tester).shape, shape); expect(_getRawMaterialButton(tester).splashColor, splashColor); }); testWidgets('FloatingActionButton values take priority over FloatingActionButtonThemeData values when both properties are specified', (WidgetTester tester) async { const Color backgroundColor = Color(0x00000001); const Color foregroundColor = Color(0x00000002); const Color splashColor = Color(0x00000003); const double elevation = 7; const double disabledElevation = 1; const double highlightElevation = 13; const ShapeBorder shape = StadiumBorder(); await tester.pumpWidget(MaterialApp( theme: ThemeData().copyWith( floatingActionButtonTheme: const FloatingActionButtonThemeData( backgroundColor: Color(0x00000004), foregroundColor: Color(0x00000005), splashColor: Color(0x00000006), elevation: 23, disabledElevation: 11, highlightElevation: 43, shape: BeveledRectangleBorder(), ), ), home: Scaffold( floatingActionButton: FloatingActionButton( onPressed: () { }, child: const Icon(Icons.add), backgroundColor: backgroundColor, foregroundColor: foregroundColor, splashColor: splashColor, elevation: elevation, disabledElevation: disabledElevation, highlightElevation: highlightElevation, shape: shape, ), ), )); expect(_getRawMaterialButton(tester).fillColor, backgroundColor); expect(_getRichText(tester).text.style.color, foregroundColor); expect(_getRawMaterialButton(tester).elevation, elevation); expect(_getRawMaterialButton(tester).disabledElevation, disabledElevation); expect(_getRawMaterialButton(tester).highlightElevation, highlightElevation); expect(_getRawMaterialButton(tester).shape, shape); expect(_getRawMaterialButton(tester).splashColor, splashColor); }); testWidgets('FloatingActionButton uses a custom shape when specified in the theme', (WidgetTester tester) async { const ShapeBorder customShape = BeveledRectangleBorder(); await tester.pumpWidget(MaterialApp( home: Scaffold( floatingActionButton: FloatingActionButton( onPressed: () { }, shape: customShape, ), ), )); expect(_getRawMaterialButton(tester).shape, customShape); }); testWidgets('default FloatingActionButton debugFillProperties', (WidgetTester tester) async { final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); const FloatingActionButtonThemeData ().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('Material implements debugFillProperties', (WidgetTester tester) async { final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); const FloatingActionButtonThemeData( backgroundColor: Color(0xCAFECAFE), foregroundColor: Color(0xFEEDFEED), elevation: 23, disabledElevation: 11, highlightElevation: 43, shape: BeveledRectangleBorder(), ).debugFillProperties(builder); final List<String> description = builder.properties .where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)) .map((DiagnosticsNode node) => node.toString()) .toList(); expect(description, <String>[ 'foregroundColor: Color(0xfeedfeed)', 'backgroundColor: Color(0xcafecafe)', 'elevation: 23.0', 'disabledElevation: 11.0', 'highlightElevation: 43.0', 'shape: BeveledRectangleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none), BorderRadius.zero)', ]); }); } RawMaterialButton _getRawMaterialButton(WidgetTester tester) { return tester.widget<RawMaterialButton>( find.descendant( of: find.byType(FloatingActionButton), matching: find.byType(RawMaterialButton), ), ); } RichText _getRichText(WidgetTester tester) { return tester.widget<RichText>( find.descendant( of: find.byType(FloatingActionButton), matching: find.byType(RichText), ), ); }