test_geometry.py 19 KB

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