appflowy-editor/test/legacy/undo_manager_test.dart

87 lines
2.6 KiB
Dart
Raw Normal View History

2022-09-13 17:33:26 +08:00
import 'dart:collection';
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy_editor/src/history/undo_manager.dart';
2022-09-13 17:33:26 +08:00
import 'package:flutter_test/flutter_test.dart';
void main() async {
setUpAll(() {
TestWidgetsFlutterBinding.ensureInitialized();
});
Node createEmptyEditorRoot() {
2022-09-13 17:33:26 +08:00
return Node(
type: 'editor',
children: LinkedList(),
attributes: {},
);
}
test("HistoryItem #1", () {
final document = Document(root: createEmptyEditorRoot());
2022-09-13 17:33:26 +08:00
final editorState = EditorState(document: document);
final historyItem = HistoryItem();
2022-10-09 14:30:55 +08:00
historyItem
.add(DeleteOperation([0], [TextNode(delta: Delta()..insert('0'))]));
historyItem
.add(DeleteOperation([0], [TextNode(delta: Delta()..insert('1'))]));
historyItem
.add(DeleteOperation([0], [TextNode(delta: Delta()..insert('2'))]));
2022-09-13 17:33:26 +08:00
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 = Document(root: createEmptyEditorRoot());
2022-09-13 17:33:26 +08:00
final editorState = EditorState(document: document);
final historyItem = HistoryItem();
2022-10-09 14:30:55 +08:00
historyItem
.add(DeleteOperation([0], [TextNode(delta: Delta()..insert('0'))]));
2022-09-13 17:33:26 +08:00
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'));
});
2023-03-24 13:59:03 +01:00
test("HistoryItem sealed", () {
final historyItem = HistoryItem();
historyItem.add(
DeleteOperation([0], [TextNode(delta: Delta()..insert('0'))]),
);
historyItem.seal();
expect(historyItem.sealed, true);
});
2022-09-13 17:33:26 +08:00
}
bool isInsertAndPathEqual(Operation operation, Path path, [String? content]) {
if (operation is! InsertOperation) {
return false;
}
2022-10-09 23:53:18 +08:00
if (!operation.path.equals(path)) {
2022-09-13 17:33:26 +08:00
return false;
}
final firstNode = operation.nodes.first;
2022-09-13 17:33:26 +08:00
if (firstNode is! TextNode) {
return false;
}
if (content == null) {
return true;
}
2022-10-09 14:30:55 +08:00
return firstNode.delta.toPlainText() == content;
2022-09-13 17:33:26 +08:00
}