| // Copyright 2015 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_test/flutter_test.dart'; |
| import 'package:flutter/material.dart'; |
| import 'package:flutter/rendering.dart'; |
| import 'package:flutter/services.dart'; |
| import 'package:mojo_services/keyboard/keyboard.mojom.dart'; |
| import 'package:test/test.dart'; |
| |
| import '../services/mock_services.dart'; |
| |
| class MockKeyboard implements KeyboardService { |
| KeyboardClient client; |
| |
| void show(KeyboardClientStub client, KeyboardType type) { |
| this.client = client.impl; |
| } |
| |
| void showByRequest() {} |
| |
| void hide() {} |
| |
| void setText(String text) {} |
| |
| void setSelection(int start, int end) {} |
| } |
| |
| void main() { |
| MockKeyboard mockKeyboard = new MockKeyboard(); |
| serviceMocker.registerMockService(KeyboardServiceName, mockKeyboard); |
| |
| test('Editable text has consistent width', () { |
| testWidgets((WidgetTester tester) { |
| GlobalKey inputKey = new GlobalKey(); |
| String inputValue; |
| |
| Widget builder() { |
| return new Center( |
| child: new Material( |
| child: new Input( |
| key: inputKey, |
| placeholder: 'Placeholder', |
| onChanged: (String value) { inputValue = value; } |
| ) |
| ) |
| ); |
| } |
| |
| tester.pumpWidget(builder()); |
| |
| Element input = tester.findElementByKey(inputKey); |
| Size emptyInputSize = (input.renderObject as RenderBox).size; |
| |
| // Simulate entry of text through the keyboard. |
| expect(mockKeyboard.client, isNotNull); |
| const String testValue = 'Test'; |
| mockKeyboard.client.setComposingText(testValue, testValue.length); |
| |
| // Check that the onChanged event handler fired. |
| expect(inputValue, equals(testValue)); |
| |
| tester.pumpWidget(builder()); |
| |
| // Check that the Input with text has the same size as the empty Input. |
| expect((input.renderObject as RenderBox).size, equals(emptyInputSize)); |
| }); |
| }); |
| |
| test('Cursor blinks', () { |
| testWidgets((WidgetTester tester) { |
| GlobalKey inputKey = new GlobalKey(); |
| |
| Widget builder() { |
| return new Center( |
| child: new Material( |
| child: new Input( |
| key: inputKey, |
| placeholder: 'Placeholder' |
| ) |
| ) |
| ); |
| } |
| |
| tester.pumpWidget(builder()); |
| |
| EditableTextState editableText = tester.findStateOfType(EditableTextState); |
| |
| // Check that the cursor visibility toggles after each blink interval. |
| void checkCursorToggle() { |
| bool initialShowCursor = editableText.cursorCurrentlyVisible; |
| tester.async.elapse(editableText.cursorBlinkInterval); |
| expect(editableText.cursorCurrentlyVisible, equals(!initialShowCursor)); |
| tester.async.elapse(editableText.cursorBlinkInterval); |
| expect(editableText.cursorCurrentlyVisible, equals(initialShowCursor)); |
| tester.async.elapse(editableText.cursorBlinkInterval ~/ 10); |
| expect(editableText.cursorCurrentlyVisible, equals(initialShowCursor)); |
| tester.async.elapse(editableText.cursorBlinkInterval); |
| expect(editableText.cursorCurrentlyVisible, equals(!initialShowCursor)); |
| tester.async.elapse(editableText.cursorBlinkInterval); |
| expect(editableText.cursorCurrentlyVisible, equals(initialShowCursor)); |
| } |
| |
| checkCursorToggle(); |
| |
| // Try the test again with a nonempty EditableText. |
| mockKeyboard.client.setComposingText('X', 1); |
| checkCursorToggle(); |
| }); |
| }); |
| |
| test('Selection remains valid', () { |
| testWidgets((WidgetTester tester) { |
| GlobalKey inputKey = new GlobalKey(); |
| |
| Widget builder() { |
| return new Center( |
| child: new Material( |
| child: new Input( |
| key: inputKey, |
| placeholder: 'Placeholder' |
| ) |
| ) |
| ); |
| } |
| |
| tester.pumpWidget(builder()); |
| |
| const String testValue = 'ABC'; |
| mockKeyboard.client.commitText(testValue, testValue.length); |
| InputState input = tester.findStateOfType(InputState); |
| |
| // Delete characters and verify that the selection follows the length |
| // of the text. |
| for (int i = 0; i < testValue.length; i++) { |
| mockKeyboard.client.deleteSurroundingText(1, 0); |
| expect(input.editableValue.selection.start, equals(testValue.length - i - 1)); |
| } |
| |
| // Delete a characters when the text is empty. The selection should |
| // remain at zero. |
| mockKeyboard.client.deleteSurroundingText(1, 0); |
| expect(input.editableValue.selection.start, equals(0)); |
| }); |
| }); |
| |
| test('hideText control test', () { |
| testWidgets((WidgetTester tester) { |
| GlobalKey inputKey = new GlobalKey(); |
| |
| Widget builder() { |
| return new Center( |
| child: new Material( |
| child: new Input( |
| key: inputKey, |
| hideText: true, |
| placeholder: 'Placeholder' |
| ) |
| ) |
| ); |
| } |
| |
| tester.pumpWidget(builder()); |
| |
| const String testValue = 'ABC'; |
| mockKeyboard.client.commitText(testValue, testValue.length); |
| |
| tester.pump(); |
| }); |
| }); |
| } |