package test;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.ojim.iface.Rules;
import org.ojim.logic.ServerLogic;
import org.ojim.logic.actions.ActionFactory;
import org.ojim.logic.actions.ActionPayForBuildings;
import org.ojim.logic.actions.ActionTransferMoneyToPlayers;
import org.ojim.logic.rules.GameRules;
import org.ojim.logic.state.Card;
import org.ojim.logic.state.CardStack;
import org.ojim.logic.state.GetOutOfJailCard;
import org.ojim.logic.state.ServerGameState;
import org.ojim.logic.state.ServerPlayer;
import org.ojim.logic.state.fields.BuyableField;
import org.ojim.logic.state.fields.CardField;
import org.ojim.logic.state.fields.Field;
import org.ojim.logic.state.fields.FieldGroup;
import org.ojim.logic.state.fields.FreeParking;
import org.ojim.logic.state.fields.GoField;
import org.ojim.logic.state.fields.GoToJail;
import org.ojim.logic.state.fields.InfrastructureField;
import org.ojim.logic.state.fields.InfrastructureFieldGroup;
import org.ojim.logic.state.fields.Jail;
import org.ojim.logic.state.fields.Station;
import org.ojim.logic.state.fields.StationFieldGroup;
import org.ojim.logic.state.fields.Street;
import org.ojim.logic.state.fields.StreetFieldGroup;
import org.ojim.logic.state.fields.TaxField;
import org.ojim.server.OjimServer;
import org.ojim.server.TestClient;
public class testServerLogic {
OjimServer server;
ServerLogic logic;
ServerGameState state;
ServerPlayer player1, player2;
class TestClass {
public void test(int x, int y, int z, int h, Field f, boolean b,
boolean s) {
}
}
@Before
public void setUp() throws Exception {
server = new OjimServer("testServer");
player1 = new ServerPlayer("test1", 0, 0, 0, 0, new TestClient(server));
player2 = new ServerPlayer("test2", 0, 0, 1, 1, new TestClient(server));
state = new ServerGameState();
logic = new ServerLogic(state, new GameRules(state, new Rules()));
Field[] fields = new Field[state.getNumberOfFields()];
this.loadDefaultGameStateFields(fields);
for (Field field : fields) {
state.setFieldAt(field, field.getPosition());
}
state.setPlayer(player1);
state.setPlayer(player2);
logic.startGame();
}
private void testParameters(TestClass testcase) {
for (int x = 0; x < 40; x++) {
player1.setPosition(x);
for (int y = -10000; y < 10000; y += 1000) {
player1.setBalance(y);
for (int z = 0; z < 40; z++) {
player2.setPosition(z);
for (int h = 0; h < 40; h++) {
Field field = state.getFieldAt(h);
if (field instanceof BuyableField) {
((BuyableField) field).buy(player1);
}
testcase.test(x, y, z, h, state.getFieldAt(h),
(state.getFieldAt(h) instanceof BuyableField),
(state.getFieldAt(h) instanceof Street));
if (field instanceof BuyableField) {
((BuyableField) field).buy(null);
}
}
}
}
}
}
@Test
public void testBuyStreet() {
testParameters(new TestClass() {
public void test(int x, int y, int z, int h, Field f, boolean b,
boolean s) {
if (state.getFieldAt(x) instanceof BuyableField && h != x && y >= ((BuyableField) state.getFieldAt(x)).getPrice()) {
logic.buyStreet();
if (!((BuyableField) state.getFieldAt(x)).getOwner()
.equals(player1)) {
fail("pos:" + x + " bal:" + y);
}
}
}
});
}
@Test
public void testToggleMortgage() {
testParameters(new TestClass() {
public void test(int x, int y, int z, int h, Field f, boolean b,
boolean s) {
if (b && y > 8000) {
boolean wasMortgaged = ((BuyableField)f).isMortgaged();
logic.toggleMortgage((BuyableField) f);
if (player1.getBalance() != y + ((BuyableField)f).getMortgagePrice() * (wasMortgaged ? 1 : -1)
|| ((BuyableField)f).isMortgaged() == wasMortgaged)
fail("field:" + f.getName() + " pre bal:" + y + "pos bal:" + player1.getBalance());
}
}
});
}
@Test
public void testExchangeMoney() {
int[] test = {0,1,-1,100,-100,1000, -1000,10000};
for(int i : test) {
int old1 = player1.getBalance();
int old2 = player2.getBalance();
logic.exchangeMoney(player1, player2, i);
if(old1 - i != player1.getBalance() ||
old2 + i != player2.getBalance()) {
fail("pl1 old:" + old1 + " pl2 old:" + old2 +
" pl1 new:" + player1.getBalance() + " pl2 new:" + player2.getBalance());
}
}
}
private void loadDefaultGameStateFields(Field[] fields) {
// Initialise field groups
StationFieldGroup stations = new StationFieldGroup();
StreetFieldGroup[] streets = new StreetFieldGroup[8];
streets[0] = new StreetFieldGroup(0, "Dagobah", 1000);
streets[1] = new StreetFieldGroup(1, "Hoth", 1000);
streets[2] = new StreetFieldGroup(2, "Tatooine", 2000);
streets[3] = new StreetFieldGroup(3, "Yavin Vier", 2000);
streets[4] = new StreetFieldGroup(4, "Wolkenstadt", 3000);
streets[5] = new StreetFieldGroup(5, "Todesstern", 3000);
streets[6] = new StreetFieldGroup(6, "Endor", 4000);
streets[7] = new StreetFieldGroup(7, "Coruscant", 4000);
InfrastructureFieldGroup infrastructures = new InfrastructureFieldGroup();
FieldGroup taxGroups = new FieldGroup(FieldGroup.TAX);
FieldGroup go = new FieldGroup(FieldGroup.GO);
FieldGroup communityCards = new FieldGroup(FieldGroup.COMMUNITY);
FieldGroup eventCards = new FieldGroup(FieldGroup.EVENT);
FieldGroup jails = new FieldGroup(FieldGroup.JAIL);
FieldGroup freeParkings = new FieldGroup(FieldGroup.FREE_PARKING);
FieldGroup goToJail = new FieldGroup(FieldGroup.GO_TO_JAIL);
FreeParking freeParking;
// Add Streets
fields[0] = go.addField(new GoField("Los", 0, this.logic));
fields[1] = streets[0].addField(new Street("Sumpf", 1, new int[] { 40,
200, 600, 1800, 3200, 5000 }, 0, 1200, logic));
fields[2] = this.newEventCardField(2, eventCards);
fields[3] = streets[0].addField(new Street("Jodas Hütte", 3, new int[] {
80, 400, 1200, 3600, 6400, 9000 }, 0, 1200, logic));
fields[4] = taxGroups.addField(new TaxField("Landungs- steuer", 4,
4000, this.logic));
fields[5] = stations.addField(new Station("TIE-Fighter", 5, 4000));
fields[6] = streets[1].addField(new Street("Echo-Basis", 6, new int[] {
120, 600, 1800, 5400, 8000, 11000 }, 0, 2000, logic));
fields[7] = this.newCommunityCardField(7, communityCards);
fields[8] = streets[1].addField(new Street("Eis-Steppen", 8, new int[] {
120, 600, 1800, 5400, 8000, 11000 }, 0, 2000, logic));
fields[9] = streets[1].addField(new Street("Nordgebirge", 9, new int[] {
160, 800, 2000, 6000, 9000, 12000 }, 0, 2400, logic));
fields[10] = jails.addField(new Jail("Gefängnis", 10, 1000, 3));
fields[11] = streets[2].addField(new Street("Lars Heimstatt", 11,
new int[] { 200, 1000, 3000, 9000, 12500, 15000 }, 0, 2800,
logic));
fields[12] = infrastructures.addField(new InfrastructureField(
"Kern-Reaktor", 12, 3000, this.logic));
fields[13] = streets[2].addField(new Street("Mos Eisley", 13,
new int[] { 200, 1000, 3000, 9000, 12500, 15000 }, 0, 2800,
logic));
fields[14] = streets[2].addField(new Street("Jabbas Palast", 14,
new int[] { 240, 1200, 3600, 10000, 14000, 18000 }, 0, 3200,
logic));
fields[15] = stations.addField(new Station("Millenium Falke", 15, 4000,
this.logic));
fields[16] = streets[3].addField(new Street("Kommandozentrale", 16,
new int[] { 280, 1400, 4000, 11000, 15000, 19000 }, 0, 3600,
logic));
fields[17] = this.newEventCardField(17, eventCards);
fields[18] = streets[3].addField(new Street("Massassi Tempel", 18,
new int[] { 280, 1400, 4000, 11000, 15000, 19000 }, 0, 3600,
logic));
fields[19] = streets[3].addField(new Street("Tempel-Thronsaal", 19,
new int[] { 320, 1600, 4400, 12000, 16000, 20000 }, 0, 4000,
logic));
freeParking = new FreeParking("Frei Parken", 20, this.logic);
fields[20] = freeParkings.addField(freeParking);
fields[21] = streets[4].addField(new Street("Andockbucht", 21,
new int[] { 360, 1800, 5000, 14000, 17500, 21000 }, 0, 4400,
logic));
fields[22] = this.newCommunityCardField(22, communityCards);
fields[23] = streets[4].addField(new Street("Karbon- Gefrierkammer",
23, new int[] { 360, 1800, 5000, 14000, 17500, 21000 }, 0,
4400, logic));
fields[24] = streets[4].addField(new Street("Reaktor- Kontrollraum",
24, new int[] { 400, 2000, 6000, 15000, 18500, 22000 }, 0,
4800, logic));
fields[25] = stations.addField(new Station("X-Wing Fighter", 25, 4000,
this.logic));
fields[26] = streets[5].addField(new Street("Lande-Deck", 26,
new int[] { 440, 2200, 6600, 16000, 19500, 23000 }, 0, 5200,
logic));
fields[27] = streets[5].addField(new Street("Thronsaal", 27, new int[] {
440, 2200, 6600, 16000, 19500, 23000 }, 0, 5200, logic));
fields[28] = infrastructures.addField(new InfrastructureField(
"Wasser- Farm", 28, 3000, this.logic));
fields[29] = streets[5].addField(new Street("Hauptreaktor", 29,
new int[] { 480, 2400, 7200, 17000, 20500, 24000 }, 0, 5600,
logic));
fields[30] = goToJail.addField(new GoToJail("Gehe ins Gefängnis", 30,
this.logic, (Jail) fields[10]));
// Fabians Strange gelbe Karte wurde hiermit hoch offiziell von Max
// entfernt!
// fields[30] = streets[5].addField(new Street("foobar", 30, new int[] {
// 480, 2400, 7200, 17000, 20500, 240()00 }, 0, 5600, logic));
fields[31] = streets[6].addField(new Street("Wald", 31, new int[] {
520, 2600, 7800, 18000, 22000, 25500 }, 0, 6000, logic));
fields[32] = streets[6].addField(new Street("Schildgenerator", 32,
new int[] { 520, 2600, 7800, 18000, 22000, 25500 }, 0, 6000,
logic));
fields[33] = this.newEventCardField(33, eventCards);
fields[34] = streets[6].addField(new Street("Ewok-Dorf", 34, new int[] {
560, 3000, 9000, 20000, 24000, 28000 }, 0, 6400, logic));
fields[35] = stations
.addField(new Station("Stern-Zerstörer", 35, 4000));
fields[36] = this.newCommunityCardField(36, communityCards);
fields[37] = streets[7].addField(new Street("Platz des Volkes", 37,
new int[] { 700, 3500, 10000, 22000, 16000, 30000 }, 0, 7000,
logic));
fields[38] = taxGroups.addField(new TaxField("Kopf-Geld Prämie", 38,
2000));
fields[39] = streets[7].addField(new Street("Imperialer Palast", 39,
new int[] { 1000, 4000, 12000, 28000, 34000, 40000 }, 0, 8000,
logic));
stations.setRent(new int[] { 500, 1000, 2000, 4000 });
infrastructures.setFactors(new int[] { 80, 200 });
// Add Cards
CardStack comm = ((ServerGameState) this.logic.getGameState())
.getCommunityCards();
comm.add(new GetOutOfJailCard("comm jail", comm, this.logic));
comm.add(Card.newNormalCard("comm +100 money", comm,
ActionFactory.newTransferMoneyToBank(this.logic, -100)));
comm.add(Card.newNormalCard("comm 100 m > free", comm, ActionFactory
.newTransferMoneyToFreeParking(this.logic, 100, freeParking)));
comm.add(Card.newNormalCard("comm 100 m (p. Hou) 1000 (p. Hot)", comm,
new ActionPayForBuildings(this.logic, 100, 1000, this.logic
.getGameState().getBank())));
comm.add(Card.newNormalCard("comm +100 m (p. Ply)", comm,
new ActionTransferMoneyToPlayers(this.logic, 100)));
CardStack even = ((ServerGameState) this.logic.getGameState())
.getEventCards();
even.add(new GetOutOfJailCard("even jail", even, this.logic));
even.add(Card.newNormalCard("even +100 money", even,
ActionFactory.newTransferMoneyToBank(this.logic, -100)));
even.add(Card.newNormalCard("even 100 m > free", even, ActionFactory
.newTransferMoneyToFreeParking(this.logic, 100, freeParking)));
even.add(Card.newNormalCard("even 100 m (p. Hou) 1000 (p. Hot)", even,
new ActionPayForBuildings(this.logic, 100, 1000, this.logic
.getGameState().getBank())));
even.add(Card.newNormalCard("even +100 m (p. Ply)", even,
new ActionTransferMoneyToPlayers(this.logic, 100)));
}
private synchronized Field newEventCardField(int position, FieldGroup group) {
return group.addField(new CardField("Ereignis- karte", position, false,
this.logic));
}
private synchronized Field newCommunityCardField(int position,
FieldGroup group) {
return group.addField(new CardField("Gemein- schafts- karte", position,
true, this.logic));
}
}