test_geometry.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. '''
  2. Tests for 'geometry' module
  3. ** By Cro-Ki l@b, 2017 **
  4. '''
  5. from math import inf
  6. import unittest
  7. from pypog.geometry_objects import FHexGeometry, SquareGeometry, BaseGeometry, \
  8. BoundingRect, IBoundingRect
  9. class Test(unittest.TestCase):
  10. def setUp(self):
  11. SquareGeometry.set_no_diagonals(False)
  12. def test_bounding_rect(self):
  13. br = BoundingRect(0, 1, 10, 11)
  14. self.assertEqual(br.xmin, 0)
  15. self.assertEqual(br.ymin, 1)
  16. self.assertEqual(br.xmax, 10)
  17. self.assertEqual(br.ymax, 11)
  18. self.assertEqual(br.topleft, (0, 1))
  19. self.assertEqual(br.bottomright, (10, 11))
  20. self.assertEqual(br.width, 11)
  21. self.assertEqual(br.height, 11)
  22. self.assertTrue((5, 5) in br)
  23. self.assertFalse((15, 15) in br)
  24. ibr = IBoundingRect()
  25. self.assertTrue((5, 5) in ibr)
  26. self.assertTrue((15, 15) in ibr)
  27. self.assertTrue((10000, 10000) in ibr)
  28. self.assertEqual(ibr.xmin, -inf)
  29. self.assertEqual(ibr.ymin, -inf)
  30. self.assertEqual(ibr.xmax, inf)
  31. self.assertEqual(ibr.ymax, inf)
  32. self.assertEqual(ibr.topleft, (-inf, -inf))
  33. self.assertEqual(ibr.bottomright, (inf, inf))
  34. self.assertEqual(ibr.width, inf)
  35. self.assertEqual(ibr.height, inf)
  36. def test_various(self):
  37. self.assertEqual(str(BaseGeometry()), "<BaseGeometry object>")
  38. self.assertEqual(str(SquareGeometry()), "<SquareGeometry object>")
  39. self.assertEqual(str(FHexGeometry()), "<FHexGeometry object>")
  40. self.assertTrue(isinstance(BaseGeometry.instance(), BaseGeometry))
  41. self.assertRaises(NotImplementedError, BaseGeometry.graphicsitem, 0, 0, 120)
  42. self.assertRaises(NotImplementedError, BaseGeometry.neighbors, 0, 0)
  43. self.assertRaises(NotImplementedError, BaseGeometry.line, 0, 0, 0, 0)
  44. self.assertRaises(NotImplementedError, BaseGeometry.triangle, 0, 0, 0, 0, 1)
  45. self.assertRaises(NotImplementedError, BaseGeometry.triangle3d, 0, 0, 0, 0, 0, 0, 1)
  46. self.assertRaises(NotImplementedError, BaseGeometry.rotate, (0, 0), [(0, 0)], 1)
  47. # # neighbors
  48. def test_neighbors(self):
  49. """ test for geometry.neighbors """
  50. self.assertCountEqual(FHexGeometry.neighbors(3, 3), [(3, 2), (4, 3), (4, 4), (3, 4), (2, 4), (2, 3)])
  51. self.assertCountEqual(FHexGeometry.neighbors(4, 4), [(4, 3), (5, 3), (5, 4), (4, 5), (3, 4), (3, 3)])
  52. self.assertCountEqual(SquareGeometry.neighbors(3, 3), [(2, 3), (2, 2), (3, 2), (4, 2), (4, 3), (4, 4), (3, 4), (2, 4)])
  53. SquareGeometry.set_no_diagonals(True)
  54. self.assertCountEqual(SquareGeometry.neighbors(3, 3), [(2, 3), (3, 2), (4, 3), (3, 4)])
  55. def test_zone(self):
  56. """ test for geometry.zone """
  57. self.assertRaises(ValueError, BaseGeometry.zone, "a", 0, 1)
  58. self.assertRaises(ValueError, BaseGeometry.zone, 0, "a", 1)
  59. self.assertRaises(ValueError, BaseGeometry.zone, 0, 0, "a")
  60. self.assertRaises(ValueError, BaseGeometry.zone, 0, 0, -1)
  61. self.assertCountEqual(FHexGeometry.zone(3, 3, 0), [(3, 3)])
  62. self.assertCountEqual(FHexGeometry.zone(3, 3, 1), [(3, 2), (2, 3), (3, 3), (4, 3), (4, 4), (3, 4), (2, 4)])
  63. self.assertCountEqual(FHexGeometry.zone(3, 3, 2), [(3, 2), (1, 3), (5, 4), (4, 5), (1, 4), (2, 3), (4, 2), \
  64. (2, 5), (5, 3), (1, 2), (3, 5), (3, 3), (4, 4), (3, 1), \
  65. (4, 3), (2, 2), (3, 4), (2, 4), (5, 2)])
  66. self.assertCountEqual(SquareGeometry.zone(3, 3, 0), [(3, 3)])
  67. self.assertCountEqual(SquareGeometry.zone(3, 3, 1), [(3, 2), (3, 3), (4, 4), (2, 3), (4, 3), (2, 2), (4, 2), (3, 4), (2, 4)])
  68. self.assertCountEqual(SquareGeometry.zone(3, 3, 2), [(2, 4), (3, 2), (5, 4), (1, 3), (4, 5), (2, 1), (1, 4), (2, 3), (4, 2), \
  69. (5, 1), (2, 5), (3, 5), (5, 3), (1, 2), (3, 3), (5, 5), (4, 4), (3, 1), \
  70. (1, 5), (4, 3), (2, 2), (4, 1), (5, 2), (3, 4), (1, 1)])
  71. # # lines
  72. def test_line2d(self):
  73. """ test for geometry.line """
  74. for geometry in (SquareGeometry, FHexGeometry):
  75. self.assertRaises(ValueError, geometry.line, "a", 1, 1, 1)
  76. self.assertRaises(ValueError, geometry.line, 1, "a", 1, 1)
  77. self.assertRaises(ValueError, geometry.line, 1, 1, "a", 1)
  78. self.assertRaises(ValueError, geometry.line, 1, 1, 1, "a")
  79. attended = {
  80. FHexGeometry: {
  81. (1, 1, 1, 1): [(1, 1)],
  82. (0, 0, 1, 1): [(0, 0), (0, 1), (1, 1)],
  83. (1, 1, 0, 0): [(1, 1), (0, 1), (0, 0)],
  84. (0, 0, 7, 3): [(0, 0), (1, 0), (2, 1), (3, 1), (4, 2), (5, 2), (6, 3), (7, 3)],
  85. (7, 3, 0, 0): [(7, 3), (6, 3), (5, 2), (4, 2), (3, 1), (2, 1), (1, 0), (0, 0)],
  86. (4, 3, 0, 3): [(4, 3), (3, 2), (2, 3), (1, 2), (0, 3)],
  87. (0, 3, 4, 3): [(0, 3), (1, 2), (2, 3), (3, 2), (4, 3)],
  88. (3, 0, 3, 3): [(3, 0), (3, 1), (3, 2), (3, 3)],
  89. (3, 3, 3, 0): [(3, 3), (3, 2), (3, 1), (3, 0)]
  90. },
  91. SquareGeometry: {
  92. (1, 1, 1, 1): [(1, 1)],
  93. (0, 0, 0, 1): [(0, 0), (0, 1)],
  94. (0, 1, 0, 0): [(0, 1), (0, 0)],
  95. (0, 0, 1, 1): [(0, 0), (1, 1)],
  96. (1, 1, 0, 0): [(1, 1), (0, 0)],
  97. (0, 0, 7, 3): [(0, 0), (1, 0), (2, 1), (3, 1), (4, 2), (5, 2), (6, 3), (7, 3)],
  98. (7, 3, 0, 0): [(7, 3), (6, 3), (5, 2), (4, 2), (3, 1), (2, 1), (1, 0), (0, 0)],
  99. (4, 3, 0, 3): [(4, 3), (3, 3), (2, 3), (1, 3), (0, 3)],
  100. (0, 3, 4, 3): [(0, 3), (1, 3), (2, 3), (3, 3), (4, 3)],
  101. (3, 0, 3, 3): [(3, 0), (3, 1), (3, 2), (3, 3)],
  102. (3, 3, 3, 0): [(3, 3), (3, 2), (3, 1), (3, 0)]
  103. }
  104. }
  105. for geometry, tests in attended.items():
  106. for args, attended in tests.items():
  107. result = geometry.line(*args)
  108. self.assertCountEqual(result, attended)
  109. def test_line3d(self):
  110. """ test for geometry.line3d """
  111. for geometry in (SquareGeometry, FHexGeometry):
  112. self.assertRaises(ValueError, geometry.line3d, 1, 1, "a", 1, 1, 1)
  113. self.assertRaises(ValueError, geometry.line3d, 1, 1, 1, 1, 1, "a")
  114. attended = {
  115. FHexGeometry: {
  116. (1, 1, 1, 1, 1, 1) : [(1, 1, 1)],
  117. (1, 1, 0, 1, 1, 1) : [(1, 1, 0), (1, 1, 1)],
  118. (0, 0, 0, 1, 1, 1) : [(0, 0, 0), (0, 1, 0), (1, 1, 1)],
  119. (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)],
  120. (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)],
  121. (3, 0, 0, 3, 3, 0) : [(3, 0, 0), (3, 1, 0), (3, 2, 0), (3, 3, 0)]
  122. },
  123. SquareGeometry: {
  124. (1, 1, 1, 1, 1, 1) : [(1, 1, 1)],
  125. (1, 1, 0, 1, 1, 1) : [(1, 1, 0), (1, 1, 1)],
  126. (0, 0, 0, 1, 1, 1) : [(0, 0, 0), (1, 1, 1)],
  127. (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)],
  128. (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)],
  129. (3, 0, 0, 3, 3, 0) : [(3, 0, 0), (3, 1, 0), (3, 2, 0), (3, 3, 0)]
  130. }
  131. }
  132. for geometry, tests in attended.items():
  133. for args, result in tests.items():
  134. line = geometry.line3d(*args)
  135. self.assertEqual(line, result)
  136. # # Rectangles
  137. def test_rectangle(self):
  138. """ test for geometry.rectangle """
  139. self.assertRaises(ValueError, BaseGeometry.rectangle, "a", 1, 1, 1)
  140. self.assertRaises(ValueError, BaseGeometry.rectangle, 1, "a", 1, 1)
  141. self.assertRaises(ValueError, BaseGeometry.rectangle, 1, 1, "a", 1)
  142. self.assertRaises(ValueError, BaseGeometry.rectangle, 1, 1, 1, "a")
  143. self.assertEqual(BaseGeometry.rectangle(0, 0, 0, 0), [(0, 0)])
  144. self.assertCountEqual(BaseGeometry.rectangle(0, 0, 1, 1), [(0, 0), (0, 1), (1, 1), (1, 0)])
  145. self.assertCountEqual(BaseGeometry.rectangle(1, 1, 0, 0), [(0, 0), (0, 1), (1, 1), (1, 0)])
  146. self.assertCountEqual(BaseGeometry.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)])
  147. self.assertCountEqual(BaseGeometry.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),
  148. (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 9), (5, 9), (6, 9), (7, 9), (8, 9), (4, 5),
  149. (5, 4), (6, 5), (7, 4), (8, 5), (4, 6), (5, 5), (6, 6), (7, 5), (8, 6), (4, 7), (5, 6), (6, 7),
  150. (7, 6), (8, 7), (4, 8), (5, 7), (6, 8), (7, 7), (8, 8), (7, 8), (5, 8), (8, 3), (6, 3), (4, 3),
  151. (5, 3)])
  152. def test_hollow_rectangle(self):
  153. """ test for geometry.hollow_rectangle """
  154. self.assertRaises(ValueError, BaseGeometry.hollow_rectangle, "a", 1, 1, 1)
  155. self.assertRaises(ValueError, BaseGeometry.hollow_rectangle, 1, "a", 1, 1)
  156. self.assertRaises(ValueError, BaseGeometry.hollow_rectangle, 1, 1, "a", 1)
  157. self.assertRaises(ValueError, BaseGeometry.hollow_rectangle, 1, 1, 1, "a")
  158. self.assertEqual(BaseGeometry.hollow_rectangle(0, 0, 0, 0), [(0, 0)])
  159. self.assertCountEqual(BaseGeometry.hollow_rectangle(0, 0, 1, 1), [(0, 0), (0, 1), (1, 1), (1, 0)])
  160. self.assertCountEqual(BaseGeometry.hollow_rectangle(1, 1, 0, 0), [(0, 0), (0, 1), (1, 1), (1, 0)])
  161. self.assertCountEqual(BaseGeometry.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)])
  162. self.assertCountEqual(BaseGeometry.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),
  163. (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 9), (5, 9), (6, 9), (7, 9), (8, 9),
  164. (8, 3), (6, 3), (4, 3), (5, 3)])
  165. # # Triangles
  166. def test_triangle(self):
  167. """ test for geometry.triangle """
  168. for geometry in (SquareGeometry, FHexGeometry):
  169. self.assertRaises(ValueError, geometry.triangle, "a", 1, 1, 1, 1)
  170. self.assertRaises(ValueError, geometry.triangle, 1, "a", 1, 1, 1)
  171. self.assertRaises(ValueError, geometry.triangle, 1, 1, "a", 1, 1)
  172. self.assertRaises(ValueError, geometry.triangle, 1, 1, 1, "a", 1)
  173. self.assertRaises(ValueError, geometry.triangle, 1, 1, 1, 1, -1)
  174. for i in geometry.ANGLES:
  175. self.assertCountEqual(geometry.triangle(0, 0, 0, 0, i), [(0, 0)])
  176. def test_triangle3d(self):
  177. """ test for geometry.triangle3d """
  178. for geometry in (SquareGeometry, FHexGeometry):
  179. self.assertRaises(ValueError, geometry.triangle3d, "a", 1, 1, 1, 1, 1, 1)
  180. self.assertRaises(ValueError, geometry.triangle3d, 1, "a", 1, 1, 1, 1, 1)
  181. self.assertRaises(ValueError, geometry.triangle3d, 1, 1, "a", 1, 1, 1, 1)
  182. self.assertRaises(ValueError, geometry.triangle3d, 1, 1, 1, "a", 1, 1, 1)
  183. self.assertRaises(ValueError, geometry.triangle3d, 1, 1, 1, 1, "a", 1, 1)
  184. self.assertRaises(ValueError, geometry.triangle3d, 1, 1, 1, 1, 1, "a", 1)
  185. self.assertRaises(ValueError, geometry.triangle3d, 1, 1, 1, 1, 1, 1, -1)
  186. # ## flat hex
  187. # left to right
  188. self.assertCountEqual(FHexGeometry.triangle(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)])
  189. self.assertCountEqual(FHexGeometry.triangle(2, 3, 4, 3, 2), [(3, 3), (4, 4), (4, 3), (4, 2), (4, 2), (3, 2), (2, 3)])
  190. self.assertCountEqual(FHexGeometry.triangle(2, 3, 4, 3, 3), [(3, 3), (4, 4), (4, 3), (4, 2), (4, 2), (3, 2), (2, 3)])
  191. # right to left
  192. self.assertCountEqual(FHexGeometry.triangle(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)])
  193. self.assertCountEqual(FHexGeometry.triangle(4, 3, 2, 3, 2), [(3, 2), (2, 2), (2, 3), (2, 4), (2, 4), (3, 3), (4, 3)])
  194. self.assertCountEqual(FHexGeometry.triangle(4, 3, 2, 3, 3), [(3, 2), (2, 2), (2, 3), (2, 4), (2, 4), (3, 3), (4, 3)])
  195. # # Translations, rotations
  196. def test_rotate(self):
  197. """ test for geometry.rotate """
  198. for geometry in (SquareGeometry, FHexGeometry):
  199. self.assertRaises(ValueError, geometry.rotate, 0, (0, 0), [(0, 0)], 1)
  200. self.assertRaises(ValueError, geometry.rotate, 0, "a", [(0, 0)], 1)
  201. self.assertRaises(ValueError, geometry.rotate, 0, ("a", 0), [(0, 0)], 1)
  202. self.assertRaises(ValueError, geometry.rotate, 0, (0, 0), 0, 1)
  203. self.assertRaises(ValueError, geometry.rotate, 0, (0, 0), ["a", (0, 0)], 1)
  204. self.assertRaises(ValueError, geometry.rotate, 0, (0, 0), [("a", 0), (0, 0)], 1)
  205. self.assertRaises(ValueError, geometry.rotate, 0, (0, 0), 1, "a")
  206. # ## Flat hex
  207. attended = [
  208. [(5, 5), (4, 5), (6, 6)],
  209. [(5, 6), (4, 7), (6, 6)],
  210. [(6, 7), (6, 8), (6, 6)],
  211. [(7, 6), (8, 7), (6, 6)],
  212. [(7, 5), (8, 5), (6, 6)],
  213. [(6, 5), (6, 4), (6, 6)],
  214. [(5, 5), (4, 5), (6, 6)]
  215. ]
  216. for i in range(len(attended)):
  217. self.assertCountEqual(FHexGeometry.rotate((6, 6), [(6, 6)], i), [(6, 6)])
  218. result = FHexGeometry.rotate((6, 6), [(5, 5), (4, 5), (6, 6)], i)
  219. self.assertCountEqual(result, attended[i])
  220. # ## Square
  221. attended = [
  222. [(6, 6), (6, 5), (5, 5), (5, 6)],
  223. [(6, 6), (5, 6), (5, 7), (6, 7)],
  224. [(6, 6), (6, 7), (7, 7), (7, 6)],
  225. [(6, 6), (7, 6), (7, 5), (6, 5)],
  226. [(6, 6), (6, 5), (5, 5), (5, 6)]
  227. ]
  228. for i in range(len(attended)):
  229. self.assertCountEqual(SquareGeometry.rotate((6, 6), [(6, 6)], i), [(6, 6)])
  230. result = SquareGeometry.rotate((6, 6), [(6, 6), (6, 5), (5, 5), (5, 6)], i)
  231. self.assertCountEqual(result, attended[i])
  232. if __name__ == "__main__":
  233. unittest.main()