forked from FirebaseExtended/firepad
-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathundo-manager.spec.ts
132 lines (116 loc) · 4.07 KB
/
undo-manager.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import { Cursor } from "../src/cursor";
import { OperationMeta } from "../src/operation-meta";
import { TextOperation } from "../src/text-operation";
import { IUndoManager, UndoManager } from "../src/undo-manager";
import { IWrappedOperation, WrappedOperation } from "../src/wrapped-operation";
describe("Undo Manager", () => {
let undoManager: IUndoManager;
let wrappedOperation: IWrappedOperation;
beforeAll(() => {
const operation = new TextOperation().retain(15, null);
const operationMeta = new OperationMeta(new Cursor(0, 0), new Cursor(4, 9));
wrappedOperation = new WrappedOperation(operation, operationMeta);
});
beforeEach(() => {
undoManager = new UndoManager();
});
afterEach(() => {
undoManager.dispose();
undoManager = null;
});
describe("#dispose", () => {
it("should cleanup Undo stack", () => {
undoManager.add(wrappedOperation);
undoManager.dispose();
expect(undoManager.canUndo()).toEqual(false);
});
it("should cleanup Redo stack", () => {
undoManager.add(wrappedOperation);
undoManager.dispose();
expect(undoManager.canRedo()).toEqual(false);
});
});
describe("#add", () => {
it("should add operation to Undo stack in normal state", () => {
undoManager.add(wrappedOperation);
expect(undoManager.canUndo()).toEqual(true);
});
it("should add operation to Redo stack in undoing state", () => {
undoManager.add(wrappedOperation);
undoManager.performUndo(() => {
undoManager.add(wrappedOperation.invert(""));
});
expect(undoManager.canRedo()).toEqual(true);
});
it("should add operation to Undo stack in redoing state", () => {
undoManager.add(wrappedOperation);
undoManager.performUndo(() => {
undoManager.add(wrappedOperation.invert(""));
});
undoManager.performRedo(() => {
undoManager.add(wrappedOperation);
});
expect(undoManager.canUndo()).toEqual(true);
});
it("should compose with last operation if exists and compose set to true", () => {
const nextOperation = wrappedOperation.clone();
undoManager = new UndoManager(1);
undoManager.add(wrappedOperation);
undoManager.add(nextOperation, true);
undoManager.performUndo(() => {
/** Empty Callback */
});
expect(undoManager.canUndo()).toEqual(false);
});
it("should not add more operations than the limit given", () => {
undoManager = new UndoManager(1);
undoManager.add(wrappedOperation);
undoManager.add(wrappedOperation.invert("Test"));
undoManager.performUndo(() => {
/** Empty Callback */
});
expect(undoManager.canUndo()).toEqual(false);
});
it("should throw error if the limit is set to zero", () => {
const fn = () => new UndoManager(0);
expect(fn).toThrowError();
});
});
describe("#last", () => {
it("should return last operation in Undo stack", () => {
undoManager.add(wrappedOperation);
expect(undoManager.last()).toEqual(wrappedOperation);
});
});
describe("#transform", () => {
it("should transform Undo/Redo stack to incoming operation", () => {
undoManager.add(wrappedOperation);
const operation = new TextOperation()
.retain(15, null)
.insert("Hello", null);
undoManager.transform(operation);
expect(undoManager.last()).not.toEqual(wrappedOperation);
});
});
describe("#isUndoing", () => {
it("should return true if the manager is undoing an operation", (done) => {
undoManager.add(wrappedOperation);
undoManager.performUndo(() => {
expect(undoManager.isUndoing()).toEqual(true);
done();
});
});
});
describe("#isRedoing", () => {
it("should return true if the manager is redoing an operation", (done) => {
undoManager.add(wrappedOperation);
undoManager.performUndo(() => {
undoManager.add(wrappedOperation.invert(""));
});
undoManager.performRedo(() => {
expect(undoManager.isRedoing()).toEqual(true);
done();
});
});
});
});