/ants/dist/sample_bots/php/tests/AntsTest.php

https://github.com/jnwhiteh/aichallenge · PHP · 211 lines · 155 code · 38 blank · 18 comment · 0 complexity · 4c66ce3ab0af378fe66b16e46f440c01 MD5 · raw file

  1. <?php
  2. require_once 'PHPUnit/Framework.php';
  3. require_once '../Ants.php';
  4. class AntsTest extends PHPUnit_Framework_TestCase
  5. {
  6. private $ants;
  7. protected function setUp()
  8. {
  9. $this->ants = new Ants();
  10. }
  11. public function testFinishTurn()
  12. {
  13. ob_start();
  14. $this->ants->finishTurn();
  15. $output = ob_get_clean();
  16. $this->assertEquals("go\n", $output);
  17. }
  18. public function testIssueOrder()
  19. {
  20. ob_start();
  21. $this->ants->issueOrder(2, 3, 'N');
  22. $output = ob_get_clean();
  23. $this->assertEquals("o 2 3 N\n", $output);
  24. }
  25. /**
  26. * @depends testFinishTurn
  27. * @depends testIssueOrder
  28. */
  29. public function testIssueOrderAndFinishTurn()
  30. {
  31. ob_start();
  32. $this->ants->issueOrder(2, 3, 'N');
  33. $this->ants->finishTurn();
  34. $output = ob_get_clean();
  35. $this->assertEquals("o 2 3 N\ngo\n", $output);
  36. }
  37. public function testSetup()
  38. {
  39. $data = explode("\n", "rows 10\ncols 15\nloadtime 2500\nturntime 1000\nturns 278\nviewradius2 64\nattackradius2 9\nspawnradius2 4\n");
  40. $this->ants->setup($data);
  41. $this->assertEquals(10, $this->ants->rows, "Unexpected rows value");
  42. $this->assertEquals(15, $this->ants->cols, "Unexpected cols value");
  43. $this->assertEquals(1000, $this->ants->turntime, "Unexpected turntime value");
  44. $this->assertEquals(2500, $this->ants->loadtime, "Unexpected loadtime value");
  45. $this->assertEquals(278, $this->ants->turns, "Unexpected turns value");
  46. $this->assertEquals(64, $this->ants->viewradius2, "Unexpected viewradius2 value");
  47. $this->assertEquals(9, $this->ants->attackradius2, "Unexpected attackradius2 value");
  48. $this->assertEquals(4, $this->ants->spawnradius2, "Unexpected spawnradius2 value");
  49. $this->assertType('array', $this->ants->map, 'Unexpected type of map');
  50. $this->assertEquals($this->ants->rows, count($this->ants->map), 'Number of rows in map doesn\'t match rows property');
  51. $this->assertEquals($this->ants->cols, count($this->ants->map[0]), 'Number of cols in map doesn\'t match cols property');
  52. $this->assertEquals(LAND, $this->ants->map[2][2], 'Initial type of map tile isn\'t LAND');
  53. }
  54. /**
  55. * @depends testSetup
  56. */
  57. public function testUpdate()
  58. {
  59. $data = explode("\n", "rows 10\ncols 15\n");
  60. $this->ants->setup($data);
  61. $this->assertEquals(array(), $this->ants->myAnts, 'inital value of myAnts isn\'t empty array');
  62. $this->assertEquals(array(), $this->ants->enemyAnts, 'inital value of enemyAnts isn\'t empty array');
  63. $this->assertEquals(array(), $this->ants->deadAnts, 'inital value of deadAnts isn\'t empty array');
  64. $this->assertEquals(array(), $this->ants->food, 'inital value of food isn\'t empty array');
  65. $data = explode("\n", "a 2 2 0\na 8 8 1\nf 5 5");
  66. $this->ants->update($data);
  67. $this->assertEquals(array( array(2,2) ), $this->ants->myAnts, 'myAnts array wasn\t updated');
  68. $this->assertEquals(array( array(8,8) ), $this->ants->enemyAnts, 'enemyAnts array wasn\t updated');
  69. $this->assertEquals(array( array(5,5) ), $this->ants->food, 'food array wasn\t updated');
  70. $this->assertEquals( FOOD, $this->ants->map[5][5], 'map was not updated by first update');
  71. $data = explode("\n", "a 2 2 0\na 8 8 1\n");
  72. $this->ants->update($data);
  73. $this->assertEquals(array(), $this->ants->food, 'food array wasn\t updated by second update');
  74. $this->assertEquals( LAND, $this->ants->map[5][5], 'map was not updated by second update');
  75. }
  76. /**
  77. * @depends testUpdate
  78. */
  79. public function testPassable()
  80. {
  81. $data = explode("\n", "rows 10\ncols 15\n");
  82. $this->ants->setup($data);
  83. //set water tiles
  84. $data = explode("\n", "a 2 2 0\nw 3 3\nw 3 4\nf 5 5\nd 4 5 1");
  85. $this->ants->update($data);
  86. $this->assertTrue( $this->ants->passable(1,1), 'Land is not passable');
  87. $this->assertTrue( $this->ants->passable(4,5), 'Dead ant is not passable');
  88. $this->assertTrue( $this->ants->passable(2,2), 'Ant is not passable');
  89. $this->assertTrue( $this->ants->passable(5,5), 'Food is passable');
  90. $this->assertFalse( $this->ants->passable(3,3), 'Water is passable');
  91. }
  92. /**
  93. * @depends testUpdate
  94. */
  95. public function testUnoccupied()
  96. {
  97. $data = explode("\n", "rows 10\ncols 15\n");
  98. $this->ants->setup($data);
  99. //set water tiles
  100. $data = explode("\n", "a 2 2 0\nw 3 3\nw 3 4\nf 5 5\nd 4 5 1");
  101. $this->ants->update($data);
  102. $this->assertTrue( $this->ants->unoccupied(1,1), 'Land is occupied');
  103. $this->assertTrue( $this->ants->unoccupied(4,5), 'Dead ant is occupied');
  104. $this->assertTrue( $this->ants->unoccupied(5,5), 'Food is occupied');
  105. $this->assertFalse( $this->ants->unoccupied(2,2), 'Ant is unoccupied');
  106. $this->assertFalse( $this->ants->unoccupied(3,3), 'Water is unoccupied');
  107. }
  108. public function testDestinationBasic()
  109. {
  110. $data = explode("\n", "rows 10\ncols 15\n");
  111. $this->ants->setup($data);
  112. $this->assertEquals(array(2,3), $this->ants->destination(3, 3, 'n'));
  113. $this->assertEquals(array(4,3), $this->ants->destination(3, 3, 's'));
  114. $this->assertEquals(array(3,4), $this->ants->destination(3, 3, 'e'));
  115. $this->assertEquals(array(3,2), $this->ants->destination(3, 3, 'w'));
  116. }
  117. /**
  118. * @depends testDestinationBasic
  119. */
  120. public function testDestinationWrap()
  121. {
  122. $data = explode("\n", "rows 10\ncols 15\n");
  123. $this->ants->setup($data);
  124. $this->assertEquals(array(9,0), $this->ants->destination(0, 0, 'n'));
  125. $this->assertEquals(array(0,0), $this->ants->destination(9, 0, 's'));
  126. $this->assertEquals(array(5,0), $this->ants->destination(5, 14, 'e'));
  127. $this->assertEquals(array(5,14), $this->ants->destination(5, 0, 'w'));
  128. }
  129. public function testDistanceStraight()
  130. {
  131. $this->assertEquals(3, $this->ants->distance( 2, 2, 5, 2) );
  132. $this->assertEquals(4, $this->ants->distance( 2, 4, 6, 4) );
  133. }
  134. public function testDistanceDiagonal()
  135. {
  136. $this->assertEquals(sqrt(8), $this->ants->distance( 2, 2, 4, 4) );
  137. $this->assertThat($this->ants->distance( 2, 2, 4, 7), $this->equalTo(5.4, 0.1) );
  138. }
  139. public function testDistanceOverBorder()
  140. {
  141. $data = explode("\n", "rows 10\ncols 15\n");
  142. $this->ants->setup($data);
  143. $this->assertEquals(4, $this->ants->distance( 2, 2, 2, 13) );
  144. $this->assertThat($this->ants->distance( 0, 0, 9, 14), $this->equalTo(1.4, 0.1) );
  145. }
  146. public function testDirectionStraight()
  147. {
  148. $data = explode("\n", "rows 10\ncols 15\n");
  149. $this->ants->setup($data);
  150. $this->assertEquals(array('n'), $this->ants->direction( 5, 7, 1, 7) );
  151. $this->assertEquals(array('s'), $this->ants->direction( 5, 7, 9, 7) );
  152. $this->assertEquals(array('e'), $this->ants->direction( 5, 7, 5, 12) );
  153. $this->assertEquals(array('w'), $this->ants->direction( 5, 7, 5, 2) );
  154. }
  155. public function testDirectionDiagonal()
  156. {
  157. $data = explode("\n", "rows 10\ncols 15\n");
  158. $this->ants->setup($data);
  159. $this->assertEquals(array('n','e'), $this->ants->direction( 5, 7, 1, 10) );
  160. $this->assertEquals(array('s','e'), $this->ants->direction( 5, 7, 9, 10) );
  161. $this->assertEquals(array('s','w'), $this->ants->direction( 5, 7, 9, 2) );
  162. $this->assertEquals(array('n','w'), $this->ants->direction( 5, 7, 1, 2) );
  163. }
  164. public function testDirectionOverBorder()
  165. {
  166. $data = explode("\n", "rows 10\ncols 15\n");
  167. $this->ants->setup($data);
  168. $this->assertEquals(array('n'), $this->ants->direction( 2, 7, 8, 7) );
  169. $this->assertEquals(array('s'), $this->ants->direction( 8, 7, 1, 7) );
  170. $this->assertEquals(array('e'), $this->ants->direction( 5, 12, 5, 1) );
  171. $this->assertEquals(array('w'), $this->ants->direction( 5, 3, 5, 12) );
  172. }
  173. }