/tests/src/python/test_qgsgraph.py

https://github.com/ricardogsilva/Quantum-GIS · Python · 335 lines · 259 code · 58 blank · 18 comment · 52 complexity · 3b72ffc995a3356a547ba09dbd9b774a MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. """QGIS Unit tests for QgsGraph.
  3. .. note:: This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. """
  8. __author__ = 'Nyall Dawson'
  9. __date__ = '08/11/2021'
  10. __copyright__ = 'Copyright 2021, The QGIS Project'
  11. import qgis # NOQA
  12. from qgis.analysis import (
  13. QgsGraph
  14. )
  15. from qgis.core import (
  16. QgsPointXY
  17. )
  18. from qgis.testing import start_app, unittest
  19. start_app()
  20. class TestQgsGraph(unittest.TestCase):
  21. def test_empty_graph(self):
  22. graph = QgsGraph()
  23. self.assertEqual(graph.vertexCount(), 0)
  24. self.assertEqual(graph.edgeCount(), 0)
  25. def test_graph_vertices(self):
  26. graph = QgsGraph()
  27. self.assertEqual(graph.findVertex(QgsPointXY(10, 11)), -1)
  28. with self.assertRaises(IndexError):
  29. graph.vertex(-1)
  30. with self.assertRaises(IndexError):
  31. graph.vertex(0)
  32. vertex_1 = graph.addVertex(QgsPointXY(1, 2))
  33. self.assertEqual(graph.vertexCount(), 1)
  34. self.assertEqual(graph.vertex(vertex_1).point(), QgsPointXY(1, 2))
  35. self.assertFalse(graph.vertex(vertex_1).incomingEdges())
  36. self.assertFalse(graph.vertex(vertex_1).outgoingEdges())
  37. self.assertEqual(graph.findVertex(QgsPointXY(10, 11)), -1)
  38. self.assertEqual(graph.findVertex(QgsPointXY(1, 2)), vertex_1)
  39. with self.assertRaises(IndexError):
  40. graph.vertex(-1)
  41. with self.assertRaises(IndexError):
  42. graph.vertex(2)
  43. vertex_2 = graph.addVertex(QgsPointXY(3, 4))
  44. self.assertEqual(graph.vertexCount(), 2)
  45. self.assertEqual(graph.vertex(vertex_1).point(), QgsPointXY(1, 2))
  46. self.assertFalse(graph.vertex(vertex_1).incomingEdges())
  47. self.assertFalse(graph.vertex(vertex_1).outgoingEdges())
  48. self.assertEqual(graph.vertex(vertex_2).point(), QgsPointXY(3, 4))
  49. self.assertFalse(graph.vertex(vertex_2).incomingEdges())
  50. self.assertFalse(graph.vertex(vertex_2).outgoingEdges())
  51. with self.assertRaises(IndexError):
  52. graph.vertex(-1)
  53. with self.assertRaises(IndexError):
  54. graph.vertex(3)
  55. self.assertEqual(graph.findVertex(QgsPointXY(10, 11)), -1)
  56. self.assertEqual(graph.findVertex(QgsPointXY(1, 2)), vertex_1)
  57. self.assertEqual(graph.findVertex(QgsPointXY(3, 4)), vertex_2)
  58. def test_graph_edges(self):
  59. graph = QgsGraph()
  60. with self.assertRaises(IndexError):
  61. graph.edge(0)
  62. vertex_1 = graph.addVertex(QgsPointXY(1, 2))
  63. vertex_2 = graph.addVertex(QgsPointXY(3, 4))
  64. vertex_3 = graph.addVertex(QgsPointXY(5, 6))
  65. edge_1 = graph.addEdge(vertex_1, vertex_2, [1, 2])
  66. self.assertEqual(graph.edgeCount(), 1)
  67. self.assertEqual(graph.edge(edge_1).cost(0), 1)
  68. self.assertEqual(graph.edge(edge_1).cost(1), 2)
  69. self.assertEqual(graph.edge(edge_1).strategies(), [1, 2])
  70. self.assertEqual(graph.edge(edge_1).fromVertex(), vertex_1)
  71. self.assertEqual(graph.edge(edge_1).toVertex(), vertex_2)
  72. with self.assertRaises(IndexError):
  73. graph.edge(-1)
  74. with self.assertRaises(IndexError):
  75. graph.edge(1)
  76. edge_2 = graph.addEdge(vertex_2, vertex_1, [1, 2])
  77. self.assertEqual(graph.edgeCount(), 2)
  78. self.assertEqual(graph.edge(edge_1).fromVertex(), vertex_1)
  79. self.assertEqual(graph.edge(edge_1).toVertex(), vertex_2)
  80. self.assertEqual(graph.edge(edge_2).cost(0), 1)
  81. self.assertEqual(graph.edge(edge_2).cost(1), 2)
  82. self.assertEqual(graph.edge(edge_2).strategies(), [1, 2])
  83. self.assertEqual(graph.edge(edge_2).fromVertex(), vertex_2)
  84. self.assertEqual(graph.edge(edge_2).toVertex(), vertex_1)
  85. with self.assertRaises(IndexError):
  86. graph.edge(2)
  87. edge_3 = graph.addEdge(vertex_3, vertex_1, [11, 12])
  88. self.assertEqual(graph.edgeCount(), 3)
  89. self.assertEqual(graph.edge(edge_1).fromVertex(), vertex_1)
  90. self.assertEqual(graph.edge(edge_1).toVertex(), vertex_2)
  91. self.assertEqual(graph.edge(edge_2).fromVertex(), vertex_2)
  92. self.assertEqual(graph.edge(edge_2).toVertex(), vertex_1)
  93. self.assertEqual(graph.edge(edge_3).cost(0), 11)
  94. self.assertEqual(graph.edge(edge_3).cost(1), 12)
  95. self.assertEqual(graph.edge(edge_3).strategies(), [11, 12])
  96. self.assertEqual(graph.edge(edge_3).fromVertex(), vertex_3)
  97. self.assertEqual(graph.edge(edge_3).toVertex(), vertex_1)
  98. with self.assertRaises(IndexError):
  99. graph.edge(3)
  100. def test_remove_vertex(self):
  101. graph = QgsGraph()
  102. with self.assertRaises(IndexError):
  103. graph.removeVertex(0)
  104. with self.assertRaises(IndexError):
  105. graph.removeVertex(-1)
  106. v1 = graph.addVertex(QgsPointXY(1, 1))
  107. v2 = graph.addVertex(QgsPointXY(2, 2))
  108. v3 = graph.addVertex(QgsPointXY(3, 3))
  109. v4 = graph.addVertex(QgsPointXY(4, 4))
  110. edge_1 = graph.addEdge(v1, v2, [1])
  111. edge_2 = graph.addEdge(v2, v1, [1])
  112. edge_3 = graph.addEdge(v2, v3, [1])
  113. edge_4 = graph.addEdge(v2, v4, [1])
  114. edge_5 = graph.addEdge(v3, v4, [1])
  115. self.assertEqual(graph.vertexCount(), 4)
  116. self.assertEqual(graph.edgeCount(), 5)
  117. with self.assertRaises(IndexError):
  118. graph.removeVertex(5)
  119. # remove a vertex
  120. graph.removeVertex(v3)
  121. self.assertEqual(graph.vertexCount(), 3)
  122. with self.assertRaises(IndexError):
  123. graph.vertex(v3)
  124. self.assertEqual(graph.edgeCount(), 3)
  125. self.assertEqual(graph.edge(edge_1).fromVertex(), v1)
  126. self.assertEqual(graph.edge(edge_2).fromVertex(), v2)
  127. self.assertEqual(graph.edge(edge_4).fromVertex(), v2)
  128. # edges 3 and 5 must be removed
  129. with self.assertRaises(IndexError):
  130. graph.edge(edge_3)
  131. with self.assertRaises(IndexError):
  132. graph.edge(edge_5)
  133. with self.assertRaises(IndexError):
  134. graph.removeVertex(v3)
  135. # remove another vertex
  136. graph.removeVertex(v1)
  137. self.assertEqual(graph.vertexCount(), 2)
  138. with self.assertRaises(IndexError):
  139. graph.vertex(v1)
  140. self.assertEqual(graph.edgeCount(), 1)
  141. self.assertEqual(graph.edge(edge_4).fromVertex(), v2)
  142. with self.assertRaises(IndexError):
  143. graph.edge(edge_1)
  144. with self.assertRaises(IndexError):
  145. graph.edge(edge_2)
  146. with self.assertRaises(IndexError):
  147. graph.edge(edge_3)
  148. with self.assertRaises(IndexError):
  149. graph.edge(edge_5)
  150. with self.assertRaises(IndexError):
  151. graph.removeVertex(v1)
  152. # remove another vertex
  153. graph.removeVertex(v4)
  154. self.assertEqual(graph.vertexCount(), 1)
  155. with self.assertRaises(IndexError):
  156. graph.vertex(v4)
  157. self.assertEqual(graph.edgeCount(), 0)
  158. with self.assertRaises(IndexError):
  159. graph.edge(edge_1)
  160. with self.assertRaises(IndexError):
  161. graph.edge(edge_2)
  162. with self.assertRaises(IndexError):
  163. graph.edge(edge_3)
  164. with self.assertRaises(IndexError):
  165. graph.edge(edge_4)
  166. with self.assertRaises(IndexError):
  167. graph.edge(edge_5)
  168. with self.assertRaises(IndexError):
  169. graph.removeVertex(v4)
  170. # remove last vertex
  171. graph.removeVertex(v2)
  172. self.assertEqual(graph.vertexCount(), 0)
  173. self.assertEqual(graph.edgeCount(), 0)
  174. with self.assertRaises(IndexError):
  175. graph.vertex(v2)
  176. with self.assertRaises(IndexError):
  177. graph.removeVertex(v2)
  178. def test_remove_edge(self):
  179. graph = QgsGraph()
  180. with self.assertRaises(IndexError):
  181. graph.removeEdge(0)
  182. with self.assertRaises(IndexError):
  183. graph.removeEdge(-1)
  184. v1 = graph.addVertex(QgsPointXY(1, 1))
  185. v2 = graph.addVertex(QgsPointXY(2, 2))
  186. v3 = graph.addVertex(QgsPointXY(3, 3))
  187. v4 = graph.addVertex(QgsPointXY(4, 4))
  188. edge_1 = graph.addEdge(v1, v2, [1])
  189. edge_2 = graph.addEdge(v2, v1, [1])
  190. edge_3 = graph.addEdge(v2, v3, [1])
  191. edge_4 = graph.addEdge(v2, v4, [1])
  192. edge_5 = graph.addEdge(v3, v4, [1])
  193. self.assertEqual(graph.vertexCount(), 4)
  194. self.assertEqual(graph.edgeCount(), 5)
  195. graph.removeEdge(edge_1)
  196. self.assertEqual(graph.vertexCount(), 4)
  197. self.assertEqual(graph.edgeCount(), 4)
  198. with self.assertRaises(IndexError):
  199. graph.edge(edge_1)
  200. # make sure vertices are updated accordingly
  201. self.assertEqual(graph.vertex(v1).incomingEdges(), [edge_2])
  202. self.assertFalse(graph.vertex(v1).outgoingEdges())
  203. self.assertFalse(graph.vertex(v2).incomingEdges())
  204. self.assertCountEqual(graph.vertex(v2).outgoingEdges(), [edge_2, edge_3, edge_4])
  205. with self.assertRaises(IndexError):
  206. graph.removeEdge(edge_1)
  207. # remove another edge
  208. graph.removeEdge(edge_2)
  209. self.assertEqual(graph.vertexCount(), 3)
  210. self.assertEqual(graph.edgeCount(), 3)
  211. with self.assertRaises(IndexError):
  212. graph.edge(edge_2)
  213. # make sure vertices are updated accordingly
  214. # vertex 1 should be removed -- no incoming or outgoing edges remain
  215. with self.assertRaises(IndexError):
  216. graph.vertex(v1)
  217. self.assertFalse(graph.vertex(v2).incomingEdges())
  218. self.assertCountEqual(graph.vertex(v2).outgoingEdges(), [edge_3, edge_4])
  219. with self.assertRaises(IndexError):
  220. graph.removeEdge(edge_2)
  221. graph.removeEdge(edge_4)
  222. self.assertEqual(graph.vertexCount(), 3)
  223. self.assertEqual(graph.edgeCount(), 2)
  224. with self.assertRaises(IndexError):
  225. graph.edge(edge_4)
  226. self.assertFalse(graph.vertex(v2).incomingEdges())
  227. self.assertEqual(graph.vertex(v2).outgoingEdges(), [edge_3])
  228. self.assertEqual(graph.vertex(v4).incomingEdges(), [edge_5])
  229. self.assertFalse(graph.vertex(v4).outgoingEdges())
  230. with self.assertRaises(IndexError):
  231. graph.removeEdge(edge_4)
  232. graph.removeEdge(edge_3)
  233. self.assertEqual(graph.vertexCount(), 2)
  234. self.assertEqual(graph.edgeCount(), 1)
  235. with self.assertRaises(IndexError):
  236. graph.edge(edge_3)
  237. # v2 should be removed
  238. with self.assertRaises(IndexError):
  239. graph.vertex(v2)
  240. self.assertFalse(graph.vertex(v3).incomingEdges())
  241. self.assertEqual(graph.vertex(v3).outgoingEdges(), [edge_5])
  242. with self.assertRaises(IndexError):
  243. graph.removeEdge(edge_3)
  244. graph.removeEdge(edge_5)
  245. self.assertEqual(graph.vertexCount(), 0)
  246. self.assertEqual(graph.edgeCount(), 0)
  247. with self.assertRaises(IndexError):
  248. graph.edge(edge_5)
  249. with self.assertRaises(IndexError):
  250. graph.vertex(v3)
  251. with self.assertRaises(IndexError):
  252. graph.vertex(v4)
  253. with self.assertRaises(IndexError):
  254. graph.removeEdge(edge_5)
  255. def test_find_opposite_edge(self):
  256. graph = QgsGraph()
  257. with self.assertRaises(IndexError):
  258. graph.findOppositeEdge(0)
  259. with self.assertRaises(IndexError):
  260. graph.findOppositeEdge(-1)
  261. v1 = graph.addVertex(QgsPointXY(1, 1))
  262. v2 = graph.addVertex(QgsPointXY(2, 2))
  263. v3 = graph.addVertex(QgsPointXY(3, 3))
  264. v4 = graph.addVertex(QgsPointXY(4, 4))
  265. edge_1 = graph.addEdge(v1, v2, [1])
  266. edge_2 = graph.addEdge(v2, v1, [1])
  267. edge_3 = graph.addEdge(v2, v3, [1])
  268. edge_4 = graph.addEdge(v2, v4, [1])
  269. edge_5 = graph.addEdge(v3, v4, [1])
  270. self.assertEqual(graph.findOppositeEdge(edge_1), edge_2)
  271. self.assertEqual(graph.findOppositeEdge(edge_2), edge_1)
  272. self.assertEqual(graph.findOppositeEdge(edge_3), -1)
  273. self.assertEqual(graph.findOppositeEdge(edge_4), -1)
  274. self.assertEqual(graph.findOppositeEdge(edge_5), -1)
  275. if __name__ == '__main__':
  276. unittest.main()