Skip to content

Commit 9a1d4dd

Browse files
committed
Fix subtle bugs.
1 parent f32c6cb commit 9a1d4dd

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

undofx/src/main/java/org/fxmisc/undo/impl/UndoManagerImpl.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -207,13 +207,15 @@ private void addChange(C change) {
207207
if(merged.isPresent()) {
208208
if (isIdentity.test(merged.get())) {
209209
canMerge = false;
210+
queue.push(); // clears the future
210211
} else {
211212
canMerge = true;
212213
queue.push(merged.get());
213214
}
214215
} else {
215216
canMerge = true;
216-
queue.push(prev, change);
217+
queue.next();
218+
queue.push(change);
217219
}
218220
} else {
219221
queue.push(change);

undofx/src/test/java/org/fxmisc/undo/impl/UndoManagerTest.java

+36
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import java.util.concurrent.CountDownLatch;
77

88
import javafx.beans.property.SimpleIntegerProperty;
9+
910
import org.fxmisc.undo.UndoManager;
11+
import org.fxmisc.undo.UndoManager.UndoPosition;
1012
import org.fxmisc.undo.UndoManagerFactory;
1113
import org.junit.Test;
1214
import org.reactfx.EventSource;
@@ -63,6 +65,40 @@ public void testMark() {
6365
assertFalse(um.atMarkedPositionProperty().get());
6466
}
6567

68+
@Test
69+
public void testPositionValidAfterAddingAChange() {
70+
EventSource<Integer> changes = new EventSource<>();
71+
UndoManager um = UndoManagerFactory.unlimitedHistoryUndoManager(changes, c -> c, changes::push);
72+
73+
changes.push(1);
74+
UndoPosition pos = um.getCurrentPosition();
75+
changes.push(1);
76+
assertTrue(pos.isValid());
77+
}
78+
79+
@Test
80+
public void testPositionInvalidAfterMerge() {
81+
EventSource<Integer> changes = new EventSource<>();
82+
UndoManager um = UndoManagerFactory.unlimitedHistoryUndoManager(
83+
changes, c -> -c, changes::push, (c1, c2) -> Optional.of(c1 + c2));
84+
85+
changes.push(1);
86+
UndoPosition pos = um.getCurrentPosition();
87+
changes.push(1);
88+
assertFalse(pos.isValid());
89+
}
90+
91+
@Test
92+
public void testRedoUnavailableAfterAnnihilation() {
93+
EventSource<Integer> changes = new EventSource<>();
94+
UndoManager um = UndoManagerFactory.unlimitedHistoryUndoManager(
95+
changes, c -> -c, changes::push, (c1, c2) -> Optional.of(c1 + c2), c -> c == 0);
96+
97+
changes.push(1);
98+
changes.push(-1);
99+
assertFalse(um.isRedoAvailable());
100+
}
101+
66102
@Test
67103
public void zeroHistoryUndoManagerMark() {
68104
EventSource<Integer> changes = new EventSource<>();

0 commit comments

Comments
 (0)