Просмотр исходного кода

fix(test): test replaceTexts, textNodes.length > texts.length

Lucas.Xu 2 лет назад
Родитель
Сommit
1f44d4de33

+ 8 - 0
frontend/appflowy_flutter/packages/appflowy_editor/lib/src/core/transform/transaction.dart

@@ -337,6 +337,7 @@ extension TextTransaction on Transaction {
     }
 
     if (textNodes.length > texts.length) {
+      final length = textNodes.length;
       for (var i = 0; i < textNodes.length; i++) {
         final textNode = textNodes[i];
         if (i == 0) {
@@ -346,6 +347,13 @@ extension TextTransaction on Transaction {
             textNode.toPlainText().length,
             texts.first,
           );
+        } else if (i == length - 1 && texts.length >= 2) {
+          replaceText(
+            textNode,
+            0,
+            selection.endIndex,
+            texts.last,
+          );
         } else if (i < texts.length - 1) {
           replaceText(
             textNode,

+ 2 - 2
frontend/appflowy_flutter/packages/appflowy_editor/test/command/command_extension_test.dart

@@ -26,11 +26,11 @@ void main() {
           .editorState.service.selectionService.currentSelectedNodes
           .whereType<TextNode>()
           .toList(growable: false);
-      final text = editor.editorState.getTextInSelection(
+      final texts = editor.editorState.getTextInSelection(
         textNodes.normalized,
         selection.normalized,
       );
-      expect(text, 'me\nto\nAppfl');
+      expect(texts, ['me', 'to', 'Appfl']);
     });
   });
 }

+ 37 - 0
frontend/appflowy_flutter/packages/appflowy_editor/test/core/transform/transaction_test.dart

@@ -91,6 +91,43 @@ void main() async {
       expect(textNodes[3].toPlainText(), 'ABC456789');
     });
 
+    testWidgets('test replaceTexts, textNodes.length >> texts.length',
+        (tester) async {
+      TestWidgetsFlutterBinding.ensureInitialized();
+
+      final editor = tester.editor
+        ..insertTextNode('0123456789')
+        ..insertTextNode('0123456789')
+        ..insertTextNode('0123456789')
+        ..insertTextNode('0123456789')
+        ..insertTextNode('0123456789');
+      await editor.startTesting();
+      await tester.pumpAndSettle();
+
+      expect(editor.documentLength, 5);
+
+      final selection = Selection(
+        start: Position(path: [0], offset: 4),
+        end: Position(path: [4], offset: 4),
+      );
+      final transaction = editor.editorState.transaction;
+      var textNodes = [0, 1, 2, 3, 4]
+          .map((e) => editor.nodeAtPath([e])!)
+          .whereType<TextNode>()
+          .toList(growable: false);
+      final texts = ['ABC'];
+      transaction.replaceTexts(textNodes, selection, texts);
+      editor.editorState.apply(transaction);
+      await tester.pumpAndSettle();
+
+      expect(editor.documentLength, 1);
+      textNodes = [0]
+          .map((e) => editor.nodeAtPath([e])!)
+          .whereType<TextNode>()
+          .toList(growable: false);
+      expect(textNodes[0].toPlainText(), '0123ABC');
+    });
+
     testWidgets('test replaceTexts, textNodes.length < texts.length',
         (tester) async {
       TestWidgetsFlutterBinding.ensureInitialized();