Unverified Commit 0ed17dd5 authored by Qun Cheng's avatar Qun Cheng Committed by GitHub

Update `TextSelectionTheme`, `ThemeData`, `TimePicker`, and `TimePickerTheme`...

Update `TextSelectionTheme`, `ThemeData`, `TimePicker`, and `TimePickerTheme` tests for M2/M3 (#130547)

Updated unit tests for `TextSelectionTheme`, `ThemeData`, `TimePicker` and `TimePickerTheme` to have M2 and M3 versions.

More info in #127064
parent d4005a87
......@@ -60,12 +60,11 @@ void main() {
]);
});
testWidgetsWithLeakTracking('Empty textSelectionTheme will use defaults', (WidgetTester tester) async {
final ThemeData theme = ThemeData();
final bool material3 = theme.useMaterial3;
final Color defaultCursorColor = material3 ? theme.colorScheme.primary : const Color(0xff2196f3);
final Color defaultSelectionColor = material3 ? theme.colorScheme.primary.withOpacity(0.40) : const Color(0x662196f3);
final Color defaultSelectionHandleColor = material3 ? theme.colorScheme.primary : const Color(0xff2196f3);
testWidgetsWithLeakTracking('Material2 - Empty textSelectionTheme will use defaults', (WidgetTester tester) async {
final ThemeData theme = ThemeData(useMaterial3: false);
const Color defaultCursorColor = Color(0xff2196f3);
const Color defaultSelectionColor = Color(0x662196f3);
const Color defaultSelectionHandleColor = Color(0xff2196f3);
EditableText.debugDeterministicCursor = true;
addTearDown(() {
......@@ -91,6 +90,67 @@ void main() {
// Test the selection handle color.
await tester.pumpWidget(
MaterialApp(
theme: theme,
home: Material(
child: Builder(
builder: (BuildContext context) {
return materialTextSelectionControls.buildHandle(
context,
TextSelectionHandleType.left,
10.0,
);
},
),
),
),
);
await tester.pumpAndSettle();
final RenderBox handle = tester.firstRenderObject<RenderBox>(find.byType(CustomPaint));
expect(handle, paints..path(color: defaultSelectionHandleColor));
},
// TODO(polina-c): remove after fixing
// https://github.com/flutter/flutter/issues/130469
leakTrackingTestConfig: const LeakTrackingTestConfig(
notDisposedAllowList: <String, int?>{
'ValueNotifier<MagnifierInfo>': 1,
'ValueNotifier<_OverlayEntryWidgetState?>': 2,
'ValueNotifier<bool>': 1,
},
// TODO(polina-c): investigate notGCed, if it does not disappear after fixing notDisposed.
allowAllNotGCed: true,
));
testWidgetsWithLeakTracking('Material3 - Empty textSelectionTheme will use defaults', (WidgetTester tester) async {
final ThemeData theme = ThemeData(useMaterial3: true);
final Color defaultCursorColor = theme.colorScheme.primary;
final Color defaultSelectionColor = theme.colorScheme.primary.withOpacity(0.40);
final Color defaultSelectionHandleColor = theme.colorScheme.primary;
EditableText.debugDeterministicCursor = true;
addTearDown(() {
EditableText.debugDeterministicCursor = false;
});
// Test TextField's cursor & selection color.
await tester.pumpWidget(
MaterialApp(
theme: theme,
home: const Material(
child: TextField(autofocus: true),
),
),
);
await tester.pump();
await tester.pumpAndSettle();
final EditableTextState editableTextState = tester.firstState(find.byType(EditableText));
final RenderEditable renderEditable = editableTextState.renderEditable;
expect(renderEditable.cursorColor, defaultCursorColor);
expect(renderEditable.selectionColor, defaultSelectionColor);
// Test the selection handle color.
await tester.pumpWidget(
MaterialApp(
theme: theme,
home: Material(
child: Builder(
builder: (BuildContext context) {
......
......@@ -14,9 +14,8 @@ void main() {
const ShapeBorder defaultFABShapeM3 = RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16.0)));
const EdgeInsets defaultFABPadding = EdgeInsets.zero;
testWidgets('theme: ThemeData.light(), enabled: true', (WidgetTester tester) async {
final ThemeData theme = ThemeData.light();
final bool material3 = theme.useMaterial3;
testWidgets('Material2 - theme: ThemeData.light(), enabled: true', (WidgetTester tester) async {
final ThemeData theme = ThemeData.light(useMaterial3: false);
await tester.pumpWidget(
MaterialApp(
theme: theme,
......@@ -31,21 +30,78 @@ void main() {
final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
expect(raw.enabled, true);
expect(raw.textStyle!.color, material3 ? theme.colorScheme.onPrimaryContainer : const Color(0xffffffff));
expect(raw.fillColor, material3 ? theme.colorScheme.primaryContainer : const Color(0xff2196f3));
expect(raw.textStyle!.color, const Color(0xffffffff));
expect(raw.fillColor, const Color(0xff2196f3));
expect(raw.elevation, 6.0);
expect(raw.highlightElevation, material3 ? 6.0 : 12.0);
expect(raw.highlightElevation, 12.0);
expect(raw.disabledElevation, 6.0);
expect(raw.constraints, defaultFABConstraints);
expect(raw.padding, defaultFABPadding);
expect(raw.shape, material3 ? defaultFABShapeM3 : defaultFABShape);
expect(raw.shape, defaultFABShape);
expect(raw.animationDuration, defaultButtonDuration);
expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
});
testWidgets('theme: ThemeData.light(), enabled: false', (WidgetTester tester) async {
final ThemeData theme = ThemeData.light();
final bool material3 = theme.useMaterial3;
testWidgets('Material3 - theme: ThemeData.light(), enabled: true', (WidgetTester tester) async {
final ThemeData theme = ThemeData.light(useMaterial3: true);
await tester.pumpWidget(
MaterialApp(
theme: theme,
home: Center(
child: FloatingActionButton(
onPressed: () { }, // button.enabled == true
child: const Icon(Icons.add),
),
),
),
);
final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
expect(raw.enabled, true);
expect(raw.textStyle!.color, theme.colorScheme.onPrimaryContainer);
expect(raw.fillColor, theme.colorScheme.primaryContainer);
expect(raw.elevation, 6.0);
expect(raw.highlightElevation, 6.0);
expect(raw.disabledElevation, 6.0);
expect(raw.constraints, defaultFABConstraints);
expect(raw.padding, defaultFABPadding);
expect(raw.shape, defaultFABShapeM3);
expect(raw.animationDuration, defaultButtonDuration);
expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
});
testWidgets('Material2 - theme: ThemeData.light(), enabled: false', (WidgetTester tester) async {
final ThemeData theme = ThemeData.light(useMaterial3: false);
await tester.pumpWidget(
MaterialApp(
theme: theme,
home: const Center(
child: FloatingActionButton(
onPressed: null, // button.enabled == false
child: Icon(Icons.add),
),
),
),
);
final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
expect(raw.enabled, false);
expect(raw.textStyle!.color, const Color(0xffffffff));
expect(raw.fillColor, const Color(0xff2196f3));
// highlightColor, disabled button can't be pressed
// splashColor, disabled button doesn't splash
expect(raw.elevation, 6.0);
expect(raw.highlightElevation, 12.0);
expect(raw.disabledElevation, 6.0);
expect(raw.constraints, defaultFABConstraints);
expect(raw.padding, defaultFABPadding);
expect(raw.shape, defaultFABShape);
expect(raw.animationDuration, defaultButtonDuration);
expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
});
testWidgets('Material3 - theme: ThemeData.light(), enabled: false', (WidgetTester tester) async {
final ThemeData theme = ThemeData.light(useMaterial3: true);
await tester.pumpWidget(
MaterialApp(
theme: theme,
......@@ -60,16 +116,16 @@ void main() {
final RawMaterialButton raw = tester.widget<RawMaterialButton>(find.byType(RawMaterialButton));
expect(raw.enabled, false);
expect(raw.textStyle!.color, material3 ? theme.colorScheme.onPrimaryContainer : const Color(0xffffffff));
expect(raw.fillColor, material3 ? theme.colorScheme.primaryContainer : const Color(0xff2196f3));
expect(raw.textStyle!.color, theme.colorScheme.onPrimaryContainer);
expect(raw.fillColor, theme.colorScheme.primaryContainer);
// highlightColor, disabled button can't be pressed
// splashColor, disabled button doesn't splash
expect(raw.elevation, 6.0);
expect(raw.highlightElevation, material3 ? 6.0 : 12.0);
expect(raw.highlightElevation, 6.0);
expect(raw.disabledElevation, 6.0);
expect(raw.constraints, defaultFABConstraints);
expect(raw.padding, defaultFABPadding);
expect(raw.shape, material3 ? defaultFABShapeM3 : defaultFABShape);
expect(raw.shape, defaultFABShapeM3);
expect(raw.animationDuration, defaultButtonDuration);
expect(raw.materialTapTargetSize, MaterialTapTargetSize.padded);
});
......
......@@ -96,8 +96,7 @@ void main() {
expect(tester.widget<EditableText>(find.byType(EditableText)).cursorColor, themeCursorColor);
});
testWidgets('Fallback theme', (WidgetTester tester) async {
// For material 2
testWidgets('Material2 - Fallback theme', (WidgetTester tester) async {
late BuildContext capturedContext;
await tester.pumpWidget(
Theme(
......@@ -112,8 +111,9 @@ void main() {
);
expect(Theme.of(capturedContext), equals(ThemeData.localize(ThemeData.fallback(useMaterial3: false), defaultGeometryTheme)));
});
// For material 3
testWidgets('Material3 - Fallback theme', (WidgetTester tester) async {
late BuildContext capturedContextM3;
await tester.pumpWidget(
Theme(
......@@ -153,9 +153,12 @@ void main() {
);
});
testWidgets('ThemeData with null typography uses proper defaults', (WidgetTester tester) async {
testWidgets('Material2 - ThemeData with null typography uses proper defaults', (WidgetTester tester) async {
final ThemeData m2Theme = ThemeData(useMaterial3: false);
expect(m2Theme.typography, Typography.material2014());
});
testWidgets('Material3 - ThemeData with null typography uses proper defaults', (WidgetTester tester) async {
final ThemeData m3Theme = ThemeData(useMaterial3: true);
expect(m3Theme.typography, Typography.material2021(colorScheme: m3Theme.colorScheme));
});
......@@ -436,7 +439,7 @@ void main() {
expect(actualFontSize, kMagicFontSize);
});
testWidgets('Default Theme provides all basic TextStyle properties - M2', (WidgetTester tester) async {
testWidgets('Material2 - Default Theme provides all basic TextStyle properties', (WidgetTester tester) async {
late ThemeData theme;
await tester.pumpWidget(Theme(
data: ThemeData(useMaterial3: false),
......@@ -494,7 +497,7 @@ void main() {
expect(theme.textTheme.displayLarge!.debugLabel, '(englishLike displayLarge 2014).merge(blackMountainView displayLarge)');
});
testWidgets('Default Theme provides all basic TextStyle properties - M3', (WidgetTester tester) async {
testWidgets('Material3 - Default Theme provides all basic TextStyle properties', (WidgetTester tester) async {
late ThemeData theme;
await tester.pumpWidget(Theme(
data: ThemeData(useMaterial3: true),
......@@ -579,9 +582,8 @@ void main() {
context = null;
});
testWidgets('Default light theme has defaults', (WidgetTester tester) async {
testWidgets('Material2 - Default light theme has defaults', (WidgetTester tester) async {
final CupertinoThemeData themeM2 = await testTheme(tester, ThemeData(useMaterial3: false));
final CupertinoThemeData themeM3 = await testTheme(tester, ThemeData(useMaterial3: true));
expect(themeM2.brightness, Brightness.light);
expect(themeM2.primaryColor, Colors.blue);
......@@ -589,6 +591,10 @@ void main() {
expect(themeM2.primaryContrastingColor, Colors.white);
expect(themeM2.textTheme.textStyle.fontFamily, '.SF Pro Text');
expect(themeM2.textTheme.textStyle.fontSize, 17.0);
});
testWidgets('Material3 - Default light theme has defaults', (WidgetTester tester) async {
final CupertinoThemeData themeM3 = await testTheme(tester, ThemeData(useMaterial3: true));
expect(themeM3.brightness, Brightness.light);
expect(themeM3.primaryColor, const Color(0xff6750a4));
......@@ -598,9 +604,8 @@ void main() {
expect(themeM3.textTheme.textStyle.fontSize, 17.0);
});
testWidgets('Dark theme has defaults', (WidgetTester tester) async {
testWidgets('Material2 - Dark theme has defaults', (WidgetTester tester) async {
final CupertinoThemeData themeM2 = await testTheme(tester, ThemeData.dark(useMaterial3: false));
final CupertinoThemeData themeM3 = await testTheme(tester, ThemeData.dark(useMaterial3: true));
expect(themeM2.brightness, Brightness.dark);
expect(themeM2.primaryColor, Colors.blue);
......@@ -608,6 +613,10 @@ void main() {
expect(themeM2.scaffoldBackgroundColor, Colors.grey[850]);
expect(themeM2.textTheme.textStyle.fontFamily, '.SF Pro Text');
expect(themeM2.textTheme.textStyle.fontSize, 17.0);
});
testWidgets('Material3 - Dark theme has defaults', (WidgetTester tester) async {
final CupertinoThemeData themeM3 = await testTheme(tester, ThemeData.dark(useMaterial3: true));
expect(themeM3.brightness, Brightness.dark);
expect(themeM3.primaryColor, const Color(0xffd0bcff));
......@@ -638,7 +647,7 @@ void main() {
expect(CupertinoTheme.brightnessOf(context!), Brightness.light);
});
testWidgets('Can override material theme', (WidgetTester tester) async {
testWidgets('Material2 - Can override material theme', (WidgetTester tester) async {
final CupertinoThemeData themeM2 = await testTheme(tester, ThemeData(
cupertinoOverrideTheme: const CupertinoThemeData(
scaffoldBackgroundColor: CupertinoColors.lightBackgroundGray,
......@@ -654,7 +663,9 @@ void main() {
expect(themeM2.scaffoldBackgroundColor, CupertinoColors.lightBackgroundGray);
expect(themeM2.textTheme.textStyle.fontFamily, '.SF Pro Text');
expect(themeM2.textTheme.textStyle.fontSize, 17.0);
});
testWidgets('Material3 - Can override material theme', (WidgetTester tester) async {
final CupertinoThemeData themeM3 = await testTheme(tester, ThemeData(
cupertinoOverrideTheme: const CupertinoThemeData(
scaffoldBackgroundColor: CupertinoColors.lightBackgroundGray,
......@@ -672,7 +683,7 @@ void main() {
expect(themeM3.textTheme.textStyle.fontSize, 17.0);
});
testWidgets('Can override properties that are independent of material', (WidgetTester tester) async {
testWidgets('Material2 - Can override properties that are independent of material', (WidgetTester tester) async {
final CupertinoThemeData themeM2 = await testTheme(tester, ThemeData(
cupertinoOverrideTheme: const CupertinoThemeData(
// The bar colors ignore all things material except brightness.
......@@ -684,7 +695,9 @@ void main() {
expect(themeM2.primaryColor, Colors.blue);
// MaterialBasedCupertinoThemeData should also function like a normal CupertinoThemeData.
expect(themeM2.barBackgroundColor, CupertinoColors.black);
});
testWidgets('Material3 - Can override properties that are independent of material', (WidgetTester tester) async {
final CupertinoThemeData themeM3 = await testTheme(tester, ThemeData(
cupertinoOverrideTheme: const CupertinoThemeData(
// The bar colors ignore all things material except brightness.
......@@ -698,7 +711,7 @@ void main() {
expect(themeM3.barBackgroundColor, CupertinoColors.black);
});
testWidgets('Changing material theme triggers rebuilds - M2', (WidgetTester tester) async {
testWidgets('Material2 - Changing material theme triggers rebuilds', (WidgetTester tester) async {
CupertinoThemeData themeM2 = await testTheme(tester, ThemeData(
useMaterial3: false,
primarySwatch: Colors.red,
......@@ -716,7 +729,7 @@ void main() {
expect(themeM2.primaryColor, Colors.orange);
});
testWidgets('Changing material theme triggers rebuilds - M3', (WidgetTester tester) async {
testWidgets('Material3 - Changing material theme triggers rebuilds', (WidgetTester tester) async {
CupertinoThemeData themeM3 = await testTheme(tester, ThemeData(
useMaterial3: true,
colorScheme: const ColorScheme.light(
......@@ -807,7 +820,7 @@ void main() {
);
testWidgets(
'Cupertino overrides do not block derivatives triggering rebuilds when derivatives are not overridden - M2',
'Material2 - Cupertino overrides do not block derivatives triggering rebuilds when derivatives are not overridden',
(WidgetTester tester) async {
CupertinoThemeData theme = await testTheme(tester, ThemeData(
useMaterial3: false,
......@@ -836,7 +849,7 @@ void main() {
);
testWidgets(
'Cupertino overrides do not block derivatives triggering rebuilds when derivatives are not overridden - M3',
'Material3 - Cupertino overrides do not block derivatives triggering rebuilds when derivatives are not overridden',
(WidgetTester tester) async {
CupertinoThemeData theme = await testTheme(tester, ThemeData(
useMaterial3: true,
......@@ -869,7 +882,7 @@ void main() {
);
testWidgets(
'copyWith only copies the overrides, not the material or cupertino derivatives - M2',
'Material2 - copyWith only copies the overrides, not the material or cupertino derivatives',
(WidgetTester tester) async {
final CupertinoThemeData originalTheme = await testTheme(tester, ThemeData(
useMaterial3: false,
......@@ -896,7 +909,7 @@ void main() {
);
testWidgets(
'copyWith only copies the overrides, not the material or cupertino derivatives - M3',
'Material3 - copyWith only copies the overrides, not the material or cupertino derivatives',
(WidgetTester tester) async {
final CupertinoThemeData originalTheme = await testTheme(tester, ThemeData(
useMaterial3: true,
......@@ -923,7 +936,7 @@ void main() {
);
testWidgets(
"Material themes with no cupertino overrides can also be copyWith'ed - M2",
"Material2 - Material themes with no cupertino overrides can also be copyWith'ed",
(WidgetTester tester) async {
final CupertinoThemeData originalTheme = await testTheme(tester, ThemeData(
useMaterial3: false,
......@@ -946,7 +959,7 @@ void main() {
);
testWidgets(
"Material themes with no cupertino overrides can also be copyWith'ed - M3",
"Material3 - Material themes with no cupertino overrides can also be copyWith'ed",
(WidgetTester tester) async {
final CupertinoThemeData originalTheme = await testTheme(tester, ThemeData(
useMaterial3: true,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment