2023-06-14 14:16:33 +00:00
|
|
|
import 'package:appflowy_editor/appflowy_editor.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
|
|
|
|
extension IME on WidgetTester {
|
|
|
|
IMESimulator get ime => IMESimulator(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
class IMESimulator {
|
|
|
|
IMESimulator(this.tester) {
|
2023-06-29 02:04:24 +00:00
|
|
|
client = findTextInputClient();
|
2023-06-14 14:16:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
final WidgetTester tester;
|
2023-06-29 02:04:24 +00:00
|
|
|
late final TextInputClient client;
|
2023-06-14 14:16:33 +00:00
|
|
|
|
|
|
|
Future<void> insertText(String text) async {
|
|
|
|
for (final c in text.characters) {
|
|
|
|
await insertCharacter(c);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> insertCharacter(String character) async {
|
|
|
|
final value = client.currentTextEditingValue;
|
|
|
|
if (value == null) {
|
|
|
|
assert(false);
|
|
|
|
return;
|
|
|
|
}
|
2023-06-29 02:04:24 +00:00
|
|
|
final text = value.text
|
|
|
|
.replaceRange(value.selection.start, value.selection.end, character);
|
|
|
|
final textEditingValue = TextEditingValue(
|
|
|
|
text: text,
|
|
|
|
selection: TextSelection.collapsed(
|
|
|
|
offset: value.selection.baseOffset + 1,
|
2023-06-14 14:16:33 +00:00
|
|
|
),
|
2023-06-29 02:04:24 +00:00
|
|
|
);
|
|
|
|
client.updateEditingValue(textEditingValue);
|
2023-06-14 14:16:33 +00:00
|
|
|
await tester.pumpAndSettle();
|
|
|
|
}
|
|
|
|
|
2023-06-29 02:04:24 +00:00
|
|
|
TextInputClient findTextInputClient() {
|
2023-06-14 14:16:33 +00:00
|
|
|
final finder = find.byType(KeyboardServiceWidget);
|
|
|
|
final KeyboardServiceWidgetState state = tester.state(finder);
|
2023-06-29 02:04:24 +00:00
|
|
|
return state.textInputService as TextInputClient;
|
2023-06-14 14:16:33 +00:00
|
|
|
}
|
|
|
|
}
|