blob: d8ee0e88c9e130f6d8f3ef6edbb109e1fdcb320b [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('DropdownMenuThemeData copyWith, ==, hashCode basics', () {
expect(const DropdownMenuThemeData(), const DropdownMenuThemeData().copyWith());
expect(const DropdownMenuThemeData().hashCode, const DropdownMenuThemeData().copyWith().hashCode);
const DropdownMenuThemeData custom = DropdownMenuThemeData(
menuStyle: MenuStyle(backgroundColor: MaterialStatePropertyAll<Color>(Colors.green)),
inputDecorationTheme: InputDecorationTheme(filled: true),
textStyle: TextStyle(fontSize: 25.0),
);
final DropdownMenuThemeData copy = const DropdownMenuThemeData().copyWith(
menuStyle: custom.menuStyle,
inputDecorationTheme: custom.inputDecorationTheme,
textStyle: custom.textStyle,
);
expect(copy, custom);
});
testWidgets('Default DropdownMenuThemeData debugFillProperties', (WidgetTester tester) async {
final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder();
const DropdownMenuThemeData().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('With no other configuration, defaults are used', (WidgetTester tester) async {
final ThemeData themeData = ThemeData();
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: const Scaffold(
body: Center(
child: DropdownMenu<int>(
dropdownMenuEntries: <DropdownMenuEntry<int>>[
DropdownMenuEntry<int>(value: 0, label: 'Item 0'),
DropdownMenuEntry<int>(value: 1, label: 'Item 1'),
DropdownMenuEntry<int>(value: 2, label: 'Item 2'),
],
),
),
),
)
);
final EditableText editableText = tester.widget(find.byType(EditableText));
expect(editableText.style.color, themeData.textTheme.labelLarge!.color);
expect(editableText.style.background, themeData.textTheme.labelLarge!.background);
expect(editableText.style.shadows, themeData.textTheme.labelLarge!.shadows);
expect(editableText.style.decoration, themeData.textTheme.labelLarge!.decoration);
expect(editableText.style.locale, themeData.textTheme.labelLarge!.locale);
expect(editableText.style.wordSpacing, themeData.textTheme.labelLarge!.wordSpacing);
final TextField textField = tester.widget(find.byType(TextField));
expect(textField.decoration?.border, const OutlineInputBorder());
await tester.tap(find.widgetWithIcon(IconButton, Icons.arrow_drop_down).first);
await tester.pump();
expect(find.byType(MenuAnchor), findsOneWidget);
final Finder menuMaterial = find.ancestor(
of: find.widgetWithText(TextButton, 'Item 0'),
matching: find.byType(Material),
).last;
Material material = tester.widget<Material>(menuMaterial);
expect(material.color, themeData.colorScheme.surface);
expect(material.shadowColor, themeData.colorScheme.shadow);
expect(material.surfaceTintColor, themeData.colorScheme.surfaceTint);
expect(material.elevation, 3.0);
expect(material.shape, const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(4.0))));
final Finder buttonMaterial = find.descendant(
of: find.widgetWithText(TextButton, 'Item 0'),
matching: find.byType(Material),
).last;
material = tester.widget<Material>(buttonMaterial);
expect(material.color, Colors.transparent);
expect(material.elevation, 0.0);
expect(material.shape, const RoundedRectangleBorder());
expect(material.textStyle?.color, themeData.colorScheme.onSurface);
});
testWidgets('ThemeData.dropdownMenuTheme overrides defaults', (WidgetTester tester) async {
final ThemeData theme = ThemeData(
dropdownMenuTheme: DropdownMenuThemeData(
textStyle: TextStyle(
color: Colors.orange,
backgroundColor: Colors.indigo,
fontSize: 30.0,
shadows: kElevationToShadow[1],
decoration: TextDecoration.underline,
wordSpacing: 2.0,
),
menuStyle: const MenuStyle(
backgroundColor: MaterialStatePropertyAll<Color>(Colors.grey),
shadowColor: MaterialStatePropertyAll<Color>(Colors.brown),
surfaceTintColor: MaterialStatePropertyAll<Color>(Colors.amberAccent),
elevation: MaterialStatePropertyAll<double>(10.0),
shape: MaterialStatePropertyAll<OutlinedBorder>(
RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10.0))),
),
),
inputDecorationTheme: const InputDecorationTheme(filled: true, fillColor: Colors.lightGreen),
)
);
await tester.pumpWidget(
MaterialApp(
theme: theme,
home: const Scaffold(
body: Center(
child: DropdownMenu<int>(
dropdownMenuEntries: <DropdownMenuEntry<int>>[
DropdownMenuEntry<int>(value: 0, label: 'Item 0'),
DropdownMenuEntry<int>(value: 1, label: 'Item 1'),
DropdownMenuEntry<int>(value: 2, label: 'Item 2'),
],
),
),
)
)
);
final EditableText editableText = tester.widget(find.byType(EditableText));
expect(editableText.style.color, Colors.orange);
expect(editableText.style.backgroundColor, Colors.indigo);
expect(editableText.style.shadows, kElevationToShadow[1]);
expect(editableText.style.decoration, TextDecoration.underline);
expect(editableText.style.wordSpacing, 2.0);
final TextField textField = tester.widget(find.byType(TextField));
expect(textField.decoration?.filled, isTrue);
expect(textField.decoration?.fillColor, Colors.lightGreen);
await tester.tap(find.widgetWithIcon(IconButton, Icons.arrow_drop_down).first);
await tester.pump();
expect(find.byType(MenuAnchor), findsOneWidget);
final Finder menuMaterial = find.ancestor(
of: find.widgetWithText(TextButton, 'Item 0'),
matching: find.byType(Material),
).last;
Material material = tester.widget<Material>(menuMaterial);
expect(material.color, Colors.grey);
expect(material.shadowColor, Colors.brown);
expect(material.surfaceTintColor, Colors.amberAccent);
expect(material.elevation, 10.0);
expect(material.shape, const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10.0))));
final Finder buttonMaterial = find.descendant(
of: find.widgetWithText(TextButton, 'Item 0'),
matching: find.byType(Material),
).last;
material = tester.widget<Material>(buttonMaterial);
expect(material.color, Colors.transparent);
expect(material.elevation, 0.0);
expect(material.shape, const RoundedRectangleBorder());
expect(material.textStyle?.color, theme.colorScheme.onSurface);
});
testWidgets('DropdownMenuTheme overrides ThemeData and defaults', (WidgetTester tester) async {
final DropdownMenuThemeData global = DropdownMenuThemeData(
textStyle: TextStyle(
color: Colors.orange,
backgroundColor: Colors.indigo,
fontSize: 30.0,
shadows: kElevationToShadow[1],
decoration: TextDecoration.underline,
wordSpacing: 2.0,
),
menuStyle: const MenuStyle(
backgroundColor: MaterialStatePropertyAll<Color>(Colors.grey),
shadowColor: MaterialStatePropertyAll<Color>(Colors.brown),
surfaceTintColor: MaterialStatePropertyAll<Color>(Colors.amberAccent),
elevation: MaterialStatePropertyAll<double>(10.0),
shape: MaterialStatePropertyAll<OutlinedBorder>(
RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10.0))),
),
),
inputDecorationTheme: const InputDecorationTheme(filled: true, fillColor: Colors.lightGreen),
);
final DropdownMenuThemeData dropdownMenuTheme = DropdownMenuThemeData(
textStyle: TextStyle(
color: Colors.red,
backgroundColor: Colors.orange,
fontSize: 27.0,
shadows: kElevationToShadow[2],
decoration: TextDecoration.lineThrough,
wordSpacing: 5.0,
),
menuStyle: const MenuStyle(
backgroundColor: MaterialStatePropertyAll<Color>(Colors.yellow),
shadowColor: MaterialStatePropertyAll<Color>(Colors.green),
surfaceTintColor: MaterialStatePropertyAll<Color>(Colors.teal),
elevation: MaterialStatePropertyAll<double>(15.0),
shape: MaterialStatePropertyAll<OutlinedBorder>(
RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(8.0))),
),
),
inputDecorationTheme: const InputDecorationTheme(filled: true, fillColor: Colors.blue),
);
final ThemeData theme = ThemeData(dropdownMenuTheme: global);
await tester.pumpWidget(
MaterialApp(
theme: theme,
home: DropdownMenuTheme(
data: dropdownMenuTheme,
child: const Scaffold(
body: Center(
child: DropdownMenu<int>(
dropdownMenuEntries: <DropdownMenuEntry<int>>[
DropdownMenuEntry<int>(value: 0, label: 'Item 0'),
DropdownMenuEntry<int>(value: 1, label: 'Item 1'),
DropdownMenuEntry<int>(value: 2, label: 'Item 2'),
],
),
),
),
)
)
);
final EditableText editableText = tester.widget(find.byType(EditableText));
expect(editableText.style.color, Colors.red);
expect(editableText.style.backgroundColor, Colors.orange);
expect(editableText.style.fontSize, 27.0);
expect(editableText.style.shadows, kElevationToShadow[2]);
expect(editableText.style.decoration, TextDecoration.lineThrough);
expect(editableText.style.wordSpacing, 5.0);
final TextField textField = tester.widget(find.byType(TextField));
expect(textField.decoration?.filled, isTrue);
expect(textField.decoration?.fillColor, Colors.blue);
await tester.tap(find.widgetWithIcon(IconButton, Icons.arrow_drop_down).first);
await tester.pump();
expect(find.byType(MenuAnchor), findsOneWidget);
final Finder menuMaterial = find.ancestor(
of: find.widgetWithText(TextButton, 'Item 0'),
matching: find.byType(Material),
).last;
Material material = tester.widget<Material>(menuMaterial);
expect(material.color, Colors.yellow);
expect(material.shadowColor, Colors.green);
expect(material.surfaceTintColor, Colors.teal);
expect(material.elevation, 15.0);
expect(material.shape, const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(8.0))));
final Finder buttonMaterial = find.descendant(
of: find.widgetWithText(TextButton, 'Item 0'),
matching: find.byType(Material),
).last;
material = tester.widget<Material>(buttonMaterial);
expect(material.color, Colors.transparent);
expect(material.elevation, 0.0);
expect(material.shape, const RoundedRectangleBorder());
expect(material.textStyle?.color, theme.colorScheme.onSurface);
});
testWidgets('Widget parameters overrides DropdownMenuTheme, ThemeData and defaults', (WidgetTester tester) async {
final DropdownMenuThemeData global = DropdownMenuThemeData(
textStyle: TextStyle(
color: Colors.orange,
backgroundColor: Colors.indigo,
fontSize: 30.0,
shadows: kElevationToShadow[1],
decoration: TextDecoration.underline,
wordSpacing: 2.0,
),
menuStyle: const MenuStyle(
backgroundColor: MaterialStatePropertyAll<Color>(Colors.grey),
shadowColor: MaterialStatePropertyAll<Color>(Colors.brown),
surfaceTintColor: MaterialStatePropertyAll<Color>(Colors.amberAccent),
elevation: MaterialStatePropertyAll<double>(10.0),
shape: MaterialStatePropertyAll<OutlinedBorder>(
RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10.0))),
),
),
inputDecorationTheme: const InputDecorationTheme(filled: true, fillColor: Colors.lightGreen),
);
final DropdownMenuThemeData dropdownMenuTheme = DropdownMenuThemeData(
textStyle: TextStyle(
color: Colors.red,
backgroundColor: Colors.orange,
fontSize: 27.0,
shadows: kElevationToShadow[2],
decoration: TextDecoration.lineThrough,
wordSpacing: 5.0,
),
menuStyle: const MenuStyle(
backgroundColor: MaterialStatePropertyAll<Color>(Colors.yellow),
shadowColor: MaterialStatePropertyAll<Color>(Colors.green),
surfaceTintColor: MaterialStatePropertyAll<Color>(Colors.teal),
elevation: MaterialStatePropertyAll<double>(15.0),
shape: MaterialStatePropertyAll<OutlinedBorder>(
RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(8.0))),
),
),
inputDecorationTheme: const InputDecorationTheme(filled: true, fillColor: Colors.blue),
);
final ThemeData theme = ThemeData(dropdownMenuTheme: global);
await tester.pumpWidget(
MaterialApp(
theme: theme,
home: DropdownMenuTheme(
data: dropdownMenuTheme,
child: Scaffold(
body: Center(
child: DropdownMenu<int>(
textStyle: TextStyle(
color: Colors.pink,
backgroundColor: Colors.cyan,
fontSize: 32.0,
shadows: kElevationToShadow[3],
decoration: TextDecoration.overline,
wordSpacing: 3.0,
),
menuStyle: const MenuStyle(
backgroundColor: MaterialStatePropertyAll<Color>(Colors.limeAccent),
shadowColor: MaterialStatePropertyAll<Color>(Colors.deepOrangeAccent),
surfaceTintColor: MaterialStatePropertyAll<Color>(Colors.lightBlue),
elevation: MaterialStatePropertyAll<double>(21.0),
shape: MaterialStatePropertyAll<OutlinedBorder>(
RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(15.0))),
),
),
inputDecorationTheme: const InputDecorationTheme(filled: true, fillColor: Colors.deepPurple),
dropdownMenuEntries: const <DropdownMenuEntry<int>>[
DropdownMenuEntry<int>(value: 0, label: 'Item 0'),
DropdownMenuEntry<int>(value: 1, label: 'Item 1'),
DropdownMenuEntry<int>(value: 2, label: 'Item 2'),
],
),
),
),
)
)
);
final EditableText editableText = tester.widget(find.byType(EditableText));
expect(editableText.style.color, Colors.pink);
expect(editableText.style.backgroundColor, Colors.cyan);
expect(editableText.style.fontSize, 32.0);
expect(editableText.style.shadows, kElevationToShadow[3]);
expect(editableText.style.decoration, TextDecoration.overline);
expect(editableText.style.wordSpacing, 3.0);
final TextField textField = tester.widget(find.byType(TextField));
expect(textField.decoration?.filled, isTrue);
expect(textField.decoration?.fillColor, Colors.deepPurple);
await tester.tap(find.widgetWithIcon(IconButton, Icons.arrow_drop_down).first);
await tester.pump();
expect(find.byType(MenuAnchor), findsOneWidget);
final Finder menuMaterial = find.ancestor(
of: find.widgetWithText(TextButton, 'Item 0'),
matching: find.byType(Material),
).last;
Material material = tester.widget<Material>(menuMaterial);
expect(material.color, Colors.limeAccent);
expect(material.shadowColor, Colors.deepOrangeAccent);
expect(material.surfaceTintColor, Colors.lightBlue);
expect(material.elevation, 21.0);
expect(material.shape, const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(15.0))));
final Finder buttonMaterial = find.descendant(
of: find.widgetWithText(TextButton, 'Item 0'),
matching: find.byType(Material),
).last;
material = tester.widget<Material>(buttonMaterial);
expect(material.color, Colors.transparent);
expect(material.elevation, 0.0);
expect(material.shape, const RoundedRectangleBorder());
expect(material.textStyle?.color, theme.colorScheme.onSurface);
});
}