瀏覽代碼

Make getTrimmedLength more robust

xuty 3 年之前
父節點
當前提交
214823d91e
共有 2 個文件被更改,包括 41 次插入2 次删除
  1. 8 2
      lib/src/core/buffer/line.dart
  2. 33 0
      test/src/core/buffer/line_test.dart

+ 8 - 2
lib/src/core/buffer/line.dart

@@ -212,8 +212,14 @@ class BufferLine {
   }
 
   int getTrimmedLength([int? cols]) {
-    if (cols == null) {
-      cols = _data.length ~/ _cellSize;
+    final maxCols = _data.length ~/ _cellSize;
+
+    if (cols == null || cols > maxCols) {
+      cols = maxCols;
+    }
+
+    if (cols <= 0) {
+      return 0;
     }
 
     for (var i = cols - 1; i >= 0; i--) {

+ 33 - 0
test/src/core/buffer/line_test.dart

@@ -53,5 +53,38 @@ void main() {
 
       expect(line.getTrimmedLength(), equals(text.length));
     });
+
+    test('can get trimmed length with wide characters', () {
+      final terminal = Terminal();
+      final text = '😀😁😂🤣😃';
+
+      terminal.write(text);
+
+      expect(terminal.buffer.lines[0].getTrimmedLength(), equals(text.length));
+    });
+
+    test('can handle length larger than the line', () {
+      final line = BufferLine(10);
+
+      final text = 'ABCDEF';
+
+      for (var i = 0; i < text.length; i++) {
+        line.setCodePoint(i, text.codeUnitAt(i));
+      }
+
+      expect(line.getTrimmedLength(1000), equals(text.length));
+    });
+
+    test('can handle negative start', () {
+      final line = BufferLine(10);
+
+      final text = 'ABCDEF';
+
+      for (var i = 0; i < text.length; i++) {
+        line.setCodePoint(i, text.codeUnitAt(i));
+      }
+
+      expect(line.getTrimmedLength(-1000), equals(0));
+    });
   });
 }