TestDirection.py 10KB

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