blob: a8f4eff9748d5f58a77e73f88f916e772d930452 [file] [log] [blame]
// 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.
import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter/services.dart';
void main() {
const TextStyle textStyle = const TextStyle();
const Color cursorColor = const Color.fromARGB(0xFF, 0xFF, 0x00, 0x00);
testWidgets('tapping on a partly visible editable brings it fully on screen', (WidgetTester tester) async {
final ScrollController scrollController = new ScrollController();
final TextEditingController controller = new TextEditingController();
final FocusNode focusNode = new FocusNode();
await tester.pumpWidget(new MaterialApp(
home: new Center(
child: new Container(
height: 300.0,
child: new ListView(
controller: scrollController,
children: <Widget>[
new EditableText(
controller: controller,
focusNode: focusNode,
style: textStyle,
cursorColor: cursorColor,
),
new Container(
height: 350.0,
),
],
),
),
),
));
// Scroll the EditableText half off screen.
final RenderBox render = tester.renderObject(find.byType(EditableText));
scrollController.jumpTo(render.size.height / 2);
await tester.pumpAndSettle();
expect(scrollController.offset, render.size.height / 2);
await tester.showKeyboard(find.byType(EditableText));
await tester.pumpAndSettle();
expect(scrollController.offset, 0.0);
});
testWidgets('editable comes back on screen when entering text while it is off-screen', (WidgetTester tester) async {
final ScrollController scrollController = new ScrollController(initialScrollOffset: 100.0);
final TextEditingController controller = new TextEditingController();
final FocusNode focusNode = new FocusNode();
await tester.pumpWidget(new MaterialApp(
home: new Center(
child: new Container(
height: 300.0,
child: new ListView(
controller: scrollController,
children: <Widget>[
new Container(
height: 350.0,
),
new EditableText(
controller: controller,
focusNode: focusNode,
style: textStyle,
cursorColor: cursorColor,
),
new Container(
height: 350.0,
),
],
),
),
),
));
// Focus the EditableText and scroll it off screen.
await tester.showKeyboard(find.byType(EditableText));
await tester.pumpAndSettle();
expect(focusNode.hasFocus, isTrue);
scrollController.jumpTo(0.0);
await tester.pumpAndSettle();
expect(scrollController.offset, 0.0);
expect(find.byType(EditableText), findsNothing);
// Entering text brings it back on screen.
tester.testTextInput.enterText('Hello');
await tester.pumpAndSettle();
expect(scrollController.offset, greaterThan(0.0));
expect(find.byType(EditableText), findsOneWidget);
});
testWidgets('focused multi-line editable scrolls caret back into view when typing', (WidgetTester tester) async {
final ScrollController scrollController = new ScrollController();
final TextEditingController controller = new TextEditingController();
final FocusNode focusNode = new FocusNode();
controller.text = 'Start\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEnd';
await tester.pumpWidget(new MaterialApp(
home: new Center(
child: new Container(
height: 300.0,
child: new ListView(
controller: scrollController,
children: <Widget>[
new EditableText(
maxLines: null, // multi-line
controller: controller,
focusNode: focusNode,
style: textStyle,
cursorColor: cursorColor,
),
],
),
),
),
));
// Bring keyboard up and verify that end of EditableText is not on screen.
await tester.showKeyboard(find.byType(EditableText));
await tester.pumpAndSettle();
scrollController.jumpTo(0.0);
await tester.pumpAndSettle();
final RenderBox render = tester.renderObject(find.byType(EditableText));
expect(render.size.height, greaterThan(500.0));
expect(scrollController.offset, 0.0);
// Enter text at end, which is off-screen.
final String textToEnter = '${controller.text} HELLO';
tester.testTextInput.updateEditingValue(new TextEditingValue(
text: textToEnter,
selection: new TextSelection.collapsed(offset: textToEnter.length),
));
await tester.pumpAndSettle();
// Caret scrolls into view.
expect(find.byType(EditableText), findsOneWidget);
expect(render.size.height, greaterThan(500.0));
expect(scrollController.offset, greaterThan(0.0));
});
}