// 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/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_api_samples/material/selection_area/selection_area.2.dart' as example; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('SelectionArea Color Text Red Example Smoke Test', ( WidgetTester tester, ) async { await tester.pumpWidget( const example.SelectionAreaColorTextRedExampleApp(), ); expect( find.widgetWithIcon(FloatingActionButton, Icons.undo), findsOneWidget, ); expect(find.byType(Column), findsNWidgets(2)); expect( find.textContaining('This is some bulleted list:\n'), findsOneWidget, ); for (int i = 1; i <= 7; i += 1) { expect(find.widgetWithText(Text, '• Bullet $i'), findsOneWidget); } expect( find.textContaining('This is some text in a text widget.'), findsOneWidget, ); expect( find.textContaining(' This is some more text in the same text widget.'), findsOneWidget, ); expect( find.textContaining('This is some text in another text widget.'), findsOneWidget, ); }); testWidgets( 'SelectionArea Color Text Red Example - colors selected range red', (WidgetTester tester) async { await tester.pumpWidget( const example.SelectionAreaColorTextRedExampleApp(), ); await tester.pumpAndSettle(); final Finder paragraph1Finder = find.descendant( of: find.textContaining('This is some bulleted list').first, matching: find.byType(RichText).first, ); final Finder paragraph3Finder = find.descendant( of: find.textContaining('This is some text in another text widget.'), matching: find.byType(RichText), ); final RenderParagraph paragraph1 = tester.renderObject( paragraph1Finder, ); final List bullets = tester .renderObjectList( find.descendant( of: find.textContaining('• Bullet'), matching: find.byType(RichText), ), ) .toList(); expect(bullets.length, 7); final RenderParagraph paragraph2 = tester.renderObject( find.descendant( of: find.textContaining('This is some text in a text widget.'), matching: find.byType(RichText), ), ); final RenderParagraph paragraph3 = tester.renderObject( paragraph3Finder, ); // Drag to select from paragraph 1 position 4 to paragraph 3 position 25. final TestGesture gesture = await tester.startGesture( tester.getRect(paragraph1Finder).topLeft + const Offset(50.0, 10.0), kind: PointerDeviceKind.mouse, ); addTearDown(gesture.removePointer); await tester.pump(); await gesture.moveTo( tester.getRect(paragraph3Finder).centerLeft + const Offset(360.0, 0.0), ); await tester.pump(); await gesture.up(); await tester.pumpAndSettle(); // Verify selection. // Bulleted list title. expect(paragraph1.selections.length, 1); expect( paragraph1.selections[0], const TextSelection(baseOffset: 4, extentOffset: 27), ); // Bulleted list. for (final RenderParagraph paragraphBullet in bullets) { expect(paragraphBullet.selections.length, 1); expect( paragraphBullet.selections[0], const TextSelection(baseOffset: 0, extentOffset: 10), ); } // Second text widget. expect(paragraph2.selections.length, 1); expect( paragraph2.selections[0], const TextSelection(baseOffset: 0, extentOffset: 83), ); // Third text widget. expect(paragraph3.selections.length, 1); expect( paragraph3.selections[0], const TextSelection(baseOffset: 0, extentOffset: 25), ); // Color selection red. expect(find.textContaining('Color Text Red'), findsOneWidget); await tester.tap(find.textContaining('Color Text Red')); await tester.pumpAndSettle(); // Verify selection is red. final TextSpan paragraph1ResultingSpan = paragraph1.text as TextSpan; final TextSpan paragraph2ResultingSpan = paragraph2.text as TextSpan; final TextSpan paragraph3ResultingSpan = paragraph3.text as TextSpan; // Title of bulleted list is partially red. expect(paragraph1ResultingSpan.children, isNotNull); expect(paragraph1ResultingSpan.children!.length, 1); expect( (paragraph1ResultingSpan.children![0] as TextSpan).children, isNotNull, ); expect( (paragraph1ResultingSpan.children![0] as TextSpan).children!.length, 3, ); expect( (paragraph1ResultingSpan.children![0] as TextSpan).children![0].style, isNull, ); expect( (paragraph1ResultingSpan.children![0] as TextSpan).children![1], isA(), ); expect( ((paragraph1ResultingSpan.children![0] as TextSpan).children![1] as TextSpan) .text, isNotNull, ); expect( ((paragraph1ResultingSpan.children![0] as TextSpan).children![1] as TextSpan) .text, ' is some bulleted list:\n', ); expect( (paragraph1ResultingSpan.children![0] as TextSpan).children![1].style, isNotNull, ); expect( (paragraph1ResultingSpan.children![0] as TextSpan) .children![1] .style! .color, isNotNull, ); expect( (paragraph1ResultingSpan.children![0] as TextSpan) .children![1] .style! .color, Colors.red, ); expect( (paragraph1ResultingSpan.children![0] as TextSpan).children![2], isA(), ); // Bullets are red. for (final RenderParagraph paragraphBullet in bullets) { final TextSpan resultingBulletSpan = paragraphBullet.text as TextSpan; expect(resultingBulletSpan.children, isNotNull); expect(resultingBulletSpan.children!.length, 1); expect(resultingBulletSpan.children![0], isA()); expect( (resultingBulletSpan.children![0] as TextSpan).children, isNotNull, ); expect( (resultingBulletSpan.children![0] as TextSpan).children!.length, 1, ); expect( (resultingBulletSpan.children![0] as TextSpan).children![0], isA(), ); expect( ((resultingBulletSpan.children![0] as TextSpan).children![0] as TextSpan) .style, isNotNull, ); expect( ((resultingBulletSpan.children![0] as TextSpan).children![0] as TextSpan) .style! .color, isNotNull, ); expect( ((resultingBulletSpan.children![0] as TextSpan).children![0] as TextSpan) .style! .color, Colors.red, ); } // Second text widget is red. expect(paragraph2ResultingSpan.children, isNotNull); expect(paragraph2ResultingSpan.children!.length, 1); expect(paragraph2ResultingSpan.children![0], isA()); expect( (paragraph2ResultingSpan.children![0] as TextSpan).children, isNotNull, ); for (final InlineSpan span in (paragraph2ResultingSpan.children![0] as TextSpan).children!) { if (span is TextSpan) { expect(span.style, isNotNull); expect(span.style!.color, isNotNull); expect(span.style!.color, Colors.red); } } // Part of third text widget is red. expect(paragraph3ResultingSpan.children, isNotNull); expect(paragraph3ResultingSpan.children!.length, 1); expect(paragraph3ResultingSpan.children![0], isA()); expect( (paragraph3ResultingSpan.children![0] as TextSpan).children, isNotNull, ); expect( (paragraph3ResultingSpan.children![0] as TextSpan).children!.length, 2, ); expect( (paragraph3ResultingSpan.children![0] as TextSpan).children![0], isA(), ); expect( ((paragraph3ResultingSpan.children![0] as TextSpan).children![0] as TextSpan) .text, isNotNull, ); expect( ((paragraph3ResultingSpan.children![0] as TextSpan).children![0] as TextSpan) .text, 'This is some text in ano', ); expect( (paragraph3ResultingSpan.children![0] as TextSpan).children![0].style, isNotNull, ); expect( (paragraph3ResultingSpan.children![0] as TextSpan) .children![0] .style! .color, isNotNull, ); expect( (paragraph3ResultingSpan.children![0] as TextSpan) .children![0] .style! .color, Colors.red, ); expect( (paragraph3ResultingSpan.children![0] as TextSpan).children![1].style, isNull, ); }, ); }