Added Mage.Tests project. Update server for test operations. Implemented bdd classes.

This commit is contained in:
magenoxx 2010-12-20 01:03:12 +03:00
parent ddf1866d6e
commit 1b6722f9b2
20 changed files with 546 additions and 2 deletions

View file

@ -0,0 +1,53 @@
package org.mage.test.base;
import mage.game.turn.Phase;
import org.junit.BeforeClass;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
/**
* Parent class for all Mage tests.
* Provides basic actions in mage game and assert functions to check game state.
*/
public class MageAPI {
public enum Owner {
mine,
me,
ai
}
@BeforeClass
public static void startServer() throws Exception {
MageBase.getInstance().start();
Thread.sleep(3000);
}
public void giveme(String card) throws Exception {
MageBase.getInstance().giveme(card);
}
public boolean checkIhave(String card) throws Exception {
return MageBase.getInstance().checkIhave(card);
}
public void goToPhase(String phase, Owner owner) {
if ("Precombat Main".equals(phase) && (owner.equals(Owner.mine) || owner.equals(Owner.me))) {
MageBase.getInstance().goToPhase("Precombat Main - play spells and sorceries.");
return;
}
System.err.println("waitForPhase not implemented for phase="+phase+", owner="+owner.name());
throw new NotImplementedException();
}
public void playCard(String cardName) throws Exception {
MageBase.getInstance().playCard(cardName);
}
public boolean checkBattlefield(String cardName) throws Exception {
return MageBase.getInstance().checkBattlefield(cardName);
}
public boolean checkGraveyardsEmpty() throws Exception {
return MageBase.getInstance().checkGraveyardsEmpty();
}
}

View file

@ -0,0 +1,245 @@
package org.mage.test.base;
import mage.interfaces.MageException;
import mage.interfaces.Server;
import mage.interfaces.ServerState;
import mage.interfaces.callback.CallbackClient;
import mage.interfaces.callback.CallbackClientDaemon;
import mage.interfaces.callback.ClientCallback;
import mage.server.Main;
import mage.sets.Sets;
import mage.util.Logging;
import mage.view.*;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Base for starting Mage server.
* Controls interactions between MageAPI and Mage Server.
*
* @author nantuko
*/
public class MageBase {
/**
* MageBase single instance
*/
private static MageBase fInstance = new MageBase();
/**
* Default logger
*/
private static Logger logger = Logging.getLogger(MageBase.class.getName());
public static MageBase getInstance() {
return fInstance;
}
private static UUID sessionId;
public static Server server;
private static String userName;
private static ServerState serverState;
private static CallbackClientDaemon callbackDaemon;
private static UUID gameId;
private static UUID playerId;
private static CardView cardPlayed;
private static GameView gameView;
private static String phaseToWait;
private static Object sync = new Object();
public void start() throws Exception {
if (server == null) {
String[] args = new String[]{"-testMode=true"};
Main.main(args);
connect("player", "localhost", 17171);
UUID roomId = server.getMainRoomId();
List<String> playerTypes = new ArrayList<String>();
playerTypes.add("Human");
playerTypes.add("Computer - default");
TableView table = server.createTable(sessionId, roomId, "Two Player Duel", "Limited", playerTypes, null, null);
System.out.println("Cards in the deck: " + Sets.loadDeck("UW Control.dck").getCards().size());
server.joinTable(sessionId, roomId, table.getTableId(), "Human", Sets.loadDeck("UW Control.dck"));
server.joinTable(sessionId, roomId, table.getTableId(), "Computer", Sets.loadDeck("UW Control.dck"));
server.startGame(sessionId, roomId, table.getTableId());
}
}
public static void connect(String userName, String serverName, int port) {
try {
System.setSecurityManager(null);
Registry reg = LocateRegistry.getRegistry(serverName, port);
server = (Server) reg.lookup("mage-server");
sessionId = server.registerClient(userName, UUID.randomUUID());
CallbackClient client = new CallbackClient(){
@Override
public void processCallback(ClientCallback callback) {
logger.info("IN >> " + callback.getMessageId() + " - " + callback.getMethod());
try {
if (callback.getMethod().equals("startGame")) {
UUID[] data = (UUID[]) callback.getData();
gameId = data[0];
playerId = data[1];
server.joinGame(gameId, sessionId);
} else if (callback.getMethod().equals("gameInit")) {
server.ack("gameInit", sessionId);
} else if (callback.getMethod().equals("gameAsk")) {
GameClientMessage message = (GameClientMessage) callback.getData();
logger.info("ASK >> " + message.getMessage());
if (message.getMessage().equals("Do you want to take a mulligan?")) {
server.sendPlayerBoolean(gameId, sessionId, false);
}
} else if (callback.getMethod().equals("gameTarget")) {
GameClientMessage message = (GameClientMessage) callback.getData();
logger.info("TARGET >> " + message.getMessage() + " >> " + message.getTargets());
if (message.getMessage().equals("Select a starting player")) {
logger.info(" Sending >> " + playerId);
server.sendPlayerUUID(gameId, sessionId, playerId);
}
} else if (callback.getMethod().equals("gameSelect")) {
GameClientMessage message = (GameClientMessage) callback.getData();
logger.info("SELECT >> " + message.getMessage());
if (phaseToWait == null) {
synchronized (sync) {
sync.wait();
}
}
if (!message.getMessage().startsWith(phaseToWait)) {
server.sendPlayerBoolean(gameId, sessionId, false);
} else {
phaseToWait = null;
}
/*if (!message.getMessage().startsWith("Precombat Main - play spells and sorceries.")) {
server.sendPlayerBoolean(gameId, sessionId, false);
} else {
if (cardPlayed == null) {
CardsView cards = message.getGameView().getHand();
CardView landToPlay = null;
for (CardView card : cards.values()) {
//System.out.println(card.getName());
if (card.getName().equals("Plains") || card.getName().equals("Island")) {
landToPlay = card;
}
}
if (landToPlay != null) {
logger.info("Playing " + landToPlay);
server.sendPlayerUUID(gameId, sessionId, landToPlay.getId());
cardPlayed = landToPlay;
} else {
logger.warning("Couldn't find land to play");
}
} else {
logger.info("Checking battlefield...");
boolean foundPlayer = false;
boolean foundLand = false;
for (PlayerView player: message.getGameView().getPlayers()) {
if (player.getPlayerId().equals(playerId)) {
foundPlayer = true;
for (PermanentView permanent : player.getBattlefield().values()) {
if (permanent.getId().equals(cardPlayed.getId())) {
foundLand = true;
}
}
break;
}
}
logger.info(" found player: " + foundPlayer);
logger.info(" found land: " + foundLand);
System.exit(0);
}
} */
}
} catch (Exception e) {
logger.info(e.getMessage());
}
}
};
callbackDaemon = new CallbackClientDaemon(sessionId, client, server);
serverState = server.getServerState();
} catch (MageException ex) {
logger.log(Level.SEVERE, null, ex);
} catch (RemoteException ex) {
logger.log(Level.SEVERE, "Unable to connect to server - ", ex);
} catch (NotBoundException ex) {
logger.log(Level.SEVERE, "Unable to connect to server - ", ex);
}
}
public void giveme(String cardName) throws Exception {
server.cheat(gameId, sessionId, playerId, cardName);
}
public boolean checkIhave(String cardName) throws Exception {
if (cardName == null) {
return false;
}
gameView = server.getGameView(gameId, sessionId, playerId);
for (CardView card : gameView.getHand().values()) {
if (card.getName().equals(cardName)) {
return true;
}
}
return false;
}
public void goToPhase(String phase) {
phaseToWait = phase;
synchronized (sync) {
sync.notify();
}
}
public void playCard(String cardName) throws Exception {
gameView = server.getGameView(gameId, sessionId, playerId);
CardsView cards = gameView.getHand();
CardView cardToPlay = null;
for (CardView card : cards.values()) {
if (card.getName().equals(cardName)) {
cardToPlay = card;
}
}
if (cardToPlay == null) {
throw new IllegalArgumentException("Couldn't find " + cardName + " in the hand.");
}
if (cardToPlay != null) {
logger.info("Playing " + cardToPlay);
server.sendPlayerUUID(gameId, sessionId, cardToPlay.getId());
cardPlayed = cardToPlay;
}
}
public boolean checkBattlefield(String cardName) throws Exception {
gameView = server.getGameView(gameId, sessionId, playerId);
for (PlayerView player: gameView.getPlayers()) {
if (player.getPlayerId().equals(playerId)) {
for (PermanentView permanent : player.getBattlefield().values()) {
if (permanent.getName().equals(cardName)) {
return true;
}
}
}
}
return false;
}
public boolean checkGraveyardsEmpty() throws Exception {
gameView = server.getGameView(gameId, sessionId, playerId);
for (PlayerView player: gameView.getPlayers()) {
if (player.getGraveyard().size() > 0) {
return false;
}
}
return true;
}
}

View file

@ -0,0 +1,6 @@
package org.mage.test.bdd.and;
public class And {
public static Phase phase;
public static Graveyards graveyards;
}

View file

@ -0,0 +1,11 @@
package org.mage.test.bdd.and;
import org.mage.test.base.MageBase;
public class Graveyards {
public static boolean empty() throws Exception {
boolean empty = MageBase.getInstance().checkGraveyardsEmpty();
System.out.println("empty: " + empty);
return empty;
}
}

View file

@ -0,0 +1,20 @@
package org.mage.test.bdd.and;
import org.mage.test.base.MageAPI;
import org.mage.test.base.MageBase;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
import static org.mage.test.base.MageAPI.*;
import static org.mage.test.base.MageAPI.Owner.*;
public class Phase {
public static void is(String phase, MageAPI.Owner owner) throws Exception {
if ("Precombat Main".equals(phase) && (owner.equals(mine) || owner.equals(me))) {
MageBase.getInstance().goToPhase("Precombat Main - play spells and sorceries.");
Thread.sleep(3000);
return;
}
System.err.println("waitForPhase not implemented for phase="+phase+", owner="+owner.name());
throw new NotImplementedException();
}
}

View file

@ -0,0 +1,13 @@
package org.mage.test.bdd.given;
import org.mage.test.base.MageBase;
public class A {
public static void card(String cardName) throws Exception {
MageBase.getInstance().giveme(cardName);
Thread.sleep(4000);
if (!MageBase.getInstance().checkIhave(cardName)) {
throw new IllegalStateException("Couldn't find a card in hand: " + cardName);
}
}
}

View file

@ -0,0 +1,8 @@
package org.mage.test.bdd.given;
import org.mage.test.bdd.and.Phase;
public class Given {
public static I I;
public static Phase phase;
}

View file

@ -0,0 +1,5 @@
package org.mage.test.bdd.given;
public class Have {
public static A a;
}

View file

@ -0,0 +1,5 @@
package org.mage.test.bdd.given;
public class I {
public static Have have;
}

View file

@ -0,0 +1,9 @@
package org.mage.test.bdd.then;
import org.mage.test.base.MageBase;
public class Battlefield {
public static boolean has(String cardName) throws Exception {
return MageBase.getInstance().checkBattlefield(cardName);
}
}

View file

@ -0,0 +1,5 @@
package org.mage.test.bdd.then;
public class Then {
public static Battlefield battlefield;
}

View file

@ -0,0 +1,10 @@
package org.mage.test.bdd.when;
import org.mage.test.base.MageBase;
public class I {
public static void play(String cardName) throws Exception {
MageBase.getInstance().playCard(cardName);
Thread.sleep(3000);
}
}

View file

@ -0,0 +1,5 @@
package org.mage.test.bdd.when;
public class When {
public static I I;
}