test_geometry.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. '''
  2. Tests for 'geometry' module
  3. ** By Cro-Ki l@b, 2017 **
  4. '''
  5. import unittest
  6. from pypog import geometry
  7. class Test(unittest.TestCase):
  8. # # neighbours
  9. def test_neighbours(self):
  10. """ test for geometry.neighbours """
  11. for coord in ((0, 0), (-10, -10), (10, 10)):
  12. x, y = coord
  13. self.assertEqual(geometry.neighbours(geometry.FLAT_HEX, x, y), geometry.fhex2_neighbours(x, y))
  14. self.assertEqual(geometry.neighbours(geometry.SQUARE, x, y), geometry.squ2_neighbours(x, y))
  15. def test_fhex2_neighbours(self):
  16. """ test for geometry.fhex2_neighbours """
  17. self.assertCountEqual(geometry.fhex2_neighbours(3, 3), [(3, 2), (4, 3), (4, 4), (3, 4), (2, 4), (2, 3)])
  18. self.assertCountEqual(geometry.fhex2_neighbours(4, 4), [(4, 3), (5, 3), (5, 4), (4, 5), (3, 4), (3, 3)])
  19. def test_squ2_neighbours(self):
  20. """ test for geometry.squ2_neighbours """
  21. self.assertCountEqual(geometry.squ2_neighbours(3, 3), [(2, 3), (2, 2), (3, 2), (4, 2), (4, 3), (4, 4), (3, 4), (2, 4)])
  22. def test_zone(self):
  23. """ test for geometry.zone """
  24. self.assertRaises(TypeError, geometry.zone, 5, 0, 0, "a")
  25. self.assertRaises(TypeError, geometry.zone, 5, "a", 0, 1)
  26. self.assertRaises(TypeError, geometry.zone, 5, 0, "a", 1)
  27. self.assertRaises(ValueError, geometry.zone, 5, 0, 0, -1)
  28. self.assertRaises(ValueError, geometry.zone, -1, 0, 0, 1)
  29. self.assertRaises(ValueError, geometry.zone, "a", 0, 0, 1)
  30. self.assertCountEqual(geometry.zone(geometry.FLAT_HEX, 3, 3, 0), [(3, 3)])
  31. self.assertCountEqual(geometry.zone(geometry.FLAT_HEX, 3, 3, 1), [(3, 2), (2, 3), (3, 3), (4, 3), (4, 4), (3, 4), (2, 4)])
  32. self.assertCountEqual(geometry.zone(geometry.FLAT_HEX, 3, 3, 2), [(3, 2), (1, 3), (5, 4), (4, 5), (1, 4), (2, 3), (4, 2), \
  33. (2, 5), (5, 3), (1, 2), (3, 5), (3, 3), (4, 4), (3, 1), \
  34. (4, 3), (2, 2), (3, 4), (2, 4), (5, 2)])
  35. self.assertCountEqual(geometry.zone(geometry.SQUARE, 3, 3, 0), [(3, 3)])
  36. self.assertCountEqual(geometry.zone(geometry.SQUARE, 3, 3, 1), [(3, 2), (3, 3), (4, 4), (2, 3), (4, 3), (2, 2), (4, 2), (3, 4), (2, 4)])
  37. self.assertCountEqual(geometry.zone(geometry.SQUARE, 3, 3, 2), [(2, 4), (3, 2), (5, 4), (1, 3), (4, 5), (2, 1), (1, 4), (2, 3), (4, 2), \
  38. (5, 1), (2, 5), (3, 5), (5, 3), (1, 2), (3, 3), (5, 5), (4, 4), (3, 1), \
  39. (1, 5), (4, 3), (2, 2), (4, 1), (5, 2), (3, 4), (1, 1)])
  40. # # lines
  41. def test_line2d(self):
  42. """ test for geometry.line """
  43. self.assertRaises(TypeError, geometry.line, geometry.FLAT_HEX, "a", 1, 1, 1)
  44. self.assertRaises(TypeError, geometry.line, geometry.FLAT_HEX, 1, "a", 1, 1)
  45. self.assertRaises(TypeError, geometry.line, geometry.FLAT_HEX, 1, 1, "a", 1)
  46. self.assertRaises(TypeError, geometry.line, geometry.FLAT_HEX, 1, 1, 1, "a")
  47. self.assertRaises(ValueError, geometry.line, 0, 1, 1, 1, 1)
  48. attended = {
  49. geometry.FLAT_HEX: {
  50. (1, 1, 1, 1): [(1, 1)],
  51. (0, 0, 1, 1): [(0, 0), (0, 1), (1, 1)],
  52. (1, 1, 0, 0): [(1, 1), (0, 1), (0, 0)],
  53. (0, 0, 7, 3): [(0, 0), (1, 0), (2, 1), (3, 1), (4, 2), (5, 2), (6, 3), (7, 3)],
  54. (7, 3, 0, 0): [(7, 3), (6, 3), (5, 2), (4, 2), (3, 1), (2, 1), (1, 0), (0, 0)],
  55. (4, 3, 0, 3): [(4, 3), (3, 2), (2, 3), (1, 2), (0, 3)],
  56. (0, 3, 4, 3): [(0, 3), (1, 2), (2, 3), (3, 2), (4, 3)],
  57. (3, 0, 3, 3): [(3, 0), (3, 1), (3, 2), (3, 3)],
  58. (3, 3, 3, 0): [(3, 3), (3, 2), (3, 1), (3, 0)]
  59. },
  60. geometry.SQUARE: {
  61. (1, 1, 1, 1): [(1, 1)],
  62. (0, 0, 0, 1): [(0, 0), (0, 1)],
  63. (0, 1, 0, 0): [(0, 1), (0, 0)],
  64. (0, 0, 1, 1): [(0, 0), (1, 1)],
  65. (1, 1, 0, 0): [(1, 1), (0, 0)],
  66. (0, 0, 7, 3): [(0, 0), (1, 0), (2, 1), (3, 1), (4, 2), (5, 2), (6, 3), (7, 3)],
  67. (7, 3, 0, 0): [(7, 3), (6, 3), (5, 2), (4, 2), (3, 1), (2, 1), (1, 0), (0, 0)],
  68. (4, 3, 0, 3): [(4, 3), (3, 3), (2, 3), (1, 3), (0, 3)],
  69. (0, 3, 4, 3): [(0, 3), (1, 3), (2, 3), (3, 3), (4, 3)],
  70. (3, 0, 3, 3): [(3, 0), (3, 1), (3, 2), (3, 3)],
  71. (3, 3, 3, 0): [(3, 3), (3, 2), (3, 1), (3, 0)]
  72. }
  73. }
  74. for cell_shape, tests in attended.items():
  75. for args, attended in tests.items():
  76. result = geometry.line(cell_shape, *args)
  77. self.assertEqual(result, attended)
  78. def test_line3d(self):
  79. """ test for geometry.line3d """
  80. self.assertRaises(TypeError, geometry.line3d, geometry.FLAT_HEX, 1, 1, "a", 1, 1, 1)
  81. self.assertRaises(TypeError, geometry.line3d, geometry.FLAT_HEX, 1, 1, 1, 1, 1, "a")
  82. attended = {
  83. geometry.FLAT_HEX: {
  84. (1, 1, 1, 1, 1, 1) : [(1, 1, 1)],
  85. (1, 1, 0, 1, 1, 1) : [(1, 1, 0), (1, 1, 1)],
  86. (0, 0, 0, 1, 1, 1) : [(0, 0, 0), (0, 1, 0), (1, 1, 1)],
  87. (0, 0, 0, 7, 3, 7) : [(0, 0, 0), (1, 0, 1), (2, 1, 2), (3, 1, 3), (4, 2, 4), (5, 2, 5), (6, 3, 6), (7, 3, 7)],
  88. (4, 3, 10, 0, 3, 3): [(4, 3, 10), (3, 2, 9), (3, 2, 8), (2, 3, 7), (2, 3, 6), (1, 2, 5), (1, 2, 4), (0, 3, 3)],
  89. (3, 0, 0, 3, 3, 0) : [(3, 0, 0), (3, 1, 0), (3, 2, 0), (3, 3, 0)]
  90. },
  91. geometry.SQUARE: {
  92. (1, 1, 1, 1, 1, 1) : [(1, 1, 1)],
  93. (1, 1, 0, 1, 1, 1) : [(1, 1, 0), (1, 1, 1)],
  94. (0, 0, 0, 1, 1, 1) : [(0, 0, 0), (1, 1, 1)],
  95. (0, 0, 0, 7, 3, 7) : [(0, 0, 0), (1, 0, 1), (2, 1, 2), (3, 1, 3), (4, 2, 4), (5, 2, 5), (6, 3, 6), (7, 3, 7)],
  96. (4, 3, 10, 0, 3, 3): [(4, 3, 10), (3, 3, 9), (3, 3, 8), (2, 3, 7), (2, 3, 6), (1, 3, 5), (1, 3, 4), (0, 3, 3)],
  97. (3, 0, 0, 3, 3, 0) : [(3, 0, 0), (3, 1, 0), (3, 2, 0), (3, 3, 0)]
  98. }
  99. }
  100. for cell_shape, tests in attended.items():
  101. for args, result in tests.items():
  102. line = geometry.line3d(cell_shape, *args)
  103. self.assertEqual(line, result)
  104. def test_squ2_line(self):
  105. """ test for geometry.squ2_line """
  106. pass
  107. def test_fhex2_line(self):
  108. """ test for geometry.fhex2_line """
  109. pass
  110. # # Rectangles
  111. def test_rectangle(self):
  112. """ test for geometry.rectangle """
  113. self.assertRaises(TypeError, geometry.rectangle, "a", 1, 1, 1)
  114. self.assertRaises(TypeError, geometry.rectangle, 1, "a", 1, 1)
  115. self.assertRaises(TypeError, geometry.rectangle, 1, 1, "a", 1)
  116. self.assertRaises(TypeError, geometry.rectangle, 1, 1, 1, "a")
  117. self.assertEquals(geometry.rectangle(0, 0, 0, 0), [(0, 0)])
  118. self.assertCountEqual(geometry.rectangle(0, 0, 1, 1), [(0, 0), (0, 1), (1, 1), (1, 0)])
  119. self.assertCountEqual(geometry.rectangle(1, 1, 0, 0), [(0, 0), (0, 1), (1, 1), (1, 0)])
  120. self.assertCountEqual(geometry.rectangle(4, 3, 7, 5), [(4, 3), (4, 4), (4, 5), (5, 5), (6, 5), (7, 5), (7, 4), (7, 3), (6, 3), (5, 3), (6, 4), (5, 4)])
  121. self.assertCountEqual(geometry.rectangle(3, 3, 9, 9), [(3, 3), (9, 9), (9, 8), (9, 7), (9, 5), (9, 6), (9, 4), (9, 3), (8, 4), (7, 3), (6, 4), (4, 4),
  122. (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 9), (5, 9), (6, 9), (7, 9), (8, 9), (4, 5),
  123. (5, 4), (6, 5), (7, 4), (8, 5), (4, 6), (5, 5), (6, 6), (7, 5), (8, 6), (4, 7), (5, 6), (6, 7),
  124. (7, 6), (8, 7), (4, 8), (5, 7), (6, 8), (7, 7), (8, 8), (7, 8), (5, 8), (8, 3), (6, 3), (4, 3),
  125. (5, 3)])
  126. def test_hollow_rectangle(self):
  127. """ test for geometry.hollow_rectangle """
  128. self.assertRaises(TypeError, geometry.hollow_rectangle, "a", 1, 1, 1)
  129. self.assertRaises(TypeError, geometry.hollow_rectangle, 1, "a", 1, 1)
  130. self.assertRaises(TypeError, geometry.hollow_rectangle, 1, 1, "a", 1)
  131. self.assertRaises(TypeError, geometry.hollow_rectangle, 1, 1, 1, "a")
  132. self.assertEquals(geometry.hollow_rectangle(0, 0, 0, 0), [(0, 0)])
  133. self.assertCountEqual(geometry.hollow_rectangle(0, 0, 1, 1), [(0, 0), (0, 1), (1, 1), (1, 0)])
  134. self.assertCountEqual(geometry.hollow_rectangle(1, 1, 0, 0), [(0, 0), (0, 1), (1, 1), (1, 0)])
  135. self.assertCountEqual(geometry.hollow_rectangle(4, 3, 7, 5), [(4, 3), (4, 4), (4, 5), (5, 5), (6, 5), (7, 5), (7, 4), (7, 3), (6, 3), (5, 3)])
  136. self.assertCountEqual(geometry.hollow_rectangle(3, 3, 9, 9), [(3, 3), (9, 9), (9, 8), (9, 7), (9, 5), (9, 6), (9, 4), (9, 3), (7, 3), (3, 4),
  137. (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 9), (5, 9), (6, 9), (7, 9), (8, 9),
  138. (8, 3), (6, 3), (4, 3), (5, 3)])
  139. # # Triangles
  140. def test_triangle(self):
  141. """ test for geometry.triangle """
  142. for cell_shape in (geometry.FLAT_HEX, geometry.SQUARE):
  143. self.assertRaises(TypeError, geometry.triangle, cell_shape, "a", 1, 1, 1, 1)
  144. self.assertRaises(TypeError, geometry.triangle, cell_shape, 1, "a", 1, 1, 1)
  145. self.assertRaises(TypeError, geometry.triangle, cell_shape, 1, 1, "a", 1, 1)
  146. self.assertRaises(TypeError, geometry.triangle, cell_shape, 1, 1, 1, "a", 1)
  147. self.assertRaises(ValueError, geometry.triangle, cell_shape, 1, 1, 1, 1, -1)
  148. self.assertRaises(ValueError, geometry.triangle, 0, 1, 1, 1, 1, 1)
  149. for i in geometry.ANGLES:
  150. self.assertCountEqual(geometry.triangle(cell_shape, 0, 0, 0, 0, i), [(0, 0)])
  151. def test_triangle3d(self):
  152. """ test for geometry.triangle3d """
  153. for cell_shape in (geometry.FLAT_HEX, geometry.SQUARE):
  154. self.assertRaises(TypeError, geometry.triangle3d, cell_shape, "a", 1, 1, 1, 1, 1, 1)
  155. self.assertRaises(TypeError, geometry.triangle3d, cell_shape, 1, "a", 1, 1, 1, 1, 1)
  156. self.assertRaises(TypeError, geometry.triangle3d, cell_shape, 1, 1, "a", 1, 1, 1, 1)
  157. self.assertRaises(TypeError, geometry.triangle3d, cell_shape, 1, 1, 1, "a", 1, 1, 1)
  158. self.assertRaises(TypeError, geometry.triangle3d, cell_shape, 1, 1, 1, 1, "a", 1, 1)
  159. self.assertRaises(TypeError, geometry.triangle3d, cell_shape, 1, 1, 1, 1, 1, "a", 1)
  160. self.assertRaises(ValueError, geometry.triangle3d, cell_shape, 1, 1, 1, 1, 1, 1, -1)
  161. self.assertRaises(ValueError, geometry.triangle3d, 0, 1, 1, 1, 1, 1, 1, 1)
  162. def test_squ2_triangle(self):
  163. """ test for geometry.squ2_triangle """
  164. cell_shape = geometry.SQUARE
  165. # TODO: check and validate
  166. # # left to right
  167. # # TODO: complete
  168. #
  169. # # top to bottom
  170. # # TODO: complete
  171. #
  172. # # right to left
  173. # # TODO: complete
  174. #
  175. # # bottom to top
  176. # # TODO: complete
  177. #
  178. # # top left to bottom right
  179. # # TODO: complete
  180. #
  181. # # bottom right to top left
  182. # # TODO: complete
  183. #
  184. # # top right to bottom left
  185. # # TODO: complete
  186. #
  187. # # bottom right to top left
  188. # # TODO: complete
  189. def test_fhex2_triangle(self):
  190. """ test for geometry.fhex2_triangle """
  191. cell_shape = geometry.FLAT_HEX
  192. # left to right
  193. self.assertCountEqual(geometry.triangle(cell_shape, 2, 3, 4, 3, 1), [(3, 3), (3, 4), (3, 3), (4, 5), (4, 4), (4, 3), (4, 2), (4, 1), (4, 1), (3, 1), (3, 2), (2, 3)])
  194. self.assertCountEqual(geometry.triangle(cell_shape, 2, 3, 4, 3, 2), [(3, 3), (4, 4), (4, 3), (4, 2), (4, 2), (3, 2), (2, 3)])
  195. self.assertCountEqual(geometry.triangle(cell_shape, 2, 3, 4, 3, 3), [(3, 3), (4, 4), (4, 3), (4, 2), (4, 2), (3, 2), (2, 3)])
  196. # TODO: check and validate
  197. # # top to bottom
  198. # # TODO: complete
  199. # right to left
  200. self.assertCountEqual(geometry.triangle(cell_shape, 4, 3, 2, 3, 1), [(3, 2), (3, 1), (3, 2), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 5), (3, 4), (3, 3), (4, 3)])
  201. self.assertCountEqual(geometry.triangle(cell_shape, 4, 3, 2, 3, 2), [(3, 2), (2, 2), (2, 3), (2, 4), (2, 4), (3, 3), (4, 3)])
  202. self.assertCountEqual(geometry.triangle(cell_shape, 4, 3, 2, 3, 3), [(3, 2), (2, 2), (2, 3), (2, 4), (2, 4), (3, 3), (4, 3)])
  203. # # bottom to top
  204. # # TODO: complete
  205. # # top left to bottom right
  206. # # TODO: complete
  207. # # bottom right to top left
  208. # # TODO: complete
  209. # # top right to bottom left
  210. # # TODO: complete
  211. # # bottom right to top left
  212. # # TODO: complete
  213. def test_squ3_triangle(self):
  214. """ test for geometry.squ3_triangle """
  215. cell_shape = geometry.SQUARE
  216. # TODO: complete
  217. def test_fhex3_triangle(self):
  218. """ test for geometry.fhex3_triangle """
  219. cell_shape = geometry.FLAT_HEX
  220. # TODO: complete
  221. # # Translations, rotations
  222. def test_pivot(self):
  223. """ test for geometry.pivot """
  224. self.assertRaises(ValueError, geometry.pivot, 0, (0, 0), [(0, 0)], 1)
  225. self.assertRaises(TypeError, geometry.pivot, 0, "a" , [(0, 0)], 1)
  226. self.assertRaises(ValueError, geometry.pivot, 0, ("a", 0), [(0, 0)], 1)
  227. self.assertRaises(TypeError, geometry.pivot, 0, (0, 0), 0, 1)
  228. self.assertRaises(ValueError, geometry.pivot, 0, (0, 0), ["a", (0, 0)], 1)
  229. self.assertRaises(ValueError, geometry.pivot, 0, (0, 0), [("a", 0), (0, 0)], 1)
  230. self.assertRaises(TypeError, geometry.pivot, 0, (0, 0), 1, "a")
  231. def test_fhex2_pivot(self):
  232. """ test for geometry.fhex2_pivot """
  233. attended = [
  234. [(5, 5), (4, 5), (6, 6)],
  235. [(5, 6), (4, 7), (6, 6)],
  236. [(6, 7), (6, 8), (6, 6)],
  237. [(7, 6), (8, 7), (6, 6)],
  238. [(7, 5), (8, 5), (6, 6)],
  239. [(6, 5), (6, 4), (6, 6)],
  240. [(5, 5), (4, 5), (6, 6)]
  241. ]
  242. for i in range(len(attended)):
  243. self.assertCountEqual(geometry.pivot(geometry.FLAT_HEX, (6, 6), [(6, 6)], i), [(6, 6)])
  244. result = geometry.pivot(geometry.FLAT_HEX, (6, 6), [(5, 5), (4, 5), (6, 6)], i)
  245. self.assertCountEqual(result, attended[i])
  246. def test_squ2_pivot(self):
  247. """ test for geometry.squ2_pivot """
  248. attended = [
  249. [(6, 6), (6, 5), (5, 5), (5, 6)],
  250. [(6, 6), (5, 6), (5, 7), (6, 7)],
  251. [(6, 6), (6, 7), (7, 7), (7, 6)],
  252. [(6, 6), (7, 6), (7, 5), (6, 5)],
  253. [(6, 6), (6, 5), (5, 5), (5, 6)]
  254. ]
  255. for i in range(len(attended)):
  256. self.assertCountEqual(geometry.pivot(geometry.SQUARE, (6, 6), [(6, 6)], i), [(6, 6)])
  257. result = geometry.pivot(geometry.SQUARE, (6, 6), [(6, 6), (6, 5), (5, 5), (5, 6)], i)
  258. self.assertCountEqual(result, attended[i])
  259. # # cubic coordinates
  260. def test_cv_cube_off(self):
  261. """ test for geometry.cv_cube_off """
  262. pass
  263. def test_cv_off_cube(self):
  264. """ test for geometry.cv_off_cube """
  265. pass
  266. if __name__ == "__main__":
  267. unittest.main()