diff --git a/packages/flutter/test/material/input_decorator_test.dart b/packages/flutter/test/material/input_decorator_test.dart index 970ca89acc1..04e1b50a368 100644 --- a/packages/flutter/test/material/input_decorator_test.dart +++ b/packages/flutter/test/material/input_decorator_test.dart @@ -9962,6 +9962,96 @@ void main() { ); }); + testWidgets('errorBorder', (WidgetTester tester) async { + const InputBorder errorBorder = OutlineInputBorder( + borderSide: BorderSide(color: Colors.red, width: 1.5), + ); + + await tester.pumpWidget( + buildInputDecorator( + localInputDecorationTheme: const InputDecorationThemeData(errorBorder: errorBorder), + decoration: const InputDecoration(errorText: 'error'), + ), + ); + await tester.pumpAndSettle(); // Border changes are animated. + expect(getBorder(tester), errorBorder); + }); + + testWidgets('focusedErrorBorder', (WidgetTester tester) async { + const InputBorder focusedErrorBorder = OutlineInputBorder( + borderSide: BorderSide(color: Colors.red, width: 1.5), + ); + + await tester.pumpWidget( + buildInputDecorator( + isFocused: true, + localInputDecorationTheme: const InputDecorationThemeData( + focusedErrorBorder: focusedErrorBorder, + ), + decoration: const InputDecoration(errorText: 'error'), + ), + ); + await tester.pumpAndSettle(); // Border changes are animated. + expect(getBorder(tester), focusedErrorBorder); + }); + + testWidgets('focusedBorder', (WidgetTester tester) async { + const InputBorder focusedBorder = OutlineInputBorder( + borderSide: BorderSide(color: Colors.green, width: 1.5), + ); + + await tester.pumpWidget( + buildInputDecorator( + isFocused: true, + localInputDecorationTheme: const InputDecorationThemeData(focusedBorder: focusedBorder), + ), + ); + await tester.pumpAndSettle(); // Border changes are animated. + expect(getBorder(tester), focusedBorder); + }); + + testWidgets('enabledBorder', (WidgetTester tester) async { + const InputBorder enabledBorder = OutlineInputBorder( + borderSide: BorderSide(color: Colors.teal, width: 5.0), + ); + + await tester.pumpWidget( + buildInputDecorator( + localInputDecorationTheme: const InputDecorationThemeData(enabledBorder: enabledBorder), + ), + ); + await tester.pumpAndSettle(); // Border changes are animated. + expect(getBorder(tester), enabledBorder); + }); + + testWidgets('disabledBorder', (WidgetTester tester) async { + const InputBorder disabledBorder = OutlineInputBorder( + borderSide: BorderSide(color: Colors.teal, width: 3.0), + ); + + await tester.pumpWidget( + buildInputDecorator( + localInputDecorationTheme: const InputDecorationThemeData(disabledBorder: disabledBorder), + decoration: const InputDecoration(enabled: false), + ), + ); + await tester.pumpAndSettle(); // Border changes are animated. + expect(getBorder(tester), disabledBorder); + }); + + testWidgets('border', (WidgetTester tester) async { + final BorderRadius borderRadius = BorderRadius.circular(6.0); + final InputBorder border = OutlineInputBorder(borderRadius: borderRadius); + await tester.pumpWidget( + buildInputDecorator(localInputDecorationTheme: InputDecorationThemeData(border: border)), + ); + + // The real instance of border is created based on the given border. + // The type and the borderRadius should be the same as the given border. + expect(getBorder(tester), isA()); + expect(getBorderRadius(tester), borderRadius); + }); + testWidgets('alignLabelWithHint', (WidgetTester tester) async { await tester.pumpWidget( buildInputDecorator( @@ -10217,6 +10307,92 @@ void main() { expect(getIconStyle(tester, suffixIcon)?.color, iconColor); }); + group('Custom borders', () { + testWidgets('InputDecoration shows custom focused border', (WidgetTester tester) async { + const InputBorder focusedBorder = OutlineInputBorder( + borderSide: BorderSide(color: Colors.teal, width: 5.0), + ); + + await tester.pumpWidget( + buildInputDecorator( + isFocused: true, + decoration: const InputDecoration(focusedBorder: focusedBorder), + ), + ); + await tester.pumpAndSettle(); // Border changes are animated. + expect(getBorder(tester), focusedBorder); + }); + + testWidgets('InputDecoration shows custom error borders', (WidgetTester tester) async { + const InputBorder errorBorder = OutlineInputBorder( + borderSide: BorderSide(color: Colors.red, width: 1.5), + ); + const InputBorder focusedErrorBorder = OutlineInputBorder( + borderSide: BorderSide(color: Colors.teal, width: 5.0), + ); + + Future checkBorders({ + bool isFocused = false, + bool enabled = true, + String? errorText, + Widget? error, + required InputBorder expectedBorder, + }) async { + await tester.pumpWidget( + buildInputDecorator( + isFocused: isFocused, + decoration: InputDecoration( + errorText: errorText, + error: error, + enabled: enabled, + errorBorder: errorBorder, + focusedErrorBorder: focusedErrorBorder, + ), + ), + ); + await tester.pumpAndSettle(); // Border changes are animated. + expect(getBorder(tester), expectedBorder); + } + + // Test with errorText. + await checkBorders(isFocused: true, errorText: 'error', expectedBorder: focusedErrorBorder); + await checkBorders(errorText: 'error', expectedBorder: errorBorder); + await checkBorders(enabled: false, errorText: 'error', expectedBorder: errorBorder); + + // Test with error widget. + const Widget error = Text('error'); + await checkBorders(isFocused: true, error: error, expectedBorder: focusedErrorBorder); + await checkBorders(error: error, expectedBorder: errorBorder); + await checkBorders(enabled: false, error: error, expectedBorder: errorBorder); + }); + + testWidgets('InputDecoration shows custom enabled border', (WidgetTester tester) async { + const InputBorder enabledBorder = OutlineInputBorder( + borderSide: BorderSide(color: Colors.teal, width: 5.0), + ); + + await tester.pumpWidget( + buildInputDecorator(decoration: const InputDecoration(enabledBorder: enabledBorder)), + ); + await tester.pumpAndSettle(); // Border changes are animated. + expect(getBorder(tester), enabledBorder); + }); + + testWidgets('InputDecoration shows custom disabled border', (WidgetTester tester) async { + const InputBorder disabledBorder = OutlineInputBorder( + borderSide: BorderSide(color: Colors.teal, width: 3.0), + ); + + await tester.pumpWidget( + buildInputDecorator( + decoration: const InputDecoration(enabled: false, disabledBorder: disabledBorder), + ), + ); + await tester.pumpAndSettle(); // Border changes are animated. + expect(getBorder(tester), disabledBorder); + }); + }); + group('Material2', () { // These tests are only relevant for Material 2. Once Material 2 // support is deprecated and the APIs are removed, these tests