From: Stefan F. <ste...@us...> - 2012-07-26 06:06:32
|
junit/rails/game/state/ArrayListMultimapStateTest.java | 89 ++++++ junit/rails/game/state/ArrayListStateTest.java | 12 junit/rails/game/state/BooleanStateTest.java | 16 - junit/rails/game/state/FormatterTest.java | 60 ---- junit/rails/game/state/GenericStateTest.java | 16 - junit/rails/game/state/HashMapStateTest.java | 9 junit/rails/game/state/HashMultimapStateTest.java | 185 ++++++++++++++ junit/rails/game/state/HashSetStateTest.java | 9 junit/rails/game/state/IntegerStateTest.java | 14 - junit/rails/game/state/OwnableItemImpl.java | 16 + junit/rails/game/state/OwnerImpl.java | 22 + junit/rails/game/state/PortfolioListTest.java | 114 ++++++++ junit/rails/game/state/PortfolioManagerTest.java | 104 +++++++ junit/rails/game/state/StateTestUtils.java | 22 + junit/rails/game/state/StringStateTest.java | 22 - src/rails/game/Bank.java | 17 - src/rails/game/BankPortfolio.java | 6 src/rails/game/BonusToken.java | 4 src/rails/game/Company.java | 10 src/rails/game/CompanyManager.java | 2 src/rails/game/GameManager.java | 5 src/rails/game/MapHex.java | 9 src/rails/game/OperatingRound.java | 3 src/rails/game/Player.java | 3 src/rails/game/PrivateCompany.java | 28 -- src/rails/game/PublicCertificate.java | 4 src/rails/game/PublicCompany.java | 32 +- src/rails/game/Round.java | 15 - src/rails/game/StartItem.java | 10 src/rails/game/StockRound.java | 12 src/rails/game/Stop.java | 6 src/rails/game/Token.java | 2 src/rails/game/Train.java | 5 src/rails/game/TrainManager.java | 11 src/rails/game/TreasuryShareRound.java | 2 src/rails/game/action/BuyBonusToken.java | 2 src/rails/game/action/BuyCertificate.java | 9 src/rails/game/action/BuyPrivate.java | 2 src/rails/game/action/BuyTrain.java | 5 src/rails/game/model/BaseTokensModel.java | 4 src/rails/game/model/CertificatesModel.java | 2 src/rails/game/model/PortfolioModel.java | 7 src/rails/game/model/PrivatesModel.java | 2 src/rails/game/model/TrainsModel.java | 2 src/rails/game/special/ExchangeForShare.java | 2 src/rails/game/special/SpecialProperty.java | 2 src/rails/game/special/SpecialRight.java | 2 src/rails/game/specific/_1835/PrussianFormationRound.java | 2 src/rails/game/specific/_1835/StockRound_1835.java | 2 src/rails/game/specific/_1856/OperatingRound_1856.java | 2 src/rails/game/specific/_1856/PublicCompany_CGR.java | 6 src/rails/game/specific/_1856/StockRound_1856.java | 4 src/rails/game/specific/_1889/OperatingRound_1889.java | 8 src/rails/game/specific/_18EU/GameManager_18EU.java | 3 src/rails/game/specific/_18EU/StockRound_18EU.java | 9 src/rails/game/specific/_18TN/OperatingRound_18TN.java | 2 src/rails/game/state/ArrayListMultimapChange.java | 48 +++ src/rails/game/state/ArrayListMultimapState.java | 18 - src/rails/game/state/ArrayListState.java | 10 src/rails/game/state/ChangeStack.java | 1 src/rails/game/state/DelayedItem.java | 8 src/rails/game/state/Formatter.java | 23 - src/rails/game/state/HashMapState.java | 5 src/rails/game/state/HashMultimapChange.java | 37 ++ src/rails/game/state/HashMultimapState.java | 25 + src/rails/game/state/Manager.java | 6 src/rails/game/state/MultimapChange.java | 37 -- src/rails/game/state/MultimapState.java | 18 - src/rails/game/state/Observable.java | 3 src/rails/game/state/Ownable.java | 13 src/rails/game/state/OwnableItem.java | 45 ++- src/rails/game/state/OwnableManager.java | 5 src/rails/game/state/Portfolio.java | 54 ++-- src/rails/game/state/PortfolioChange.java | 2 src/rails/game/state/PortfolioHolder.java | 10 src/rails/game/state/PortfolioList.java | 32 +- src/rails/game/state/PortfolioManager.java | 81 +++++- src/rails/game/state/PortfolioMap.java | 23 - src/rails/game/state/Root.java | 31 +- src/rails/game/state/StateManager.java | 26 - src/rails/game/state/UnknownOwner.java | 17 + src/rails/ui/swing/GameStatus.java | 22 - src/rails/ui/swing/ORUIManager.java | 2 83 files changed, 1102 insertions(+), 475 deletions(-) New commits: commit 428eefc5b1ebcd1f7b33634512b1a671f539f320 Author: Stefan Frey <ste...@we...> Date: Thu Jul 26 07:31:26 2012 +0200 refined MultiMap states and added tests diff --git a/junit/rails/game/state/ArrayListMultimapStateTest.java b/junit/rails/game/state/ArrayListMultimapStateTest.java new file mode 100644 index 0000000..2960dbb --- /dev/null +++ b/junit/rails/game/state/ArrayListMultimapStateTest.java @@ -0,0 +1,89 @@ +package rails.game.state; + +import static org.fest.assertions.api.Assertions.assertThat; +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class ArrayListMultimapStateTest { + + private final static String STATE_ID = "State"; + private final static String ITEM_A_ID = "ItemA"; + private final static String ITEM_B_ID = "ItemB"; + private final static String ITEM_C_ID = "ItemC"; + + private Root root; + private ArrayListMultimapState<String, Item> state; + private Item itemA, itemB, itemC; + + @Before + public void setUp() { + root = StateTestUtils.setUpRoot(); + state = ArrayListMultimapState.create(root, STATE_ID); + itemA = OwnableItemImpl.create(root, ITEM_A_ID); + itemB = OwnableItemImpl.create(root, ITEM_B_ID); + itemC = OwnableItemImpl.create(root, ITEM_C_ID); + StateTestUtils.startActionChangeSet(root); + } + + @Test + public void testPut() { + state.put(ITEM_A_ID, itemA); + assertThat(state.get(ITEM_A_ID)).containsOnly(itemA); + state.put(ITEM_A_ID, itemA); + assertThat(state.get(ITEM_A_ID)).containsExactly(itemA, itemA); + state.put(ITEM_A_ID, itemB); + assertThat(state.get(ITEM_A_ID)).containsExactly(itemA, itemA, itemB); + // test undo + StateTestUtils.closeAndUndo(root); + assertTrue(state.isEmpty()); + // test redo + StateTestUtils.redo(root); + assertThat(state.get(ITEM_A_ID)).containsExactly(itemA, itemA, itemB); + } + + @Test + public void testRemove() { + // initialize state + state.put(ITEM_A_ID, itemA); + state.put(ITEM_A_ID, itemB); + state.put(ITEM_A_ID, itemA); + StateTestUtils.startActionChangeSet(root); + assertThat(state.get(ITEM_A_ID)).containsExactly(itemA, itemB, itemA); + // remove items + state.remove(ITEM_A_ID, itemA); + assertThat(state.get(ITEM_A_ID)).containsExactly(itemB, itemA); + state.remove(ITEM_A_ID, itemA); + assertThat(state.get(ITEM_A_ID)).containsExactly(itemB); + // test undo + StateTestUtils.closeAndUndo(root); + assertThat(state.get(ITEM_A_ID)).containsExactly(itemA, itemB, itemA); + // test redo + StateTestUtils.redo(root); + assertThat(state.get(ITEM_A_ID)).containsExactly(itemB); + } + + @Test + public void testGet() { + state.put(ITEM_A_ID, itemA); + state.put(ITEM_A_ID, itemB); + state.put(ITEM_C_ID, itemC); + assertThat(state.get(ITEM_A_ID)).containsExactly(itemA, itemB); + assertThat(state.get(ITEM_C_ID)).containsExactly(itemC); + } + + @Test + public void testContainsEntry() { + state.put(ITEM_A_ID, itemA); + state.put(ITEM_C_ID, itemB); + assertTrue(state.containsEntry(ITEM_A_ID, itemA)); + assertTrue(state.containsEntry(ITEM_C_ID, itemB)); + + assertFalse(state.containsEntry(ITEM_B_ID, itemA)); + assertFalse(state.containsEntry(ITEM_A_ID, itemB)); + assertFalse(state.containsEntry(ITEM_B_ID, itemB)); + assertFalse(state.containsEntry(ITEM_C_ID, itemC)); + } + +} diff --git a/junit/rails/game/state/HashMultimapStateTest.java b/junit/rails/game/state/HashMultimapStateTest.java new file mode 100644 index 0000000..67a91a1 --- /dev/null +++ b/junit/rails/game/state/HashMultimapStateTest.java @@ -0,0 +1,185 @@ +package rails.game.state; + +import static org.fest.assertions.api.Assertions.assertThat; +import static org.junit.Assert.*; + +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.junit.Before; +import org.junit.Test; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + +public class HashMultimapStateTest { + + private final static String STATE_ID = "State"; + private final static String ITEM_A_ID = "ItemA"; + private final static String ITEM_B_ID = "ItemB"; + private final static String ITEM_C_ID = "ItemC"; + + private Root root; + private HashMultimapState<String, Item> state; + private Item itemA, itemB, itemC; + private List<Item> initContents; + + @Before + public void setUp() { + root = StateTestUtils.setUpRoot(); + state = HashMultimapState.create(root, STATE_ID); + itemA = OwnableItemImpl.create(root, ITEM_A_ID); + itemB = OwnableItemImpl.create(root, ITEM_B_ID); + itemC = OwnableItemImpl.create(root, ITEM_C_ID); + StateTestUtils.startActionChangeSet(root); + } + + private void initState() { + // initialize state + state.put(ITEM_A_ID, itemA); + state.put(ITEM_A_ID, itemB); + state.put(ITEM_A_ID, itemC); + state.put(ITEM_B_ID, itemB); + state.put(ITEM_C_ID, itemC); + StateTestUtils.startActionChangeSet(root); + initContents = Lists.newArrayList(itemA, itemB, itemC, itemB, itemC); + } + + @Test + public void testPut() { + state.put(ITEM_A_ID, itemA); + assertThat(state.get(ITEM_A_ID)).containsOnly(itemA); + assertFalse(state.put(ITEM_A_ID, itemA)); // cannot add identical tuple + assertThat(state.get(ITEM_A_ID)).containsOnly(itemA); + state.put(ITEM_A_ID, itemB); + assertThat(state.get(ITEM_A_ID)).containsOnly(itemA, itemB); + // test undo + StateTestUtils.closeAndUndo(root); + assertTrue(state.isEmpty()); + // test redo + StateTestUtils.redo(root); + assertThat(state.get(ITEM_A_ID)).containsOnly(itemA, itemB); + } + + @Test + public void testRemove() { + initState(); + // remove items + state.remove(ITEM_A_ID, itemA); + assertThat(state.get(ITEM_A_ID)).containsOnly(itemB, itemC); + state.remove(ITEM_A_ID, itemC); + assertThat(state.get(ITEM_A_ID)).containsOnly(itemB); + // test undo + StateTestUtils.closeAndUndo(root); + assertThat(state.get(ITEM_A_ID)).containsOnly(itemA, itemB, itemC); + // test redo + StateTestUtils.redo(root); + assertThat(state.get(ITEM_A_ID)).containsOnly(itemB); + } + + @Test + public void testRemoveAll() { + initState(); + Set<Item> removed = state.removeAll(ITEM_A_ID); + assertThat(removed).containsOnly(itemA, itemB, itemC); + assertThat(state.get(ITEM_A_ID)).isEmpty(); + // test undo + StateTestUtils.closeAndUndo(root); + assertThat(state.get(ITEM_A_ID)).containsOnly(itemA, itemB, itemC); + // test redo + StateTestUtils.redo(root); + assertThat(state.get(ITEM_A_ID)).isEmpty(); + } + + @Test + public void testGet() { + initState(); + assertThat(state.get(ITEM_A_ID)).containsOnly(itemA, itemB, itemC); + assertThat(state.get(ITEM_C_ID)).containsOnly(itemC); + } + + @Test + public void testContainsEntry() { + state.put(ITEM_A_ID, itemA); + state.put(ITEM_C_ID, itemB); + assertTrue(state.containsEntry(ITEM_A_ID, itemA)); + assertTrue(state.containsEntry(ITEM_C_ID, itemB)); + + assertFalse(state.containsEntry(ITEM_B_ID, itemA)); + assertFalse(state.containsEntry(ITEM_A_ID, itemB)); + assertFalse(state.containsEntry(ITEM_B_ID, itemB)); + assertFalse(state.containsEntry(ITEM_C_ID, itemC)); + } + + @Test + public void testContainsKey() { + state.put(ITEM_A_ID, itemA); + state.put(ITEM_C_ID, itemB); + assertTrue(state.containsKey(ITEM_A_ID)); + assertFalse(state.containsKey(ITEM_B_ID)); + assertTrue(state.containsKey(ITEM_C_ID)); + } + + @Test + public void testContainsValue() { + state.put(ITEM_A_ID, itemA); + state.put(ITEM_C_ID, itemB); + assertTrue(state.containsValue(itemA)); + assertTrue(state.containsValue(itemB)); + assertFalse(state.containsValue(itemC)); + } + + @Test + public void testSize() { + assertEquals(0, state.size()); + initState(); + assertEquals(5, state.size()); + } + + @Test + public void testIsEmpty() { + assertTrue(state.isEmpty()); + initState(); + assertFalse(state.isEmpty()); + } + + @Test + public void testKeySet() { + state.put(ITEM_A_ID, itemA); + state.put(ITEM_C_ID, itemB); + assertThat(state.keySet()).containsOnly(ITEM_A_ID, ITEM_C_ID); + } + + @Test + public void testValues() { + initState(); + assertThat(state.values()).containsAll(initContents); + } + + private void assertTestIterator(Item thirdItem) { + // no order is defined, so store them + Set<Item> iterated = Sets.newHashSet(); + + Iterator<Item> it = state.iterator(); + while (it.hasNext()) { + iterated.add(it.next()); + } + assertThat(iterated).containsAll(initContents); + // iterator is an immutable copy, thus not changed by adding a new item + state.put(ITEM_C_ID, itemA); + assertFalse(it.hasNext()); + // remove the last added item + state.remove(ITEM_C_ID, itemA); + } + + @Test + public void testIterator() { + initState(); + Item thirdItem = AbstractItemImpl.create(root, "Third"); + assertTestIterator(thirdItem); + } + + + +} diff --git a/src/rails/game/state/ArrayListMultimapChange.java b/src/rails/game/state/ArrayListMultimapChange.java new file mode 100644 index 0000000..5d10ee0 --- /dev/null +++ b/src/rails/game/state/ArrayListMultimapChange.java @@ -0,0 +1,48 @@ +package rails.game.state; + +final class ArrayListMultimapChange<K,V> extends Change { + private final ArrayListMultimapState<K,V> state; + private final K key; + private final V value; + private final int index; + private final boolean addToList; + + ArrayListMultimapChange(ArrayListMultimapState<K,V> state, K key, V value, int index) { + this.state = state; + this.key = key; + this.value = value; + this.index = index; + this.addToList = true; + super.init(state); + } + + ArrayListMultimapChange(ArrayListMultimapState<K,V> state, K key, int index) { + this.state = state; + this.key = key; + this.value = state.get(key).get(index); + this.index = index; + this.addToList = false; + super.init(state); + } + + @Override void execute() { + state.change(key, value, index, addToList); + } + + @Override void undo() { + state.change(key, value, index, !addToList); + } + + @Override ArrayListMultimapState<K,V> getState() { + return state; + } + + @Override + public String toString() { + if (addToList) { + return "Change for " + state + ": Add key = " + key + " with value " + value + " at index " + index; + } else { + return "Change for " + state + ": Remove object with key = " + key + " at index " + index ; + } + } +} diff --git a/src/rails/game/state/ArrayListMultimapState.java b/src/rails/game/state/ArrayListMultimapState.java index 8dd69c1..3e3c7aa 100644 --- a/src/rails/game/state/ArrayListMultimapState.java +++ b/src/rails/game/state/ArrayListMultimapState.java @@ -4,7 +4,7 @@ import java.util.List; import com.google.common.collect.ArrayListMultimap; -public final class ArrayListMultimapState<K,V> extends MultimapState<K,V> { +public final class ArrayListMultimapState<K,V> extends State { private final ArrayListMultimap<K,V> map = ArrayListMultimap.create(); ; @@ -27,7 +27,7 @@ public final class ArrayListMultimapState<K,V> extends MultimapState<K,V> { */ public boolean put(K key, V value) { - |