test_geometry.py 15 KB

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