kaggle-environments 0.2.1__py3-none-any.whl → 1.20.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of kaggle-environments might be problematic. Click here for more details.

Files changed (215) hide show
  1. kaggle_environments/__init__.py +49 -13
  2. kaggle_environments/agent.py +177 -124
  3. kaggle_environments/api.py +31 -0
  4. kaggle_environments/core.py +295 -170
  5. kaggle_environments/envs/cabt/cabt.js +164 -0
  6. kaggle_environments/envs/cabt/cabt.json +28 -0
  7. kaggle_environments/envs/cabt/cabt.py +186 -0
  8. kaggle_environments/envs/cabt/cg/__init__.py +0 -0
  9. kaggle_environments/envs/cabt/cg/cg.dll +0 -0
  10. kaggle_environments/envs/cabt/cg/game.py +75 -0
  11. kaggle_environments/envs/cabt/cg/libcg.so +0 -0
  12. kaggle_environments/envs/cabt/cg/sim.py +48 -0
  13. kaggle_environments/envs/cabt/test_cabt.py +120 -0
  14. kaggle_environments/envs/chess/chess.js +4289 -0
  15. kaggle_environments/envs/chess/chess.json +60 -0
  16. kaggle_environments/envs/chess/chess.py +4241 -0
  17. kaggle_environments/envs/chess/test_chess.py +60 -0
  18. kaggle_environments/envs/connectx/connectx.ipynb +3186 -0
  19. kaggle_environments/envs/connectx/connectx.js +1 -1
  20. kaggle_environments/envs/connectx/connectx.json +15 -1
  21. kaggle_environments/envs/connectx/connectx.py +6 -23
  22. kaggle_environments/envs/connectx/test_connectx.py +70 -24
  23. kaggle_environments/envs/football/football.ipynb +75 -0
  24. kaggle_environments/envs/football/football.json +91 -0
  25. kaggle_environments/envs/football/football.py +277 -0
  26. kaggle_environments/envs/football/helpers.py +95 -0
  27. kaggle_environments/envs/football/test_football.py +360 -0
  28. kaggle_environments/envs/halite/__init__.py +0 -0
  29. kaggle_environments/envs/halite/halite.ipynb +44741 -0
  30. kaggle_environments/envs/halite/halite.js +199 -83
  31. kaggle_environments/envs/halite/halite.json +31 -18
  32. kaggle_environments/envs/halite/halite.py +164 -303
  33. kaggle_environments/envs/halite/helpers.py +720 -0
  34. kaggle_environments/envs/halite/test_halite.py +190 -0
  35. kaggle_environments/envs/hungry_geese/__init__.py +0 -0
  36. kaggle_environments/envs/{battlegeese/battlegeese.js → hungry_geese/hungry_geese.js} +38 -22
  37. kaggle_environments/envs/{battlegeese/battlegeese.json → hungry_geese/hungry_geese.json} +21 -14
  38. kaggle_environments/envs/hungry_geese/hungry_geese.py +316 -0
  39. kaggle_environments/envs/hungry_geese/test_hungry_geese.py +0 -0
  40. kaggle_environments/envs/identity/identity.json +6 -5
  41. kaggle_environments/envs/identity/identity.py +15 -2
  42. kaggle_environments/envs/kore_fleets/__init__.py +0 -0
  43. kaggle_environments/envs/kore_fleets/helpers.py +1005 -0
  44. kaggle_environments/envs/kore_fleets/kore_fleets.ipynb +114 -0
  45. kaggle_environments/envs/kore_fleets/kore_fleets.js +658 -0
  46. kaggle_environments/envs/kore_fleets/kore_fleets.json +164 -0
  47. kaggle_environments/envs/kore_fleets/kore_fleets.py +555 -0
  48. kaggle_environments/envs/kore_fleets/starter_bots/java/Bot.java +54 -0
  49. kaggle_environments/envs/kore_fleets/starter_bots/java/README.md +26 -0
  50. kaggle_environments/envs/kore_fleets/starter_bots/java/jars/hamcrest-core-1.3.jar +0 -0
  51. kaggle_environments/envs/kore_fleets/starter_bots/java/jars/junit-4.13.2.jar +0 -0
  52. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Board.java +518 -0
  53. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Cell.java +61 -0
  54. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Configuration.java +24 -0
  55. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Direction.java +166 -0
  56. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Fleet.java +72 -0
  57. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/KoreJson.java +97 -0
  58. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Observation.java +72 -0
  59. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Pair.java +13 -0
  60. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Player.java +68 -0
  61. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Point.java +65 -0
  62. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/Shipyard.java +70 -0
  63. kaggle_environments/envs/kore_fleets/starter_bots/java/kore/ShipyardAction.java +59 -0
  64. kaggle_environments/envs/kore_fleets/starter_bots/java/main.py +73 -0
  65. kaggle_environments/envs/kore_fleets/starter_bots/java/test/BoardTest.java +567 -0
  66. kaggle_environments/envs/kore_fleets/starter_bots/java/test/ConfigurationTest.java +25 -0
  67. kaggle_environments/envs/kore_fleets/starter_bots/java/test/KoreJsonTest.java +62 -0
  68. kaggle_environments/envs/kore_fleets/starter_bots/java/test/ObservationTest.java +46 -0
  69. kaggle_environments/envs/kore_fleets/starter_bots/java/test/PointTest.java +21 -0
  70. kaggle_environments/envs/kore_fleets/starter_bots/java/test/ShipyardTest.java +22 -0
  71. kaggle_environments/envs/kore_fleets/starter_bots/java/test/configuration.json +1 -0
  72. kaggle_environments/envs/kore_fleets/starter_bots/java/test/fullob.json +1 -0
  73. kaggle_environments/envs/kore_fleets/starter_bots/java/test/observation.json +1 -0
  74. kaggle_environments/envs/kore_fleets/starter_bots/python/__init__.py +0 -0
  75. kaggle_environments/envs/kore_fleets/starter_bots/python/main.py +27 -0
  76. kaggle_environments/envs/kore_fleets/starter_bots/ts/Bot.ts +34 -0
  77. kaggle_environments/envs/kore_fleets/starter_bots/ts/DoNothingBot.ts +12 -0
  78. kaggle_environments/envs/kore_fleets/starter_bots/ts/MinerBot.ts +62 -0
  79. kaggle_environments/envs/kore_fleets/starter_bots/ts/README.md +55 -0
  80. kaggle_environments/envs/kore_fleets/starter_bots/ts/interpreter.ts +402 -0
  81. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Board.ts +514 -0
  82. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Cell.ts +63 -0
  83. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Configuration.ts +25 -0
  84. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Direction.ts +169 -0
  85. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Fleet.ts +76 -0
  86. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/KoreIO.ts +70 -0
  87. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Observation.ts +45 -0
  88. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Pair.ts +11 -0
  89. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Player.ts +68 -0
  90. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Point.ts +65 -0
  91. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Shipyard.ts +72 -0
  92. kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/ShipyardAction.ts +58 -0
  93. kaggle_environments/envs/kore_fleets/starter_bots/ts/main.py +73 -0
  94. kaggle_environments/envs/kore_fleets/starter_bots/ts/miner.py +73 -0
  95. kaggle_environments/envs/kore_fleets/starter_bots/ts/package.json +23 -0
  96. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/BoardTest.ts +551 -0
  97. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ConfigurationTest.ts +16 -0
  98. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ObservationTest.ts +33 -0
  99. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/PointTest.ts +17 -0
  100. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ShipyardTest.ts +18 -0
  101. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/configuration.json +1 -0
  102. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/fullob.json +1 -0
  103. kaggle_environments/envs/kore_fleets/starter_bots/ts/test/observation.json +1 -0
  104. kaggle_environments/envs/kore_fleets/starter_bots/ts/tsconfig.json +22 -0
  105. kaggle_environments/envs/kore_fleets/test_kore_fleets.py +331 -0
  106. kaggle_environments/envs/lux_ai_2021/README.md +3 -0
  107. kaggle_environments/envs/lux_ai_2021/__init__.py +0 -0
  108. kaggle_environments/envs/lux_ai_2021/agents.py +11 -0
  109. kaggle_environments/envs/lux_ai_2021/dimensions/754.js +2 -0
  110. kaggle_environments/envs/lux_ai_2021/dimensions/754.js.LICENSE.txt +296 -0
  111. kaggle_environments/envs/lux_ai_2021/dimensions/main.js +1 -0
  112. kaggle_environments/envs/lux_ai_2021/index.html +43 -0
  113. kaggle_environments/envs/lux_ai_2021/lux_ai_2021.json +100 -0
  114. kaggle_environments/envs/lux_ai_2021/lux_ai_2021.py +231 -0
  115. kaggle_environments/envs/lux_ai_2021/test_agents/__init__.py +0 -0
  116. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.js +6 -0
  117. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.json +59 -0
  118. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_objects.js +145 -0
  119. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/io.js +14 -0
  120. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/kit.js +209 -0
  121. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/map.js +107 -0
  122. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/parser.js +79 -0
  123. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.js +88 -0
  124. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.py +75 -0
  125. kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/simple.tar.gz +0 -0
  126. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/__init__.py +0 -0
  127. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/annotate.py +20 -0
  128. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/constants.py +25 -0
  129. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game.py +86 -0
  130. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.json +59 -0
  131. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.py +7 -0
  132. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_map.py +106 -0
  133. kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_objects.py +154 -0
  134. kaggle_environments/envs/lux_ai_2021/test_agents/python/random_agent.py +38 -0
  135. kaggle_environments/envs/lux_ai_2021/test_agents/python/simple_agent.py +82 -0
  136. kaggle_environments/envs/lux_ai_2021/test_lux.py +19 -0
  137. kaggle_environments/envs/lux_ai_2021/testing.md +23 -0
  138. kaggle_environments/envs/lux_ai_2021/todo.md.og +18 -0
  139. kaggle_environments/envs/lux_ai_s3/README.md +21 -0
  140. kaggle_environments/envs/lux_ai_s3/agents.py +5 -0
  141. kaggle_environments/envs/lux_ai_s3/index.html +42 -0
  142. kaggle_environments/envs/lux_ai_s3/lux_ai_s3.json +47 -0
  143. kaggle_environments/envs/lux_ai_s3/lux_ai_s3.py +178 -0
  144. kaggle_environments/envs/lux_ai_s3/luxai_s3/__init__.py +1 -0
  145. kaggle_environments/envs/lux_ai_s3/luxai_s3/env.py +819 -0
  146. kaggle_environments/envs/lux_ai_s3/luxai_s3/globals.py +9 -0
  147. kaggle_environments/envs/lux_ai_s3/luxai_s3/params.py +101 -0
  148. kaggle_environments/envs/lux_ai_s3/luxai_s3/profiler.py +141 -0
  149. kaggle_environments/envs/lux_ai_s3/luxai_s3/pygame_render.py +222 -0
  150. kaggle_environments/envs/lux_ai_s3/luxai_s3/spaces.py +27 -0
  151. kaggle_environments/envs/lux_ai_s3/luxai_s3/state.py +464 -0
  152. kaggle_environments/envs/lux_ai_s3/luxai_s3/utils.py +12 -0
  153. kaggle_environments/envs/lux_ai_s3/luxai_s3/wrappers.py +156 -0
  154. kaggle_environments/envs/lux_ai_s3/test_agents/python/agent.py +78 -0
  155. kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/__init__.py +0 -0
  156. kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/kit.py +31 -0
  157. kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/utils.py +17 -0
  158. kaggle_environments/envs/lux_ai_s3/test_agents/python/main.py +66 -0
  159. kaggle_environments/envs/lux_ai_s3/test_lux.py +9 -0
  160. kaggle_environments/envs/mab/__init__.py +0 -0
  161. kaggle_environments/envs/mab/agents.py +12 -0
  162. kaggle_environments/envs/mab/mab.js +100 -0
  163. kaggle_environments/envs/mab/mab.json +74 -0
  164. kaggle_environments/envs/mab/mab.py +146 -0
  165. kaggle_environments/envs/open_spiel/__init__.py +0 -0
  166. kaggle_environments/envs/open_spiel/games/__init__.py +0 -0
  167. kaggle_environments/envs/open_spiel/games/chess/chess.js +441 -0
  168. kaggle_environments/envs/open_spiel/games/chess/image_config.jsonl +20 -0
  169. kaggle_environments/envs/open_spiel/games/chess/openings.jsonl +20 -0
  170. kaggle_environments/envs/open_spiel/games/connect_four/__init__.py +0 -0
  171. kaggle_environments/envs/open_spiel/games/connect_four/connect_four.js +284 -0
  172. kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy.py +86 -0
  173. kaggle_environments/envs/open_spiel/games/go/__init__.py +0 -0
  174. kaggle_environments/envs/open_spiel/games/go/go.js +481 -0
  175. kaggle_environments/envs/open_spiel/games/go/go_proxy.py +99 -0
  176. kaggle_environments/envs/open_spiel/games/tic_tac_toe/__init__.py +0 -0
  177. kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe.js +345 -0
  178. kaggle_environments/envs/open_spiel/games/tic_tac_toe/tic_tac_toe_proxy.py +98 -0
  179. kaggle_environments/envs/open_spiel/games/universal_poker/__init__.py +0 -0
  180. kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker.js +431 -0
  181. kaggle_environments/envs/open_spiel/games/universal_poker/universal_poker_proxy.py +159 -0
  182. kaggle_environments/envs/open_spiel/html_playthrough_generator.py +31 -0
  183. kaggle_environments/envs/open_spiel/observation.py +128 -0
  184. kaggle_environments/envs/open_spiel/open_spiel.py +565 -0
  185. kaggle_environments/envs/open_spiel/proxy.py +138 -0
  186. kaggle_environments/envs/open_spiel/test_open_spiel.py +191 -0
  187. kaggle_environments/envs/rps/__init__.py +0 -0
  188. kaggle_environments/envs/rps/agents.py +84 -0
  189. kaggle_environments/envs/rps/helpers.py +25 -0
  190. kaggle_environments/envs/rps/rps.js +117 -0
  191. kaggle_environments/envs/rps/rps.json +63 -0
  192. kaggle_environments/envs/rps/rps.py +90 -0
  193. kaggle_environments/envs/rps/test_rps.py +110 -0
  194. kaggle_environments/envs/rps/utils.py +7 -0
  195. kaggle_environments/envs/tictactoe/test_tictactoe.py +43 -77
  196. kaggle_environments/envs/tictactoe/tictactoe.ipynb +1397 -0
  197. kaggle_environments/envs/tictactoe/tictactoe.json +10 -2
  198. kaggle_environments/envs/tictactoe/tictactoe.py +1 -1
  199. kaggle_environments/errors.py +2 -4
  200. kaggle_environments/helpers.py +377 -0
  201. kaggle_environments/main.py +340 -0
  202. kaggle_environments/schemas.json +23 -18
  203. kaggle_environments/static/player.html +206 -74
  204. kaggle_environments/utils.py +46 -73
  205. kaggle_environments-1.20.0.dist-info/METADATA +25 -0
  206. kaggle_environments-1.20.0.dist-info/RECORD +211 -0
  207. {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.0.dist-info}/WHEEL +1 -2
  208. kaggle_environments-1.20.0.dist-info/entry_points.txt +3 -0
  209. kaggle_environments/envs/battlegeese/battlegeese.py +0 -223
  210. kaggle_environments/temp.py +0 -14
  211. kaggle_environments-0.2.1.dist-info/METADATA +0 -393
  212. kaggle_environments-0.2.1.dist-info/RECORD +0 -32
  213. kaggle_environments-0.2.1.dist-info/entry_points.txt +0 -3
  214. kaggle_environments-0.2.1.dist-info/top_level.txt +0 -1
  215. {kaggle_environments-0.2.1.dist-info → kaggle_environments-1.20.0.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,73 @@
1
+ import atexit
2
+ import os
3
+ import sys
4
+ from queue import Empty, Queue
5
+ from subprocess import PIPE, Popen
6
+ from threading import Thread
7
+
8
+ agent_processes = [None, None, None, None]
9
+ t = None
10
+ q = None
11
+
12
+
13
+ def cleanup_process():
14
+ global agent_processes
15
+ for proc in agent_processes:
16
+ if proc is not None:
17
+ proc.kill()
18
+
19
+
20
+ def enqueue_output(out, queue):
21
+ for line in iter(out.readline, b""):
22
+ queue.put(line)
23
+ out.close()
24
+
25
+
26
+ def agent(observation, configuration):
27
+ global agent_processes, t, q
28
+
29
+ agent_process = agent_processes[observation.player]
30
+ ### Do not edit ###
31
+ if agent_process is None:
32
+ if "__raw_path__" in configuration:
33
+ cwd = os.path.dirname(configuration["__raw_path__"])
34
+ else:
35
+ cwd = os.path.dirname(__file__)
36
+ agent_process = Popen(["java", "Bot"], stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=cwd)
37
+ agent_processes[observation.player] = agent_process
38
+ atexit.register(cleanup_process)
39
+
40
+ # following 4 lines from https://stackoverflow.com/questions/375427/a-non-blocking-read-on-a-subprocess-pipe-in-python
41
+ q = Queue()
42
+ t = Thread(target=enqueue_output, args=(agent_process.stderr, q))
43
+ t.daemon = True # thread dies with the program
44
+ t.start()
45
+
46
+ # print observations to agent
47
+ import json
48
+
49
+ agent_process.stdin.write((json.dumps(observation) + "\n").encode())
50
+ agent_process.stdin.write((json.dumps(configuration) + "\n").encode())
51
+ agent_process.stdin.flush()
52
+
53
+ # wait for data written to stdout
54
+ agent1res = (agent_process.stdout.readline()).decode()
55
+
56
+ while True:
57
+ try:
58
+ line = q.get_nowait()
59
+ except Empty:
60
+ # no standard error received, break
61
+ break
62
+ else:
63
+ # standard error output received, print it out
64
+ print(line.decode(), file=sys.stderr, end="")
65
+
66
+ agent1res = agent1res.strip()
67
+ outputs = agent1res.split(",")
68
+ actions = {}
69
+ for cmd in outputs:
70
+ if cmd != "":
71
+ shipyard_id, action_str = cmd.split(":")
72
+ actions[shipyard_id] = action_str
73
+ return actions
@@ -0,0 +1,567 @@
1
+ package test;
2
+
3
+ import java.io.IOException;
4
+ import java.nio.file.Files;
5
+ import java.nio.file.Path;
6
+ import java.nio.file.Paths;
7
+ import java.util.Optional;
8
+
9
+ import org.junit.Assert;
10
+ import org.junit.Test;
11
+
12
+ import kore.Board;
13
+ import kore.Direction;
14
+ import kore.Fleet;
15
+ import kore.Point;
16
+ import kore.Shipyard;
17
+ import kore.ShipyardAction;
18
+
19
+ public class BoardTest {
20
+
21
+ @Test
22
+ public void givenValidConfigAndObservation_createsSuccessful() throws IOException {
23
+ Path configPath = Paths.get("bin", "test", "configuration.json");
24
+ String rawConfig = Files.readString(configPath);
25
+ Path obsPath = Paths.get("bin", "test", "observation.json");
26
+ String rawObs = Files.readString(obsPath);
27
+
28
+ Board board = new Board(rawObs, rawConfig);
29
+
30
+ Assert.assertEquals(16, board.step);
31
+ }
32
+
33
+ @Test
34
+ public void koreRegenerates() throws IOException {
35
+ Board board = getStarterBoard();
36
+
37
+ Board nextBoard = board.next();
38
+
39
+ Assert.assertTrue("cells should regen", board.cells[3].kore < nextBoard.cells[3].kore);
40
+ }
41
+
42
+ @Test
43
+ public void spawnShips_spawnsShips() throws IOException {
44
+ Board board = getStarterBoard();
45
+
46
+ String shipyardId = board.players[0].shipyardIds.get(0);
47
+ Shipyard shipyard = board.shipyards.get(shipyardId);
48
+
49
+ shipyard.setNextAction(ShipyardAction.spawnShips(1));
50
+
51
+ Board nextBoard = board.next();
52
+ Shipyard nextShipyard = nextBoard.shipyards.get(shipyardId);
53
+
54
+ Assert.assertEquals(0, shipyard.shipCount);
55
+ Assert.assertEquals(1, nextShipyard.shipCount);
56
+ }
57
+
58
+ @Test
59
+ public void spawnShips_shawnZeroShipsDoesNothing() throws IOException {
60
+ Board board = getStarterBoard();
61
+
62
+ String shipyardId = board.players[0].shipyardIds.get(0);
63
+ Shipyard shipyard = board.shipyards.get(shipyardId);
64
+
65
+ shipyard.setNextAction(ShipyardAction.spawnShips(0));
66
+
67
+ Board nextBoard = board.next();
68
+ Shipyard nextShipyard = nextBoard.shipyards.get(shipyardId);
69
+
70
+ Assert.assertEquals(0, shipyard.shipCount);
71
+ Assert.assertEquals(0, nextShipyard.shipCount);
72
+ Assert.assertEquals(board.players[0].kore, nextBoard.players[0].kore, .01);
73
+ }
74
+
75
+ @Test
76
+ public void launchShips_launchesCorrectly() throws IOException {
77
+ Board board = getStarterBoard();
78
+
79
+ String shipyardId = board.players[0].shipyardIds.get(0);
80
+ Shipyard shipyard = board.shipyards.get(shipyardId);
81
+ shipyard.shipCount = 100;
82
+
83
+ shipyard.setNextAction(ShipyardAction.launchFleetWithFlightPlan(10, "N"));
84
+
85
+ Board nextBoard = board.next();
86
+ Shipyard nextShipyard = nextBoard.shipyards.get(shipyardId);
87
+
88
+ Assert.assertEquals(100, shipyard.shipCount);
89
+ Assert.assertEquals(90, nextShipyard.shipCount);
90
+
91
+ Assert.assertTrue("should have launched a fleet", nextBoard.getFleetAtPoint(shipyard.position.add(Direction.NORTH)).isPresent());
92
+ Fleet launchedFleet = nextBoard.getFleetAtPoint(shipyard.position.add(Direction.NORTH)).get();
93
+ Assert.assertEquals(10, launchedFleet.shipCount);
94
+ }
95
+
96
+ @Test
97
+ public void fleetsCoalescence() throws IOException {
98
+ Board board = getStarterBoard();
99
+
100
+ Point p = new Point(10, 10);
101
+
102
+ Fleet f1 = new Fleet("f1", 100, Direction.SOUTH, p.add(Direction.NORTH), 100.0, "", 0, board);
103
+ board.addFleet(f1);
104
+ Fleet f2 = new Fleet("f2", 60, Direction.NORTH, p.add(Direction.SOUTH), 100.0, "", 0, board);
105
+ board.addFleet(f2);
106
+ Fleet f3 = new Fleet("f3", 60, Direction.EAST, p.add(Direction.WEST), 100.0, "", 0, board);
107
+ board.addFleet(f3);
108
+
109
+ Board nextBoard = board.next();
110
+
111
+ Fleet nextFleet = nextBoard.getFleetAtPoint(p).get();
112
+ Assert.assertTrue(nextFleet.id.equals("f1"));
113
+ }
114
+
115
+ @Test
116
+ public void fleetsPickUpKore() throws IOException {
117
+ Board board = getStarterBoard();
118
+
119
+ Point p = new Point(10, 10);
120
+ board.getCellAtPosition(p).kore = 100;
121
+ board.getCellAtPosition(p.add(Direction.SOUTH)).kore = 100;
122
+
123
+ Fleet fleet = new Fleet("test-fleet", 100, Direction.SOUTH, p, 100.0, "8N", 0, board);
124
+
125
+ board.addFleet(fleet);
126
+
127
+ Board nextBoard = board.next();
128
+
129
+ Fleet nextFleet = nextBoard.getFleetAtPoint(p.add(Direction.SOUTH)).get();
130
+ Assert.assertTrue(nextFleet.kore > fleet.kore);
131
+ }
132
+
133
+ @Test
134
+ public void updatesFlightPlan_decrements() throws IOException {
135
+ Board board = getStarterBoard();
136
+
137
+ Point p = new Point(10, 11);
138
+
139
+ Fleet f = new Fleet("test-fleet", 10, Direction.SOUTH, p, 100.0, "8N", 0, board);
140
+
141
+ board.addFleet(f);
142
+
143
+ Board nextBoard = board.next();
144
+
145
+ Fleet nextFleet = nextBoard.getFleetAtPoint(new Point(10, 10)).get();
146
+ Assert.assertEquals(Direction.SOUTH.toChar(), nextFleet.direction.toChar());
147
+ Assert.assertEquals("7N", nextFleet.flightPlan);
148
+ }
149
+
150
+ @Test
151
+ public void updatesFlightPlan_changesDirection() throws IOException {
152
+ Board board = getStarterBoard();
153
+
154
+ Point p = new Point(10, 11);
155
+
156
+ Fleet f = new Fleet("test-fleet", 10, Direction.NORTH, p, 100.0, "S", 0, board);
157
+
158
+ board.addFleet(f);
159
+
160
+ Board nextBoard = board.next();
161
+
162
+ Fleet nextFleet = nextBoard.getFleetAtPoint(new Point(10, 10)).get();
163
+ Assert.assertEquals(Direction.SOUTH.toChar(), nextFleet.direction.toChar());
164
+ Assert.assertEquals("", nextFleet.flightPlan);
165
+ }
166
+
167
+ @Test
168
+ public void updatesFlightPlan_convertsToShipyard() throws IOException {
169
+ Board board = getStarterBoard();
170
+
171
+ Point p = new Point(10, 11);
172
+
173
+ Fleet f = new Fleet("test-fleet", 100, Direction.NORTH, p, 100.0, "C", 0, board);
174
+
175
+ board.addFleet(f);
176
+
177
+ Board nextBoard = board.next();
178
+
179
+ Assert.assertTrue("should have made a shipyard", nextBoard.getShipyardAtPoint(p).isPresent());
180
+ Shipyard nextShipyard = nextBoard.getShipyardAtPoint(p).get();
181
+ Assert.assertEquals(0, nextShipyard.playerId);
182
+ Assert.assertEquals(50, nextShipyard.shipCount);
183
+ }
184
+
185
+ @Test
186
+ public void updatesFlightPlan_doesNotConvertIfNotEnoughShips() throws IOException {
187
+ Board board = getStarterBoard();
188
+
189
+ Point p = new Point(10, 11);
190
+
191
+ Fleet f = new Fleet("test-fleet", 10, Direction.SOUTH, p, 100.0, "C", 0, board);
192
+
193
+ board.addFleet(f);
194
+
195
+ Board nextBoard = board.next();
196
+
197
+ Assert.assertTrue("should not have made a shipyard", nextBoard.getShipyardAtPoint(p).isEmpty());
198
+ Fleet nextFleet = nextBoard.getFleetAtPoint(new Point(10, 10)).get();
199
+ Assert.assertEquals(Direction.SOUTH.toChar(), nextFleet.direction.toChar());
200
+ Assert.assertEquals(10, nextFleet.shipCount);
201
+ Assert.assertEquals("", nextFleet.flightPlan);
202
+ }
203
+
204
+ @Test
205
+ public void updatesFlightPlan_worksWithMultipleConverts() throws IOException {
206
+ Board board = getStarterBoard();
207
+
208
+ Point p = new Point(10, 11);
209
+
210
+ Fleet f = new Fleet("test-fleet", 10, Direction.SOUTH, p, 100.0, "CCC", 0, board);
211
+
212
+ board.addFleet(f);
213
+
214
+ board = board.next();
215
+ board = board.next();
216
+ board = board.next();
217
+
218
+ Assert.assertTrue("should not have crashed", true);
219
+ }
220
+
221
+ @Test
222
+ public void correctlyJoinAlliedFleet() throws IOException {
223
+ Board board = getStarterBoard();
224
+
225
+ Point p1 = new Point(10, 11);
226
+ Point p2 = new Point(10, 9);
227
+
228
+ Fleet f1 = new Fleet("f1", 10, Direction.SOUTH, p1, 100.0, "", 0, board);
229
+ Fleet f2 = new Fleet("f2", 11, Direction.NORTH, p2, 100.0, "", 0, board);
230
+
231
+ board.addFleet(f1);
232
+ board.addFleet(f2);
233
+
234
+ Board nextBoard = board.next();
235
+
236
+ Fleet combinedFleet = nextBoard.getFleetAtPoint(new Point(10, 10)).get();
237
+ Assert.assertEquals(Direction.NORTH.toChar(), combinedFleet.direction.toChar());
238
+ Assert.assertEquals(21, combinedFleet.shipCount);
239
+ }
240
+
241
+ @Test
242
+ public void correctlyJoinAlliedFleet_onFirstTieBreak() throws IOException {
243
+ Board board = getStarterBoard();
244
+
245
+ Point p1 = new Point(10, 11);
246
+ Point p2 = new Point(10, 9);
247
+
248
+ Fleet f1 = new Fleet("f1", 10, Direction.SOUTH, p1, 100.0, "", 0, board);
249
+ Fleet f2 = new Fleet("f2", 10, Direction.NORTH, p2, 101.0, "10S", 0, board);
250
+
251
+ board.addFleet(f1);
252
+ board.addFleet(f2);
253
+
254
+ Board nextBoard = board.next();
255
+
256
+ Fleet combinedFleet = nextBoard.getFleetAtPoint(new Point(10, 10)).get();
257
+ Assert.assertEquals(Direction.NORTH.toChar(), combinedFleet.direction.toChar());
258
+ Assert.assertEquals(20, combinedFleet.shipCount);
259
+ Assert.assertEquals("9S", combinedFleet.flightPlan);
260
+ }
261
+
262
+ @Test
263
+ public void correctlyJoinAlliedFleet_onSecondTieBreak() throws IOException {
264
+ Board board = getStarterBoard();
265
+
266
+ Point p1 = new Point(10, 11);
267
+ Point p2 = new Point(10, 9);
268
+
269
+ Fleet f1 = new Fleet("f1", 10, Direction.SOUTH, p1, 100.0, "", 0, board);
270
+ Fleet f2 = new Fleet("f2", 10, Direction.NORTH, p2, 100.0, "", 0, board);
271
+
272
+ board.addFleet(f1);
273
+ board.addFleet(f2);
274
+
275
+ Board nextBoard = board.next();
276
+
277
+ Fleet combinedFleet = nextBoard.getFleetAtPoint(new Point(10, 10)).get();
278
+ Assert.assertEquals(Direction.NORTH.toChar(), combinedFleet.direction.toChar());
279
+ Assert.assertEquals(20, combinedFleet.shipCount);
280
+ }
281
+
282
+ @Test
283
+ public void correctlyResolvesFleetBattles_whenThereIsAWinner() throws IOException {
284
+ Board board = getStarterBoard();
285
+
286
+ Point p1 = new Point(9, 11);
287
+ Point p2 = new Point(10, 9);
288
+
289
+ Fleet f1 = new Fleet("f1", 10, Direction.SOUTH, p1, 100.0, "", 0, board);
290
+ Fleet f2 = new Fleet("f2", 11, Direction.NORTH, p2, 100.0, "", 1, board);
291
+
292
+ board.addFleet(f1);
293
+ board.addFleet(f2);
294
+
295
+ Board nextBoard = board.next();
296
+
297
+ Assert.assertTrue("should have a surviving fleet", nextBoard.getFleetAtPoint(new Point(10, 10)).isPresent());
298
+ Fleet survivingFleet = nextBoard.getFleetAtPoint(new Point(10, 10)).get();
299
+ Assert.assertEquals(Direction.NORTH.toChar(), survivingFleet.direction.toChar());
300
+ Assert.assertEquals(1, survivingFleet.shipCount);
301
+ Assert.assertEquals(1, survivingFleet.playerId);
302
+ }
303
+
304
+ @Test
305
+ public void correctlyResolvesFleetBattles_whenThereIsATie() throws IOException {
306
+ Board board = getStarterBoard();
307
+
308
+ Point p1 = new Point(10, 11);
309
+ Point p2 = new Point(10, 9);
310
+
311
+ Fleet f1 = new Fleet("f1", 10, Direction.SOUTH, p1, 100.0, "", 0, board);
312
+ Fleet f2 = new Fleet("f2", 10, Direction.NORTH, p2, 100.0, "", 1, board);
313
+
314
+ board.addFleet(f1);
315
+ board.addFleet(f2);
316
+
317
+ Board nextBoard = board.next();
318
+
319
+ Point collision = new Point(10, 10);
320
+ Assert.assertTrue("should not have a surviving fleet", nextBoard.getFleetAtPoint(collision).isEmpty());
321
+ Assert.assertTrue("should have dropped halite", board.getCellAtPosition(collision).kore + 100 < nextBoard.getCellAtPosition(collision).kore);
322
+ }
323
+
324
+ @Test
325
+ public void correctlyResolvesFleetCollisions_whenThereIsAWinner() throws IOException {
326
+ Board board = getStarterBoard();
327
+
328
+ Point p1 = new Point(10, 11);
329
+ Point p2 = new Point(10, 9);
330
+
331
+ Fleet f1 = new Fleet("f1", 10, Direction.SOUTH, p1, 100.0, "", 0, board);
332
+ Fleet f2 = new Fleet("f2", 11, Direction.NORTH, p2, 100.0, "", 1, board);
333
+
334
+ board.addFleet(f1);
335
+ board.addFleet(f2);
336
+
337
+ Board nextBoard = board.next();
338
+
339
+ Assert.assertTrue("should have a surviving fleet", nextBoard.getFleetAtPoint(new Point(10, 10)).isPresent());
340
+ Fleet survivingFleet = nextBoard.getFleetAtPoint(new Point(10, 10)).get();
341
+ Assert.assertEquals(Direction.NORTH.toChar(), survivingFleet.direction.toChar());
342
+ Assert.assertEquals(1, survivingFleet.shipCount);
343
+ Assert.assertEquals(1, survivingFleet.playerId);
344
+ }
345
+
346
+ @Test
347
+ public void correctlyResolvesFleetCollisions_whenThereAreMultipleFromOnePlayer() throws IOException {
348
+ Board board = getStarterBoard();
349
+
350
+ Point p1 = new Point(10, 11);
351
+ Point p2 = new Point(10, 9);
352
+ Point p3 = new Point(9, 10);
353
+
354
+ Fleet f1 = new Fleet("f1", 10, Direction.SOUTH, p1, 100.0, "", 0, board);
355
+ Fleet f2 = new Fleet("f2", 11, Direction.NORTH, p2, 100.0, "", 1, board);
356
+ Fleet f3 = new Fleet("f3", 2, Direction.EAST, p3, 100.0, "", 0, board);
357
+
358
+ board.addFleet(f1);
359
+ board.addFleet(f2);
360
+ board.addFleet(f3);
361
+
362
+ Board nextBoard = board.next();
363
+
364
+ Assert.assertTrue("should have a surviving fleet", nextBoard.getFleetAtPoint(new Point(10, 10)).isPresent());
365
+ Fleet survivingFleet = nextBoard.getFleetAtPoint(new Point(10, 10)).get();
366
+ Assert.assertEquals(Direction.SOUTH.toChar(), survivingFleet.direction.toChar());
367
+ Assert.assertEquals(1, survivingFleet.shipCount);
368
+ Assert.assertEquals(0, survivingFleet.playerId);
369
+ }
370
+
371
+ @Test
372
+ public void correctlyResolvesFleetCollisions_whenThereAreThreeFleets() throws IOException {
373
+ Board board = getStarterBoard();
374
+
375
+ Point p1 = new Point(10, 11);
376
+ Point p2 = new Point(10, 9);
377
+ Point p3 = new Point(9, 10);
378
+
379
+ Fleet f1 = new Fleet("f1", 10, Direction.SOUTH, p1, 100.0, "", 0, board);
380
+ Fleet f2 = new Fleet("f2", 11, Direction.NORTH, p2, 100.0, "", 1, board);
381
+ Fleet f3 = new Fleet("f3", 2, Direction.EAST, p3, 100.0, "", 2, board);
382
+
383
+ board.addFleet(f1);
384
+ board.addFleet(f2);
385
+ board.addFleet(f3);
386
+
387
+ Board nextBoard = board.next();
388
+
389
+ Assert.assertTrue("should have a surviving fleet", nextBoard.getFleetAtPoint(new Point(10, 10)).isPresent());
390
+ Fleet survivingFleet = nextBoard.getFleetAtPoint(new Point(10, 10)).get();
391
+ Assert.assertEquals(Direction.NORTH.toChar(), survivingFleet.direction.toChar());
392
+ Assert.assertEquals(1, survivingFleet.shipCount);
393
+ Assert.assertEquals(1, survivingFleet.playerId);
394
+ }
395
+
396
+ @Test
397
+ public void correctlyResolvesFleetCollisions_whenThereIsATie() throws IOException {
398
+ Board board = getStarterBoard();
399
+
400
+ Point p1 = new Point(10, 11);
401
+ Point p2 = new Point(10, 9);
402
+
403
+ Fleet f1 = new Fleet("f1", 10, Direction.SOUTH, p1, 100.0, "", 0, board);
404
+ Fleet f2 = new Fleet("f2", 10, Direction.NORTH, p2, 100.0, "", 1, board);
405
+
406
+ board.addFleet(f1);
407
+ board.addFleet(f2);
408
+
409
+ Board nextBoard = board.next();
410
+
411
+ Point collision = new Point(10, 10);
412
+ Assert.assertTrue("should not have a surviving fleet", nextBoard.getFleetAtPoint(collision).isEmpty());
413
+ Assert.assertTrue("should have dropped halite", board.getCellAtPosition(collision).kore + 100 < nextBoard.getCellAtPosition(collision).kore);
414
+ }
415
+
416
+ @Test
417
+ public void fleetShipyardCollision_worksWhenTheyAreAllied() throws IOException {
418
+ Board board = getStarterBoard();
419
+
420
+ Point p1 = new Point(10, 11);
421
+ Point p2 = new Point(10, 10);
422
+
423
+ Fleet f1 = new Fleet("f1", 10, Direction.SOUTH, p1, 100.0, "", 0, board);
424
+ Shipyard s1 = new Shipyard("s1", 0, p2, 0, 100, board, Optional.empty());
425
+
426
+ board.addFleet(f1);
427
+ board.addShipyard(s1);
428
+
429
+ Board nextBoard = board.next();
430
+
431
+ Assert.assertTrue("should not have a fleet on the square", nextBoard.getFleetAtPoint(p2).isEmpty());
432
+ Assert.assertTrue("should have a shipyard on the square", nextBoard.getShipyardAtPoint(p2).isPresent());
433
+ Shipyard nextShipyard = nextBoard.getShipyardAtPoint(p2).get();
434
+ Assert.assertEquals(10, nextShipyard.shipCount);
435
+ Assert.assertEquals(0, nextShipyard.playerId);
436
+ Assert.assertEquals(100, s1.turnsControlled);
437
+ Assert.assertEquals(101, nextShipyard.turnsControlled);
438
+ Assert.assertEquals(nextBoard.players[0].kore, board.players[0].kore + 100, .01);
439
+ }
440
+
441
+ @Test
442
+ public void fleetShipyardCollision_smallerFleetDoesNotTakeOverLargerShipyard() throws IOException {
443
+ Board board = getStarterBoard();
444
+
445
+ Point p1 = new Point(10, 11);
446
+ Point p2 = new Point(10, 10);
447
+
448
+ Fleet f1 = new Fleet("f1", 10, Direction.SOUTH, p1, 100.0, "", 1, board);
449
+ Shipyard s1 = new Shipyard("s1", 100, p2, 0, 100, board, Optional.empty());
450
+
451
+ board.addFleet(f1);
452
+ board.addShipyard(s1);
453
+
454
+ Board nextBoard = board.next();
455
+
456
+ Assert.assertTrue("should not have a fleet on the square", nextBoard.getFleetAtPoint(p2).isEmpty());
457
+ Assert.assertTrue("should have a shipyard on the square", nextBoard.getShipyardAtPoint(p2).isPresent());
458
+ Shipyard nextShipyard = nextBoard.getShipyardAtPoint(p2).get();
459
+ Assert.assertEquals(90, nextShipyard.shipCount);
460
+ Assert.assertEquals(0, nextShipyard.playerId);
461
+ Assert.assertEquals(100, s1.turnsControlled);
462
+ Assert.assertEquals(101, nextShipyard.turnsControlled);
463
+ Assert.assertEquals(nextBoard.players[0].kore, board.players[0].kore + 100, .01);
464
+ }
465
+
466
+ @Test
467
+ public void fleetShipyardCollision_equalFleetDoesNotTakeOverLargerShipyard() throws IOException {
468
+ Board board = getStarterBoard();
469
+
470
+ Point p1 = new Point(10, 11);
471
+ Point p2 = new Point(10, 10);
472
+
473
+ Fleet f1 = new Fleet("f1", 100, Direction.SOUTH, p1, 100.0, "", 1, board);
474
+ Shipyard s1 = new Shipyard("s1", 100, p2, 0, 100, board, Optional.empty());
475
+
476
+ board.addFleet(f1);
477
+ board.addShipyard(s1);
478
+
479
+ Board nextBoard = board.next();
480
+
481
+ Assert.assertTrue("should not have a fleet on the square", nextBoard.getFleetAtPoint(p2).isEmpty());
482
+ Assert.assertTrue("should have a shipyard on the square", nextBoard.getShipyardAtPoint(p2).isPresent());
483
+ Shipyard nextShipyard = nextBoard.getShipyardAtPoint(p2).get();
484
+ Assert.assertEquals(0, nextShipyard.shipCount);
485
+ Assert.assertEquals(0, nextShipyard.playerId);
486
+ Assert.assertEquals(100, s1.turnsControlled);
487
+ Assert.assertEquals(101, nextShipyard.turnsControlled);
488
+ Assert.assertEquals(nextBoard.players[0].kore, board.players[0].kore + 100, .01);
489
+ }
490
+
491
+ @Test
492
+ public void fleetShipyardCollision_largerFleetDoesTakeOverSmallerShipyard() throws IOException {
493
+ Board board = getStarterBoard();
494
+
495
+ Point p1 = new Point(10, 11);
496
+ Point p2 = new Point(10, 10);
497
+
498
+ Fleet f1 = new Fleet("f1", 110, Direction.SOUTH, p1, 100.0, "", 1, board);
499
+ Shipyard s1 = new Shipyard("s1", 100, p2, 0, 100, board, Optional.empty());
500
+
501
+ board.addFleet(f1);
502
+ board.addShipyard(s1);
503
+
504
+ Board nextBoard = board.next();
505
+
506
+ Assert.assertTrue("should not have a fleet on the square", nextBoard.getFleetAtPoint(p2).isEmpty());
507
+ Assert.assertTrue("should have a shipyard on the square", nextBoard.getShipyardAtPoint(p2).isPresent());
508
+ Shipyard nextShipyard = nextBoard.getShipyardAtPoint(p2).get();
509
+ Assert.assertEquals(10, nextShipyard.shipCount);
510
+ Assert.assertEquals(1, nextShipyard.playerId);
511
+ Assert.assertEquals(100, s1.turnsControlled);
512
+ Assert.assertEquals(1, nextShipyard.turnsControlled);
513
+ Assert.assertEquals(nextBoard.players[1].kore, board.players[1].kore + 100, .01);
514
+ }
515
+
516
+ @Test
517
+ public void fleetAdjacentBattle_dropsKoreCorrectlyWhenBothDie() throws IOException {
518
+ Board board = getStarterBoard();
519
+
520
+ Point p1 = new Point(10, 11);
521
+ Fleet f1 = new Fleet("f1", 100, Direction.NORTH, p1, 100.0, "", 0, board);
522
+ double p1Kore = board.getCellAtPosition(p1.add(Direction.NORTH)).kore;
523
+ board.addFleet(f1);
524
+
525
+ Point p2 = p1.add(Direction.NORTH).add(Direction.NORTH).add(Direction.EAST);
526
+ Fleet f2 = new Fleet("f2", 100, Direction.SOUTH, p2, 100.0, "", 1, board);
527
+ board.addFleet(f2);
528
+
529
+ Board nextBoard = board.next();
530
+
531
+ double p1NextKore = nextBoard.getCellAtPosition(p1.add(Direction.NORTH)).kore;
532
+ Assert.assertTrue("should have been destroyed", !nextBoard.fleets.containsKey("f1"));
533
+ Assert.assertTrue("should dump all kore", p1Kore + 100 < p1NextKore);
534
+ }
535
+
536
+ @Test
537
+ public void fleetAdjacentBattle_dropsKoreCorrectlyWhenOneDies() throws IOException {
538
+ Board board = getStarterBoard();
539
+
540
+ Point p1 = new Point(10, 11);
541
+ Fleet f1 = new Fleet("f1", 50, Direction.NORTH, p1, 100.0, "", 0, board);
542
+ double p1Kore = board.getCellAtPosition(p1.add(Direction.NORTH)).kore;
543
+ board.addFleet(f1);
544
+
545
+ Point p2 = p1.add(Direction.NORTH).add(Direction.NORTH).add(Direction.EAST);
546
+ Fleet f2 = new Fleet("f2", 100, Direction.SOUTH, p2, 100.0, "", 1, board);
547
+ board.addFleet(f2);
548
+
549
+ Board nextBoard = board.next();
550
+
551
+ double p1NextKore = nextBoard.getCellAtPosition(p1.add(Direction.NORTH)).kore;
552
+ Assert.assertTrue("should have been destroyed", !nextBoard.fleets.containsKey("f1"));
553
+ Assert.assertTrue("should dump half kore", p1Kore + 50 < p1NextKore && p1Kore + 55 > p1NextKore);
554
+
555
+ Fleet f2next = nextBoard.fleets.get("f2");
556
+ Assert.assertTrue("Should have picked up half", f2.kore + 50 <= f2next.kore && f2.kore + 55 > f2next.kore);
557
+ }
558
+
559
+ private Board getStarterBoard() throws IOException {
560
+ Path configPath = Paths.get("bin", "test", "configuration.json");
561
+ String rawConfig = Files.readString(configPath);
562
+ Path obsPath = Paths.get("bin", "test", "observation.json");
563
+ String rawObs = Files.readString(obsPath);
564
+
565
+ return new Board(rawObs, rawConfig);
566
+ }
567
+ }
@@ -0,0 +1,25 @@
1
+ package test;
2
+
3
+ import java.io.IOException;
4
+ import java.nio.file.Files;
5
+ import java.nio.file.Path;
6
+ import java.nio.file.Paths;
7
+
8
+ import org.junit.Assert;
9
+ import org.junit.Test;
10
+
11
+ import kore.Configuration;
12
+
13
+ public class ConfigurationTest {
14
+
15
+ @Test
16
+ public void givenValidConfiguration_createSuccessful() throws IOException {
17
+ Path configPath = Paths.get("bin", "test", "configuration.json");
18
+ String rawConfig = Files.readString(configPath);
19
+
20
+ Configuration config = new Configuration(rawConfig);
21
+
22
+ Assert.assertEquals(0.02, config.regenRate, .001);
23
+ }
24
+
25
+ }