// 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/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('Shows prefix', (WidgetTester tester) async { const Widget prefix = Text('Enter Value'); await tester.pumpWidget( const CupertinoApp( home: Center( child: CupertinoFormRow( prefix: prefix, child: CupertinoTextField(), ), ), ), ); expect(prefix, tester.widget(find.byType(Text))); }); testWidgets('Shows child', (WidgetTester tester) async { const Widget child = CupertinoTextField(); await tester.pumpWidget( const CupertinoApp( home: Center( child: CupertinoFormRow( child: child, ), ), ), ); expect(child, tester.widget(find.byType(CupertinoTextField))); }); testWidgets('RTL puts prefix after child', (WidgetTester tester) async { const Widget prefix = Text('Enter Value'); const Widget child = CupertinoTextField(); await tester.pumpWidget( const CupertinoApp( home: Center( child: Directionality( textDirection: TextDirection.rtl, child: CupertinoFormRow( prefix: prefix, child: child, ), ), ), ), ); expect(tester.getTopLeft(find.byType(Text)).dx > tester.getTopLeft(find.byType(CupertinoTextField)).dx, true); }); testWidgets('LTR puts child after prefix', (WidgetTester tester) async { const Widget prefix = Text('Enter Value'); const Widget child = CupertinoTextField(); await tester.pumpWidget( const CupertinoApp( home: Center( child: Directionality( textDirection: TextDirection.ltr, child: CupertinoFormRow( prefix: prefix, child: child, ), ), ), ), ); expect(tester.getTopLeft(find.byType(Text)).dx > tester.getTopLeft(find.byType(CupertinoTextField)).dx, false); }); testWidgets('Shows error widget', (WidgetTester tester) async { const Widget error = Text('Error'); await tester.pumpWidget( const CupertinoApp( home: Center( child: CupertinoFormRow( error: error, child: CupertinoTextField(), ), ), ), ); expect(error, tester.widget(find.byType(Text))); }); testWidgets('Shows helper widget', (WidgetTester tester) async { const Widget helper = Text('Helper'); await tester.pumpWidget( const CupertinoApp( home: Center( child: CupertinoFormRow( helper: helper, child: CupertinoTextField(), ), ), ), ); expect(helper, tester.widget(find.byType(Text))); }); testWidgets('Shows helper text above error text', (WidgetTester tester) async { const Widget helper = Text('Helper'); const Widget error = CupertinoActivityIndicator(); await tester.pumpWidget( const CupertinoApp( home: Center( child: CupertinoFormRow( helper: helper, error: error, child: CupertinoTextField(), ), ), ), ); expect( tester.getTopLeft(find.byType(CupertinoActivityIndicator)).dy > tester.getTopLeft(find.byType(Text)).dy, true, ); }); testWidgets('Shows helper in label color and error text in red color', (WidgetTester tester) async { const Widget helper = Text('Helper'); const Widget error = Text('Error'); await tester.pumpWidget( const CupertinoApp( home: Center( child: CupertinoFormRow( helper: helper, error: error, child: CupertinoTextField(), ), ), ), ); final DefaultTextStyle helperTextStyle = tester.widget(find.byType(DefaultTextStyle).first); expect(helperTextStyle.style.color, CupertinoColors.label); final DefaultTextStyle errorTextStyle = tester.widget(find.byType(DefaultTextStyle).last); expect(errorTextStyle.style.color, CupertinoColors.destructiveRed); }); testWidgets('CupertinoFormRow adapts to MaterialApp dark mode', (WidgetTester tester) async { const Widget prefix = Text('Prefix'); const Widget helper = Text('Helper'); Widget buildFormRow(Brightness brightness) { return MaterialApp( theme: ThemeData(brightness: brightness), home: const Center( child: CupertinoFormRow( prefix: prefix, helper: helper, child: CupertinoTextField(), ), ), ); } // CupertinoFormRow with light theme. await tester.pumpWidget(buildFormRow(Brightness.light)); RenderParagraph helperParagraph = tester.renderObject(find.text('Helper')); expect(helperParagraph.text.style!.color, CupertinoColors.label); // Text style should not return unresolved color. expect(helperParagraph.text.style!.color.toString().contains('UNRESOLVED'), isFalse); RenderParagraph prefixParagraph = tester.renderObject(find.text('Prefix')); expect(prefixParagraph.text.style!.color, CupertinoColors.label); // Text style should not return unresolved color. expect(prefixParagraph.text.style!.color.toString().contains('UNRESOLVED'), isFalse); // CupertinoFormRow with light theme. await tester.pumpWidget(buildFormRow(Brightness.dark)); helperParagraph = tester.renderObject(find.text('Helper')); expect(helperParagraph.text.style!.color, CupertinoColors.label); // Text style should not return unresolved color. expect(helperParagraph.text.style!.color.toString().contains('UNRESOLVED'), isFalse); prefixParagraph = tester.renderObject(find.text('Prefix')); expect(prefixParagraph.text.style!.color, CupertinoColors.label); // Text style should not return unresolved color. expect(prefixParagraph.text.style!.color.toString().contains('UNRESOLVED'), isFalse); }); }