/**
* Copyright (C) 2002-2012 The FreeCol Team
*
* This file is part of FreeCol.
*
* FreeCol is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* FreeCol is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FreeCol. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.freecol.server;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import net.sf.freecol.common.FreeColException;
import net.sf.freecol.common.io.FreeColSavegameFile;
import net.sf.freecol.common.model.Game;
import net.sf.freecol.common.model.Map;
import net.sf.freecol.common.networking.NoRouteToServerException;
import net.sf.freecol.server.control.ChangeSet;
import net.sf.freecol.server.control.Controller;
import net.sf.freecol.server.control.InGameController;
import net.sf.freecol.server.control.PreGameController;
import net.sf.freecol.server.model.ServerGame;
import net.sf.freecol.util.test.FreeColTestCase;
import net.sf.freecol.util.test.MockMapGenerator;
public final class ServerTestHelper {
private static final String SERVER_NAME = "MyTestServer";
private static final int SERVER_PORT = -1;
private static final String TEST_FILE = "test/data/test.fsg";
private static FreeColServer server = null;
private static Random random = null;
public static FreeColServer getServer() {
return server;
}
public static void setServer(FreeColServer newServer) {
server = newServer;
}
public static InGameController getInGameController() {
return server.getInGameController();
}
public static void stopServer(FreeColServer serv) {
if (serv != null) {
Controller c = serv.getController();
assertNotNull(c);
c.shutdown();
serv = null;
}
}
public static FreeColServer startServer(boolean publicServer, boolean singlePlayer) {
return startServer(publicServer, singlePlayer, SERVER_PORT, SERVER_NAME);
}
public static FreeColServer startServer(boolean publicServer, boolean singlePlayer, int port, String name) {
stopServer(server);
try {
// TODO: fixme! Pass tc
server = new FreeColServer(FreeColTestCase.spec(), publicServer, singlePlayer, port, name);
} catch (NoRouteToServerException e) {
fail(e.getMessage());
} catch (IOException e) {
fail(e.getMessage());
}
assertNotNull(server);
assertEquals(FreeColServer.GameState.STARTING_GAME, server.getGameState());
return server;
}
public static FreeColServer startServer(File file, boolean publicServer, boolean singlePlayer) {
return startServer(file, publicServer, singlePlayer, SERVER_PORT, SERVER_NAME);
}
public static FreeColServer startServer(File file, boolean publicServer, boolean singlePlayer, int port, String name) {
stopServer(server);
try {
server = new FreeColServer(new FreeColSavegameFile(file), port, name);
} catch (NoRouteToServerException e) {
fail(e.getMessage());
} catch (FreeColException e) {
fail(e.getMessage());
} catch (IOException e) {
fail(e.getMessage());
}
assertNotNull(server);
assertEquals(FreeColServer.GameState.IN_GAME, server.getGameState());
return server;
}
public static File createRandomSaveGame() {
// start a server
FreeColServer serv = startServer(false, true, SERVER_PORT, SERVER_NAME);
// generate a random map
Controller c = serv.getController();
assertNotNull(c);
assertTrue(c instanceof PreGameController);
PreGameController pgc = (PreGameController) c;
try {
pgc.startGame();
} catch (FreeColException e) {
fail();
}
assertEquals(FreeColServer.GameState.IN_GAME, serv.getGameState());
assertNotNull(serv.getGame());
assertNotNull(serv.getGame().getMap());
// save the game as a file
File file = new File(TEST_FILE);
try {
serv.saveGame(file, "user", null);
} catch (IOException e) {
e.printStackTrace();
fail(e.toString());
}
assertTrue(file.exists());
stopServer(serv);
return file;
}
public static void newTurn() {
ServerGame game = (ServerGame) server.getGame();
game.csNewTurn(random, new ChangeSet());
}
public static Game startServerGame(Map map) {
stopServerGame();
FreeColServer serv = startServer(false, true);
serv.setMapGenerator(new MockMapGenerator(map));
PreGameController pgc = (PreGameController) serv.getController();
try {
pgc.startGame();
} catch (FreeColException e) {
fail("Failed to start game");
}
Game game = serv.getGame();
FreeColTestCase.setGame(game);
if (game.getCurrentPlayer() == null) {
game.setCurrentPlayer(game.getFirstPlayer());
}
random = new Random();
return game;
}
public static void stopServerGame() {
stopServer(server);
FreeColTestCase.setGame(null);
}
public static void setRandom(Random newRandom) {
random = newRandom;
}
}