import com.codingame.gameengine.runner.MultiplayerGameRunner;
import com.codingame.gameengine.runner.dto.*;
-public class TrollTest {
- static GameResult runGame(String left, String right) {
+public class TrollTest implements Cloneable {
+ Integer leagueLevel;
+ Long seed;
+ TrollTest branch() {
+ try { return (TrollTest) clone(); }
+ catch (CloneNotSupportedException e) { throw new InternalError(e); }
+ }
+ TrollTest setLeague(int league) { leagueLevel = league; return this; }
+ TrollTest setSeed(long seed) { this.seed = seed; return this; }
+
+ GameResult runGame(String left, String right) {
MultiplayerGameRunner gameRunner = new MultiplayerGameRunner();
Properties gameParameters = new Properties();
gameParameters.setProperty("roadLength", "6");
gameParameters.setProperty("initialStones", "15");
gameRunner.setGameParameters(gameParameters);
- gameRunner.setSeed(0l);
- gameRunner.setLeagueLevel(1);
+ if (seed != null) gameRunner.setSeed(seed); else gameRunner.setSeed(0l);
+ if (leagueLevel != null) gameRunner.setLeagueLevel(leagueLevel);
gameRunner.addAgent(left);
gameRunner.addAgent(right);
// win despite fastforward after winner exhaustion
// (harder to construct :-D )
- assertWinLose(agent(1,2,2,2,8),
- agent(3,1,1,1,8));
+ assertWinLose(agent(1,2,2,2,8), agent(3,1,1,1,8));
+ }
+
+ @Test
+ public void cheatingGames() {
+ // win by cheating (works in league 1, which is the default)
+ assertWinLose(agentCheat, agentTwo);
+
+ // league 2 randomizes: we should be able to get a win and a loss
+ branch().setLeague(2).setSeed(0).assertWinLose(agentCheat, agentTwo);
+ branch().setLeague(2).setSeed(1).assertWinLose(agentTwo, agentCheat);
}
// great thanks to @dbdr for the intense moral support leading to
static String agentTwo = "yes 2";
static String agentCrash = "false";
static String agentGarbage = "yes this_is_assuredly_not_an_int";
+ static String agentCheat = agent(-100,25,25,25,25);
static String agent(int... tosses) {
String cmd = "echo -e ";
p.println("[agent] " + agent.agentId + ": " + agent.avatar + " " + agent.index + " " + agent.name);
}
- static void assertWinLose(String winner, String loser) {
+ void assertWinLose(String winner, String loser) {
assertLeftWin(runGame(winner, loser));
assertRightWin(runGame(loser, winner));
}
static void assertLeftWin(GameResult gameResult) {
+ assertLeftWin(gameResult, false);
+ }
+ static void assertLeftWin(GameResult gameResult, boolean strict) {
int[] scores = assertTwoScores(gameResult);
if (scores == null) return;
int s1 = scores[0], s2 = scores[1];
assertTrue("Left player has higher score than right player", s1 > s2);
+ if (strict) assertTrue("Right player isn't disqualified", s2 >= 0);
}
static void assertRightWin(GameResult gameResult) {
+ assertRightWin(gameResult, false);
+ }
+ static void assertRightWin(GameResult gameResult, boolean strict) {
int[] scores = assertTwoScores(gameResult);
if (scores == null) return;
int s1 = scores[0], s2 = scores[1];
assertTrue("Right player has higher score than right player", s2 > s1);
+ if (strict) assertTrue("Left player isn't disqualified", s1 >= 0);
}
static void assertIsDraw(GameResult gameResult) {