From: Stefan F. <ste...@us...> - 2012-07-20 07:59:18
|
.classpath | 4 dev/null |binary junit/lib/fest-2.0M6/fest-assert-core-2.0M6.jar |binary junit/lib/fest-2.0M6/fest-util-1.2.1.jar |binary junit/rails/game/state/AbstractItemImpl.java | 8 junit/rails/game/state/ArrayListStateTest.java | 245 +++++++++++++++++++++++ junit/rails/game/state/BooleanStateTest.java | 38 +-- junit/rails/game/state/GenericStateTest.java | 54 ++--- junit/rails/game/state/HashMapStateTest.java | 177 ++++++++++++++++ junit/rails/game/state/HashSetStateTest.java | 166 +++++++++++++++ junit/rails/game/state/IntegerStateTest.java | 54 ++--- junit/rails/game/state/StateImpl.java | 6 junit/rails/game/state/StateTestUtils.java | 7 junit/rails/game/state/StringStateTest.java | 72 +++--- src/rails/game/state/AbstractItem.java | 5 src/rails/game/state/ArrayListChange.java | 30 +- src/rails/game/state/ArrayListMultimapState.java | 5 src/rails/game/state/ArrayListState.java | 73 +++++- src/rails/game/state/BooleanChange.java | 11 - src/rails/game/state/BooleanState.java | 2 src/rails/game/state/Context.java | 6 src/rails/game/state/GenericState.java | 5 src/rails/game/state/GenericStateChange.java | 23 -- src/rails/game/state/HashMapChange.java | 19 + src/rails/game/state/HashMapState.java | 113 ++++++++-- src/rails/game/state/HashMultimapState.java | 2 src/rails/game/state/HashSetChange.java | 21 + src/rails/game/state/HashSetState.java | 6 src/rails/game/state/IntegerChange.java | 11 - src/rails/game/state/IntegerState.java | 2 src/rails/game/state/Manager.java | 5 src/rails/game/state/MultimapChange.java | 15 - src/rails/game/state/Observable.java | 11 + src/rails/game/state/PortfolioChange.java | 13 - src/rails/game/state/PortfolioList.java | 5 src/rails/game/state/PortfolioMap.java | 4 src/rails/game/state/Root.java | 6 src/rails/game/state/State.java | 11 - src/rails/game/state/StringChange.java | 11 - src/rails/game/state/StringState.java | 2 src/rails/game/state/Wallet.java | 6 src/rails/game/state/WalletChange.java | 13 - 42 files changed, 983 insertions(+), 284 deletions(-) New commits: commit 4cc7610949e6fa611f086e2d89b7c2540c18e2a8 Author: Stefan Frey <ste...@we...> Date: Thu Jul 19 16:48:19 2012 +0200 changed only variable names diff --git a/junit/rails/game/state/ArrayListStateTest.java b/junit/rails/game/state/ArrayListStateTest.java index fb11df0..e858570 100644 --- a/junit/rails/game/state/ArrayListStateTest.java +++ b/junit/rails/game/state/ArrayListStateTest.java @@ -26,8 +26,8 @@ public class ArrayListStateTest { private Root root; private ChangeStack stack; - private ArrayListState<Item> state_default; - private ArrayListState<Item> state_init; + private ArrayListState<Item> stateDefault; + private ArrayListState<Item> stateInit; private Item oneItem; private Item anotherItem; @@ -41,8 +41,8 @@ public class ArrayListStateTest { oneItem = AbstractItemImpl.create(root, ONE_ITEM_ID); anotherItem = AbstractItemImpl.create(root, ANOTHER_ITEM_ID); - state_default = ArrayListState.create(root, DEFAULT_ID); - state_init = ArrayListState.create(root, INIT_ID, Lists.newArrayList(oneItem)); + stateDefault = ArrayListState.create(root, DEFAULT_ID); + stateInit = ArrayListState.create(root, INIT_ID, Lists.newArrayList(oneItem)); } // helper function to check the initial state after undo @@ -50,21 +50,21 @@ public class ArrayListStateTest { private void assertInitialStateAfterUndo() { stack.closeCurrentChangeSet(); stack.undo(); - assertEquals(state_default.view(), Lists.newArrayList()); - assertEquals(state_init.view(), Lists.newArrayList(oneItem)); + assertEquals(stateDefault.view(), Lists.newArrayList()); + assertEquals(stateInit.view(), Lists.newArrayList(oneItem)); stack.redo(); } private void assertTestAdd() { // TODO: replace with containsExactly, this does not work yet - assertThat(state_default).containsOnly(oneItem); - assertThat(state_init).containsSequence(oneItem, anotherItem); + assertThat(stateDefault).containsOnly(oneItem); + assertThat(stateInit).containsSequence(oneItem, anotherItem); } @Test public void testAdd() { - state_default.add(oneItem); - state_init.add(anotherItem); + stateDefault.add(oneItem); + stateInit.add(anotherItem); assertTestAdd(); // check undo @@ -74,20 +74,20 @@ public class ArrayListStateTest { @Test public void testAddIndex() { - state_init.add(0, anotherItem); + stateInit.add(0, anotherItem); // TODO: replace with containsExactly, this does not work yet - assertThat(state_init).containsSequence(anotherItem, oneItem); - state_init.add(2, anotherItem); + assertThat(stateInit).containsSequence(anotherItem, oneItem); + stateInit.add(2, anotherItem); // TODO: replace with containsExactly, this does not work yet - assertThat(state_init).containsSequence(anotherItem, oneItem, anotherItem); - state_init.add(1, oneItem); + assertThat(stateInit).containsSequence(anotherItem, oneItem, anotherItem); + stateInit.add(1, oneItem); // TODO: replace with containsExactly, this does not work yet - assertThat(state_init).containsSequence(anotherItem, oneItem, oneItem, anotherItem); + assertThat(stateInit).containsSequence(anotherItem, oneItem, oneItem, anotherItem); // Check undo assertInitialStateAfterUndo(); // TODO: replace with containsExactly, this does not work yet - assertThat(state_init).containsSequence(anotherItem, oneItem, oneItem, anotherItem); + assertThat(stateInit).containsSequence(anotherItem, oneItem, oneItem, anotherItem); } @Test @@ -95,13 +95,13 @@ public class ArrayListStateTest { // open new ChangeSet to test if it is still empty StateTestUtils.startActionChangeSet(root); try { - state_init.add(2, anotherItem); + stateInit.add(2, anotherItem); failBecauseExceptionWasNotThrown(IndexOutOfBoundsException.class); } catch (Exception e) { assertThat(e).isInstanceOf(IndexOutOfBoundsException.class); } try { - state_init.add(-1, anotherItem); + stateInit.add(-1, anotherItem); failBecauseExceptionWasNotThrown(IndexOutOfBoundsException.class); } catch (Exception e) { assertThat(e).isInstanceOf(IndexOutOfBoundsException.class); @@ -114,105 +114,105 @@ public class ArrayListStateTest { @Test public void testRemove() { // remove a non-existing item - assertFalse(state_default.remove(oneItem)); + assertFalse(stateDefault.remove(oneItem)); // remove an existing item - assertTrue(state_init.remove(oneItem)); + assertTrue(stateInit.remove(oneItem)); - assertThat(state_init).doesNotContain(oneItem); + assertThat(stateInit).doesNotContain(oneItem); // check undo assertInitialStateAfterUndo(); // ... and the redo - assertThat(state_init).doesNotContain(oneItem); + assertThat(stateInit).doesNotContain(oneItem); } @Test public void testMove() { - state_init.add(0, anotherItem); + stateInit.add(0, anotherItem); // TODO: replace with containsExactly, this does not work yet - assertThat(state_init).containsSequence(anotherItem, oneItem); + assertThat(stateInit).containsSequence(anotherItem, oneItem); - state_init.move(oneItem, 0); + stateInit.move(oneItem, 0); // TODO: replace with containsExactly, this does not work yet - assertThat(state_init).containsSequence(oneItem, anotherItem); + assertThat(stateInit).containsSequence(oneItem, anotherItem); - state_init.move(oneItem, 1); + stateInit.move(oneItem, 1); // TODO: replace with containsExactly, this does not work yet - assertThat(state_init).containsSequence(anotherItem, oneItem); + assertThat(stateInit).containsSequence(anotherItem, oneItem); // try illegal move and check if nothing has changed try { - state_init.move(oneItem, 2); + stateInit.move(oneItem, 2); failBecauseExceptionWasNotThrown(IndexOutOfBoundsException.class); } catch (Exception e) { assertThat(e).isInstanceOf(IndexOutOfBoundsException.class); } // TODO: replace with containsExactly, this does not work yet - assertThat(state_init).containsSequence(anotherItem, oneItem); + assertThat(stateInit).containsSequence(anotherItem, oneItem); // check undo assertInitialStateAfterUndo(); // ... and the redo // TODO: replace with containsExactly, this does not work yet - assertThat(state_init).containsSequence(anotherItem, oneItem); + assertThat(stateInit).containsSequence(anotherItem, oneItem); } @Test public void testContains() { - assertTrue(state_init.contains(oneItem)); - assertFalse(state_init.contains(anotherItem)); + assertTrue(stateInit.contains(oneItem)); + assertFalse(stateInit.contains(anotherItem)); } @Test public void testClear() { - state_init.add(anotherItem); - state_init.clear(); - assertTrue(state_init.isEmpty()); + stateInit.add(anotherItem); + stateInit.clear(); + assertTrue(stateInit.isEmpty()); // check undo and redo assertInitialStateAfterUndo(); - assertTrue(state_init.isEmpty()); + assertTrue(stateInit.isEmpty()); } @Test public void testView() { ImmutableList<Item> list = ImmutableList.of(oneItem); - assertEquals(list, state_init.view()); + assertEquals(list, stateInit.view()); } @Test public void testSize() { - assertEquals(0, state_default.size()); - assertEquals(1, state_init.size()); - state_init.add(anotherItem); - state_init.add(oneItem); - assertEquals(3, state_init.size()); + assertEquals(0, stateDefault.size()); + assertEquals(1, stateInit.size()); + stateInit.add(anotherItem); + stateInit.add(oneItem); + assertEquals(3, stateInit.size()); } @Test public void testIsEmpty() { - assertTrue(state_default.isEmpty()); - assertFalse(state_init.isEmpty()); + assertTrue(stateDefault.isEmpty()); + assertFalse(stateInit.isEmpty()); } @Test public void testIndexOf() { - state_init.add(anotherItem); - assertEquals(0, state_init.indexOf(oneItem)); - assertEquals(1, state_init.indexOf(anotherItem)); + stateInit.add(anotherItem); + assertEquals(0, stateInit.indexOf(oneItem)); + assertEquals(1, stateInit.indexOf(anotherItem)); // check if not included - assertEquals(-1, state_default.indexOf(oneItem)); + assertEquals(-1, stateDefault.indexOf(oneItem)); } @Test public void testGet() { - state_init.add(anotherItem); - assertSame(oneItem, state_init.get(0)); - assertSame(anotherItem, state_init.get(1)); + stateInit.add(anotherItem); + assertSame(oneItem, stateInit.get(0)); + assertSame(anotherItem, stateInit.get(1)); // check index out of bound try { - state_init.get(2); + stateInit.get(2); failBecauseExceptionWasNotThrown(IndexOutOfBoundsException.class); } catch (Exception e) { assertThat(e).isInstanceOf(IndexOutOfBoundsException.class); @@ -220,21 +220,21 @@ public class ArrayListStateTest { } private void assertTestIterator() { - Iterator<Item> it = state_init.iterator(); + Iterator<Item> it = stateInit.iterator(); assertSame(oneItem,it.next()); assertSame(anotherItem,it.next()); // iterator is finished assertFalse(it.hasNext()); // iterator is an immutable copy, thus not changed by adding a new item - state_init.add(oneItem); + stateInit.add(oneItem); assertFalse(it.hasNext()); // remove the last added item - state_init.remove(state_init.size()-1); + stateInit.remove(stateInit.size()-1); } @Test public void testIterator() { - state_init.add(anotherItem); + stateInit.add(anotherItem); assertTestIterator(); // check initial state after undo assertInitialStateAfterUndo(); diff --git a/junit/rails/game/state/BooleanStateTest.java b/junit/rails/game/state/BooleanStateTest.java index 51427af..c40fce5 100644 --- a/junit/rails/game/state/BooleanStateTest.java +++ b/junit/rails/game/state/BooleanStateTest.java @@ -13,50 +13,50 @@ public class BooleanStateTest { private Root root; private ChangeStack stack; - private BooleanState state_default; - private BooleanState state_init; + private BooleanState stateDefault; + private BooleanState stateInit; @Before public void setUp() { root = StateTestUtils.setUpRoot(); - state_default = BooleanState.create(root, DEFAULT_ID); - state_init = BooleanState.create(root, INIT_ID, true); + stateDefault = BooleanState.create(root, DEFAULT_ID); + stateInit = BooleanState.create(root, INIT_ID, true); stack = root.getStateManager().getChangeStack(); } @Test public void testValue() { - assertFalse(state_default.value()); - assertTrue(state_init.value()); + assertFalse(stateDefault.value()); + assertTrue(stateInit.value()); } @Test public void testSet() { - state_default.set(true); - assertTrue(state_default.value()); - state_init.set(false); - assertFalse(state_init.value()); + stateDefault.set(true); + assertTrue(stateDefault.value()); + stateInit.set(false); + assertFalse(stateInit.value()); } @Test public void testSetSameIgnored() { - state_default.set(false); - state_init.set(true); + stateDefault.set(false); + stateInit.set(true); stack.closeCurrentChangeSet(); - assertThat(stack.getLastClosedChangeSet().getStates()).doesNotContain(state_default, state_init); + assertThat(stack.getLastClosedChangeSet().getStates()).doesNotContain(stateDefault, stateInit); } @Test public void testUndoRedo() { - assertFalse(state_default.value()); - state_default.set(true); - assertTrue(state_default.value()); + assertFalse(stateDefault.value()); + stateDefault.set(true); + assertTrue(stateDefault.value()); stack.closeCurrentChangeSet(); - assertThat(stack.getLastClosedChangeSet().getStates()).contains(state_default); + assertThat(stack.getLastClosedChangeSet().getStates()).contains(stateDefault); stack.undo(); - assertFalse(state_default.value()); + assertFalse(stateDefault.value()); stack.redo(); - assertTrue(state_default.value()); + assertTrue(stateDefault.value()); } } diff --git a/junit/rails/game/state/GenericStateTest.java b/junit/rails/game/state/GenericStateTest.java index aaccd90..b423e3c 100644 --- a/junit/rails/game/state/GenericStateTest.java +++ b/junit/rails/game/state/GenericStateTest.java @@ -15,8 +15,8 @@ public class GenericStateTest { private Root root; private ChangeStack stack; - private GenericState<Item> state_default; - private GenericState<Item> state_init; + private GenericState<Item> stateDefault; + private GenericState<Item> stateInit; private Item item, another_item; @@ -28,55 +28,55 @@ public class GenericStateTest { item = new AbstractItemImpl(root, ITEM_ID); another_item = new AbstractItemImpl(root, ANOTHER_ID); - state_default = GenericState.create(root, DEFAULT_ID); - state_init = GenericState.create(root, INIT_ID, item); + stateDefault = GenericState.create(root, DEFAULT_ID); + stateInit = GenericState.create(root, INIT_ID, item); } @Test public void testValue() { - assertNull(state_default.value()); - assertSame(item, state_init.value()); + assertNull(stateDefault.value()); + assertSame(item, stateInit.value()); } @Test public void testSet() { - state_default.set(item); - assertSame(item, state_default.value()); - state_default.set(null); - assertNull(state_default.value()); - state_init.set(another_item); - assertSame(another_item, state_init.value()); + stateDefault.set(item); + assertSame(item, stateDefault.value()); + stateDefault.set(null); + assertNull(stateDefault.value()); + stateInit.set(another_item); + assertSame(another_item, stateInit.value()); } @Test public void testSetSameIgnored() { - state_default.set(null); - state_init.set(item); + stateDefault.set(null); + stateInit.set(item); stack.closeCurrentChangeSet(); - assertThat(stack.getLastClosedChangeSet().getStates()).doesNotContain(state_default, state_init); + assertThat(stack.getLastClosedChangeSet().getStates()).doesNotContain(stateDefault, stateInit); } @Test public void testUndoRedo() { - assertNull(state_default.value()); - assertSame(item, state_init.value()); + assertNull(stateDefault.value()); + assertSame(item, stateInit.value()); - state_default.set(item); - state_init.set(another_item); - assertSame(item, state_default.value()); - assertSame(another_item, state_init.value()); + stateDefault.set(item); + stateInit.set(another_item); + assertSame(item, stateDefault.value()); + assertSame(another_item, stateInit.value()); stack.closeCurrentChangeSet(); - // remark: state_init is an internal (isObservable = false) - assertThat(stack.getLastClosedChangeSet().getStates()).contains(state_default); + // remark: stateInit is an internal (isObservable = false) + assertThat(stack.getLastClosedChangeSet().getStates()).contains(stateDefault); stack.undo(); - assertNull(state_default.value()); - assertSame(item, state_init.value()); + assertNull(stateDefault.value()); + assertSame(item, stateInit.value()); stack.redo(); - assertSame(item, state_default.value()); - assertSame(another_item, state_init.value()); + assertSame(item, stateDefault.value()); + assertSame(another_item, stateInit.value()); } } diff --git a/junit/rails/game/state/HashSetStateTest.java b/junit/rails/game/state/HashSetStateTest.java index f30d078..02d76ff 100644 --- a/junit/rails/game/state/HashSetStateTest.java +++ b/junit/rails/game/state/HashSetStateTest.java @@ -26,8 +26,8 @@ public class HashSetStateTest { private Root root; private ChangeStack stack; - private HashSetState<Item> state_default; - private HashSetState<Item> state_init; + private HashSetState<Item> stateDefault; + private HashSetState<Item> stateInit; private Item oneItem; private Item anotherItem; @@ -41,8 +41,8 @@ public class HashSetStateTest { oneItem = AbstractItemImpl.create(root, ONE_ITEM_ID); anotherItem = AbstractItemImpl.create(root, ANOTHER_ITEM_ID); - state_default = HashSetState.create(root, DEFAULT_ID); - state_init = HashSetState.create(root, INIT_ID, Sets.newHashSet(oneItem)); + stateDefault = HashSetState.create(root, DEFAULT_ID); + stateInit = HashSetState.create(root, INIT_ID, Sets.newHashSet(oneItem)); } @@ -59,20 +59,20 @@ public class HashSetStateTest { private void assertInitialStateAfterUndo() { stack.closeCurrentChangeSet(); stack.undo(); - assertEquals(state_default.view(), Sets.newHashSet()); - assertEquals(state_init.view(), Sets.newHashSet(oneItem)); + assertEquals(stateDefault.view(), Sets.newHashSet()); + assertEquals(stateInit.view(), Sets.newHashSet(oneItem)); stack.redo(); } private void assertTestAdd() { - assertThat(state_default).containsOnly(oneItem); - assertThat(state_init).containsOnly(oneItem, anotherItem); + assertThat(stateDefault).containsOnly(oneItem); + assertThat(stateInit).containsOnly(oneItem, anotherItem); } @Test public void testAdd() { - state_default.add(oneItem); - state_init.add(anotherItem); + stateDefault.add(oneItem); + stateInit.add(anotherItem); assertTestAdd(); // check undo @@ -83,62 +83,62 @@ public class HashSetStateTest { @Test public void testRemove() { // remove a non-existing item - assertFalse(state_default.remove(oneItem)); + assertFalse(stateDefault.remove(oneItem)); // remove an existing item - assertTrue(state_init.remove(oneItem)); + assertTrue(stateInit.remove(oneItem)); - assertThat(state_init).doesNotContain(oneItem); + assertThat(stateInit).doesNotContain(oneItem); // check undo assertInitialStateAfterUndo(); // ... and the redo - assertThat(state_init).doesNotContain(oneItem); + assertThat(stateInit).doesNotContain(oneItem); } @Test public void testContains() { - assertTrue(state_init.contains(oneItem)); - assertFalse(state_init.contains(anotherItem)); + assertTrue(stateInit.contains(oneItem)); + assertFalse(stateInit.contains(anotherItem)); } @Test public void testClear() { - state_init.add(anotherItem); - state_init.clear(); - assertTrue(state_init.isEmpty()); + stateInit.add(anotherItem); + stateInit.clear(); + assertTrue(stateInit.isEmpty()); // check undo and redo assertInitialStateAfterUndo(); - assertTrue(state_init.isEmpty()); + assertTrue(stateInit.isEmpty()); } @Test public void testView() { ImmutableSet<Item> list = ImmutableSet.of(oneItem); - assertEquals(list, state_init.view()); + assertEquals(list, stateInit.view()); } @Test public void testSize() { - assertEquals(0, state_default.size()); - assertEquals(1, state_init.size()); - state_init.add(anotherItem); - assertEquals(2, state_init.size()); - state_init.add(oneItem); - assertEquals(2, state_init.size()); + assertEquals(0, stateDefault.size()); + assertEquals(1, stateInit.size()); + stateInit.add(anotherItem); + assertEquals(2, stateInit.size()); + stateInit.add(oneItem); + assertEquals(2, stateInit.size()); } @Test public void testIsEmpty() { - assertTrue(state_default.isEmpty()); - assertFalse(state_init.isEmpty()); + assertTrue(stateDefault.isEmpty()); + assertFalse(stateInit.isEmpty()); } private void assertTestIterator(Item thirdItem) { // no order is defined, so store them Set<Item> iterated = Sets.newHashSet(); - Iterator<Item> it = state_init.iterator(); + Iterator<Item> it = stateInit.iterator(); iterated.add(it.next()); iterated.add(it.next()); @@ -146,15 +146,15 @@ public class HashSetStateTest { // iterator is finished assertFalse(it.hasNext()); // iterator is an immutable copy, thus not changed by adding a new item - state_init.add(thirdItem); + stateInit.add(thirdItem); assertFalse(it.hasNext()); // remove the last added item - state_init.remove(thirdItem); + stateInit.remove(thirdItem); } @Test public void testIterator() { - state_init.add(anotherItem); + stateInit.add(anotherItem); Item thirdItem = AbstractItemImpl.create(root, "Third"); assertTestIterator(thirdItem); // check initial state after undo diff --git a/junit/rails/game/state/IntegerStateTest.java b/junit/rails/game/state/IntegerStateTest.java index 9c183a3..fed226c 100644 --- a/junit/rails/game/state/IntegerStateTest.java +++ b/junit/rails/game/state/IntegerStateTest.java @@ -15,8 +15,8 @@ public class IntegerStateTest { private Root root; private ChangeStack stack; - private IntegerState state_default; - private IntegerState state_init; + private IntegerState stateDefault; + private IntegerState stateInit; @Before @@ -24,62 +24,62 @@ public class IntegerStateTest { root = StateTestUtils.setUpRoot(); stack = root.getStateManager().getChangeStack(); - state_default = IntegerState.create(root, DEFAULT_ID); - state_init = IntegerState.create(root, INIT_ID, INIT); + stateDefault = IntegerState.create(root, DEFAULT_ID); + stateInit = IntegerState.create(root, INIT_ID, INIT); } @Test public void testValue() { - assertEquals(state_default.value(), 0); - assertEquals(state_init.value(), INIT); + assertEquals(stateDefault.value(), 0); + assertEquals(stateInit.value(), INIT); } @Test public void testSet() { - state_default.set(OTHER); - assertEquals(state_default.value(), OTHER); - state_init.set(0); - assertEquals(state_init.value(), 0); + stateDefault.set(OTHER); + assertEquals(stateDefault.value(), OTHER); + stateInit.set(0); + assertEquals(stateInit.value(), 0); } @Test public void testAdd() { - state_default.add(OTHER); - assertEquals(state_default.value(), OTHER); - state_init.add(OTHER); - assertEquals(state_init.value(), INIT + OTHER); + stateDefault.add(OTHER); + assertEquals(stateDefault.value(), OTHER); + stateInit.add(OTHER); + assertEquals(stateInit.value(), INIT + OTHER); } @Test public void testSetSameIgnored() { - state_default.set(0); - state_init.set((INIT)); + stateDefault.set(0); + stateInit.set((INIT)); stack.closeCurrentChangeSet(); - assertThat(stack.getLastClosedChangeSet().getStates()).doesNotContain(state_default, state_init); + assertThat(stack.getLastClosedChangeSet().getStates()).doesNotContain(stateDefault, stateInit); } @Test public void testUndoRedo() { - state_default.set(INIT); - state_default.add(OTHER); + stateDefault.set(INIT); + stateDefault.add(OTHER); - state_init.add(OTHER); - state_init.set(0); + stateInit.add(OTHER); + stateInit.set(0); stack.closeCurrentChangeSet(); - assertEquals(state_default.value(), INIT+OTHER); - assertEquals(state_init.value(), 0); + assertEquals(stateDefault.value(), INIT+OTHER); + assertEquals(stateInit.value(), 0); stack.undo(); - assertEquals(state_default.value(), 0); - assertEquals(state_init.value(), INIT); + assertEquals(stateDefault.value(), 0); + assertEquals(stateInit.value(), INIT); stack.redo(); - assertEquals(state_default.value(), INIT+OTHER); - assertEquals(state_init.value(), 0); + assertEquals(stateDefault.value(), INIT+OTHER); + assertEquals(stateInit.value(), 0); } } diff --git a/junit/rails/game/state/StringStateTest.java b/junit/rails/game/state/StringStateTest.java index 814706d..31bff01 100644 --- a/junit/rails/game/state/StringStateTest.java +++ b/junit/rails/game/state/StringStateTest.java @@ -17,8 +17,8 @@ public class StringStateTest { private Root root; private ChangeStack stack; - private StringState state_default; - private StringState state_init; + private StringState stateDefault; + private StringState stateInit; @Before @@ -26,73 +26,73 @@ public class StringStateTest { root = StateTestUtils.setUpRoot(); stack = root.getStateManager().getChangeStack(); - state_default = StringState.create(root, DEFAULT_ID); - state_init = StringState.create(root, INIT_ID, INIT); + stateDefault = StringState.create(root, DEFAULT_ID); + stateInit = StringState.create(root, INIT_ID, INIT); } @Test public void testValue() { - assertEquals(state_default.value(), ""); - assertEquals(state_init.value(), INIT); + assertEquals(stateDefault.value(), ""); + assertEquals(stateInit.value(), INIT); } @Test public void testSet() { - state_default.set(OTHER); - assertEquals(state_default.value(), OTHER); - state_init.set(""); - assertEquals(state_init.value(), ""); - state_init.set(null); - assertEquals(state_init.value(), null); + stateDefault.set(OTHER); + assertEquals(stateDefault.value(), OTHER); + stateInit.set(""); + assertEquals(stateInit.value(), ""); + stateInit.set(null); + assertEquals(stateInit.value(), null); } @Test public void testAppend() { - state_default.append(OTHER, null); - assertEquals(state_default.value(), OTHER); - state_default.append(OTHER, ""); - assertEquals(state_default.value(), OTHER + OTHER); + stateDefault.append(OTHER, null); + assertEquals(stateDefault.value(), OTHER); + stateDefault.append(OTHER, ""); + assertEquals(stateDefault.value(), OTHER + OTHER); - state_init.append(OTHER, ","); - assertEquals(state_init.value(), INIT + "," + OTHER); + stateInit.append(OTHER, ","); + assertEquals(stateInit.value(), INIT + "," + OTHER); } @Test public void testSetSameIgnored() { - state_default.set(""); - state_init.set(null); + stateDefault.set(""); + stateInit.set(null); stack.closeCurrentChangeSet(); - assertThat(stack.getLastClosedChangeSet().getStates()).doesNotContain(state_default); - assertThat(stack.getLastClosedChangeSet().getStates()).contains(state_init); + assertThat(stack.getLastClosedChangeSet().getStates()).doesNotContain(stateDefault); + assertThat(stack.getLastClosedChangeSet().getStates()).contains(stateInit); - state_default.set(null); - state_init.set(null); + stateDefault.set(null); + stateInit.set(null); stack.closeCurrentChangeSet(); - assertThat(stack.getLastClosedChangeSet().getStates()).contains(state_default); - assertThat(stack.getLastClosedChangeSet().getStates()).doesNotContain(state_init); + assertThat(stack.getLastClosedChangeSet().getStates()).contains(stateDefault); + assertThat(stack.getLastClosedChangeSet().getStates()).doesNotContain(stateInit); } @Test public void testUndoRedo() { - state_default.set(OTHER); - state_default.append(OTHER, null); + stateDefault.set(OTHER); + stateDefault.append(OTHER, null); - state_init.append(OTHER, ""); - state_init.set(null); + stateInit.append(OTHER, ""); + stateInit.set(null); stack.closeCurrentChangeSet(); - assertEquals(state_default.value(), OTHER+OTHER); - assertNull(state_init.value()); + assertEquals(stateDefault.value(), OTHER+OTHER); + assertNull(stateInit.value()); stack.undo(); - assertEquals(state_default.value(), ""); - assertEquals(state_init.value(), INIT); + assertEquals(stateDefault.value(), ""); + assertEquals(stateInit.value(), INIT); stack.redo(); - assertEquals(state_default.value(), OTHER+OTHER); - assertNull(state_init.value()); + assertEquals(stateDefault.value(), OTHER+OTHER); + assertNull(stateInit.value()); } commit 24d0379866ab5428a071d255151025e4fafd7340 Author: Stefan Frey <ste...@we...> Date: Thu Jul 19 16:46:04 2012 +0200 added tests for HashMapState diff --git a/junit/rails/game/state/HashMapStateTest.java b/junit/rails/game/state/HashMapStateTest.java new file mode 100644 index 0000000..959e1f9 --- /dev/null +++ b/junit/rails/game/state/HashMapStateTest.java @@ -0,0 +1,177 @@ +package rails.game.state; + +import static org.fest.assertions.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; + +public class HashMapStateTest { + + private final static String DEFAULT_ID = "Default"; + private final static String INIT_ID = "Init"; + + private final static String FIRST_ITEM_ID = "FirstItem"; + private final static String SECOND_ITEM_ID = "SecondItem"; + private final static String THIRD_ITEM_ID = "ThirdItem"; + + private Root root; + private ChangeStack stack; + private HashMapState<String, Item> state_default; + private HashMapState<String, Item> stateInit; + private Map<String, Item> initMap, testMap; + + private Item firstItem, secondItem, thirdItem; + + @Before + public void setUp() { + root = StateTestUtils.setUpRoot(); + stack = root.getStateManager().getChangeStack(); + + firstItem = AbstractItemImpl.create(root, FIRST_ITEM_ID); + secondItem = AbstractItemImpl.create(root, SECOND_ITEM_ID); + thirdItem = AbstractItemImpl.create(root, THIRD_ITEM_ID); + + state_default = HashMapState.create(root, DEFAULT_ID); + + // intialize stateInit with initMap and create testMap + testMap = Maps.newHashMap(); + testMap.put(FIRST_ITEM_ID, firstItem); + initMap = ImmutableMap.copyOf(testMap); + stateInit = HashMapState.create(root, INIT_ID, testMap); + testMap.put(SECOND_ITEM_ID, secondItem); + } + + + @Test + public void testCreate() { + HashMapState<String, Item> state = HashMapState.create(root, "Test"); + assertThat(state.viewMap()).isEmpty(); + } + + @Test + public void testCreateMapOfKV() { + HashMapState<String, Item> state = HashMapState.create(root, "Test", testMap); + assertEquals(state.viewMap(), testMap); + } + + // helper function to check the initial state after undo + // includes redo, so after returning the state should be unchanged + private void assertInitialStateAfterUndo() { + stack.closeCurrentChangeSet(); + stack.undo(); + assertThat(state_default.viewMap()).isEmpty(); + assertEquals(stateInit.viewMap(), initMap); + stack.redo(); + } + + + @Test + public void testPut() { + for (String key: testMap.keySet()) { + state_default.put(key, testMap.get(key)); + stateInit.put(key, testMap.get(key)); + } + assertEquals(state_default.viewMap(), testMap); + assertEquals(stateInit.viewMap(), testMap); + + // check undo and redo + assertInitialStateAfterUndo(); + assertEquals(state_default.viewMap(), testMap); + assertEquals(stateInit.viewMap(), testMap); + } + + // includes tests for viewMap + @Test + public void testPutAll() { + stateInit.putAll(testMap); + state_default.putAll(testMap); + assertEquals(state_default.viewMap(), testMap); + assertEquals(stateInit.viewMap(), testMap); + + // check undo and redo + assertInitialStateAfterUndo(); + assertEquals(testMap, state_default.viewMap()); + assertEquals(testMap, stateInit.viewMap()); + } + + @Test + public void testGet() { + assertEquals(firstItem, stateInit.get(FIRST_ITEM_ID)); + assertNull(stateInit.get(SECOND_ITEM_ID)); + } + + @Test + public void testRemove() { + stateInit.remove(FIRST_ITEM_ID); + assertNull(stateInit.get(FIRST_ITEM_ID)); + + // check undo and redo + assertInitialStateAfterUndo(); + assertNull(stateInit.get(FIRST_ITEM_ID)); + } + + @Test + public void testContainsKey() { + state_default.put(THIRD_ITEM_ID, thirdItem); + assertTrue(state_default.containsKey(THIRD_ITEM_ID)); + + assertTrue(stateInit.containsKey(FIRST_ITEM_ID)); + assertFalse(stateInit.containsKey(SECOND_ITEM_ID)); + } + + @Test + public void testClear() { + state_default.putAll(testMap); + state_default.clear(); + assertTrue(state_default.isEmpty()); + + // check undo and redo + assertInitialStateAfterUndo(); + assertTrue(state_default.isEmpty()); + } + + @Test + public void testIsEmpty() { + assertTrue(state_default.isEmpty()); + state_default.put(FIRST_ITEM_ID, firstItem); + assertFalse(state_default.isEmpty()); + + assertFalse(stateInit.isEmpty()); + stateInit.remove(FIRST_ITEM_ID); + assertTrue(stateInit.isEmpty()); + } + + + @Test + public void testInitFromMap() { + state_default.put(THIRD_ITEM_ID, thirdItem); + state_default.initFromMap(testMap); + assertEquals(testMap, state_default.viewMap()); + + // check undo and redo + assertInitialStateAfterUndo(); + assertEquals(ImmutableMap.copyOf(testMap), state_default.viewMap()); + } + + @Test + public void testViewKeySet() { + state_default.putAll(testMap); + assertThat(state_default.viewKeySet()).containsAll(testMap.keySet()); + } + + @Test + public void testViewValues() { + state_default.putAll(testMap); + assertThat(state_default.viewValues()).containsAll(testMap.values()); + } + +} diff --git a/junit/rails/game/state/HashSetStateTest.java b/junit/rails/game/state/HashSetStateTest.java index 004b147..f30d078 100644 --- a/junit/rails/game/state/HashSetStateTest.java +++ b/junit/rails/game/state/HashSetStateTest.java @@ -3,10 +3,10 @@ package rails.game.state; import static org.fest.assertions.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.util.Iterator; +import java.util.Set; import org.junit.Before; @@ -135,9 +135,14 @@ public class HashSetStateTest { } private void assertTestIterator(Item thirdItem) { + // no order is defined, so store them + Set<Item> iterated = Sets.newHashSet(); + Iterator<Item> it = state_init.iterator(); - assertSame(oneItem,it.next()); - assertSame(anotherItem,it.next()); + iterated.add(it.next()); + iterated.add(it.next()); + + assertThat(iterated).containsOnly(oneItem, anotherItem); // iterator is finished assertFalse(it.hasNext()); // iterator is an immutable copy, thus not changed by adding a new item diff --git a/src/rails/game/state/HashMapState.java b/src/rails/game/state/HashMapState.java index ab4ae57..be193b1 100644 --- a/src/rails/game/state/HashMapState.java +++ b/src/rails/game/state/HashMapState.java @@ -8,8 +8,12 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import static com.google.common.base.Preconditions.checkNotNull; /** * A stateful version of a HashMap @@ -25,6 +29,7 @@ public final class HashMapState<K,V> extends State { } /** + * creates an empty HashMapState * @return empty HashMapState */ public static <K,V> HashMapState<K,V> create(Item parent, String id){ @@ -32,78 +37,132 @@ public final class HashMapState<K,V> extends State { } /** - * @return prefilled HashMapState + * creates an initialized (filled) HashMapState + * @param map used for initialization + * @return initialized HashMapState */ public static <K,V> HashMapState<K,V> create(Item parent, String id, Map<K,V> map){ return new HashMapState<K,V>(parent, id, map); } - public void put(K key, V value) { - // check if element already has the specified value - if (map.containsKey(key) && map.get(key).equals(value)) return; - new HashMapChange<K,V>(this, key, value); + /** + * Add key,value pair to map + * @param key for mapping + * @param value associated with key + * @return previous value associated with specified key, or null if there was no mapping for the key (or null was the value). + */ + public V put(K key, V value) { + // check if the key is in the map + if (map.containsKey(key)) { + V oldValue = map.get(key); + // check if element already has the specified value + if (!oldValue.equals(value)) { + new HashMapChange<K,V>(this, key, value); + } + return oldValue; + } else { + // if not in map, add tuple and return null + new HashMapChange<K,V>(this, key, value); + return null; + } } - + + /** + * Adds all (key,value) pairs + * @param map that gets added + * @throws NullPointerException if map is null + */ + public void putAll(Map<K,V> map) { + checkNotNull(map); for (K key:map.keySet()) { put(key, map.get(key)); } } - + + /** + * return value for specified key + * @param key used to retrieve value + * @return value associated with the key, null if map does not contain key + */ public V get(K key) { return map.get(key); } - public void remove(K key) { + /** + * removes key from mapping + * @param key to be removed from map + * @return value previously associated with key, null if map did not contain key + */ + public V remove(K key) { // check if map contains key - if (!map.containsKey(key)) return; + if (!map.containsKey(key)) return null; + V old = map.get(key); new HashMapChange<K,V>(this, key); + return old; } + /** + * test if key is present in mapping + * @param key whose presence is tested + * @return true if key is present + */ public boolean containsKey(K key) { return map.containsKey(key); } + /** + * removes all mappings from the map + */ public void clear() { - // Two-step process to avoid concurrent modification exception - List<K> keys = new ArrayList<K>(map.keySet()); - for (K key : keys) { + for (K key : ImmutableSet.copyOf(map.keySet())) { remove (key); } } /** - * (re)intializes the state map from another map + * checks if map is empty + * @return true if map is empty + */ + public boolean isEmpty() { + return map.isEmpty(); + } + + /** + * (re)initializes the state map from another map + * @param map used for initialization */ public void initFromMap(Map<K,V> initMap) { // all from initMap get added putAll(initMap); // remove those only in current map - for (K key:Sets.difference(map.keySet(), initMap.keySet())) { + for (K key:ImmutableSet.copyOf(Sets.difference(map.keySet(), initMap.keySet()))) { remove(key); } } /** - * @return unmodifiable view of map + * creates an immutable copy of the map + * @return immutable version of the map */ - public Map<K,V> viewMap() { - return Collections.unmodifiableMap(map); + public ImmutableMap<K,V> viewMap() { + return ImmutableMap.copyOf(map); } /** - * @return unmodifiable view of keyset + * creates an immutable copy of the keyset + * @return immutable keyset of the map */ - public Set<K> viewKeySet() { - return Collections.unmodifiableSet(map.keySet()); - } - - public Collection<V> viewValues() { - return Collections.unmodifiableCollection(map.values()); + public ImmutableSet<K> viewKeySet() { + return ImmutableSet.copyOf(map.keySet()); } - public boolean isEmpty() { - return map.isEmpty(); + /** + * creates an immutable copy of the values + * @return immutable list of values + */ + public ImmutableList<V> viewValues() { + return ImmutableList.copyOf(map.values()); } public String getData() { commit 80ad59a1182f0a841fb6c1ab945b3ebf4412478a Author: Stefan Frey <ste...@we...> Date: Thu Jul 19 11:05:49 2012 +0200 changed Change methods from public to default visibility diff --git a/src/rails/game/state/ArrayListChange.java b/src/rails/game/state/ArrayListChange.java index 832d387..54fa91f 100644 --- a/src/rails/game/state/ArrayListChange.java +++ b/src/rails/game/state/ArrayListChange.java @@ -32,18 +32,15 @@ final class ArrayListChange<E> extends Change { super.init(state); } - @Override - public void execute() { + @Override void execute() { state.change(object, index, addToList); } - @Override - public void undo() { + @Override void undo() { state.change(object, index, !addToList); } - @Override - public ArrayListState<E> getState() { + @Override ArrayListState<E> getState() { return state; } diff --git a/src/rails/game/state/BooleanChange.java b/src/rails/game/state/BooleanChange.java index 824aeb7..6002069 100644 --- a/src/rails/game/state/BooleanChange.java +++ b/src/rails/game/state/BooleanChange.java @@ -17,18 +17,15 @@ final class BooleanChange extends Change { super.init(state); } - @Override - public void execute() { + @Override void execute() { state.change(newValue); } - @Override - public void undo() { + @Override void undo() { state.change(oldValue); } - @Override - public BooleanState getState() { + @Override BooleanState getState() { return state; } diff --git a/src/rails/game/state/GenericStateChange.java b/src/rails/game/state/GenericStateChange.java index 86289ea..f6e1434 100644 --- a/src/rails/game/state/GenericStateChange.java +++ b/src/rails/game/state/GenericStateChange.java @@ -12,18 +12,15 @@ final class GenericStateChange<E> extends Change { super.init(state); } - @Override - public void execute() { + @Override void execute() { state.change(next); } - @Override - public void undo() { + @Override void undo() { state.change(previous); } - @Override - public GenericState<E> getState() { + @Override GenericState<E> getState() { return state; } diff --git a/src/rails/game/state/HashMapChange.java b/src/rails/game/state/HashMapChange.java index c04edad..933a3c7 100644 --- a/src/rails/game/state/HashMapChange.java +++ b/src/rails/game/state/HashMapChange.java @@ -38,18 +38,15 @@ final class HashMapChange<K,V> extends Change { super.init(state); } - @Override - public void execute() { + @Override void execute() { state.change(key, newValue, remove); } - @Override - public void undo() { + @Override void undo() { state.change(key, oldValue, !existed); } - @Override - public HashMapState<K,V> getState() { + @Override HashMapState<K,V> getState() { return state; } diff --git a/src/rails/game/state/HashSetChange.java b/src/rails/game/state/HashSetChange.java index 7f1c2d5..30f8bcb 100644 --- a/src/rails/game/state/HashSetChange.java +++ b/src/rails/game/state/HashSetChange.java @@ -18,18 +18,15 @@ final class HashSetChange<E> extends Change { super.init(state); } - @Override - public void execute() { + @Override void execute() { state.change(element, addToSet); } - @Override - public void undo() { + @Override void undo() { state.change(element, !addToSet); } - @Override - public HashSetState<E> getState() { + @Override HashSetState<E> getState() { return state; } diff --git a/src/rails/game/state/IntegerChange.java b/src/rails/game/state/IntegerChange.java index b6e55e6..01d3030 100644 --- a/src/rails/game/state/IntegerChange.java +++ b/src/rails/game/state/IntegerChange.java @@ -16,18 +16,15 @@ final class IntegerChange extends Change { super.init(state); } - @Override - public void execute() { + @Override void execute() { state.change(newValue); } - @Override - public void undo() { + @Override void undo() { state.change(oldValue); } - @Override - public IntegerState getState() { + @Override IntegerState getState() { return state; } diff --git a/src/rails/game/state/MultimapChange.java b/src/rails/game/state/MultimapChange.java index 2783a8f..36dcd5e 100644 --- a/src/rails/game/state/MultimapChange.java +++ b/src/rails/game/state/MultimapChange.java @@ -14,18 +14,15 @@ final class MultimapChange<K,V> extends Change { super.init(state); } - @Override - public void execute() { + @Override void execute() { state.change(key, value, addToMap); } - @Override - public void undo() { + @Override void undo() { state.change(key, value, !addToMap); } - @Override - public MultimapState<K,V> getState() { + @Override MultimapState<K,V> getState() { return state; } diff --git a/src/rails/game/state/PortfolioChange.java b/src/rails/game/state/PortfolioChange.java index 5c3e21a..bb8624a 100644 --- a/src/rails/game/state/PortfolioChange.java +++ b/src/rails/game/state/PortfolioChange.java @@ -13,24 +13,21 @@ final class PortfolioChange<T extends Ownable<T>> extends Change { super.init(in); } - @Override - public void execute() { + @Override void execute() { in.change(item, true); if (out != null) { out.change(item, false); } } - @Override - public void undo() { + @Override void undo() { in.change(item, false); if (out != null) { out.change(item, true); } } - @Override - public Portfolio<? super T> getState() { + @Override Portfolio<? super T> getState() { return in; } diff --git a/src/rails/game/state/StringChange.java b/src/rails/game/state/StringChange.java index b1909e9..c327796 100644 --- a/src/rails/game/state/StringChange.java +++ b/src/rails/game/state/StringChange.java @@ -18,18 +18,15 @@ final class StringChange extends Change { super.init(state); } - @Override - public void execute() { + @Override void execute() { state.change(newValue); } - @Override - public void undo() { + @Override void undo() { state.change(oldValue); } - @Override - public StringState getState() { + @Override StringState getState() { return state; } diff --git a/src/rails/game/state/WalletChange.java b/src/rails/game/state/WalletChange.java index 6e3b089..62082ae 100644 --- a/src/rails/game/state/WalletChange.java +++ b/src/rails/game/state/WalletChange.java @@ -15,24 +15,21 @@ final class WalletChange<T extends CountableItem> extends Change { super.init(in); } - @Override - public void execute() { + @Override void execute() { in.change(item, amount); if (out != null) { out.change(item, - amount); } } - @Override - public void undo() { + @Override void undo() { in.change(item, - amount); if (out != null) { out.change(item, amount); } } - @Override - public Wallet<T> getState() { + @Override Wallet<T> getState() { return in; } commit 1a7522c88b0effb42bd6bce4dd3d80d7bee83c02 Author: Stefan Frey <ste...@we...> Date: Thu Jul 19 11:02:40 2012 +0200 added tests for HashSetState diff --git a/junit/rails/game/state/ArrayListStateTest.java b/junit/rails/game/state/ArrayListStateTest.java index 0745f7c..fb11df0 100644 --- a/junit/rails/game/state/ArrayListStateTest.java +++ b/junit/rails/game/state/ArrayListStateTest.java @@ -44,7 +44,9 @@ public class ArrayListStateTest { state_default = ArrayListState.create(root, DEFAULT_ID); state_init = ArrayListState.create(root, INIT_ID, Lists.newArrayList(oneItem)); } - + + // helper function to check the initial state after undo + // includes redo, so after returning the state should be unchanged private void assertInitialStateAfterUndo() { stack.closeCurrentChangeSet(); stack.undo(); @@ -168,6 +170,9 @@ public class ArrayListStateTest { state_init.add(anotherItem); state_init.clear(); assertTrue(state_init.isEmpty()); + // check undo and redo + assertInitialStateAfterUndo(); + assertTrue(state_init.isEmpty()); } @Test diff --git a/junit/rails/game/state/HashSetStateTest.java b/junit/rails/game/state/HashSetStateTest.java new file mode 100644 index 0000000..004b147 --- /dev/null +++ b/junit/rails/game/state/HashSetStateTest.java @@ -0,0 +1,161 @@ +package rails.game.state; + +import static org.fest.assertions.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +import java.util.Iterator; + + +import org.junit.Before; +import org.junit.Test; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + +public class HashSetStateTest { + + private final static String DEFAULT_ID = "Default"; + private final static String INIT_ID = "Init"; + + private final static String ONE_ITEM_ID = "OneItem"; + private final static String ANOTHER_ITEM_ID = "AnotherItem"; + + private Root root; + private ChangeStack stack; + private HashSetState<Item> state_default; + private HashSetState<Item> state_init; + + private Item oneItem; + private Item anotherItem; + + + @Before + public void setUp() { + root = StateTestUtils.setUpRoot(); + stack = root.getStateManager().getChangeStack(); + + oneItem = AbstractItemImpl.create(root, ONE_ITEM_ID); + anotherItem = AbstractItemImpl.create(root, ANOTHER_ITEM_ID); + + state_default = HashSetState.create(root, DEFAULT_ID); + state_init = HashSetState.create(root, INIT_ID, Sets.newHashSet(oneItem)); + } + + + @Test + public void testCreationWithList() { + // checks if the set is created with a list, that it only contains non-unique elements + HashSetState<Item> state = HashSetState.create(root, null, Lists.newArrayList(oneItem, oneItem)); + assertThat(state).containsOnly(oneItem); + assertThat(state).hasSize(1); + } + + // helper function to check the initial state after undo + // includes redo, so after returning the state should be unchanged + private void assertInitialStateAfterUndo() { + stack.closeCurrentChangeSet(); + stack.undo(); + assertEquals(state_default.view(), Sets.newHashSet()); + assertEquals(state_init.view(), Sets.newHashSet(oneItem)); + stack.redo(); + } + + private void assertTestAdd() { + assertThat(state_default).containsOnly(oneItem); + assertThat(state_init).containsOnly(oneItem, anotherItem); + } + + @Test + public void testAdd() { + state_default.add(oneItem); + state_init.add(anotherItem); + assertTestAdd(); + + // check undo + assertInitialStateAfterUndo(); + assertTestAdd(); + } + + @Test + public void testRemove() { + // rem |