fix: redo/undo error

This commit is contained in:
Vincent Chan 2022-09-13 17:33:26 +08:00
commit a01a7beb8a

View file

@ -0,0 +1,76 @@
import 'dart:collection';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy_editor/src/undo_manager.dart';
import 'package:flutter_test/flutter_test.dart';
void main() async {
setUpAll(() {
TestWidgetsFlutterBinding.ensureInitialized();
});
Node _createEmptyEditorRoot() {
return Node(
type: 'editor',
children: LinkedList(),
attributes: {},
);
}
test("HistoryItem #1", () {
final document = StateTree(root: _createEmptyEditorRoot());
final editorState = EditorState(document: document);
final historyItem = HistoryItem();
historyItem.add(DeleteOperation(
[0], [TextNode(type: 'text', delta: Delta()..insert('0'))]));
historyItem.add(DeleteOperation(
[0], [TextNode(type: 'text', delta: Delta()..insert('1'))]));
historyItem.add(DeleteOperation(
[0], [TextNode(type: 'text', delta: Delta()..insert('2'))]));
final transaction = historyItem.toTransaction(editorState);
assert(isInsertAndPathEqual(transaction.operations[0], [0], '2'));
assert(isInsertAndPathEqual(transaction.operations[1], [0], '1'));
assert(isInsertAndPathEqual(transaction.operations[2], [0], '0'));
});
test("HistoryItem #2", () {
final document = StateTree(root: _createEmptyEditorRoot());
final editorState = EditorState(document: document);
final historyItem = HistoryItem();
historyItem.add(DeleteOperation(
[0], [TextNode(type: 'text', delta: Delta()..insert('0'))]));
historyItem
.add(UpdateOperation([0], {"subType": "number"}, {"subType": null}));
historyItem.add(DeleteOperation([0], [TextNode.empty(), TextNode.empty()]));
historyItem.add(DeleteOperation([0], [TextNode.empty()]));
final transaction = historyItem.toTransaction(editorState);
assert(isInsertAndPathEqual(transaction.operations[0], [0]));
assert(isInsertAndPathEqual(transaction.operations[1], [0]));
assert(transaction.operations[2] is UpdateOperation);
assert(isInsertAndPathEqual(transaction.operations[3], [0], '0'));
});
}
bool isInsertAndPathEqual(Operation operation, Path path, [String? content]) {
if (operation is! InsertOperation) {
return false;
}
if (!pathEquals(operation.path, path)) {
return false;
}
final firstNode = operation.nodes[0];
if (firstNode is! TextNode) {
return false;
}
if (content == null) {
return true;
}
return firstNode.delta.toRawString() == content;
}