TestDirection.py 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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')
  5. from intelligine.tests.simulation.pheromone.Base import Base
  6. from intelligine.simulation.pheromone.DirectionPheromone import DirectionPheromone
  7. from intelligine.core.Context import Context
  8. from intelligine.cst import PHEROMON_DIRECTION, PHEROMON_DIR_EXPLO, PHEROMON_DIR_HOME
  9. from intelligine.synergy.event.move.direction import NORTH, NORTH_EST, EST, SOUTH_EST, SOUTH, SOUTH_WEST, WEST, \
  10. NORTH_WEST, CENTER
  11. from intelligine.synergy.event.move.direction import get_position_with_direction_decal as _p
  12. class TestDirection(Base):
  13. def __init__(self, *args, **kwargs):
  14. super().__init__(*args, **kwargs)
  15. self._context = Context()
  16. def setUp(self):
  17. self._context = Context()
  18. def _set_up_pheromones(self, pheromones, re_init=True):
  19. if re_init:
  20. self._context = Context()
  21. for position in pheromones:
  22. self._context.pheromones().set_pheromones(position, pheromones[position])
  23. def _test_direction_for_point(self, pheromones, direction, pheromone_type=PHEROMON_DIR_EXPLO,
  24. reference_point=_p(CENTER), re_init=True):
  25. """
  26. :param pheromones:
  27. :param direction:
  28. :param pheromone_type:
  29. :param reference_point:
  30. :return:
  31. """
  32. self._set_up_pheromones(pheromones, re_init=re_init)
  33. direction_tested = DirectionPheromone.get_direction_for_point(self._context, reference_point, pheromone_type)
  34. self.assertEqual(direction, direction_tested, "Direction must be %s" % direction)
  35. def _test_direction_for_points(self, pheromones, direction, pheromone_type=PHEROMON_DIR_EXPLO,
  36. reference_point=_p(CENTER), re_init=True):
  37. """
  38. :param pheromones:
  39. :param direction:
  40. :param pheromone_type:
  41. :param reference_point:
  42. :return:
  43. """
  44. self._set_up_pheromones(pheromones, re_init=re_init)
  45. around_points = self._context.get_around_points_of(reference_point)
  46. direction_tested = DirectionPheromone.get_best_pheromone_direction_in(self._context,
  47. reference_point,
  48. around_points,
  49. pheromone_type)
  50. self.assertEqual(direction, direction_tested, "Direction must be %s" % direction)
  51. def test_route_direct_route(self):
  52. """
  53. Test easy direction with 1 best pheromones just near actual position
  54. :return:
  55. """
  56. test_data = {
  57. NORTH_WEST: {
  58. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  59. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  60. },
  61. NORTH: {
  62. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  63. _p(NORTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  64. },
  65. NORTH_EST: {
  66. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  67. _p(NORTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  68. },
  69. WEST: {
  70. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  71. _p(WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  72. },
  73. EST: {
  74. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  75. _p(EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  76. },
  77. SOUTH_WEST: {
  78. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  79. _p(SOUTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  80. },
  81. SOUTH: {
  82. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  83. _p(SOUTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  84. },
  85. SOUTH_EST: {
  86. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  87. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}}
  88. }
  89. }
  90. for direction_wanted in test_data:
  91. self._test_direction_for_point(test_data[direction_wanted], direction_wanted)
  92. def test_route_with_multiple_same_intensity(self):
  93. """
  94. Test find route in middle of multiple pheromones
  95. :return:
  96. """
  97. test_data = {
  98. NORTH_WEST: {
  99. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  100. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}},
  101. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (12, 1)}}
  102. },
  103. NORTH_WEST: {
  104. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  105. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}},
  106. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (12, 1)}},
  107. _p(SOUTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (12, 1)}}
  108. },
  109. NORTH_WEST: {
  110. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 1)}},
  111. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 1)}},
  112. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (12, 1)}},
  113. _p(SOUTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_HOME: (8, 1)}}
  114. },
  115. }
  116. for direction_wanted in test_data:
  117. self._test_direction_for_point(test_data[direction_wanted], direction_wanted)
  118. def test_route_with_multiple_different_intensity(self):
  119. """
  120. Test find route in middle of multiple pheromones
  121. :return:
  122. """
  123. test_data = {
  124. NORTH_WEST: {
  125. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 2)}},
  126. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 2)}},
  127. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (8, 1)}}
  128. },
  129. NORTH_WEST: {
  130. _p(CENTER): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (10, 2)}},
  131. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 2)}},
  132. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (8, 1)}},
  133. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_HOME: (5, 10)}} # an other pheromone type
  134. }
  135. }
  136. for direction_wanted in test_data:
  137. self._test_direction_for_point(test_data[direction_wanted], direction_wanted)
  138. def test_direction_direct(self):
  139. test_data = {
  140. NORTH: {
  141. _p(NORTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 2)}}
  142. },
  143. NORTH: {
  144. _p(NORTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 2)}},
  145. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_HOME: (9, 500)}} # An other pheromone type
  146. }
  147. }
  148. for direction in test_data:
  149. self._test_direction_for_points(test_data[direction], direction)
  150. def test_direction_with_multiple_intensity(self):
  151. test_data = {
  152. NORTH: {
  153. _p(NORTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 5)}},
  154. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 4)}},
  155. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 4)}}
  156. },
  157. NORTH: {
  158. _p(NORTH): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 5)}},
  159. _p(WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_HOME: (9, 500)}}, # An other pheromone_type
  160. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 4)}},
  161. _p(NORTH_WEST): {PHEROMON_DIRECTION: {PHEROMON_DIR_EXPLO: (9, 4)}}
  162. }
  163. }
  164. for direction in test_data:
  165. self._test_direction_for_points(test_data[direction], direction)
  166. def test_no_pheromones_around(self):
  167. # No pheromone
  168. try: # WTF ?
  169. self.assertRaises(NoPheromone, self._test_direction_for_points({}, -1))
  170. except NoPheromone:
  171. self.assertTrue(True)
  172. # Wrong pheromone type
  173. try: # WTF ?
  174. self.assertRaises(NoPheromone, self._test_direction_for_points({
  175. _p(SOUTH_EST): {PHEROMON_DIRECTION: {PHEROMON_DIR_HOME: (9, 5)}}
  176. }, -1))
  177. except NoPheromone:
  178. self.assertTrue(True)
  179. def test_appose(self):
  180. self._test_point_raise_no_pheromone()
  181. self._test_points_raise_no_pheromone()
  182. # Une pheromone au centre
  183. DirectionPheromone.appose(self._context,
  184. _p(CENTER),
  185. (PHEROMON_DIR_EXPLO, 2))
  186. # Ne permet pas de trouver une route
  187. self._test_point_raise_no_pheromone(re_init=False)
  188. self._test_points_raise_no_pheromone(re_init=False)
  189. # Une pheromone au nord
  190. DirectionPheromone.appose(self._context,
  191. _p(NORTH),
  192. (PHEROMON_DIR_EXPLO, 1))
  193. # le permet
  194. self._test_direction_for_points({}, NORTH, re_init=False)
  195. self._test_direction_for_point({}, NORTH, re_init=False)
  196. def _test_point_raise_no_pheromone(self, pheromones={}, direction=-1, pheromone_type=PHEROMON_DIR_EXPLO,
  197. reference_point=_p(CENTER), re_init=True):
  198. try: # WTF ?
  199. self._test_direction_for_point(pheromones, direction, re_init=re_init)
  200. except NoPheromone:
  201. self.assertTrue(True)
  202. def _test_points_raise_no_pheromone(self, pheromones={}, direction=-1, pheromone_type=PHEROMON_DIR_EXPLO,
  203. reference_point=_p(CENTER), re_init=True):
  204. try: # WTF ?
  205. self._test_direction_for_points(pheromones, direction, re_init=re_init)
  206. except NoPheromone:
  207. self.assertTrue(True)