Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 28 additions & 6 deletions lib/src/input_method_engine.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ class ImeSimulator {
String textToType, {
Finder? finder,
GetDeltaTextInputClient? getter,
bool settle = true,
int extraPumps = 0,
}) async {
final imeClient = _findImeClient(finder: finder, getter: getter);

Expand All @@ -50,11 +52,16 @@ class ImeSimulator {
"The target widget doesn't have a text selection to type into.");

for (final character in textToType.characters) {
await _typeCharacter(imeClient, character);
await _typeCharacter(imeClient, character, settle: settle, extraPumps: extraPumps);
}
}

Future<void> _typeCharacter(DeltaTextInputClient imeClient, String character) async {
Future<void> _typeCharacter(
DeltaTextInputClient imeClient,
String character, {
bool settle = true,
int extraPumps = 0,
}) async {
assert(imeClient.currentTextEditingValue != null);
assert(imeClient.currentTextEditingValue!.selection.extentOffset != -1);

Expand Down Expand Up @@ -93,15 +100,17 @@ class ImeSimulator {
// await _sendDeltasThroughChannel(deltas);

// Let the app handle the deltas, however long it takes.
await _tester.pumpAndSettle();
await _maybeSettleOrExtraPumps(settle: settle, extraPumps: extraPumps);
}

/// Simulates the user pressing the tab button on a software keyboard.
Future<void> pressTab({
Finder? finder,
GetDeltaTextInputClient? getter,
bool settle = true,
int extraPumps = 0,
}) async {
await typeText('\t');
await typeText('\t', settle: settle, extraPumps: extraPumps);
}

/// Simulates the user pressing the backspace button.
Expand All @@ -111,6 +120,8 @@ class ImeSimulator {
Future<void> backspace({
Finder? finder,
GetDeltaTextInputClient? getter,
bool settle = true,
int extraPumps = 0,
}) async {
final imeClient = _findImeClient(finder: finder, getter: getter);

Expand Down Expand Up @@ -152,7 +163,7 @@ class ImeSimulator {
// await _sendDeltasThroughChannel(deltas);

// Let the app handle the deltas, however long it takes.
await _tester.pumpAndSettle();
await _maybeSettleOrExtraPumps(settle: settle, extraPumps: extraPumps);
}

/// Simulates dispatching arbitrary deltas.
Expand All @@ -163,13 +174,15 @@ class ImeSimulator {
List<TextEditingDelta> deltas, {
Finder? finder,
GetDeltaTextInputClient? getter,
bool settle = true,
int extraPumps = 0,
}) async {
final imeClient = _findImeClient(finder: finder, getter: getter);

imeClient.updateEditingValueWithDeltas(deltas);

// Let the app handle the deltas.
await _tester.pumpAndSettle();
await _maybeSettleOrExtraPumps(settle: settle, extraPumps: extraPumps);
}

DeltaTextInputClient _findImeClient({
Expand Down Expand Up @@ -270,6 +283,15 @@ class ImeSimulator {
return 'TextAffinity.upstream';
}
}

Future<void> _maybeSettleOrExtraPumps({bool settle = true, int extraPumps = 0}) async {
if (settle) {
await _tester.pumpAndSettle();
}
for (int i = 0; i < extraPumps; i += 1) {
await _tester.pump();
}
}
}

typedef GetDeltaTextInputClient = DeltaTextInputClient Function();
Loading