mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
192 lines
7.3 KiB
Dart
192 lines
7.3 KiB
Dart
// 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/rendering.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
void main() {
|
|
test('MaterialBannerThemeData copyWith, ==, hashCode basics', () {
|
|
expect(const MaterialBannerThemeData(), const MaterialBannerThemeData().copyWith());
|
|
expect(const MaterialBannerThemeData().hashCode, const MaterialBannerThemeData().copyWith().hashCode);
|
|
});
|
|
|
|
test('MaterialBannerThemeData null fields by default', () {
|
|
const MaterialBannerThemeData bannerTheme = MaterialBannerThemeData();
|
|
expect(bannerTheme.backgroundColor, null);
|
|
expect(bannerTheme.contentTextStyle, null);
|
|
});
|
|
|
|
testWidgets('Default MaterialBannerThemeData debugFillProperties', (WidgetTester tester) async {
|
|
final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder();
|
|
const MaterialBannerThemeData().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('MaterialBannerThemeData implements debugFillProperties', (WidgetTester tester) async {
|
|
final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder();
|
|
const MaterialBannerThemeData(
|
|
backgroundColor: Color(0xFFFFFFFF),
|
|
contentTextStyle: TextStyle(color: Color(0xFFFFFFFF)),
|
|
).debugFillProperties(builder);
|
|
|
|
final List<String> description = builder.properties
|
|
.where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info))
|
|
.map((DiagnosticsNode node) => node.toString())
|
|
.toList();
|
|
|
|
expect(description, <String>[
|
|
'backgroundColor: Color(0xffffffff)',
|
|
'contentTextStyle: TextStyle(inherit: true, color: Color(0xffffffff))',
|
|
]);
|
|
});
|
|
|
|
testWidgets('Passing no MaterialBannerThemeData returns defaults', (WidgetTester tester) async {
|
|
const String contentText = 'Content';
|
|
await tester.pumpWidget(MaterialApp(
|
|
home: Scaffold(
|
|
body: MaterialBanner(
|
|
content: const Text(contentText),
|
|
actions: <Widget>[
|
|
TextButton(
|
|
child: const Text('Action'),
|
|
onPressed: () { },
|
|
),
|
|
],
|
|
),
|
|
),
|
|
));
|
|
|
|
final Container container = _getContainerFromBanner(tester);
|
|
final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText);
|
|
expect(container.color, const Color(0xffffffff));
|
|
// Default value for ThemeData.typography is Typography.material2014()
|
|
expect(content.text.style, Typography.material2014().englishLike.bodyText2!.merge(Typography.material2014().black.bodyText2));
|
|
});
|
|
|
|
testWidgets('MaterialBanner uses values from MaterialBannerThemeData', (WidgetTester tester) async {
|
|
final MaterialBannerThemeData bannerTheme = _bannerTheme();
|
|
const String contentText = 'Content';
|
|
await tester.pumpWidget(MaterialApp(
|
|
theme: ThemeData(bannerTheme: bannerTheme),
|
|
home: Scaffold(
|
|
body: MaterialBanner(
|
|
leading: const Icon(Icons.ac_unit),
|
|
content: const Text(contentText),
|
|
actions: <Widget>[
|
|
TextButton(
|
|
child: const Text('Action'),
|
|
onPressed: () { },
|
|
),
|
|
],
|
|
),
|
|
),
|
|
));
|
|
|
|
final Container container = _getContainerFromBanner(tester);
|
|
final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText);
|
|
expect(container.color, bannerTheme.backgroundColor);
|
|
expect(content.text.style, bannerTheme.contentTextStyle);
|
|
|
|
final Offset contentTopLeft = tester.getTopLeft(_textFinder(contentText));
|
|
final Offset containerTopLeft = tester.getTopLeft(_containerFinder());
|
|
final Offset leadingTopLeft = tester.getTopLeft(find.byIcon(Icons.ac_unit));
|
|
expect(contentTopLeft.dy - containerTopLeft.dy, 24);
|
|
expect(contentTopLeft.dx - containerTopLeft.dx, 41);
|
|
expect(leadingTopLeft.dy - containerTopLeft.dy, 19);
|
|
expect(leadingTopLeft.dx - containerTopLeft.dx, 11);
|
|
});
|
|
|
|
testWidgets('MaterialBanner widget properties take priority over theme', (WidgetTester tester) async {
|
|
const Color backgroundColor = Colors.purple;
|
|
const TextStyle textStyle = TextStyle(color: Colors.green);
|
|
final MaterialBannerThemeData bannerTheme = _bannerTheme();
|
|
const String contentText = 'Content';
|
|
await tester.pumpWidget(MaterialApp(
|
|
theme: ThemeData(bannerTheme: bannerTheme),
|
|
home: Scaffold(
|
|
body: MaterialBanner(
|
|
backgroundColor: backgroundColor,
|
|
leading: const Icon(Icons.ac_unit),
|
|
contentTextStyle: textStyle,
|
|
content: const Text(contentText),
|
|
padding: const EdgeInsets.all(10),
|
|
leadingPadding: const EdgeInsets.all(12),
|
|
actions: <Widget>[
|
|
TextButton(
|
|
child: const Text('Action'),
|
|
onPressed: () { },
|
|
),
|
|
],
|
|
),
|
|
),
|
|
));
|
|
|
|
final Container container = _getContainerFromBanner(tester);
|
|
final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText);
|
|
expect(container.color, backgroundColor);
|
|
expect(content.text.style, textStyle);
|
|
|
|
final Offset contentTopLeft = tester.getTopLeft(_textFinder(contentText));
|
|
final Offset containerTopLeft = tester.getTopLeft(_containerFinder());
|
|
final Offset leadingTopLeft = tester.getTopLeft(find.byIcon(Icons.ac_unit));
|
|
expect(contentTopLeft.dy - containerTopLeft.dy, 29);
|
|
expect(contentTopLeft.dx - containerTopLeft.dx, 58);
|
|
expect(leadingTopLeft.dy - containerTopLeft.dy, 24);
|
|
expect(leadingTopLeft.dx - containerTopLeft.dx, 22);
|
|
});
|
|
|
|
testWidgets('MaterialBanner uses color scheme when necessary', (WidgetTester tester) async {
|
|
final ColorScheme colorScheme = const ColorScheme.light().copyWith(surface: Colors.purple);
|
|
await tester.pumpWidget(MaterialApp(
|
|
theme: ThemeData(colorScheme: colorScheme),
|
|
home: Scaffold(
|
|
body: MaterialBanner(
|
|
content: const Text('Content'),
|
|
actions: <Widget>[
|
|
TextButton(
|
|
child: const Text('Action'),
|
|
onPressed: () { },
|
|
),
|
|
],
|
|
),
|
|
),
|
|
));
|
|
|
|
final Container container = _getContainerFromBanner(tester);
|
|
expect(container.color, colorScheme.surface);
|
|
});
|
|
}
|
|
|
|
MaterialBannerThemeData _bannerTheme() {
|
|
return const MaterialBannerThemeData(
|
|
backgroundColor: Colors.orange,
|
|
contentTextStyle: TextStyle(color: Colors.pink),
|
|
padding: EdgeInsets.all(5),
|
|
leadingPadding: EdgeInsets.all(6),
|
|
);
|
|
}
|
|
|
|
Container _getContainerFromBanner(WidgetTester tester) {
|
|
return tester.widget<Container>(_containerFinder());
|
|
}
|
|
|
|
Finder _containerFinder() {
|
|
return find.descendant(of: find.byType(MaterialBanner), matching: find.byType(Container)).first;
|
|
}
|
|
|
|
RenderParagraph _getTextRenderObjectFromDialog(WidgetTester tester, String text) {
|
|
return tester.element<StatelessElement>(_textFinder(text)).renderObject! as RenderParagraph;
|
|
}
|
|
|
|
Finder _textFinder(String text) {
|
|
return find.descendant(of: find.byType(MaterialBanner), matching: find.text(text));
|
|
}
|