From: Stefan F. <ste...@us...> - 2012-07-07 06:55:17
|
junit/rails/game/state/AbstractItemImpl.java | 1 junit/rails/game/state/AbstractItemTest.java | 24 +-- junit/rails/game/state/ActionChangeSetTest.java | 5 junit/rails/game/state/BooleanStateTest.java | 61 ++++++++ junit/rails/game/state/ChangeStackTest.java | 38 ++--- junit/rails/game/state/FormatterTest.java | 40 +++++ junit/rails/game/state/GenericStateTest.java | 80 +++++++++++ junit/rails/game/state/ManagerImpl.java | 1 junit/rails/game/state/ManagerTest.java | 39 ++--- junit/rails/game/state/ModelImpl.java | 17 ++ junit/rails/game/state/ObservableTest.java | 166 ++++++++++++++++++++++++ junit/rails/game/state/RootTest.java | 24 +-- junit/rails/game/state/StateImpl.java | 18 ++ junit/rails/game/state/StateTest.java | 54 +++++++ junit/rails/game/state/StateTestUtils.java | 21 +++ src/rails/game/state/BooleanChange.java | 1 src/rails/game/state/BooleanState.java | 11 + src/rails/game/state/GenericState.java | 14 -- src/rails/game/state/GenericStateChange.java | 14 +- src/rails/game/state/Observable.java | 12 + src/rails/game/state/State.java | 9 - 21 files changed, 562 insertions(+), 88 deletions(-) New commits: commit 8d420cfb229c5a0883b5cdef9eebb68141612dec Author: Stefan Frey <ste...@we...> Date: Fri Jul 6 15:40:46 2012 +0200 added GenericStateTest diff --git a/junit/rails/game/state/BooleanStateTest.java b/junit/rails/game/state/BooleanStateTest.java index e5d9f77..1e4b6f5 100644 --- a/junit/rails/game/state/BooleanStateTest.java +++ b/junit/rails/game/state/BooleanStateTest.java @@ -38,6 +38,14 @@ public class BooleanStateTest { } @Test + public void testSetSameIgnored() { + state_default.set(false); + state_init.set(true); + stack.closeCurrentChangeSet(); + assertThat(stack.getLastClosedChangeSet().getStates()).doesNotContain(state_default, state_init); + } + + @Test public void testUndoRedo() { assertFalse(state_default.value()); state_default.set(true); diff --git a/junit/rails/game/state/GenericStateTest.java b/junit/rails/game/state/GenericStateTest.java new file mode 100644 index 0000000..c25424c --- /dev/null +++ b/junit/rails/game/state/GenericStateTest.java @@ -0,0 +1,80 @@ +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 GenericStateTest { + + private final static String STATE_ID = "Generic"; + private final static String ITEM_ID = "Item"; + private final static String ANOTHER_ID = "Another"; + + private Root root; + private ChangeStack stack; + private GenericState<Item> state_default; + private GenericState<Item> state_init; + + private Item item, another_item; + + @Before + public void setUp() { + root = StateTestUtils.setUpRoot(); + stack = root.getStateManager().getChangeStack(); + + item = new AbstractItemImpl(root, ITEM_ID); + another_item = new AbstractItemImpl(root, ANOTHER_ID); + + state_default = GenericState.create(root, STATE_ID); + state_init = GenericState.create(root, null, item); + } + + @Test + public void testValue() { + assertNull(state_default.get()); + assertSame(item, state_init.get()); + } + + @Test + public void testSet() { + state_default.set(item); + assertSame(item, state_default.get()); + state_default.set(null); + assertNull(state_default.get()); + state_init.set(another_item); + assertSame(another_item, state_init.get()); + } + + @Test + public void testSetSameIgnored() { + state_default.set(null); + state_init.set(item); + stack.closeCurrentChangeSet(); + assertThat(stack.getLastClosedChangeSet().getStates()).doesNotContain(state_default, state_init); + } + + @Test + public void testUndoRedo() { + assertNull(state_default.get()); + assertSame(item, state_init.get()); + + state_default.set(item); + state_init.set(another_item); + assertSame(item, state_default.get()); + assertSame(another_item, state_init.get()); + + stack.closeCurrentChangeSet(); + assertThat(stack.getLastClosedChangeSet().getStates()).contains(state_default, state_init); + + stack.undo(); + assertNull(state_default.get()); + assertSame(item, state_init.get()); + + stack.redo(); + assertSame(item, state_default.get()); + assertSame(another_item, state_init.get()); + } + +} diff --git a/src/rails/game/state/BooleanState.java b/src/rails/game/state/BooleanState.java index f2da4c2..301e1dd 100644 --- a/src/rails/game/state/BooleanState.java +++ b/src/rails/game/state/BooleanState.java @@ -31,7 +31,7 @@ public final class BooleanState extends State { * @param value set state to this value */ public void set(boolean value) { - new BooleanChange(this, value); + if (value != this.value) new BooleanChange(this, value); } /** diff --git a/src/rails/game/state/GenericState.java b/src/rails/game/state/GenericState.java index 6003c40..ea79cb6 100644 --- a/src/rails/game/state/GenericState.java +++ b/src/rails/game/state/GenericState.java @@ -29,24 +29,16 @@ public final class GenericState<E> extends State { return new GenericState<E>(parent, id, object); } - private void set(E object, boolean forced) { + public void set(E object) { if (object == null) { if (this.object != null) { new GenericStateChange<E>(this, object); } - } else if (!object.equals(this.object) || forced) { - new GenericStateChange<E>(this, object); + } else if (object != this.object) { + new GenericStateChange<E>(this, object); } } - public void set(E object) { - set(object, false); - } - - public void setForced(E object) { - set(object, true); - } - public E get() { return this.object; } diff --git a/src/rails/game/state/GenericStateChange.java b/src/rails/game/state/GenericStateChange.java index 076f731..d53d925 100644 --- a/src/rails/game/state/GenericStateChange.java +++ b/src/rails/game/state/GenericStateChange.java @@ -29,7 +29,19 @@ final class GenericStateChange<E> extends Change { @Override public String toString() { - return "Change State " + state.getId() + " from " + previous.toString() + " to" + next.toString(); + String from, to; + if (previous == null) { + from = "<null>"; + } else { + from = previous.toString(); + } + if (next == null) { + to = "<null>"; + } else { + to = next.toString(); + } + + return "Change State " + state + " from " + from + " to " + to ; } } commit f828e621bdcf63659cc8b24516ba5a0e1430974e Author: Stefan Frey <ste...@we...> Date: Fri Jul 6 15:12:16 2012 +0200 added BooleanStateTest and StateTestUtils diff --git a/junit/rails/game/state/BooleanStateTest.java b/junit/rails/game/state/BooleanStateTest.java new file mode 100644 index 0000000..e5d9f77 --- /dev/null +++ b/junit/rails/game/state/BooleanStateTest.java @@ -0,0 +1,53 @@ +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 BooleanStateTest { + + private final static String STATE_ID = "Boolean"; + + private Root root; + private ChangeStack stack; + private BooleanState state_default; + private BooleanState state_init; + + @Before + public void setUp() { + root = StateTestUtils.setUpRoot(); + state_default = BooleanState.create(root, STATE_ID); + state_init = BooleanState.create(root, null, true); + stack = root.getStateManager().getChangeStack(); + } + + @Test + public void testValue() { + assertFalse(state_default.value()); + assertTrue(state_init.value()); + } + + @Test + public void testSet() { + state_default.set(true); + assertTrue(state_default.value()); + state_init.set(false); + assertFalse(state_init.value()); + } + + @Test + public void testUndoRedo() { + assertFalse(state_default.value()); + state_default.set(true); + assertTrue(state_default.value()); + stack.closeCurrentChangeSet(); + assertThat(stack.getLastClosedChangeSet().getStates()).contains(state_default); + stack.undo(); + assertFalse(state_default.value()); + stack.redo(); + assertTrue(state_default.value()); + } + +} diff --git a/junit/rails/game/state/StateTestUtils.java b/junit/rails/game/state/StateTestUtils.java new file mode 100644 index 0000000..1d1d50e --- /dev/null +++ b/junit/rails/game/state/StateTestUtils.java @@ -0,0 +1,21 @@ +package rails.game.state; + +import org.mockito.Mock; + +import rails.game.Player; +import rails.game.action.PossibleAction; + +/** + * Common Utilities for State Testing + */ +class StateTestUtils { + @Mock static Player player; + @Mock static PossibleAction action; + + public static Root setUpRoot() { + Root root = Root.create(); + // avoid initial changeSet as it is not undoable + root.getStateManager().getChangeStack().startActionChangeSet(player, action); + return root; + } +} diff --git a/src/rails/game/state/BooleanChange.java b/src/rails/game/state/BooleanChange.java index 6246fd0..75aa2bc 100644 --- a/src/rails/game/state/BooleanChange.java +++ b/src/rails/game/state/BooleanChange.java @@ -2,7 +2,6 @@ package rails.game.state; /** * Change associated with BooleanState - * @author freystef */ final class BooleanChange extends Change { diff --git a/src/rails/game/state/BooleanState.java b/src/rails/game/state/BooleanState.java index 2c35526..f2da4c2 100644 --- a/src/rails/game/state/BooleanState.java +++ b/src/rails/game/state/BooleanState.java @@ -2,8 +2,6 @@ package rails.game.state; /** * A stateful version of a boolean variable - * - * @author Erik Vos, Stefan Frey (V2.0) */ public final class BooleanState extends State { @@ -22,16 +20,23 @@ public final class BooleanState extends State { } /** + * Creates a BooleanState with defined initial value * @param value initial value */ public static BooleanState create(Item parent, String id, Boolean value){ return new BooleanState(parent, id, value); } + /** + * @param value set state to this value + */ public void set(boolean value) { new BooleanChange(this, value); } + /** + * @return current value of state variable + */ public boolean value() { return value; } commit a190b541b3264233275b92644cbfb99025c47827 Author: Stefan Frey <ste...@we...> Date: Fri Jul 6 13:21:29 2012 +0200 added StateTest and required Impl test classes diff --git a/junit/rails/game/state/FormatterTest.java b/junit/rails/game/state/FormatterTest.java new file mode 100644 index 0000000..626f0be --- /dev/null +++ b/junit/rails/game/state/FormatterTest.java @@ -0,0 +1,40 @@ +package rails.game.state; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +public class FormatterTest { + + // This formatter doubles the text of the state + private class FormatterImpl implements Formatter<State> { + public String formatValue(State state) { + return state.toString() + state.toString(); + } + } + + private final static String STATE_ID = "State"; + private final static String STATE_TEXT = "Test"; + + private Root root; + private State state; + private Formatter<State> formatter; + + @Before + public void setUp() { + root = Root.create(); + state = new StateImpl(root, STATE_ID, STATE_TEXT); + formatter = new FormatterImpl(); + } + + @Test + public void testFormatValue() { + assertEquals(STATE_TEXT, state.getText()); + state.setFormatter(formatter); + assertEquals(STATE_TEXT + STATE_TEXT, state.getText()); + state.setFormatter(null); + assertEquals(STATE_TEXT, state.getText()); + } + +} diff --git a/junit/rails/game/state/ModelImpl.java b/junit/rails/game/state/ModelImpl.java new file mode 100644 index 0000000..e029de0 --- /dev/null +++ b/junit/rails/game/state/ModelImpl.java @@ -0,0 +1,17 @@ +package rails.game.state; + +//An implementation only for testing +class ModelImpl extends Model { + + private final String text; + + ModelImpl(Item parent, String id, String text) { + super(parent, id); + this.text = text; + } + + @Override + public String toString() { + return text; + } +} diff --git a/junit/rails/game/state/StateImpl.java b/junit/rails/game/state/StateImpl.java new file mode 100644 index 0000000..4f4f160 --- /dev/null +++ b/junit/rails/game/state/StateImpl.java @@ -0,0 +1,18 @@ +package rails.game.state; + +// An implementation only for testing +class StateImpl extends State { + + private final String text; + + StateImpl(Item parent, String id, String text) { + super(parent, id); + this.text = text; + } + + @Override + public String toString() { + return text; + } + +} diff --git a/junit/rails/game/state/StateTest.java b/junit/rails/game/state/StateTest.java new file mode 100644 index 0000000..61bffab --- /dev/null +++ b/junit/rails/game/state/StateTest.java @@ -0,0 +1,54 @@ +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 StateTest { + + private final static String STATE_ID = "State"; + private final static String MODEL_ID = "Model"; + private final static String STATE_TEXT = "Test"; + + private Root root; + private State state; + private State state_model; + private State state_wo_id; + private Model model; + + @Before + public void setUp() { + root = Root.create(); + state = new StateImpl(root, STATE_ID, null); + model = new ModelImpl(root, MODEL_ID, null); + state_model = new StateImpl(model, STATE_ID, null); + state_wo_id = new StateImpl(model, null, STATE_TEXT); + } + + @Test + public void testState() { + // check that model is linked by state_model + assertThat(state_model.getModels()).contains(model); + // but for the standard model only after explicit link + assertThat(state.getModels()).doesNotContain(model); + state.addModel(model); + assertThat(state.getModels()).contains(model); + + // state_wo_id does not have any link + try { + state_wo_id.getModels(); + } catch (Exception e) { + assertThat(e).isInstanceOf(IllegalStateException.class); + } + + } + + @Test + public void testGetText() { + assertNull(state.getText()); + assertEquals(STATE_TEXT, state_wo_id.getText()); + } + +} diff --git a/src/rails/game/state/State.java b/src/rails/game/state/State.java index fc2ef79..59a95c0 100644 --- a/src/rails/game/state/State.java +++ b/src/rails/game/state/State.java @@ -20,13 +20,14 @@ public abstract class State extends Observable { protected State(Item parent, String id) { super(parent, id); - // check if parent is a model and add as dependent model - if (parent instanceof Model) { - addModel((Model)parent); - } + // register if observable state if (id != null) { + // check if parent is a model and add as dependent model + if (parent instanceof Model) { + addModel((Model)parent); + } // check if there is a StateManager available checkState(getContext().getRoot().getStateManager() != null, "Root of state has no StateManager attached"); // if so => register state there commit 08ffe071434691403dc840e50859997bbd32c5ac Author: Stefan Frey <ste...@we...> Date: Fri Jul 6 10:57:07 2012 +0200 fixed wronger ordering of expected and actual arguments in existing tests diff --git a/junit/rails/game/state/AbstractItemTest.java b/junit/rails/game/state/AbstractItemTest.java index 19c994e..ec38434 100644 --- a/junit/rails/game/state/AbstractItemTest.java +++ b/junit/rails/game/state/AbstractItemTest.java @@ -26,38 +26,38 @@ public class AbstractItemTest { @Test public void testGetId() { - assertEquals(item.getId(), ITEM_ID); - assertEquals(anotherItem.getId(), ANOTHER_ID); + assertEquals(ITEM_ID, item.getId()); + assertEquals(ANOTHER_ID, anotherItem.getId()); } @Test public void testGetParent() { - assertSame(item.getParent(), manager); - assertSame(anotherItem.getParent(), item); + assertSame(manager, item.getParent()); + assertSame(item, anotherItem.getParent()); } @Test public void testGetContext() { - assertSame(item.getContext(), manager); - assertSame(anotherItem.getContext(), manager); + assertSame(manager, item.getContext()); + assertSame(manager, anotherItem.getContext()); } @Test public void testGetRoot() { - assertSame(item.getRoot(), root); - assertSame(anotherItem.getRoot(), root); + assertSame(root, item.getRoot()); + assertSame(root, anotherItem.getRoot()); } @Test public void testGetURI() { - assertEquals(item.getURI(), ITEM_ID); - assertEquals(anotherItem.getURI(), ITEM_ID + Item.SEP + ANOTHER_ID); + assertEquals(ITEM_ID, item.getURI()); + assertEquals(ITEM_ID + Item.SEP + ANOTHER_ID, anotherItem.getURI()); } @Test public void testGetFullURI() { - assertEquals(item.getFullURI(), Item.SEP + MANAGER_ID + Item.SEP + ITEM_ID); - assertEquals(anotherItem.getFullURI(), Item.SEP + MANAGER_ID+ Item.SEP + ITEM_ID + Item.SEP + ANOTHER_ID); + assertEquals(Item.SEP + MANAGER_ID + Item.SEP + ITEM_ID, item.getFullURI()); + assertEquals(Item.SEP + MANAGER_ID+ Item.SEP + ITEM_ID + Item.SEP + ANOTHER_ID, anotherItem.getFullURI()); } } diff --git a/junit/rails/game/state/ActionChangeSetTest.java b/junit/rails/game/state/ActionChangeSetTest.java index 8062dba..dd388ec 100644 --- a/junit/rails/game/state/ActionChangeSetTest.java +++ b/junit/rails/game/state/ActionChangeSetTest.java @@ -42,12 +42,12 @@ public class ActionChangeSetTest { @Test public void testGetPlayer() { - assertSame(changeSet.getPlayer(), player); + assertSame(player, changeSet.getPlayer()); } @Test public void testGetAction() { - assertSame(changeSet.getAction(), action); + assertSame(action, changeSet.getAction()); } @Test @@ -79,5 +79,4 @@ public class ActionChangeSetTest { assertTrue(state.value()); } - } diff --git a/junit/rails/game/state/ChangeStackTest.java b/junit/rails/game/state/ChangeStackTest.java index d1d04ef..3b24122 100644 --- a/junit/rails/game/state/ChangeStackTest.java +++ b/junit/rails/game/state/ChangeStackTest.java @@ -43,16 +43,16 @@ public class ChangeStackTest { @Test public void testGetCurrentChangeSet() { - assertSame(changeStack.getCurrentChangeSet(), action_3); + assertSame(action_3, changeStack.getCurrentChangeSet()); // on the stack there are auto_1, action_1, auto_2, action_2 - assertEquals(changeStack.sizeUndoStack(), 4); + assertEquals(4, changeStack.sizeUndoStack()); } @Test public void testCloseCurrentChangeSet() { changeStack.closeCurrentChangeSet(); assertTrue(action_3.isClosed()); - assertSame(changeStack.getLastClosedChangeSet(), action_3); + assertSame(action_3, changeStack.getLastClosedChangeSet()); // and now action_3 is added assertEquals(changeStack.sizeUndoStack(), 5); } @@ -62,26 +62,26 @@ public class ChangeStackTest { assertFalse(state.value()); // undo action 3 assertTrue(changeStack.undo()); - assertEquals(changeStack.sizeUndoStack(), 4); - assertSame(changeStack.getLastClosedChangeSet(), action_2); + assertEquals(4, changeStack.sizeUndoStack()); + assertSame(action_2, changeStack.getLastClosedChangeSet()); assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class); assertFalse(state.value()); // undo action 2 assertTrue(changeStack.undo()); - assertEquals(changeStack.sizeUndoStack(), 3); - assertSame(changeStack.getLastClosedChangeSet(), auto_2); + assertEquals(3, changeStack.sizeUndoStack()); + assertSame(auto_2, changeStack.getLastClosedChangeSet()); assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class); assertTrue(state.value()); // undo auto_2 and action 1 assertTrue(changeStack.undo()); - assertEquals(changeStack.sizeUndoStack(), 1); - assertSame(changeStack.getLastClosedChangeSet(), auto_1); + assertEquals(1, changeStack.sizeUndoStack()); + assertSame(auto_1, changeStack.getLastClosedChangeSet()); assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class); assertFalse(state.value()); // undo should not do anything now assertFalse(changeStack.undo()); - assertEquals(changeStack.sizeUndoStack(), 1); - assertSame(changeStack.getLastClosedChangeSet(), auto_1); + assertEquals(1, changeStack.sizeUndoStack()); + assertSame(auto_1, changeStack.getLastClosedChangeSet()); assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class); assertFalse(state.value()); } @@ -95,26 +95,26 @@ public class ChangeStackTest { // the state unitl now was checked in testUndo // now redo action_1 and auto_2 assertTrue(changeStack.redo()); - assertEquals(changeStack.sizeUndoStack(), 3); - assertSame(changeStack.getLastClosedChangeSet(), auto_2); + assertEquals(3, changeStack.sizeUndoStack()); + assertSame(auto_2, changeStack.getLastClosedChangeSet()); assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class); assertTrue(state.value()); // redo action_2 assertTrue(changeStack.redo()); - assertEquals(changeStack.sizeUndoStack(), 4); - assertSame(changeStack.getLastClosedChangeSet(), action_2); + assertEquals(4, changeStack.sizeUndoStack()); + assertSame(action_2, changeStack.getLastClosedChangeSet()); assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class); assertFalse(state.value()); // redo action_3 assertTrue(changeStack.redo()); - assertEquals(changeStack.sizeUndoStack(), 5); - assertSame(changeStack.getLastClosedChangeSet(), action_3); + assertEquals(5, changeStack.sizeUndoStack()); + assertSame(action_3, changeStack.getLastClosedChangeSet()); assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class); assertFalse(state.value()); // then it should do anything assertFalse(changeStack.redo()); - assertEquals(changeStack.sizeUndoStack(), 5); - assertSame(changeStack.getLastClosedChangeSet(), action_3); + assertEquals(5, changeStack.sizeUndoStack()); + assertSame(action_3, changeStack.getLastClosedChangeSet()); assertThat(changeStack.getCurrentChangeSet()).isInstanceOf(AutoChangeSet.class); assertFalse(state.value()); } diff --git a/junit/rails/game/state/ManagerTest.java b/junit/rails/game/state/ManagerTest.java index 0400718..95fd0c7 100644 --- a/junit/rails/game/state/ManagerTest.java +++ b/junit/rails/game/state/ManagerTest.java @@ -27,60 +27,59 @@ public class ManagerTest { @Test public void testGetId() { - assertEquals(manager.getId(), MANAGER_ID); - assertEquals(anotherManager.getId(), ANOTHER_MANAGER_ID); + assertEquals(MANAGER_ID, manager.getId()); + assertEquals(ANOTHER_MANAGER_ID, anotherManager.getId()); } @Test public void testGetParent() { - assertSame(manager.getParent(), item); - assertSame(anotherManager.getParent(), manager); + assertSame(item, manager.getParent()); + assertSame(manager, anotherManager.getParent()); } @Test public void testGetContext() { - System.out.println(); - assertSame(manager.getContext(), root); - assertSame(anotherManager.getContext(), manager); + assertSame(root, manager.getContext()); + assertSame(manager, anotherManager.getContext()); } @Test public void testGetURI() { - assertEquals(manager.getURI(), ITEM_ID + Item.SEP + MANAGER_ID); - assertEquals(anotherManager.getURI(), ANOTHER_MANAGER_ID); + assertEquals(ITEM_ID + Item.SEP + MANAGER_ID, manager.getURI()); + assertEquals(ANOTHER_MANAGER_ID, anotherManager.getURI()); } @Test public void testGetFullURI() { - assertEquals(manager.getFullURI(), Item.SEP + ITEM_ID + Item.SEP + MANAGER_ID); - assertEquals(anotherManager.getFullURI(), Item.SEP + ITEM_ID + Item.SEP + MANAGER_ID + Item.SEP + ANOTHER_MANAGER_ID); + assertEquals(Item.SEP + ITEM_ID + Item.SEP + MANAGER_ID, manager.getFullURI()); + assertEquals(Item.SEP + ITEM_ID + Item.SEP + MANAGER_ID + Item.SEP + ANOTHER_MANAGER_ID, anotherManager.getFullURI()); } @Test public void testLocate() { // anotherItem is local - assertSame(manager.locate(anotherItem.getURI()), anotherItem); - assertSame(manager.locate(anotherItem.getFullURI()), anotherItem); + assertSame(anotherItem, manager.locate(anotherItem.getURI())); + assertSame(anotherItem, manager.locate(anotherItem.getFullURI())); // item is not local assertNull(manager.locate(item.getURI())); - assertSame(manager.locate(item.getFullURI()), item); + assertSame(item, manager.locate(item.getFullURI())); // manager is not local in itself, but in root assertNull(manager.locate(manager.getURI())); - assertSame(root.locate(manager.getURI()), manager); - assertSame(manager.locate(manager.getFullURI()), manager); + assertSame(manager, root.locate(manager.getURI())); + assertSame(manager, manager.locate(manager.getFullURI())); // anotherManager is not local in itself, but in manager assertNull(anotherManager.locate(anotherManager.getURI())); - assertSame(manager.locate(anotherManager.getURI()), anotherManager); - assertSame(anotherManager.locate(anotherManager.getFullURI()), anotherManager); + assertSame(anotherManager, manager.locate(anotherManager.getURI())); + assertSame(anotherManager, anotherManager.locate(anotherManager.getFullURI())); } @Test public void testGetRoot() { - assertSame(manager.getRoot(), root); - assertSame(anotherManager.getRoot(), root); + assertSame(root, manager.getRoot()); + assertSame(root, anotherManager.getRoot()); } } diff --git a/junit/rails/game/state/RootTest.java b/junit/rails/game/state/RootTest.java index c98adfd..2f686c9 100644 --- a/junit/rails/game/state/RootTest.java +++ b/junit/rails/game/state/RootTest.java @@ -37,43 +37,43 @@ public class RootTest { @Test public void testGetId() { - assertEquals(root.getId(), Root.ID); + assertEquals(Root.ID, root.getId()); } @Test public void testGetContext() { - assertSame(root.getContext(), root); + assertSame(root, root.getContext()); } @Test public void testGetRoot() { - assertSame(root.getRoot(), root); + assertSame(root, root.getRoot()); } @Test public void testGetURI() { - assertSame(root.getURI(), Root.ID); + assertSame(Root.ID, root.getURI()); } @Test public void testGetFullURI() { - assertSame(root.getFullURI(), Root.ID); + assertSame(Root.ID, root.getFullURI()); } @Test public void testLocate() { // item is local - assertSame(root.locate(item.getURI()), item); - assertSame(root.locate(item.getFullURI()), item); + assertSame(item, root.locate(item.getURI())); + assertSame(item, root.locate(item.getFullURI())); // manager is local - assertSame(root.locate(manager.getURI()), manager); - assertSame(root.locate(manager.getFullURI()), manager); + assertSame(manager, root.locate(manager.getURI())); + assertSame(manager, root.locate(manager.getFullURI())); // anotherItem is not local assertNull(root.locate(anotherItem.getURI())); assertSame(root.locate(anotherItem.getFullURI()), anotherItem); // root is local in root - assertSame(root.locate(root.getURI()), root); - assertSame(root.locate(root.getFullURI()), root); + assertSame(root, root.locate(root.getURI())); + assertSame(root, root.locate(root.getFullURI())); // and if item is removed it is not found anymore root.removeItem(item); assertNull(root.locate(item.getURI())); @@ -88,7 +88,7 @@ public class RootTest { public void testAddItemSuccess() { root.removeItem(item); root.addItem(item); - assertSame(root.locate(item.getFullURI()), item); + assertSame(item, root.locate(item.getFullURI())); } public void testRemoveItemSuccess() { commit f324c698103cbc65d49fceecaf0b468d350e2d2e Author: Stefan Frey <ste...@we...> Date: Fri Jul 6 10:41:17 2012 +0200 added ObservableTest diff --git a/junit/rails/game/state/AbstractItemImpl.java b/junit/rails/game/state/AbstractItemImpl.java index 3aec737..5249e89 100644 --- a/junit/rails/game/state/AbstractItemImpl.java +++ b/junit/rails/game/state/AbstractItemImpl.java @@ -1,5 +1,6 @@ package rails.game.state; +// Implementation for Testing only class AbstractItemImpl extends AbstractItem { AbstractItemImpl(Item parent, String id) { super(parent, id); diff --git a/junit/rails/game/state/ManagerImpl.java b/junit/rails/game/state/ManagerImpl.java index a6fdf00..477fb3f 100644 --- a/junit/rails/game/state/ManagerImpl.java +++ b/junit/rails/game/state/ManagerImpl.java @@ -1,5 +1,6 @@ package rails.game.state; +// Implementation for Testing only class ManagerImpl extends Manager { ManagerImpl(Item parent, String id) { super(parent, id); diff --git a/junit/rails/game/state/ObservableTest.java b/junit/rails/game/state/ObservableTest.java new file mode 100644 index 0000000..2e2000b --- /dev/null +++ b/junit/rails/game/state/ObservableTest.java @@ -0,0 +1,166 @@ +package rails.game.state; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; +import static org.fest.assertions.api.Assertions.assertThat; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class ObservableTest { + + // Implementation for Testing only + private class ObservableImpl extends Observable { + ObservableImpl(Item parent, String id) { + super(parent, id); + } + + @Override + public String getText() { + return null; + } + } + + private final static String MANAGER_ID = "Manager"; + private final static String ITEM_ID = "Item"; + private final static String OBS_ID = "Observable"; + + private Root root; + private Manager manager; + private Item item; + private Observable observable, unobservable; + @Mock private Observer observer; + @Mock private Model model; + + @Before + public void setUp() { + root = Root.create(); + manager = new ManagerImpl(root, MANAGER_ID); + item = new AbstractItemImpl(manager, ITEM_ID); + observable = new ObservableImpl(item, OBS_ID); + unobservable = new ObservableImpl(root, null); + } + + + @Test + public void testObservers() { + // add observer and test if contained + observable.addObserver(observer); + assertThat(observable.getObservers()).contains(observer); + + // remove observer and test if not contained + assertTrue(observable.removeObserver(observer)); + assertThat(observable.getObservers()).doesNotContain(observer); + + // remove observer not contained anymore + assertFalse(observable.removeObserver(observer)); + + // Check failing on unobservable + try { + unobservable.addObserver(observer); + } catch (Exception e) { + assertThat(e).isInstanceOf(IllegalStateException.class); + } + try { + unobservable.removeObserver(observer); + } catch (Exception e) { + assertThat(e).isInstanceOf(IllegalStateException.class); + } + try { + unobservable.getObservers(); + } catch (Exception e) { + assertThat(e).isInstanceOf(IllegalStateException.class); + } + } + + @Test + public void testModels() { + // add observer and test if contained + observable.addModel(model); + assertThat(observable.getModels()).contains(model); + + // check update + observable.updateModels(); + verify(model).update(); + + // remove Model and test if not contained + assertTrue(observable.removeModel(model)); + assertThat(observable.getModels()).doesNotContain(model); + observable.updateModels(); + // still only called once(!) + verify(model).update(); + + // remove Model not contained anymore + assertFalse(observable.removeModel(model)); + + // Check failing on unobservable + try { + unobservable.addModel(model); + } catch (Exception e) { + assertThat(e).isInstanceOf(IllegalStateException.class); + } + try { + unobservable.removeModel(model); + } catch (Exception e) { + assertThat(e).isInstanceOf(IllegalStateException.class); + } + try { + unobservable.getModels(); + } catch (Exception e) { + assertThat(e).isInstanceOf(IllegalStateException.class); + } + + } + + @Test + public void testGetId() { + assertEquals(OBS_ID, observable.getId()); + assertEquals(null, unobservable.getId()); + } + + @Test + public void testGetParent() { + assertSame(item, observable.getParent()); + assertSame(root, unobservable.getParent()); + } + + @Test + public void testGetContext() { + assertSame(manager, observable.getContext()); + assertSame(root, unobservable.getContext()); + } + + @Test + public void testGetRoot() { + assertSame(root, observable.getRoot()); + assertSame(root, unobservable.getRoot()); + } + + @Test + public void testGetURI() { + assertEquals(ITEM_ID + Item.SEP + OBS_ID, observable.getURI()); + assertSame(observable, observable.getContext().locate(observable.getURI())); + try { + unobservable.getURI(); + } catch (Exception e) { + assertThat(e).isInstanceOf(IllegalStateException.class); + } + } + + @Test + public void testGetFullURI() { + assertEquals(Item.SEP + MANAGER_ID + Item.SEP + ITEM_ID + Item.SEP + OBS_ID, observable.getFullURI()); + assertSame(observable, observable.getContext().locate(observable.getURI())); + assertSame(observable, observable.getRoot().locate(observable.getFullURI())); + try { + unobservable.getFullURI(); + } catch (Exception e) { + assertThat(e).isInstanceOf(IllegalStateException.class); + } + } + +} diff --git a/src/rails/game/state/Observable.java b/src/rails/game/state/Observable.java index 3272391..0ac1ffb 100644 --- a/src/rails/game/state/Observable.java +++ b/src/rails/game/state/Observable.java @@ -33,7 +33,13 @@ public abstract class Observable implements Item { // defined standard fields this.parent = parent; this.id = id; - context = parent.getContext(); + + if (parent instanceof Context) { + context = (Context)parent; + } else { + // recursive definition + context = parent.getContext(); + } // if id is null this is an "unobservable" observable if (id == null) { @@ -42,6 +48,8 @@ public abstract class Observable implements Item { } else { observers = HashSetState.create(this, null); models = HashSetState.create(this, null); + // add item to context if it has an id + context.addItem(this); } } @@ -108,7 +116,7 @@ public abstract class Observable implements Item { public String getURI() { checkState(id != null, "Cannot get URI of unobservable object"); - if (parent instanceof Manager) { + if (parent instanceof Context) { return id; } else { // recursive definition |