If an exception ocures while reconstructing the instance, no

modification is made; see #155
This commit is contained in:
hneemann 2019-05-13 12:32:38 +02:00
parent 7f789ec83d
commit 25c8b4e886
2 changed files with 61 additions and 5 deletions

View File

@ -103,10 +103,11 @@ public class UndoManager<A extends HistoryComponent<A>> {
public void undo() throws ModifyException { public void undo() throws ModifyException {
if (undoAvailable()) { if (undoAvailable()) {
try { try {
A newActual = initial.createDeepCopy();
for (int i = 0; i < modificationCounter - 1; i++)
modifications.get(i).modify(newActual);
modificationCounter--; modificationCounter--;
actual = initial.createDeepCopy(); actual = newActual;
for (int i = 0; i < modificationCounter; i++)
modifications.get(i).modify(actual);
fireChangedEvent(); fireChangedEvent();
} catch (ModifyException e) { } catch (ModifyException e) {
throw createTrace(e); throw createTrace(e);

View File

@ -9,6 +9,8 @@ import junit.framework.TestCase;
public class UndoManagerTest extends TestCase { public class UndoManagerTest extends TestCase {
private int changedCount;
public static class MyString implements HistoryComponent<MyString> { public static class MyString implements HistoryComponent<MyString> {
private String text; private String text;
@ -44,6 +46,21 @@ public class UndoManagerTest extends TestCase {
} }
} }
public static class Error implements Modification<MyString> {
private int count;
@Override
public void modify(MyString myString) throws ModifyException {
if (count++ > 0)
throw new ModifyException("Error");
}
@Override
public String toString() {
return "Error";
}
}
public void testSimple() throws ModifyException { public void testSimple() throws ModifyException {
UndoManager<MyString> mm = new UndoManager<>(new MyString("initial")); UndoManager<MyString> mm = new UndoManager<>(new MyString("initial"));
@ -53,7 +70,7 @@ public class UndoManagerTest extends TestCase {
mm.apply(new Append("_1")); mm.apply(new Append("_1"));
assertEquals("initial_1", mm.getActual().text); assertEquals("initial_1", mm.getActual().text);
assertEquals("Append _1",mm.getUndoModification().toString()); assertEquals("Append _1", mm.getUndoModification().toString());
assertTrue(mm.undoAvailable()); assertTrue(mm.undoAvailable());
assertFalse(mm.redoAvailable()); assertFalse(mm.redoAvailable());
@ -67,7 +84,7 @@ public class UndoManagerTest extends TestCase {
assertTrue(mm.undoAvailable()); assertTrue(mm.undoAvailable());
assertTrue(mm.redoAvailable()); assertTrue(mm.redoAvailable());
assertEquals("Append _2",mm.getRedoModification().toString()); assertEquals("Append _2", mm.getRedoModification().toString());
mm.redo(); mm.redo();
assertEquals("initial_1_2", mm.getActual().text); assertEquals("initial_1_2", mm.getActual().text);
assertTrue(mm.undoAvailable()); assertTrue(mm.undoAvailable());
@ -141,4 +158,42 @@ public class UndoManagerTest extends TestCase {
mm.undo(); mm.undo();
assertEquals("initial", mm.getActual().text); assertEquals("initial", mm.getActual().text);
} }
public void testListener() throws ModifyException {
UndoManager<MyString> mm = new UndoManager<>(new MyString("initial"));
mm.addListener(() -> changedCount++);
mm.apply(new Append("_1"));
assertEquals(1, changedCount);
assertEquals("initial_1", mm.getActual().text);
mm.undo();
assertEquals(2, changedCount);
assertEquals("initial", mm.getActual().text);
mm.apply(new Append("_5"));
assertEquals(3, changedCount);
assertEquals("initial_5", mm.getActual().text);
mm.undo();
assertEquals(4, changedCount);
assertEquals("initial", mm.getActual().text);
}
public void testUndoError() throws ModifyException {
UndoManager<MyString> mm = new UndoManager<>(new MyString("initial"));
mm.apply(new Append("_1"));
mm.apply(new Append("_2"));
mm.apply(new Error());
mm.apply(new Append("_3"));
mm.apply(new Append("_4"));
try {
mm.undo();
fail();
} catch (ModifyException e) {
assertEquals("initial_1_2_3_4", mm.getActual().text);
String m = e.getMessage();
assertTrue(m.contains("Append _1"));
assertTrue(m.contains("Append _2"));
assertTrue(m.contains("Append _3"));
assertTrue(m.contains("Append _4"));
}
}
} }