| 
									
										
										
										
											2023-06-14 22:16:33 +08: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 07:04:24 +05:00
										 |  |  |     client = findTextInputClient(); | 
					
						
							| 
									
										
										
										
											2023-06-14 22:16:33 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   final WidgetTester tester; | 
					
						
							| 
									
										
										
										
											2023-06-29 07:04:24 +05:00
										 |  |  |   late final TextInputClient client; | 
					
						
							| 
									
										
										
										
											2023-06-14 22:16:33 +08: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 07:04:24 +05: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 22:16:33 +08:00
										 |  |  |       ), | 
					
						
							| 
									
										
										
										
											2023-06-29 07:04:24 +05:00
										 |  |  |       composing: TextRange.empty, | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |     client.updateEditingValue(textEditingValue); | 
					
						
							| 
									
										
										
										
											2023-06-14 22:16:33 +08:00
										 |  |  |     await tester.pumpAndSettle(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-29 07:04:24 +05:00
										 |  |  |   TextInputClient findTextInputClient() { | 
					
						
							| 
									
										
										
										
											2023-06-14 22:16:33 +08:00
										 |  |  |     final finder = find.byType(KeyboardServiceWidget); | 
					
						
							|  |  |  |     final KeyboardServiceWidgetState state = tester.state(finder); | 
					
						
							| 
									
										
										
										
											2023-06-29 07:04:24 +05:00
										 |  |  |     return state.textInputService as TextInputClient; | 
					
						
							| 
									
										
										
										
											2023-06-14 22:16:33 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | } |