// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Synced. * Contains Web DELTA * import 'package:flutter_web/material.dart'; import 'package:flutter_web/rendering.dart'; import 'package:flutter_web_test/flutter_web_test.dart'; MaterialApp _appWithAlertDialog(WidgetTester tester, AlertDialog dialog, {ThemeData theme}) { return MaterialApp( theme: theme, home: Material( child: Builder(builder: (BuildContext context) { return Center( child: RaisedButton( child: const Text('X'), onPressed: () { showDialog( context: context, builder: (BuildContext context) { return RepaintBoundary(key: _painterKey, child: dialog); }, ); }, ), ); }), ), ); } final Key _painterKey = UniqueKey(); Material _getMaterialFromDialog(WidgetTester tester) { return tester.widget(find.descendant( of: find.byType(AlertDialog), matching: find.byType(Material))); } RenderParagraph _getTextRenderObjectFromDialog( WidgetTester tester, String text) { return tester .element(find.descendant( of: find.byType(AlertDialog), matching: find.text(text))) .renderObject; } void main() { testWidgets('Dialog Theme implements debugFillProperties', (WidgetTester tester) async { final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); const DialogTheme( backgroundColor: Color(0xff123456), elevation: 8.0, shape: null, titleTextStyle: TextStyle(color: Color(0xffffffff)), contentTextStyle: TextStyle(color: Color(0xff000000)), ).debugFillProperties(builder); final List description = builder.properties .where((DiagnosticsNode n) => !n.isFiltered(DiagnosticLevel.info)) .map((DiagnosticsNode n) => n.toString()) .toList(); expect(description, [ 'backgroundColor: Color(0xff123456)', 'elevation: 8.0', 'titleTextStyle: TextStyle(inherit: true, color: Color(0xffffffff))', 'contentTextStyle: TextStyle(inherit: true, color: Color(0xff000000))', ]); }); testWidgets('Dialog background color', (WidgetTester tester) async { const Color customColor = Colors.pink; const AlertDialog dialog = AlertDialog( title: Text('Title'), actions: [], ); final ThemeData theme = ThemeData(dialogTheme: const DialogTheme(backgroundColor: customColor)); await tester.pumpWidget(_appWithAlertDialog(tester, dialog, theme: theme)); await tester.tap(find.text('X')); await tester.pumpAndSettle(); final Material materialWidget = _getMaterialFromDialog(tester); expect(materialWidget.color, customColor); }); testWidgets('Custom dialog elevation', (WidgetTester tester) async { const double customElevation = 12.0; const AlertDialog dialog = AlertDialog( title: Text('Title'), actions: [], ); final ThemeData theme = ThemeData(dialogTheme: const DialogTheme(elevation: customElevation)); await tester.pumpWidget(_appWithAlertDialog(tester, dialog, theme: theme)); await tester.tap(find.text('X')); await tester.pumpAndSettle(); final Material materialWidget = _getMaterialFromDialog(tester); expect(materialWidget.elevation, customElevation); }); testWidgets('Custom dialog shape', (WidgetTester tester) async { const RoundedRectangleBorder customBorder = RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(16.0))); const AlertDialog dialog = AlertDialog( title: Text('Title'), actions: [], ); final ThemeData theme = ThemeData(dialogTheme: const DialogTheme(shape: customBorder)); await tester.pumpWidget(_appWithAlertDialog(tester, dialog, theme: theme)); await tester.tap(find.text('X')); await tester.pumpAndSettle(); final Material materialWidget = _getMaterialFromDialog(tester); expect(materialWidget.shape, customBorder); }); testWidgets('Custom dialog shape matches golden', (WidgetTester tester) async { const RoundedRectangleBorder customBorder = RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(16.0))); const AlertDialog dialog = AlertDialog( title: Text('Title'), actions: [], ); final ThemeData theme = ThemeData(dialogTheme: const DialogTheme(shape: customBorder)); await tester.pumpWidget(_appWithAlertDialog(tester, dialog, theme: theme)); await tester.tap(find.text('X')); await tester.pumpAndSettle(); await expectLater( find.byKey(_painterKey), matchesGoldenFile('dialog_theme.dialog_with_custom_border.png'), skip: true, ); }, skip: true); // TODO(flutter_web): reenable when goldens are supported. testWidgets('Custom Title Text Style - Constructor Param', (WidgetTester tester) async { const String titleText = 'Title'; const TextStyle titleTextStyle = TextStyle(color: Colors.pink); const AlertDialog dialog = AlertDialog( title: Text(titleText), titleTextStyle: titleTextStyle, actions: [], ); await tester.pumpWidget(_appWithAlertDialog(tester, dialog)); await tester.tap(find.text('X')); await tester.pumpAndSettle(); final RenderParagraph title = _getTextRenderObjectFromDialog(tester, titleText); expect(title.text.style, titleTextStyle); }); testWidgets('Custom Title Text Style - Dialog Theme', (WidgetTester tester) async { const String titleText = 'Title'; const TextStyle titleTextStyle = TextStyle(color: Colors.pink); const AlertDialog dialog = AlertDialog( title: Text(titleText), actions: [], ); final ThemeData theme = ThemeData( dialogTheme: const DialogTheme(titleTextStyle: titleTextStyle)); await tester.pumpWidget(_appWithAlertDialog(tester, dialog, theme: theme)); await tester.tap(find.text('X')); await tester.pumpAndSettle(); final RenderParagraph title = _getTextRenderObjectFromDialog(tester, titleText); expect(title.text.style, titleTextStyle); }); testWidgets('Custom Title Text Style - Theme', (WidgetTester tester) async { const String titleText = 'Title'; const TextStyle titleTextStyle = TextStyle(color: Colors.pink); const AlertDialog dialog = AlertDialog( title: Text(titleText), actions: [], ); final ThemeData theme = ThemeData(textTheme: const TextTheme(title: titleTextStyle)); await tester.pumpWidget(_appWithAlertDialog(tester, dialog, theme: theme)); await tester.tap(find.text('X')); await tester.pumpAndSettle(); final RenderParagraph title = _getTextRenderObjectFromDialog(tester, titleText); expect(title.text.style.color, titleTextStyle.color); }); testWidgets('Custom Content Text Style - Constructor Param', (WidgetTester tester) async { const String contentText = 'Content'; const TextStyle contentTextStyle = TextStyle(color: Colors.pink); const AlertDialog dialog = AlertDialog( content: Text(contentText), contentTextStyle: contentTextStyle, actions: [], ); await tester.pumpWidget(_appWithAlertDialog(tester, dialog)); await tester.tap(find.text('X')); await tester.pumpAndSettle(); final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText); expect(content.text.style, contentTextStyle); }); testWidgets('Custom Content Text Style - Dialog Theme', (WidgetTester tester) async { const String contentText = 'Content'; const TextStyle contentTextStyle = TextStyle(color: Colors.pink); const AlertDialog dialog = AlertDialog( content: Text(contentText), actions: [], ); final ThemeData theme = ThemeData( dialogTheme: const DialogTheme(contentTextStyle: contentTextStyle)); await tester.pumpWidget(_appWithAlertDialog(tester, dialog, theme: theme)); await tester.tap(find.text('X')); await tester.pumpAndSettle(); final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText); expect(content.text.style, contentTextStyle); }); testWidgets('Custom Content Text Style - Theme', (WidgetTester tester) async { const String contentText = 'Content'; const TextStyle contentTextStyle = TextStyle(color: Colors.pink); const AlertDialog dialog = AlertDialog( content: Text(contentText), actions: [], ); final ThemeData theme = ThemeData(textTheme: const TextTheme(subhead: contentTextStyle)); await tester.pumpWidget(_appWithAlertDialog(tester, dialog, theme: theme)); await tester.tap(find.text('X')); await tester.pumpAndSettle(); final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText); expect(content.text.style.color, contentTextStyle.color); }); }