package games.strategy.engine.framework.startup.mc;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.awt.Component;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Observable;
import java.util.Observer;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.GameSequence;
import games.strategy.engine.framework.ui.NewGameChooserEntry;
import games.strategy.util.Version;
@RunWith(MockitoJUnitRunner.class)
public class GameSelectorModelTest {
private static void assertHasEmptyData(final GameSelectorModel objectToCheck) {
assertThat(objectToCheck.getGameData(), nullValue());
assertHasEmptyDisplayData(objectToCheck);
}
private static void assertHasEmptyDisplayData(final GameSelectorModel objectToCheck) {
assertThat(objectToCheck.getFileName(), is("-"));
assertThat(objectToCheck.getGameName(), is("-"));
assertThat(objectToCheck.getGameRound(), is("-"));
}
private static void assertHasFakeTestData(final GameSelectorModel objectToCheck) {
assertThat(objectToCheck.getGameName(), is(fakeGameName));
assertThat(objectToCheck.getGameRound(), is(fakeGameRound));
assertThat(objectToCheck.getGameVersion(), is(fakeGameVersion));
}
private static final String fakeGameVersion = "fakeGameVersion";
private static final String fakeGameRound = "3";
private static final String fakeGameName = "_fakeGameName_";
private static final String fakeFileName = "/hack/and/slash";
private GameSelectorModel testObj;
@Mock
private NewGameChooserEntry mockEntry;
@Mock
private GameData mockGameData;
@Mock
private Version mockVersion;
@Mock
private GameSequence mockSequence;
@Mock
private Observer mockObserver;
@Mock
private ClientModel mockClientModel;
@Mock
private Component mockUiComponent;
@Before
public void setup() {
testObj = new GameSelectorModel();
assertHasEmptyData(testObj);
testObj.addObserver(mockObserver);
}
@After
public void tearDown() {
testObj.deleteObservers();
}
@Test
public void testSetGameData() {
assertHasEmptyData(testObj);
this.testObjectSetMockGameData();
}
private final void testObjectSetMockGameData() {
prepareMockGameDataExpectations();
testObj.setGameData(mockGameData);
assertThat(testObj.getGameData(), sameInstance(mockGameData));
assertHasFakeTestData(testObj);
this.verifyTestObjectObserverUpdateSent();
}
private void verifyTestObjectObserverUpdateSent() {
verify(mockObserver, times(1)).update((Observable) Mockito.any(), Mockito.any());
reset(mockObserver);
}
private final void prepareMockGameDataExpectations() {
when(mockGameData.getGameVersion()).thenReturn(mockVersion);
when(mockVersion.toString()).thenReturn(fakeGameVersion);
when(mockGameData.getSequence()).thenReturn(mockSequence);
when(mockSequence.getRound()).thenReturn(Integer.valueOf(fakeGameRound));
when(mockGameData.getGameName()).thenReturn(fakeGameName);
}
@Test
public void testResetGameDataToNull() {
assertHasEmptyData(testObj);
this.testObjectSetMockGameData();
testObj.resetGameDataToNull();
assertHasEmptyData(testObj);
}
@Test
public void testIsSaveGame() {
testObj.load((GameData) null, "");
assertThat(testObj.isSavedGame(), is(true));
testObj.load((GameData) null, ".xml");
assertThat(testObj.isSavedGame(), is(false));
testObj.load((GameData) null, "file.tsvg");
assertThat(testObj.isSavedGame(), is(true));
}
@Test
public void testCanSelect() {
assertThat(testObj.canSelect(), is(true));
testObj.setCanSelect(false);
assertThat(testObj.canSelect(), is(false));
testObj.setCanSelect(true);
assertThat(testObj.canSelect(), is(true));
}
@Test
public void testClearDataButKeepGameInfo() {
this.testObjectSetMockGameData();
final String newGameName = " 123";
final String newGameRound = "gameRound xyz";
final String newGameVersion = "gameVersion abc";
testObj.clearDataButKeepGameInfo(newGameName, newGameRound, newGameVersion);
verifyTestObjectObserverUpdateSent();
assertThat(testObj.getGameData(), nullValue());
assertThat(testObj.getGameName(), is(newGameName));
assertThat(testObj.getGameRound(), is(newGameRound));
assertThat(testObj.getGameVersion(), is(newGameVersion));
}
@Test
public void testLoadFromNewGameChooserEntry() {
final String fileName = "testname";
when(mockEntry.getLocation()).thenReturn(fileName);
when(mockEntry.getGameData()).thenReturn(mockGameData);
prepareMockGameDataExpectations();
try {
when(mockEntry.getURI()).thenReturn(new URI("abc"));
} catch (final URISyntaxException e) {
throw new RuntimeException(e);
}
testObj.load(mockEntry);
assertThat(testObj.getFileName(), is(fileName));
assertThat(testObj.getGameData(), sameInstance(mockGameData));
assertHasFakeTestData(testObj);
}
@Test
public void testLoadFromGameDataFileNamePair() {
assertHasEmptyData(testObj);
prepareMockGameDataExpectations();
testObj.load(mockGameData, fakeFileName);
assertThat(testObj.getGameData(), sameInstance(mockGameData));
assertThat(testObj.getFileName(), is(fakeFileName));
}
@Test
public void testGetGameData() {
assertThat(testObj.getGameData(), nullValue());
prepareMockGameDataExpectations();
testObj.setGameData(mockGameData);
assertThat(testObj.getGameData(), sameInstance(mockGameData));
}
@Test
public void testSetAndGetIsHostHeadlessBot() {
assertThat(testObj.isHostHeadlessBot(), is(false));
testObj.setIsHostHeadlessBot(true);
assertThat(testObj.isHostHeadlessBot(), is(true));
testObj.setIsHostHeadlessBot(false);
assertThat(testObj.isHostHeadlessBot(), is(false));
}
@Test
public void testSetAndGetClientModelForHostBots() {
assertThat(testObj.getClientModelForHostBots(), nullValue());
testObj.setClientModelForHostBots(mockClientModel);
assertThat(testObj.getClientModelForHostBots(), sameInstance(mockClientModel));
testObj.setClientModelForHostBots(null);
assertThat(testObj.getClientModelForHostBots(), nullValue());
}
@Test
public void testGetFileName() {
assertThat(testObj.getFileName(), is("-"));
prepareMockGameDataExpectations();
testObj.load(mockGameData, fakeFileName);
assertThat(testObj.getFileName(), is(fakeFileName));
testObj.resetGameDataToNull();
assertThat(testObj.getFileName(), is("-"));
}
@Test
public void testGetGameName() {
this.testObjectSetMockGameData();
assertThat(testObj.getGameName(), is(fakeGameName));
}
@Test
public void testGetGameRound() {
this.testObjectSetMockGameData();
assertThat(testObj.getGameRound(), is(fakeGameRound));
}
@Test
public void testGetGameVersion() {
this.testObjectSetMockGameData();
assertThat(testObj.getGameVersion(), is(fakeGameVersion));
}
@Ignore
@Test
public void testLoadFromInputStream() {
// testObj.load(InputStream, string fileName);
// TODO
}
@Ignore
@Test
public void testLoadFromFile() {
// testObj.load(File, Component);
// TODO
}
@Ignore
@Test
public void testLoadDefaultGame() {
// testObj.loadDefaultGame(Component);
// TODO
}
}