package jrummikub.control; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import jrummikub.model.MockTable; import jrummikub.model.Stone; import jrummikub.model.StoneColor; import jrummikub.model.StoneSet; import jrummikub.util.Event; import jrummikub.util.IEvent; import jrummikub.util.IListener; import jrummikub.view.MockView; import org.junit.Before; import org.junit.Test; public class TurnControlTest { class MockTimer implements ITurnTimer { public boolean timerRunning; public Event timeRunOutEvent = new Event(); @Override public void startTimer() { timerRunning = true; } @Override public void stopTimer() { timerRunning = false; } @Override public IEvent getTimeRunOutEvent() { return timeRunOutEvent; } } TurnControl testControl; MockView mockView; MockTimer mockTimer; MockTable mockTable; boolean eventFired; @Before public void setUp() { mockView = new MockView(); mockTimer = new MockTimer(); mockTable = new MockTable(); testControl = new TurnControl(null, mockTable, mockView, mockTimer); } @Test public void viewEndOfTurn() { eventFired = false; mockTimer.timerRunning = true; testControl.getEndOfTurnEvent().add(new IListener() { @Override public void handle() { eventFired = true; } }); mockView.playerPanel.endTurnEvent.emit(); assertTrue(eventFired); assertFalse(mockTimer.timerRunning); } @Test public void timerEndOfTurn() { eventFired = false; mockTimer.timerRunning = true; testControl.getEndOfTurnEvent().add(new IListener() { @Override public void handle() { eventFired = true; } }); mockTimer.timeRunOutEvent.emit(); assertTrue(eventFired); assertFalse(mockTimer.timerRunning); } @Test public void selectStoneInHand() { Stone firstStone = new Stone(StoneColor.RED); // Select first stone mockView.playerPanel.handPanel.stoneClickEvent.emit(firstStone, false); assertCollection(Arrays.asList(firstStone)); // Select second stone Stone secondStone = new Stone(StoneColor.BLACK); mockView.playerPanel.handPanel.stoneClickEvent.emit(secondStone, false); assertCollection(Arrays.asList(secondStone)); } @Test public void collectStoneInHand() { Stone firstStone = new Stone(StoneColor.RED); // Select first stone mockView.playerPanel.handPanel.stoneClickEvent.emit(firstStone, true); assertCollection(Arrays.asList(firstStone)); // Select second stone Stone secondStone = new Stone(StoneColor.BLACK); mockView.playerPanel.handPanel.stoneClickEvent.emit(secondStone, true); assertCollection(Arrays.asList(firstStone, secondStone)); // De-select first stone mockView.playerPanel.handPanel.stoneClickEvent.emit(firstStone, true); assertCollection(Arrays.asList(secondStone)); } @Test public void deselectStoneInCollection() { Stone firstStone = new Stone(StoneColor.RED); Stone secondStone = new Stone(StoneColor.BLACK); mockView.playerPanel.handPanel.stoneClickEvent.emit(firstStone, true); mockView.playerPanel.handPanel.stoneClickEvent.emit(secondStone, true); mockView.tablePanel.stoneCollectionPanel.stoneClickEvent.emit( firstStone, false); assertCollection(Arrays.asList(secondStone)); } @Test public void reorderCollection() { Stone firstStone = new Stone(StoneColor.RED); Stone secondStone = new Stone(StoneColor.BLACK); mockView.playerPanel.handPanel.stoneClickEvent.emit(firstStone, true); mockView.playerPanel.handPanel.stoneClickEvent.emit(secondStone, true); mockView.tablePanel.stoneCollectionPanel.stoneClickEvent.emit( firstStone, true); assertCollection(Arrays.asList(secondStone, firstStone)); } @Test public void deselectWholeCollection() { Stone firstStone = new Stone(StoneColor.RED); Stone secondStone = new Stone(StoneColor.BLACK); mockView.playerPanel.handPanel.stoneClickEvent.emit(firstStone, true); mockView.playerPanel.handPanel.stoneClickEvent.emit(secondStone, true); mockView.tablePanel.stoneCollectionPanel.setClickEvent.emit(firstStone, true); assertCollection(new ArrayList()); } @Test public void selectStoneOnTable() { Stone firstStone = new Stone(StoneColor.RED); // Select first stone mockView.tablePanel.stoneClickEvent.emit(firstStone, false); assertCollection(Arrays.asList(firstStone)); // Select second stone Stone secondStone = new Stone(StoneColor.BLACK); mockView.tablePanel.stoneClickEvent.emit(secondStone, false); assertCollection(Arrays.asList(secondStone)); } @Test public void collectStoneOnTable() { Stone firstStone = new Stone(StoneColor.RED); // Select first stone mockView.tablePanel.stoneClickEvent.emit(firstStone, true); assertCollection(Arrays.asList(firstStone)); // Select second stone Stone secondStone = new Stone(StoneColor.BLACK); mockView.tablePanel.stoneClickEvent.emit(secondStone, true); assertCollection(Arrays.asList(firstStone, secondStone)); // De-select first stone mockView.tablePanel.stoneClickEvent.emit(firstStone, true); assertCollection(Arrays.asList(secondStone)); } @Test public void selectSetOnTable() { Stone stone1 = new Stone(StoneColor.RED); Stone stone2 = new Stone(StoneColor.BLACK); StoneSet set1 = new StoneSet(Arrays.asList(stone1, stone2)); Stone stone3 = new Stone(1, StoneColor.RED); Stone stone4 = new Stone(1, StoneColor.BLACK); StoneSet set2 = new StoneSet(Arrays.asList(stone3, stone4)); mockTable.findStoneSet.put(stone1, set1); mockTable.findStoneSet.put(stone4, set2); mockView.tablePanel.setClickEvent.emit(stone1, false); assertCollection(Arrays.asList(stone1, stone2)); mockView.tablePanel.setClickEvent.emit(stone4, false); assertCollection(Arrays.asList(stone3, stone4)); } @Test public void collectSetOnTable() { Stone stone1 = new Stone(StoneColor.RED); Stone stone2 = new Stone(StoneColor.BLACK); StoneSet set1 = new StoneSet(Arrays.asList(stone1, stone2)); Stone stone3 = new Stone(1, StoneColor.RED); Stone stone4 = new Stone(1, StoneColor.BLACK); StoneSet set2 = new StoneSet(Arrays.asList(stone3, stone4)); mockTable.findStoneSet.put(stone1, set1); mockTable.findStoneSet.put(stone4, set2); mockView.tablePanel.setClickEvent.emit(stone1, true); assertCollection(Arrays.asList(stone1, stone2)); mockView.tablePanel.setClickEvent.emit(stone4, true); assertCollection(Arrays.asList(stone1, stone2, stone3, stone4)); } @Test public void rangeSelectOnTable() { Stone stone1 = new Stone(1, StoneColor.RED); Stone stone2 = new Stone(2, StoneColor.RED); Stone stone3 = new Stone(3, StoneColor.RED); Stone stone4 = new Stone(4, StoneColor.RED); StoneSet set1 = new StoneSet(Arrays.asList(stone1, stone2, stone3, stone4)); mockTable.findStoneSet.put(stone1, set1); mockTable.findStoneSet.put(stone3, set1); mockView.tablePanel.stoneClickEvent.emit(stone1, false); mockView.tablePanel.rangeClickEvent.emit(stone3, true); assertCollection(Arrays.asList(stone1, stone2, stone3)); } @Test public void rangeCollectOnTable() { Stone extraStone = new Stone(StoneColor.RED); Stone stone1 = new Stone(1, StoneColor.RED); Stone stone2 = new Stone(2, StoneColor.RED); Stone stone3 = new Stone(3, StoneColor.RED); Stone stone4 = new Stone(4, StoneColor.RED); StoneSet set1 = new StoneSet(Arrays.asList(stone1, stone2, stone3, stone4)); mockTable.findStoneSet.put(stone1, set1); mockTable.findStoneSet.put(stone3, set1); mockView.tablePanel.stoneClickEvent.emit(extraStone, false); mockView.tablePanel.stoneClickEvent.emit(stone1, true); mockView.tablePanel.rangeClickEvent.emit(stone3, false); assertCollection(Arrays.asList(extraStone, stone1, stone2, stone3)); } @Test public void rangeFailSelect() { Stone stone1 = new Stone(1, StoneColor.RED); Stone stone2 = new Stone(2, StoneColor.RED); StoneSet set1 = new StoneSet(Arrays.asList(stone1)); StoneSet set2 = new StoneSet(Arrays.asList(stone2)); mockTable.findStoneSet.put(stone1, set1); mockTable.findStoneSet.put(stone2, set2); // Select first stone mockView.tablePanel.stoneClickEvent.emit(stone1, false); assertCollection(Arrays.asList(stone1)); // Select second stone mockView.tablePanel.rangeClickEvent.emit(stone2, false); assertCollection(Arrays.asList(stone2)); } @Test public void rangeFailCollect() { Stone stone1 = new Stone(1, StoneColor.RED); Stone stone2 = new Stone(2, StoneColor.RED); StoneSet set1 = new StoneSet(Arrays.asList(stone1)); StoneSet set2 = new StoneSet(Arrays.asList(stone2)); mockTable.findStoneSet.put(stone1, set1); mockTable.findStoneSet.put(stone2, set2); // Select first stone mockView.tablePanel.stoneClickEvent.emit(stone1, true); assertCollection(Arrays.asList(stone1)); // Select second stone mockView.tablePanel.rangeClickEvent.emit(stone2, true); assertCollection(Arrays.asList(stone1, stone2)); } private void assertCollection(List expected) { ArrayList selectedStones = new ArrayList( mockView.selectedStones); ArrayList expectedStones = new ArrayList(expected); assertEquals(selectedStones, expectedStones); } }