TestDirection.py 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. from os import getcwd
  2. from sys import path as ppath
  3. from intelligine.core.exceptions import NoPheromone
  4. ppath.insert(1,getcwd()+'/modules') # TODO: win32 compatibilite (python path)
  5. # TODO: load et launch des tests auto (avec bootstrap contenant ci dessus)
  6. from intelligine.tests.simulation.pheromone.Base import Base
  7. from intelligine.simulation.pheromone.DirectionPheromone import DirectionPheromone
  8. from intelligine.core.Context import Context
  9. from intelligine.cst import PHEROMON_DIRECTION, PHEROMON_DIR_EXPLO, PHEROMON_DIR_HOME
  10. from intelligine.synergy.event.move.direction import NORTH, NORTH_EST, EST, SOUTH_EST, SOUTH, SOUTH_WEST, WEST, \
  11. NORTH_WEST, CENTER
  12. from intelligine.synergy.event.move.direction import get_position_with_direction_decal as _p
  13. class TestDirection(Base):
  14. def __init__(self, *args, **kwargs):
  15. super().__init__(*args, **kwargs)
  16. self._context = Context()
  17. def setUp(self):
  18. self._context = Context()
  19. def _set_up_pheromones(self, pheromones, re_init=True):
  20. if re_init:
  21. self._context = Context()
  22. for position in pheromones:
  23. self._context.pheromones().set_pheromones(position, pheromones[position])
  24. def _test_direction_for_point(self, pheromones, direction, pheromone_type=PHEROMON_DIR_EXPLO,
  25. reference_point=_p(CENTER)):
  26. """
  27. :param pheromones:
  28. :param direction:
  29. :param pheromone_type:
  30. :param reference_point:
  31. :return:
  32. """
  33. self._set_up_pheromones(pheromones)
  34. direction_tested = DirectionPheromone.get_direction_for_point(self._context, reference_point, pheromone_type)
  35. self.assertEqual(direction, direction_tested, "Direction must be %s" % direction)
  36. def _test_direction_for_points(self, pheromones, direction, pheromone_type=PHEROMON_DIR_EXPLO,
  37. reference_point=_p(CENTER)):
  38. """
  39. :param pheromones:
  40. :param direction:
  41. :param pheromone_type:
  42. :param reference_point:
  43. :return:
  44. """
  45. self._set_up_pheromones(pheromones)
  46. around_points = self._context.get_arround_points_of(reference_point)
  47. direction_tested = DirectionPheromone.get_best_pheromone_direction_in(self._context,
  48. reference_point,
  49. around_points,
  50. pheromone_type)
  51. self.assertEqual(direction, direction_tested, "Direction must be %s" % direction)
  52. def test_route_direct_route(self):
  53. """
  54. Test easy direction with 1 best pheromones just near actual position
  55. :return:
  56. """
  57. test_data = {
  58. NORTH_WEST: {
  59. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  60. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  61. },
  62. NORTH: {
  63. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  64. _p(NORTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  65. },
  66. NORTH_EST: {
  67. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  68. _p(NORTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  69. },
  70. WEST: {
  71. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  72. _p(WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  73. },
  74. EST: {
  75. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  76. _p(EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  77. },
  78. SOUTH_WEST: {
  79. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  80. _p(SOUTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  81. },
  82. SOUTH: {
  83. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  84. _p(SOUTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  85. },
  86. SOUTH_EST: {
  87. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  88. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  89. }
  90. }
  91. for direction_wanted in test_data:
  92. self._test_direction_for_point(test_data[direction_wanted], direction_wanted)
  93. def test_route_with_multiple_same_intensity(self):
  94. """
  95. Test find route in middle of multiple pheromones
  96. :return:
  97. """
  98. test_data = {
  99. NORTH_WEST: {
  100. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  101. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}},
  102. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (12, 1)}}
  103. },
  104. NORTH_WEST: {
  105. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  106. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}},
  107. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (12, 1)}},
  108. _p(SOUTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (12, 1)}}
  109. },
  110. NORTH_WEST: {
  111. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  112. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}},
  113. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (12, 1)}},
  114. _p(SOUTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_HOME: (8, 1)}}
  115. },
  116. }
  117. for direction_wanted in test_data:
  118. self._test_direction_for_point(test_data[direction_wanted], direction_wanted)
  119. def test_route_with_multiple_different_intensity(self):
  120. """
  121. Test find route in middle of multiple pheromones
  122. :return:
  123. """
  124. test_data = {
  125. NORTH_WEST: {
  126. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 2)}},
  127. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 2)}},
  128. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (8, 1)}}
  129. },
  130. NORTH_WEST: {
  131. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 2)}},
  132. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 2)}},
  133. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (8, 1)}},
  134. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_HOME: (5, 10)}} # an other pheromone type
  135. }
  136. }
  137. for direction_wanted in test_data:
  138. self._test_direction_for_point(test_data[direction_wanted], direction_wanted)
  139. def test_direction_direct(self):
  140. test_data = {
  141. NORTH: {
  142. _p(NORTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 2)}}
  143. },
  144. NORTH: {
  145. _p(NORTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 2)}},
  146. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_HOME: (9, 500)}} # An other pheromone type
  147. }
  148. }
  149. for direction in test_data:
  150. self._test_direction_for_points(test_data[direction], direction)
  151. def test_direction_with_multiple_intensity(self):
  152. test_data = {
  153. NORTH: {
  154. _p(NORTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 5)}},
  155. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 4)}},
  156. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 4)}}
  157. },
  158. NORTH: {
  159. _p(NORTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 5)}},
  160. _p(WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_HOME: (9, 500)}}, # An other pheromone_type
  161. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 4)}},
  162. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 4)}}
  163. }
  164. }
  165. for direction in test_data:
  166. self._test_direction_for_points(test_data[direction], direction)
  167. def test_no_pheromones_around(self):
  168. # No pheromone
  169. try: # WTF ?
  170. self.assertRaises(NoPheromone, self._test_direction_for_points({}, -1))
  171. except NoPheromone:
  172. self.assertTrue(True)
  173. # Wrong pheromone type
  174. try: # WTF ?
  175. self.assertRaises(NoPheromone, self._test_direction_for_points({
  176. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_HOME: (9, 5)}}
  177. }, -1))
  178. except NoPheromone:
  179. self.assertTrue(True)