test_assertions_vect.py 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. """
  2. Tests assertion methods for vectors.
  3. """
  4. from grass.exceptions import CalledModuleError
  5. from grass.gunittest.case import TestCase
  6. from grass.gunittest.main import test
  7. V_UNIVAR_SCHOOLS_WIDTH_SUBSET = """n=144
  8. nmissing=0
  9. nnull=23
  10. min=0
  11. max=2294
  12. range=2294
  13. sum=109978
  14. mean=763.736
  15. mean_abs=763.736
  16. """
  17. RANDOM_KEYVALUES = """abc=2025000
  18. aaa=55.5787925720215
  19. bbb=156.329864501953
  20. """
  21. # v.info schools -t
  22. V_UNIVAR_SCHOOLS_TOPO = dict(
  23. nodes=0,
  24. points=167,
  25. lines=0,
  26. boundaries=0,
  27. centroids=0,
  28. areas=0,
  29. islands=0,
  30. primitives=167,
  31. map3d=0,
  32. )
  33. # v.info schools -g and rounded
  34. V_UNIVAR_SCHOOLS_REGION = dict(
  35. north=248160,
  36. south=203560,
  37. east=671715,
  38. west=619215,
  39. top=0,
  40. bottom=0,
  41. )
  42. # v.info schools -g and reduced to minimum
  43. V_UNIVAR_SCHOOLS_EXTENDED = dict(
  44. name="schools",
  45. level=2,
  46. num_dblinks=1,
  47. )
  48. class TestVectorInfoAssertions(TestCase):
  49. """Test assertions of map meta and statistics"""
  50. # pylint: disable=R0904
  51. def test_assertVectorFitsUnivar(self):
  52. self.assertVectorFitsUnivar(
  53. map="schools",
  54. column="CORECAPACI",
  55. reference=V_UNIVAR_SCHOOLS_WIDTH_SUBSET,
  56. precision=0.01,
  57. )
  58. self.assertRaises(
  59. self.failureException,
  60. self.assertVectorFitsUnivar,
  61. map="schools",
  62. column="MOBILECAPA",
  63. reference=V_UNIVAR_SCHOOLS_WIDTH_SUBSET,
  64. precision=0.01,
  65. )
  66. self.assertRaises(
  67. ValueError,
  68. self.assertVectorFitsUnivar,
  69. map="schools",
  70. column="CORECAPACI",
  71. reference=RANDOM_KEYVALUES,
  72. )
  73. def test_assertVectorFitsTopoInfo(self):
  74. self.assertVectorFitsTopoInfo("schools", V_UNIVAR_SCHOOLS_TOPO)
  75. self.assertRaises(
  76. self.failureException,
  77. self.assertVectorFitsTopoInfo,
  78. "hospitals",
  79. V_UNIVAR_SCHOOLS_TOPO,
  80. )
  81. self.assertRaises(
  82. ValueError, self.assertVectorFitsTopoInfo, "schools", RANDOM_KEYVALUES
  83. )
  84. self.assertRaises(
  85. ValueError,
  86. self.assertVectorFitsTopoInfo,
  87. "schools",
  88. V_UNIVAR_SCHOOLS_REGION,
  89. )
  90. def test_assertVectorFitsRegionInfo(self):
  91. self.assertVectorFitsRegionInfo(
  92. "schools", V_UNIVAR_SCHOOLS_REGION, precision=1.0
  93. )
  94. self.assertRaises(
  95. self.failureException,
  96. self.assertVectorFitsRegionInfo,
  97. "hospitals",
  98. V_UNIVAR_SCHOOLS_REGION,
  99. precision=1.0,
  100. )
  101. self.assertRaises(
  102. ValueError,
  103. self.assertVectorFitsRegionInfo,
  104. "schools",
  105. RANDOM_KEYVALUES,
  106. precision=1.0,
  107. )
  108. self.assertRaises(
  109. ValueError,
  110. self.assertVectorFitsRegionInfo,
  111. "schools",
  112. V_UNIVAR_SCHOOLS_TOPO,
  113. precision=1.0,
  114. )
  115. def test_assertVectorFitsExtendedInfo(self):
  116. self.assertVectorFitsExtendedInfo("schools", V_UNIVAR_SCHOOLS_EXTENDED)
  117. self.assertRaises(
  118. self.failureException,
  119. self.assertVectorFitsExtendedInfo,
  120. "hospitals",
  121. V_UNIVAR_SCHOOLS_EXTENDED,
  122. )
  123. self.assertRaises(
  124. ValueError, self.assertVectorFitsExtendedInfo, "schools", RANDOM_KEYVALUES
  125. )
  126. self.assertRaises(
  127. ValueError,
  128. self.assertVectorFitsExtendedInfo,
  129. "schools",
  130. V_UNIVAR_SCHOOLS_TOPO,
  131. )
  132. def test_assertVectorInfoEqualsVectorInfo(self):
  133. self.assertVectorInfoEqualsVectorInfo(
  134. "schools", "schools", precision=0.00000001
  135. )
  136. self.assertRaises(
  137. self.failureException,
  138. self.assertVectorInfoEqualsVectorInfo,
  139. "hospitals",
  140. "schools",
  141. precision=0.00000001,
  142. )
  143. self.assertRaises(
  144. CalledModuleError,
  145. self.assertVectorInfoEqualsVectorInfo,
  146. "schools",
  147. "does_not_exist",
  148. precision=0.00000001,
  149. )
  150. class TestVectorGeometryAssertions(TestCase):
  151. """Test assertions of map geometry"""
  152. # pylint: disable=R0904
  153. maps_to_remove = []
  154. simple_base_file = "data/simple_vector_map_ascii_4p_2l_2c_3b_dp14.txt"
  155. simple_modified_file = "data/simple_vector_map_ascii_4p_2l_2c_3b_dp14_modified.txt"
  156. simple_diff_header_file = (
  157. "data/simple_vector_map_ascii_4p_2l_2c_3b_dp14_diff_header.txt"
  158. )
  159. precision = 0.00001
  160. digits = 14
  161. @classmethod
  162. def tearDownClass(cls):
  163. # TODO: this should be decided globaly by cleanup variable
  164. # perhaps cls.gremove() wheoul be the right option
  165. # when invoking separately, no need to delete maps since mapset
  166. # is deleted
  167. if cls.maps_to_remove:
  168. cls.runModule(
  169. "g.remove", flags="f", type="vector", name=",".join(cls.maps_to_remove)
  170. )
  171. def test_assertVectorEqualsVector_basic(self):
  172. """Check completely different maps."""
  173. self.assertVectorEqualsVector(
  174. actual="schools", reference="schools", precision=0.01, digits=15
  175. )
  176. self.assertRaises(
  177. self.failureException,
  178. self.assertVectorEqualsVector,
  179. actual="schools",
  180. reference="hospitals",
  181. precision=0.01,
  182. digits=7,
  183. )
  184. self.assertRaises(
  185. CalledModuleError,
  186. self.assertVectorEqualsVector,
  187. actual="does_not_exist",
  188. reference="hospitals",
  189. precision=0.01,
  190. digits=7,
  191. )
  192. def test_assertVectorEqualsVector_geometry_same_header(self):
  193. """Check small slighlty different maps with same header in ASCII."""
  194. amap = "simple_vector_map_base_geom"
  195. bmap = "simple_vector_map_modified_geom"
  196. self.runModule(
  197. "v.in.ascii", format="standard", input=self.simple_base_file, output=amap
  198. )
  199. self.maps_to_remove.append(amap)
  200. self.runModule(
  201. "v.in.ascii",
  202. format="standard",
  203. input=self.simple_modified_file,
  204. output=bmap,
  205. )
  206. self.maps_to_remove.append(bmap)
  207. self.assertVectorEqualsVector(
  208. actual=amap, reference=amap, precision=self.precision, digits=self.digits
  209. )
  210. self.assertRaises(
  211. self.failureException,
  212. self.assertVectorEqualsVector,
  213. actual=amap,
  214. reference=bmap,
  215. precision=self.precision,
  216. digits=self.digits,
  217. )
  218. def test_assertVectorEqualsVector_geometry(self):
  219. """Check small slighlty different maps with different headers in ASCII."""
  220. amap = "simple_vector_map_base"
  221. bmap = "simple_vector_map_different_header"
  222. self.runModule(
  223. "v.in.ascii", format="standard", input=self.simple_base_file, output=amap
  224. )
  225. self.maps_to_remove.append(amap)
  226. self.runModule(
  227. "v.in.ascii",
  228. format="standard",
  229. input=self.simple_diff_header_file,
  230. output=bmap,
  231. )
  232. self.maps_to_remove.append(bmap)
  233. self.assertVectorEqualsVector(
  234. actual=amap, reference=bmap, precision=self.precision, digits=self.digits
  235. )
  236. def test_assertVectorAsciiEqualsVectorAscii_diff_header(self):
  237. """Test ASCII files with different header.
  238. Prove that files were not deleted if not requested.
  239. """
  240. self.assertVectorAsciiEqualsVectorAscii(
  241. actual=self.simple_base_file, reference=self.simple_diff_header_file
  242. )
  243. self.assertFileExists(self.simple_base_file)
  244. self.assertFileExists(self.simple_diff_header_file)
  245. def test_assertVectorAsciiEqualsVectorAscii_diff_content(self):
  246. """Test ASCII files with slighlty different content.
  247. Prove that files were not deleted if not requested.
  248. """
  249. self.assertRaises(
  250. self.failureException,
  251. self.assertVectorAsciiEqualsVectorAscii,
  252. actual=self.simple_base_file,
  253. reference=self.simple_modified_file,
  254. )
  255. self.assertFileExists(self.simple_base_file)
  256. self.assertFileExists(self.simple_modified_file)
  257. def test_assertVectorEqualsAscii_by_import(self):
  258. amap = "simple_vector_map_imported_base"
  259. self.runModule(
  260. "v.in.ascii", format="standard", input=self.simple_base_file, output=amap
  261. )
  262. self.maps_to_remove.append(amap)
  263. self.assertVectorEqualsAscii(
  264. amap,
  265. self.simple_diff_header_file,
  266. precision=self.precision,
  267. digits=self.digits,
  268. )
  269. self.assertRaises(
  270. self.failureException,
  271. self.assertVectorEqualsAscii,
  272. amap,
  273. self.simple_modified_file,
  274. precision=self.precision,
  275. digits=self.digits,
  276. )
  277. self.assertFileExists(self.simple_base_file)
  278. self.assertFileExists(self.simple_modified_file)
  279. self.assertFileExists(self.simple_diff_header_file)
  280. if __name__ == "__main__":
  281. test()