package jrummikub.control; import static org.junit.Assert.*; import java.util.Collections; import java.util.List; import java.util.ArrayList; import java.util.Arrays; 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; } } MockView mockView; MockTimer mockTimer; MockTable mockTable; boolean eventFired; @Before public void setUp() { mockView = new MockView(); mockTimer = new MockTimer(); mockTable = new MockTable(); } @Test public void viewEndOfTurn() { eventFired = false; mockTimer.timerRunning = true; TurnControl testControl = new TurnControl(null, null, mockView, mockTimer); 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; TurnControl testControl = new TurnControl(null, null, mockView, mockTimer); testControl.getEndOfTurnEvent().add(new IListener() { @Override public void handle() { eventFired = true; } }); mockTimer.timeRunOutEvent.emit(); assertTrue(eventFired); assertFalse(mockTimer.timerRunning); } @Test public void selectStoneInHand() { TurnControl testControl = new TurnControl(null, null, mockView, mockTimer); 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() { TurnControl testControl = new TurnControl(null, null, mockView, mockTimer); 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() { TurnControl testControl = new TurnControl(null, null, mockView, mockTimer); 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() { TurnControl testControl = new TurnControl(null, null, mockView, mockTimer); 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() { TurnControl testControl = new TurnControl(null, null, mockView, mockTimer); 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() { TurnControl testControl = new TurnControl(null, null, mockView, mockTimer); 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() { TurnControl testControl = new TurnControl(null, null, mockView, mockTimer); 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() { TurnControl testControl = new TurnControl(null, mockTable, mockView, mockTimer); 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() { TurnControl testControl = new TurnControl(null, mockTable, mockView, mockTimer); 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)); } private void assertCollection(List expected) { ArrayList selectedStones = new ArrayList( mockView.selectedStones); ArrayList expectedStones = new ArrayList(expected); assertEquals(selectedStones, expectedStones); } }