e8dff3facbad2a9e8e329f7fe7d83706d987a853
[troll.git] / src / test / java / TrollTest.java
1 import java.util.Properties;
2 import java.util.List;
3 import java.util.ListIterator;
4 import java.util.Map;
5 import java.io.PrintStream;
6
7 import static org.junit.Assert.assertEquals;
8 import static org.junit.Assert.*;
9 import org.junit.Test;
10
11 import com.codingame.gameengine.runner.MultiplayerGameRunner;
12 import com.codingame.gameengine.runner.dto.*;
13
14 public class TrollTest {
15     static GameResult runGame(String left, String right) {
16         MultiplayerGameRunner gameRunner = new MultiplayerGameRunner();
17         Properties gameParameters = new Properties();
18         gameParameters.setProperty("roadLength", "6");
19         gameParameters.setProperty("initialStones", "15");
20         gameRunner.setGameParameters(gameParameters);
21         gameRunner.setSeed(0l);
22         gameRunner.setLeagueLevel(1);
23
24         gameRunner.addAgent(left);
25         gameRunner.addAgent(right);
26
27         return gameRunner.simulate();
28     }
29
30     @Test
31     public void drawGame() {
32         assertIsDraw(runGame(agentOne, agentOne));
33     }
34
35     @Test
36     public void defeatGames() {
37         assertIsDefeat(runGame(agentCrash, agentCrash));
38         assertIsDefeat(runGame(agentGarbage, agentGarbage));
39     }
40
41     @Test
42     public void simpleGames() {
43         // wins by direct reach, no fastforward
44         assertWinLose(agentTwo, agentOne);
45
46         // win by fastforward after loser exhaustion
47         assertWinLose(agentOne, "yes 15");
48
49         // win despite fastforward after winner exhaustion
50         // (harder to construct :-D )
51         assertWinLose(agent(1,2,2,2,8),
52                       agent(3,1,1,1,8));
53     }
54
55     // great thanks to @dbdr for the intense moral support leading to
56     // the following:
57     static String agentOne = "yes 1";
58     static String agentTwo = "yes 2";
59     static String agentCrash = "false";
60     static String agentGarbage = "yes this_is_assuredly_not_an_int";
61
62     static String agent(int... tosses) {
63         String cmd = "echo -e ";
64         for (int i = 0; i < tosses.length; i++) {
65             if (i > 0) cmd += "\\n";
66             cmd += tosses[i];
67         }
68         return cmd;
69     }
70
71     static void dumpGameResult(PrintStream p, GameResult gameResult) {
72         for (AgentDto agent : gameResult.agents) dumpAgent(p, agent);
73         dumpMap(p, "errors", gameResult.errors);
74         dumpString(p, "failCause", gameResult.failCause);
75         dumpMap(p, "ids", gameResult.ids);
76         dumpString(p, "metadata", gameResult.metadata);
77         dumpMap(p, "outputs", gameResult.outputs);
78         dumpList(p, "summaries", gameResult.summaries);
79         dumpList(p, "tooltips", gameResult.tooltips);
80         // dumpList(p, "views", gameResult.views);
81     }
82
83     static <V> void dumpList(PrintStream p, String tag, List<V> list) {
84         ListIterator i = list.listIterator();
85         while (i.hasNext()) {
86             if (tag != null) p.print(tag + " ");
87             p.print(i.nextIndex() + ": ");
88             dumpGeneric(p, i.next());
89         }
90     }
91
92     static <K,V> void dumpMap(PrintStream p, String tag, Map<K,V> map) {
93         for (Map.Entry kv : map.entrySet()) {
94             p.print(tag + " for " + kv.getKey() + ": ");
95             dumpGeneric(p, kv.getValue());
96         }
97     }
98
99     static <E,V> void dumpGeneric(PrintStream p, E v) {
100         if (v instanceof List) {
101             dumpList(p, null, (List<?>) v);
102         }
103         else {
104             p.println(v);
105         }
106     }
107
108     static void dumpString(PrintStream p, String tag, String msg) {
109         p.println(tag + ": " + msg);
110     }
111
112     static void dumpAgent(PrintStream p, AgentDto agent) {
113         p.println("[agent] " + agent.agentId + ": " + agent.avatar + " " + agent.index + " " + agent.name);
114     }
115
116     static void assertWinLose(String winner, String loser) {
117         assertLeftWin(runGame(winner, loser));
118         assertRightWin(runGame(loser, winner));
119     }
120
121     static void assertLeftWin(GameResult gameResult) {
122         int[] scores = assertTwoScores(gameResult);
123         if (scores == null) return;
124
125         int s1 = scores[0], s2 = scores[1];
126         assertTrue("Left player has higher score than right player", s1 > s2);
127     }
128
129     static void assertRightWin(GameResult gameResult) {
130         int[] scores = assertTwoScores(gameResult);
131         if (scores == null) return;
132
133         int s1 = scores[0], s2 = scores[1];
134         assertTrue("Right player has higher score than right player", s2 > s1);
135     }
136
137     static void assertIsDraw(GameResult gameResult) {
138         int[] scores = assertTwoScores(gameResult);
139         if (scores == null) return;
140
141         int s1 = scores[0], s2 = scores[1];
142         assertEquals("Player scores are equal", s1, s2);
143         assertTrue("Player scores are non-negative", s1 >= 0);
144     }
145
146     static void assertIsDefeat(GameResult gameResult) {
147         int[] scores = assertTwoScores(gameResult);
148         if (scores == null) return;
149
150         int s1 = scores[0], s2 = scores[1];
151         assertTrue("First player score is negative", s1 < 0);
152         assertTrue("Second player score is negative", s2 < 0);
153     }
154
155     static int[] assertTwoScores(GameResult gameResult) {
156         Map<Integer,Integer> scores = gameResult.scores;
157         assertEquals("Two scores are reported", scores.size(), 2);
158         assertTrue("Player 0 has a score", scores.containsKey(0));
159         assertTrue("Player 1 has a score", scores.containsKey(1));
160         return new int[] { scores.get(0), scores.get(1) };
161     }
162 }