| // 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_test/flutter_test.dart'; |
| |
| void main() { |
| test('TextTheme copyWith apply, merge basics with const TextTheme()', () { |
| expect(const TextTheme(), equals(const TextTheme().copyWith())); |
| expect(const TextTheme(), equals(const TextTheme().apply())); |
| expect(const TextTheme(), equals(const TextTheme().merge(null))); |
| expect(const TextTheme().hashCode, equals(const TextTheme().copyWith().hashCode)); |
| expect(const TextTheme(), equals(const TextTheme().copyWith())); |
| }); |
| |
| test('TextTheme copyWith apply, merge basics with Typography.black', () { |
| final Typography typography = Typography.material2018(platform: TargetPlatform.android); |
| expect(typography.black, equals(typography.black.copyWith())); |
| expect(typography.black, equals(typography.black.apply())); |
| expect(typography.black, equals(typography.black.merge(null))); |
| expect(typography.black, equals(const TextTheme().merge(typography.black))); |
| expect(typography.black, equals(typography.black.merge(typography.black))); |
| expect(typography.white, equals(typography.black.merge(typography.white))); |
| expect(typography.black.hashCode, equals(typography.black.copyWith().hashCode)); |
| expect(typography.black, isNot(equals(typography.white))); |
| }); |
| |
| test('TextTheme copyWith', () { |
| final Typography typography = Typography.material2018(platform: TargetPlatform.android); |
| final TextTheme whiteCopy = typography.black.copyWith( |
| headline1: typography.white.headline1, |
| headline2: typography.white.headline2, |
| headline3: typography.white.headline3, |
| headline4: typography.white.headline4, |
| headline5: typography.white.headline5, |
| headline6: typography.white.headline6, |
| subtitle1: typography.white.subtitle1, |
| bodyText1: typography.white.bodyText1, |
| bodyText2: typography.white.bodyText2, |
| caption: typography.white.caption, |
| button: typography.white.button, |
| subtitle2: typography.white.subtitle2, |
| overline: typography.white.overline, |
| ); |
| expect(typography.white, equals(whiteCopy)); |
| }); |
| |
| |
| test('TextTheme merges properly in the presence of null fields.', () { |
| const TextTheme partialTheme = TextTheme(headline6: TextStyle(color: Color(0xcafefeed))); |
| final TextTheme fullTheme = ThemeData.fallback().textTheme.merge(partialTheme); |
| expect(fullTheme.headline6!.color, equals(partialTheme.headline6!.color)); |
| |
| const TextTheme onlyHeadlineAndTitle = TextTheme( |
| headline5: TextStyle(color: Color(0xcafefeed)), |
| headline6: TextStyle(color: Color(0xbeefcafe)), |
| ); |
| const TextTheme onlyBody1AndTitle = TextTheme( |
| bodyText2: TextStyle(color: Color(0xfeedfeed)), |
| headline6: TextStyle(color: Color(0xdeadcafe)), |
| ); |
| TextTheme merged = onlyHeadlineAndTitle.merge(onlyBody1AndTitle); |
| expect(merged.bodyText1, isNull); |
| expect(merged.bodyText2!.color, equals(onlyBody1AndTitle.bodyText2!.color)); |
| expect(merged.headline5!.color, equals(onlyHeadlineAndTitle.headline5!.color)); |
| expect(merged.headline6!.color, equals(onlyBody1AndTitle.headline6!.color)); |
| |
| merged = onlyHeadlineAndTitle.merge(null); |
| expect(merged, equals(onlyHeadlineAndTitle)); |
| }); |
| |
| test('TextTheme apply', () { |
| // The `displayColor` is applied to [headline1], [headline2], [headline3], |
| // [headline4], and [caption]. The `bodyColor` is applied to the remaining |
| // text styles. |
| const Color displayColor = Color(0x00000001); |
| const Color bodyColor = Color(0x00000002); |
| const String fontFamily = 'fontFamily'; |
| const Color decorationColor = Color(0x00000003); |
| const TextDecorationStyle decorationStyle = TextDecorationStyle.dashed; |
| final TextDecoration decoration = TextDecoration.combine(<TextDecoration>[ |
| TextDecoration.underline, |
| TextDecoration.lineThrough, |
| ]); |
| |
| final Typography typography = Typography.material2018(platform: TargetPlatform.android); |
| final TextTheme theme = typography.black.apply( |
| fontFamily: fontFamily, |
| displayColor: displayColor, |
| bodyColor: bodyColor, |
| decoration: decoration, |
| decorationColor: decorationColor, |
| decorationStyle: decorationStyle, |
| ); |
| |
| expect(theme.headline1!.color, displayColor); |
| expect(theme.headline2!.color, displayColor); |
| expect(theme.headline3!.color, displayColor); |
| expect(theme.headline4!.color, displayColor); |
| expect(theme.caption!.color, displayColor); |
| expect(theme.headline5!.color, bodyColor); |
| expect(theme.headline6!.color, bodyColor); |
| expect(theme.subtitle1!.color, bodyColor); |
| expect(theme.bodyText1!.color, bodyColor); |
| expect(theme.bodyText2!.color, bodyColor); |
| expect(theme.button!.color, bodyColor); |
| expect(theme.subtitle2!.color, bodyColor); |
| expect(theme.overline!.color, bodyColor); |
| |
| final List<TextStyle> themeStyles = <TextStyle>[ |
| theme.headline1!, |
| theme.headline2!, |
| theme.headline3!, |
| theme.headline4!, |
| theme.caption!, |
| theme.headline5!, |
| theme.headline6!, |
| theme.subtitle1!, |
| theme.bodyText1!, |
| theme.bodyText2!, |
| theme.button!, |
| theme.subtitle2!, |
| theme.overline!, |
| ]; |
| expect(themeStyles.every((TextStyle style) => style.fontFamily == fontFamily), true); |
| expect(themeStyles.every((TextStyle style) => style.decorationColor == decorationColor), true); |
| expect(themeStyles.every((TextStyle style) => style.decorationStyle == decorationStyle), true); |
| expect(themeStyles.every((TextStyle style) => style.decoration == decoration), true); |
| }); |
| |
| test('TextTheme apply fontSizeFactor fontSizeDelta', () { |
| final Typography typography = Typography.material2018(platform: TargetPlatform.android); |
| final TextTheme baseTheme = Typography.englishLike2018.merge(typography.black); |
| final TextTheme sizeTheme = baseTheme.apply( |
| fontSizeFactor: 2.0, |
| fontSizeDelta: 5.0, |
| ); |
| |
| expect(sizeTheme.headline1!.fontSize, baseTheme.headline1!.fontSize! * 2.0 + 5.0); |
| expect(sizeTheme.headline2!.fontSize, baseTheme.headline2!.fontSize! * 2.0 + 5.0); |
| expect(sizeTheme.headline3!.fontSize, baseTheme.headline3!.fontSize! * 2.0 + 5.0); |
| expect(sizeTheme.headline4!.fontSize, baseTheme.headline4!.fontSize! * 2.0 + 5.0); |
| expect(sizeTheme.caption!.fontSize, baseTheme.caption!.fontSize! * 2.0 + 5.0); |
| expect(sizeTheme.headline5!.fontSize, baseTheme.headline5!.fontSize! * 2.0 + 5.0); |
| expect(sizeTheme.headline6!.fontSize, baseTheme.headline6!.fontSize! * 2.0 + 5.0); |
| expect(sizeTheme.subtitle1!.fontSize, baseTheme.subtitle1!.fontSize! * 2.0 + 5.0); |
| expect(sizeTheme.bodyText1!.fontSize, baseTheme.bodyText1!.fontSize! * 2.0 + 5.0); |
| expect(sizeTheme.bodyText2!.fontSize, baseTheme.bodyText2!.fontSize! * 2.0 + 5.0); |
| expect(sizeTheme.button!.fontSize, baseTheme.button!.fontSize! * 2.0 + 5.0); |
| expect(sizeTheme.subtitle2!.fontSize, baseTheme.subtitle2!.fontSize! * 2.0 + 5.0); |
| expect(sizeTheme.overline!.fontSize, baseTheme.overline!.fontSize! * 2.0 + 5.0); |
| }); |
| |
| test('TextTheme lerp with second parameter null', () { |
| final TextTheme theme = Typography.material2018().black; |
| final TextTheme lerped = TextTheme.lerp(theme, null, 0.25); |
| |
| expect(lerped.headline1, TextStyle.lerp(theme.headline1, null, 0.25)); |
| expect(lerped.headline2, TextStyle.lerp(theme.headline2, null, 0.25)); |
| expect(lerped.headline3, TextStyle.lerp(theme.headline3, null, 0.25)); |
| expect(lerped.headline4, TextStyle.lerp(theme.headline4, null, 0.25)); |
| expect(lerped.caption, TextStyle.lerp(theme.caption, null, 0.25)); |
| expect(lerped.headline5, TextStyle.lerp(theme.headline5, null, 0.25)); |
| expect(lerped.headline6, TextStyle.lerp(theme.headline6, null, 0.25)); |
| expect(lerped.subtitle1, TextStyle.lerp(theme.subtitle1, null, 0.25)); |
| expect(lerped.bodyText1, TextStyle.lerp(theme.bodyText1, null, 0.25)); |
| expect(lerped.bodyText2, TextStyle.lerp(theme.bodyText2, null, 0.25)); |
| expect(lerped.button, TextStyle.lerp(theme.button, null, 0.25)); |
| expect(lerped.subtitle2, TextStyle.lerp(theme.subtitle2, null, 0.25)); |
| expect(lerped.overline, TextStyle.lerp(theme.overline, null, 0.25)); |
| }); |
| |
| test('TextTheme lerp with first parameter null', () { |
| final TextTheme theme = Typography.material2018().black; |
| final TextTheme lerped = TextTheme.lerp(null, theme, 0.25); |
| |
| expect(lerped.headline1, TextStyle.lerp(null, theme.headline1, 0.25)); |
| expect(lerped.headline2, TextStyle.lerp(null, theme.headline2, 0.25)); |
| expect(lerped.headline3, TextStyle.lerp(null, theme.headline3, 0.25)); |
| expect(lerped.headline4, TextStyle.lerp(null, theme.headline4, 0.25)); |
| expect(lerped.caption, TextStyle.lerp(null, theme.caption, 0.25)); |
| expect(lerped.headline5, TextStyle.lerp(null, theme.headline5, 0.25)); |
| expect(lerped.headline6, TextStyle.lerp(null, theme.headline6, 0.25)); |
| expect(lerped.subtitle1, TextStyle.lerp(null, theme.subtitle1, 0.25)); |
| expect(lerped.bodyText1, TextStyle.lerp(null, theme.bodyText1, 0.25)); |
| expect(lerped.bodyText2, TextStyle.lerp(null, theme.bodyText2, 0.25)); |
| expect(lerped.button, TextStyle.lerp(null, theme.button, 0.25)); |
| expect(lerped.subtitle2, TextStyle.lerp(null, theme.subtitle2, 0.25)); |
| expect(lerped.overline, TextStyle.lerp(null, theme.overline, 0.25)); |
| }); |
| |
| test('TextTheme lerp with null parameters', () { |
| final TextTheme lerped = TextTheme.lerp(null, null, 0.25); |
| expect(lerped.headline1, null); |
| expect(lerped.headline2, null); |
| expect(lerped.headline3, null); |
| expect(lerped.headline4, null); |
| expect(lerped.caption, null); |
| expect(lerped.headline5, null); |
| expect(lerped.headline6, null); |
| expect(lerped.subtitle1, null); |
| expect(lerped.bodyText1, null); |
| expect(lerped.bodyText2, null); |
| expect(lerped.button, null); |
| expect(lerped.subtitle2, null); |
| expect(lerped.overline, null); |
| }); |
| } |