blob: 70aa1e85cdb37b9463219edf421e1332e86c2245 [file] [log] [blame]
// 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_test/flutter_test.dart';
void main() {
test('Theme data control test', () {
final ThemeData dark = ThemeData.dark();
expect(dark, hasOneLineDescription);
expect(dark, equals(dark.copyWith()));
expect(dark.hashCode, equals(dark.copyWith().hashCode));
final ThemeData light = ThemeData.light();
final ThemeData dawn = ThemeData.lerp(dark, light, 0.25);
expect(dawn.brightness, Brightness.dark);
expect(dawn.primaryColor, Color.lerp(dark.primaryColor, light.primaryColor, 0.25));
});
test('Defaults to the default typography for the platform', () {
for (final TargetPlatform platform in TargetPlatform.values) {
final ThemeData theme = ThemeData(platform: platform);
final Typography typography = Typography.material2018(platform: platform);
expect(theme.textTheme, typography.black.apply(decoration: TextDecoration.none),
reason: 'Not using default typography for $platform');
}
});
test('Default text theme contrasts with brightness', () {
final ThemeData lightTheme = ThemeData(brightness: Brightness.light);
final ThemeData darkTheme = ThemeData(brightness: Brightness.dark);
final Typography typography = Typography.material2018(platform: lightTheme.platform);
expect(lightTheme.textTheme.headline6!.color, typography.black.headline6!.color);
expect(darkTheme.textTheme.headline6!.color, typography.white.headline6!.color);
});
test('Default primary text theme contrasts with primary brightness', () {
final ThemeData lightTheme = ThemeData(primaryColorBrightness: Brightness.light);
final ThemeData darkTheme = ThemeData(primaryColorBrightness: Brightness.dark);
final Typography typography = Typography.material2018(platform: lightTheme.platform);
expect(lightTheme.primaryTextTheme.headline6!.color, typography.black.headline6!.color);
expect(darkTheme.primaryTextTheme.headline6!.color, typography.white.headline6!.color);
});
test('Default accent text theme contrasts with accent brightness', () {
final ThemeData lightTheme = ThemeData(accentColorBrightness: Brightness.light);
final ThemeData darkTheme = ThemeData(accentColorBrightness: Brightness.dark);
final Typography typography = Typography.material2018(platform: lightTheme.platform);
expect(lightTheme.accentTextTheme.headline6!.color, typography.black.headline6!.color);
expect(darkTheme.accentTextTheme.headline6!.color, typography.white.headline6!.color);
});
test('Default chip label style gets a default bodyText1 if textTheme.bodyText1 is null', () {
const TextTheme noBodyText1TextTheme = TextTheme(bodyText1: null);
final ThemeData lightTheme = ThemeData(brightness: Brightness.light, textTheme: noBodyText1TextTheme);
final ThemeData darkTheme = ThemeData(brightness: Brightness.dark, textTheme: noBodyText1TextTheme);
final Typography typography = Typography.material2018(platform: lightTheme.platform);
expect(lightTheme.chipTheme.labelStyle.color, equals(typography.black.bodyText1!.color!.withAlpha(0xde)));
expect(darkTheme.chipTheme.labelStyle.color, equals(typography.white.bodyText1!.color!.withAlpha(0xde)));
});
test('Default icon theme contrasts with brightness', () {
final ThemeData lightTheme = ThemeData(brightness: Brightness.light);
final ThemeData darkTheme = ThemeData(brightness: Brightness.dark);
final Typography typography = Typography.material2018(platform: lightTheme.platform);
expect(lightTheme.textTheme.headline6!.color, typography.black.headline6!.color);
expect(darkTheme.textTheme.headline6!.color, typography.white.headline6!.color);
});
test('Default primary icon theme contrasts with primary brightness', () {
final ThemeData lightTheme = ThemeData(primaryColorBrightness: Brightness.light);
final ThemeData darkTheme = ThemeData(primaryColorBrightness: Brightness.dark);
final Typography typography = Typography.material2018(platform: lightTheme.platform);
expect(lightTheme.primaryTextTheme.headline6!.color, typography.black.headline6!.color);
expect(darkTheme.primaryTextTheme.headline6!.color, typography.white.headline6!.color);
});
test('Default accent icon theme contrasts with accent brightness', () {
final ThemeData lightTheme = ThemeData(accentColorBrightness: Brightness.light);
final ThemeData darkTheme = ThemeData(accentColorBrightness: Brightness.dark);
final Typography typography = Typography.material2018(platform: lightTheme.platform);
expect(lightTheme.accentTextTheme.headline6!.color, typography.black.headline6!.color);
expect(darkTheme.accentTextTheme.headline6!.color, typography.white.headline6!.color);
});
testWidgets('Defaults to MaterialTapTargetBehavior.padded on mobile platforms and MaterialTapTargetBehavior.shrinkWrap on desktop', (WidgetTester tester) async {
final ThemeData themeData = ThemeData(platform: defaultTargetPlatform);
switch (defaultTargetPlatform) {
case TargetPlatform.android:
case TargetPlatform.fuchsia:
case TargetPlatform.iOS:
expect(themeData.materialTapTargetSize, MaterialTapTargetSize.padded);
break;
case TargetPlatform.linux:
case TargetPlatform.macOS:
case TargetPlatform.windows:
expect(themeData.materialTapTargetSize, MaterialTapTargetSize.shrinkWrap);
break;
}
}, variant: TargetPlatformVariant.all());
test('Can control fontFamily default', () {
final ThemeData themeData = ThemeData(
fontFamily: 'Ahem',
textTheme: const TextTheme(
headline6: TextStyle(fontFamily: 'Roboto'),
),
);
expect(themeData.textTheme.bodyText1!.fontFamily, equals('Ahem'));
expect(themeData.primaryTextTheme.headline3!.fontFamily, equals('Ahem'));
expect(themeData.accentTextTheme.headline1!.fontFamily, equals('Ahem'));
// Shouldn't override the specified style's family
expect(themeData.textTheme.headline6!.fontFamily, equals('Roboto'));
});
test('Can estimate brightness - directly', () {
expect(ThemeData.estimateBrightnessForColor(Colors.white), equals(Brightness.light));
expect(ThemeData.estimateBrightnessForColor(Colors.black), equals(Brightness.dark));
expect(ThemeData.estimateBrightnessForColor(Colors.blue), equals(Brightness.dark));
expect(ThemeData.estimateBrightnessForColor(Colors.yellow), equals(Brightness.light));
expect(ThemeData.estimateBrightnessForColor(Colors.deepOrange), equals(Brightness.dark));
expect(ThemeData.estimateBrightnessForColor(Colors.orange), equals(Brightness.light));
expect(ThemeData.estimateBrightnessForColor(Colors.lime), equals(Brightness.light));
expect(ThemeData.estimateBrightnessForColor(Colors.grey), equals(Brightness.light));
expect(ThemeData.estimateBrightnessForColor(Colors.teal), equals(Brightness.dark));
expect(ThemeData.estimateBrightnessForColor(Colors.indigo), equals(Brightness.dark));
});
test('Can estimate brightness - indirectly', () {
expect(ThemeData(primaryColor: Colors.white).primaryColorBrightness, equals(Brightness.light));
expect(ThemeData(primaryColor: Colors.black).primaryColorBrightness, equals(Brightness.dark));
expect(ThemeData(primaryColor: Colors.blue).primaryColorBrightness, equals(Brightness.dark));
expect(ThemeData(primaryColor: Colors.yellow).primaryColorBrightness, equals(Brightness.light));
expect(ThemeData(primaryColor: Colors.deepOrange).primaryColorBrightness, equals(Brightness.dark));
expect(ThemeData(primaryColor: Colors.orange).primaryColorBrightness, equals(Brightness.light));
expect(ThemeData(primaryColor: Colors.lime).primaryColorBrightness, equals(Brightness.light));
expect(ThemeData(primaryColor: Colors.grey).primaryColorBrightness, equals(Brightness.light));
expect(ThemeData(primaryColor: Colors.teal).primaryColorBrightness, equals(Brightness.dark));
expect(ThemeData(primaryColor: Colors.indigo).primaryColorBrightness, equals(Brightness.dark));
});
test('cursorColor', () {
expect(const TextSelectionThemeData(cursorColor: Colors.red).cursorColor, Colors.red);
});
testWidgets('ThemeData.from a light color scheme sets appropriate values', (WidgetTester tester) async {
const ColorScheme lightColors = ColorScheme.light();
final ThemeData theme = ThemeData.from(colorScheme: lightColors);
expect(theme.brightness, equals(Brightness.light));
expect(theme.primaryColor, equals(lightColors.primary));
expect(theme.accentColor, equals(lightColors.secondary));
expect(theme.cardColor, equals(lightColors.surface));
expect(theme.backgroundColor, equals(lightColors.background));
expect(theme.canvasColor, equals(lightColors.background));
expect(theme.scaffoldBackgroundColor, equals(lightColors.background));
expect(theme.dialogBackgroundColor, equals(lightColors.background));
expect(theme.errorColor, equals(lightColors.error));
expect(theme.applyElevationOverlayColor, isFalse);
});
testWidgets('ThemeData.from a dark color scheme sets appropriate values', (WidgetTester tester) async {
const ColorScheme darkColors = ColorScheme.dark();
final ThemeData theme = ThemeData.from(colorScheme: darkColors);
expect(theme.brightness, equals(Brightness.dark));
// in dark theme's the color used for main components is surface instead of primary
expect(theme.primaryColor, equals(darkColors.surface));
expect(theme.accentColor, equals(darkColors.secondary));
expect(theme.cardColor, equals(darkColors.surface));
expect(theme.backgroundColor, equals(darkColors.background));
expect(theme.canvasColor, equals(darkColors.background));
expect(theme.scaffoldBackgroundColor, equals(darkColors.background));
expect(theme.dialogBackgroundColor, equals(darkColors.background));
expect(theme.errorColor, equals(darkColors.error));
expect(theme.applyElevationOverlayColor, isTrue);
});
testWidgets('VisualDensity.adaptivePlatformDensity returns adaptive values', (WidgetTester tester) async {
switch (debugDefaultTargetPlatformOverride!) {
case TargetPlatform.android:
case TargetPlatform.iOS:
case TargetPlatform.fuchsia:
expect(VisualDensity.adaptivePlatformDensity, equals(const VisualDensity()));
break;
case TargetPlatform.linux:
case TargetPlatform.macOS:
case TargetPlatform.windows:
expect(VisualDensity.adaptivePlatformDensity, equals(VisualDensity.compact));
}
}, variant: TargetPlatformVariant.all());
testWidgets('VisualDensity in ThemeData defaults to "compact" on desktop and "standard" on mobile', (WidgetTester tester) async {
final ThemeData themeData = ThemeData();
switch (debugDefaultTargetPlatformOverride!) {
case TargetPlatform.android:
case TargetPlatform.iOS:
case TargetPlatform.fuchsia:
expect(themeData.visualDensity, equals(const VisualDensity()));
break;
case TargetPlatform.linux:
case TargetPlatform.macOS:
case TargetPlatform.windows:
expect(themeData.visualDensity, equals(VisualDensity.compact));
}
}, variant: TargetPlatformVariant.all());
testWidgets('ThemeData.copyWith correctly creates new ThemeData with all copied arguments', (WidgetTester tester) async {
final SliderThemeData sliderTheme = SliderThemeData.fromPrimaryColors(
primaryColor: Colors.black,
primaryColorDark: Colors.black,
primaryColorLight: Colors.black,
valueIndicatorTextStyle: const TextStyle(color: Colors.black),
);
final ChipThemeData chipTheme = ChipThemeData.fromDefaults(
primaryColor: Colors.black,
secondaryColor: Colors.white,
labelStyle: const TextStyle(color: Colors.black),
);
const PageTransitionsTheme pageTransitionTheme = PageTransitionsTheme(
builders: <TargetPlatform, PageTransitionsBuilder>{
TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
TargetPlatform.macOS: CupertinoPageTransitionsBuilder(),
},
);
final ThemeData theme = ThemeData.raw(
visualDensity: const VisualDensity(),
primaryColor: Colors.black,
primaryColorBrightness: Brightness.dark,
primaryColorLight: Colors.black,
primaryColorDark: Colors.black,
accentColor: Colors.black,
accentColorBrightness: Brightness.dark,
canvasColor: Colors.black,
shadowColor: Colors.black,
scaffoldBackgroundColor: Colors.black,
bottomAppBarColor: Colors.black,
cardColor: Colors.black,
dividerColor: Colors.black,
focusColor: Colors.black,
hoverColor: Colors.black,
highlightColor: Colors.black,
splashColor: Colors.black,
splashFactory: InkRipple.splashFactory,
selectedRowColor: Colors.black,
unselectedWidgetColor: Colors.black,
disabledColor: Colors.black,
buttonTheme: const ButtonThemeData(colorScheme: ColorScheme.dark()),
toggleButtonsTheme: const ToggleButtonsThemeData(textStyle: TextStyle(color: Colors.black)),
buttonColor: Colors.black,
secondaryHeaderColor: Colors.black,
textSelectionColor: Colors.black,
cursorColor: Colors.black,
textSelectionHandleColor: Colors.black,
backgroundColor: Colors.black,
dialogBackgroundColor: Colors.black,
indicatorColor: Colors.black,
hintColor: Colors.black,
errorColor: Colors.black,
toggleableActiveColor: Colors.black,
textTheme: ThemeData.dark().textTheme,
primaryTextTheme: ThemeData.dark().textTheme,
accentTextTheme: ThemeData.dark().textTheme,
inputDecorationTheme: ThemeData.dark().inputDecorationTheme.copyWith(border: const OutlineInputBorder()),
iconTheme: ThemeData.dark().iconTheme,
primaryIconTheme: ThemeData.dark().iconTheme,
accentIconTheme: ThemeData.dark().iconTheme,
sliderTheme: sliderTheme,
tabBarTheme: const TabBarTheme(labelColor: Colors.black),
tooltipTheme: const TooltipThemeData(height: 100),
cardTheme: const CardTheme(color: Colors.black),
chipTheme: chipTheme,
platform: TargetPlatform.iOS,
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
applyElevationOverlayColor: false,
pageTransitionsTheme: pageTransitionTheme,
appBarTheme: const AppBarTheme(color: Colors.black),
bottomAppBarTheme: const BottomAppBarTheme(color: Colors.black),
colorScheme: const ColorScheme.light(),
dialogTheme: const DialogTheme(backgroundColor: Colors.black),
floatingActionButtonTheme: const FloatingActionButtonThemeData(backgroundColor: Colors.black),
navigationRailTheme: const NavigationRailThemeData(backgroundColor: Colors.black),
typography: Typography.material2018(platform: TargetPlatform.android),
cupertinoOverrideTheme: null,
snackBarTheme: const SnackBarThemeData(backgroundColor: Colors.black),
bottomSheetTheme: const BottomSheetThemeData(backgroundColor: Colors.black),
popupMenuTheme: const PopupMenuThemeData(color: Colors.black),
bannerTheme: const MaterialBannerThemeData(backgroundColor: Colors.black),
dividerTheme: const DividerThemeData(color: Colors.black),
buttonBarTheme: const ButtonBarThemeData(alignment: MainAxisAlignment.start),
bottomNavigationBarTheme: const BottomNavigationBarThemeData(type: BottomNavigationBarType.fixed),
timePickerTheme: const TimePickerThemeData(backgroundColor: Colors.black),
textButtonTheme: TextButtonThemeData(style: TextButton.styleFrom(primary: Colors.red)),
elevatedButtonTheme: ElevatedButtonThemeData(style: ElevatedButton.styleFrom(primary: Colors.green)),
outlinedButtonTheme: OutlinedButtonThemeData(style: OutlinedButton.styleFrom(primary: Colors.blue)),
textSelectionTheme: const TextSelectionThemeData(cursorColor: Colors.black),
dataTableTheme: const DataTableThemeData(),
fixTextFieldOutlineLabel: false,
useTextSelectionTheme: false,
);
final SliderThemeData otherSliderTheme = SliderThemeData.fromPrimaryColors(
primaryColor: Colors.white,
primaryColorDark: Colors.white,
primaryColorLight: Colors.white,
valueIndicatorTextStyle: const TextStyle(color: Colors.white),
);
final ChipThemeData otherChipTheme = ChipThemeData.fromDefaults(
primaryColor: Colors.white,
secondaryColor: Colors.black,
labelStyle: const TextStyle(color: Colors.white),
);
final ThemeData otherTheme = ThemeData.raw(
visualDensity: const VisualDensity(),
primaryColor: Colors.white,
primaryColorBrightness: Brightness.light,
primaryColorLight: Colors.white,
primaryColorDark: Colors.white,
accentColor: Colors.white,
accentColorBrightness: Brightness.light,
canvasColor: Colors.white,
shadowColor: Colors.white,
scaffoldBackgroundColor: Colors.white,
bottomAppBarColor: Colors.white,
cardColor: Colors.white,
dividerColor: Colors.white,
focusColor: Colors.white,
hoverColor: Colors.white,
highlightColor: Colors.white,
splashColor: Colors.white,
splashFactory: InkRipple.splashFactory,
selectedRowColor: Colors.white,
unselectedWidgetColor: Colors.white,
disabledColor: Colors.white,
buttonTheme: const ButtonThemeData(colorScheme: ColorScheme.light()),
toggleButtonsTheme: const ToggleButtonsThemeData(textStyle: TextStyle(color: Colors.white)),
buttonColor: Colors.white,
secondaryHeaderColor: Colors.white,
textSelectionColor: Colors.white,
cursorColor: Colors.white,
textSelectionHandleColor: Colors.white,
backgroundColor: Colors.white,
dialogBackgroundColor: Colors.white,
indicatorColor: Colors.white,
hintColor: Colors.white,
errorColor: Colors.white,
toggleableActiveColor: Colors.white,
textTheme: ThemeData.light().textTheme,
primaryTextTheme: ThemeData.light().textTheme,
accentTextTheme: ThemeData.light().textTheme,
inputDecorationTheme: ThemeData.light().inputDecorationTheme.copyWith(border: InputBorder.none),
iconTheme: ThemeData.light().iconTheme,
primaryIconTheme: ThemeData.light().iconTheme,
accentIconTheme: ThemeData.light().iconTheme,
sliderTheme: otherSliderTheme,
tabBarTheme: const TabBarTheme(labelColor: Colors.white),
tooltipTheme: const TooltipThemeData(height: 100),
cardTheme: const CardTheme(color: Colors.white),
chipTheme: otherChipTheme,
platform: TargetPlatform.android,
materialTapTargetSize: MaterialTapTargetSize.padded,
applyElevationOverlayColor: true,
pageTransitionsTheme: const PageTransitionsTheme(),
appBarTheme: const AppBarTheme(color: Colors.white),
bottomAppBarTheme: const BottomAppBarTheme(color: Colors.white),
colorScheme: const ColorScheme.light(),
dialogTheme: const DialogTheme(backgroundColor: Colors.white),
floatingActionButtonTheme: const FloatingActionButtonThemeData(backgroundColor: Colors.white),
navigationRailTheme: const NavigationRailThemeData(backgroundColor: Colors.white),
typography: Typography.material2018(platform: TargetPlatform.iOS),
cupertinoOverrideTheme: ThemeData.light().cupertinoOverrideTheme,
snackBarTheme: const SnackBarThemeData(backgroundColor: Colors.white),
bottomSheetTheme: const BottomSheetThemeData(backgroundColor: Colors.white),
popupMenuTheme: const PopupMenuThemeData(color: Colors.white),
bannerTheme: const MaterialBannerThemeData(backgroundColor: Colors.white),
dividerTheme: const DividerThemeData(color: Colors.white),
buttonBarTheme: const ButtonBarThemeData(alignment: MainAxisAlignment.end),
bottomNavigationBarTheme: const BottomNavigationBarThemeData(type: BottomNavigationBarType.shifting),
timePickerTheme: const TimePickerThemeData(backgroundColor: Colors.white),
textButtonTheme: const TextButtonThemeData(),
elevatedButtonTheme: const ElevatedButtonThemeData(),
outlinedButtonTheme: const OutlinedButtonThemeData(),
textSelectionTheme: const TextSelectionThemeData(cursorColor: Colors.white),
dataTableTheme: const DataTableThemeData(),
fixTextFieldOutlineLabel: true,
useTextSelectionTheme: true,
);
final ThemeData themeDataCopy = theme.copyWith(
primaryColor: otherTheme.primaryColor,
primaryColorBrightness: otherTheme.primaryColorBrightness,
primaryColorLight: otherTheme.primaryColorLight,
primaryColorDark: otherTheme.primaryColorDark,
accentColor: otherTheme.accentColor,
accentColorBrightness: otherTheme.accentColorBrightness,
canvasColor: otherTheme.canvasColor,
shadowColor: otherTheme.shadowColor,
scaffoldBackgroundColor: otherTheme.scaffoldBackgroundColor,
bottomAppBarColor: otherTheme.bottomAppBarColor,
cardColor: otherTheme.cardColor,
dividerColor: otherTheme.dividerColor,
focusColor: otherTheme.focusColor,
hoverColor: otherTheme.hoverColor,
highlightColor: otherTheme.highlightColor,
splashColor: otherTheme.splashColor,
splashFactory: otherTheme.splashFactory,
selectedRowColor: otherTheme.selectedRowColor,
unselectedWidgetColor: otherTheme.unselectedWidgetColor,
disabledColor: otherTheme.disabledColor,
buttonTheme: otherTheme.buttonTheme,
toggleButtonsTheme: otherTheme.toggleButtonsTheme,
buttonColor: otherTheme.buttonColor,
secondaryHeaderColor: otherTheme.secondaryHeaderColor,
textSelectionColor: otherTheme.textSelectionTheme.selectionColor,
cursorColor: otherTheme.textSelectionTheme.cursorColor,
textSelectionHandleColor: otherTheme.textSelectionTheme.selectionHandleColor,
backgroundColor: otherTheme.backgroundColor,
dialogBackgroundColor: otherTheme.dialogBackgroundColor,
indicatorColor: otherTheme.indicatorColor,
hintColor: otherTheme.hintColor,
errorColor: otherTheme.errorColor,
toggleableActiveColor: otherTheme.toggleableActiveColor,
textTheme: otherTheme.textTheme,
primaryTextTheme: otherTheme.primaryTextTheme,
accentTextTheme: otherTheme.accentTextTheme,
inputDecorationTheme: otherTheme.inputDecorationTheme,
iconTheme: otherTheme.iconTheme,
primaryIconTheme: otherTheme.primaryIconTheme,
accentIconTheme: otherTheme.accentIconTheme,
sliderTheme: otherTheme.sliderTheme,
tabBarTheme: otherTheme.tabBarTheme,
tooltipTheme: otherTheme.tooltipTheme,
cardTheme: otherTheme.cardTheme,
chipTheme: otherTheme.chipTheme,
platform: otherTheme.platform,
materialTapTargetSize: otherTheme.materialTapTargetSize,
applyElevationOverlayColor: otherTheme.applyElevationOverlayColor,
pageTransitionsTheme: otherTheme.pageTransitionsTheme,
appBarTheme: otherTheme.appBarTheme,
bottomAppBarTheme: otherTheme.bottomAppBarTheme,
colorScheme: otherTheme.colorScheme,
dialogTheme: otherTheme.dialogTheme,
floatingActionButtonTheme: otherTheme.floatingActionButtonTheme,
navigationRailTheme: otherTheme.navigationRailTheme,
typography: otherTheme.typography,
cupertinoOverrideTheme: otherTheme.cupertinoOverrideTheme,
snackBarTheme: otherTheme.snackBarTheme,
bottomSheetTheme: otherTheme.bottomSheetTheme,
popupMenuTheme: otherTheme.popupMenuTheme,
bannerTheme: otherTheme.bannerTheme,
dividerTheme: otherTheme.dividerTheme,
buttonBarTheme: otherTheme.buttonBarTheme,
bottomNavigationBarTheme: otherTheme.bottomNavigationBarTheme,
timePickerTheme: otherTheme.timePickerTheme,
textButtonTheme: otherTheme.textButtonTheme,
elevatedButtonTheme: otherTheme.elevatedButtonTheme,
outlinedButtonTheme: otherTheme.outlinedButtonTheme,
textSelectionTheme: otherTheme.textSelectionTheme,
fixTextFieldOutlineLabel: otherTheme.fixTextFieldOutlineLabel,
);
expect(themeDataCopy.brightness, equals(otherTheme.brightness));
expect(themeDataCopy.primaryColor, equals(otherTheme.primaryColor));
expect(themeDataCopy.primaryColorBrightness, equals(otherTheme.primaryColorBrightness));
expect(themeDataCopy.primaryColorLight, equals(otherTheme.primaryColorLight));
expect(themeDataCopy.primaryColorDark, equals(otherTheme.primaryColorDark));
expect(themeDataCopy.accentColor, equals(otherTheme.accentColor));
expect(themeDataCopy.accentColorBrightness, equals(otherTheme.accentColorBrightness));
expect(themeDataCopy.canvasColor, equals(otherTheme.canvasColor));
expect(themeDataCopy.shadowColor, equals(otherTheme.shadowColor));
expect(themeDataCopy.scaffoldBackgroundColor, equals(otherTheme.scaffoldBackgroundColor));
expect(themeDataCopy.bottomAppBarColor, equals(otherTheme.bottomAppBarColor));
expect(themeDataCopy.cardColor, equals(otherTheme.cardColor));
expect(themeDataCopy.dividerColor, equals(otherTheme.dividerColor));
expect(themeDataCopy.focusColor, equals(otherTheme.focusColor));
expect(themeDataCopy.focusColor, equals(otherTheme.focusColor));
expect(themeDataCopy.hoverColor, equals(otherTheme.hoverColor));
expect(themeDataCopy.highlightColor, equals(otherTheme.highlightColor));
expect(themeDataCopy.splashColor, equals(otherTheme.splashColor));
expect(themeDataCopy.splashFactory, equals(otherTheme.splashFactory));
expect(themeDataCopy.selectedRowColor, equals(otherTheme.selectedRowColor));
expect(themeDataCopy.unselectedWidgetColor, equals(otherTheme.unselectedWidgetColor));
expect(themeDataCopy.disabledColor, equals(otherTheme.disabledColor));
expect(themeDataCopy.buttonTheme, equals(otherTheme.buttonTheme));
expect(themeDataCopy.toggleButtonsTheme, equals(otherTheme.toggleButtonsTheme));
expect(themeDataCopy.buttonColor, equals(otherTheme.buttonColor));
expect(themeDataCopy.secondaryHeaderColor, equals(otherTheme.secondaryHeaderColor));
expect(themeDataCopy.textSelectionTheme.selectionColor, equals(otherTheme.textSelectionTheme.selectionColor));
expect(themeDataCopy.textSelectionTheme.cursorColor, equals(otherTheme.textSelectionTheme.cursorColor));
expect(themeDataCopy.textSelectionTheme.selectionColor, equals(otherTheme.textSelectionTheme.selectionColor));
expect(themeDataCopy.textSelectionTheme.cursorColor, equals(otherTheme.textSelectionTheme.cursorColor));
expect(themeDataCopy.textSelectionTheme.selectionHandleColor, equals(otherTheme.textSelectionTheme.selectionHandleColor));
expect(themeDataCopy.backgroundColor, equals(otherTheme.backgroundColor));
expect(themeDataCopy.dialogBackgroundColor, equals(otherTheme.dialogBackgroundColor));
expect(themeDataCopy.indicatorColor, equals(otherTheme.indicatorColor));
expect(themeDataCopy.hintColor, equals(otherTheme.hintColor));
expect(themeDataCopy.errorColor, equals(otherTheme.errorColor));
expect(themeDataCopy.toggleableActiveColor, equals(otherTheme.accentColor));
expect(themeDataCopy.textTheme, equals(otherTheme.textTheme));
expect(themeDataCopy.primaryTextTheme, equals(otherTheme.primaryTextTheme));
expect(themeDataCopy.accentTextTheme, equals(otherTheme.accentTextTheme));
expect(themeDataCopy.sliderTheme, equals(otherTheme.sliderTheme));
expect(themeDataCopy.tabBarTheme, equals(otherTheme.tabBarTheme));
expect(themeDataCopy.tooltipTheme, equals(otherTheme.tooltipTheme));
expect(themeDataCopy.cardTheme, equals(otherTheme.cardTheme));
expect(themeDataCopy.chipTheme, equals(otherTheme.chipTheme));
expect(themeDataCopy.platform, equals(otherTheme.platform));
expect(themeDataCopy.materialTapTargetSize, equals(otherTheme.materialTapTargetSize));
expect(themeDataCopy.applyElevationOverlayColor, equals(otherTheme.applyElevationOverlayColor));
expect(themeDataCopy.pageTransitionsTheme, equals(otherTheme.pageTransitionsTheme));
expect(themeDataCopy.appBarTheme, equals(otherTheme.appBarTheme));
expect(themeDataCopy.bottomAppBarTheme, equals(otherTheme.bottomAppBarTheme));
expect(themeDataCopy.colorScheme, equals(otherTheme.colorScheme));
expect(themeDataCopy.dialogTheme, equals(otherTheme.dialogTheme));
expect(themeDataCopy.floatingActionButtonTheme, equals(otherTheme.floatingActionButtonTheme));
expect(themeDataCopy.navigationRailTheme, equals(otherTheme.navigationRailTheme));
expect(themeDataCopy.typography, equals(otherTheme.typography));
expect(themeDataCopy.cupertinoOverrideTheme, equals(otherTheme.cupertinoOverrideTheme));
expect(themeDataCopy.snackBarTheme, equals(otherTheme.snackBarTheme));
expect(themeDataCopy.bottomSheetTheme, equals(otherTheme.bottomSheetTheme));
expect(themeDataCopy.popupMenuTheme, equals(otherTheme.popupMenuTheme));
expect(themeDataCopy.bannerTheme, equals(otherTheme.bannerTheme));
expect(themeDataCopy.dividerTheme, equals(otherTheme.dividerTheme));
expect(themeDataCopy.buttonBarTheme, equals(otherTheme.buttonBarTheme));
expect(themeDataCopy.bottomNavigationBarTheme, equals(otherTheme.bottomNavigationBarTheme));
expect(themeDataCopy.timePickerTheme, equals(otherTheme.timePickerTheme));
expect(themeDataCopy.textButtonTheme, equals(otherTheme.textButtonTheme));
expect(themeDataCopy.elevatedButtonTheme, equals(otherTheme.elevatedButtonTheme));
expect(themeDataCopy.outlinedButtonTheme, equals(otherTheme.outlinedButtonTheme));
expect(themeDataCopy.textSelectionTheme, equals(otherTheme.textSelectionTheme));
expect(themeDataCopy.fixTextFieldOutlineLabel, equals(otherTheme.fixTextFieldOutlineLabel));
});
testWidgets('ThemeData.toString has less than 200 characters output', (WidgetTester tester) async {
// This test makes sure that the ThemeData debug output doesn't get too
// verbose, which has been a problem in the past.
const ColorScheme darkColors = ColorScheme.dark();
final ThemeData darkTheme = ThemeData.from(colorScheme: darkColors);
expect(darkTheme.toString().length, lessThan(200));
const ColorScheme lightColors = ColorScheme.light();
final ThemeData lightTheme = ThemeData.from(colorScheme: lightColors);
expect(lightTheme.toString().length, lessThan(200));
});
testWidgets('ThemeData brightness parameter overrides ColorScheme brightness', (WidgetTester tester) async {
const ColorScheme lightColors = ColorScheme.light();
expect(() => ThemeData(colorScheme: lightColors, brightness: Brightness.dark), throwsAssertionError);
});
testWidgets('ThemeData.copyWith brightness parameter overrides ColorScheme brightness', (WidgetTester tester) async {
const ColorScheme lightColors = ColorScheme.light();
final ThemeData theme = ThemeData.from(colorScheme: lightColors).copyWith(brightness: Brightness.dark);
// The brightness parameter only overrides ColorScheme.brightness.
expect(theme.brightness, equals(Brightness.dark));
expect(theme.colorScheme.brightness, equals(Brightness.dark));
expect(theme.primaryColor, equals(lightColors.primary));
expect(theme.accentColor, equals(lightColors.secondary));
expect(theme.cardColor, equals(lightColors.surface));
expect(theme.backgroundColor, equals(lightColors.background));
expect(theme.canvasColor, equals(lightColors.background));
expect(theme.scaffoldBackgroundColor, equals(lightColors.background));
expect(theme.dialogBackgroundColor, equals(lightColors.background));
expect(theme.errorColor, equals(lightColors.error));
expect(theme.applyElevationOverlayColor, isFalse);
});
}