test_assertions_vect.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. # -*- coding: utf-8 -*-
  2. """
  3. Tests assertion methods for vectors.
  4. """
  5. from grass.exceptions import CalledModuleError
  6. from grass.gunittest.case import TestCase
  7. from grass.gunittest.main import test
  8. V_UNIVAR_BRIDGES_WIDTH_SUBSET = """n=10938
  9. nmissing=0
  10. nnull=0
  11. min=0
  12. max=1451
  13. range=1451
  14. sum=2.6299e+06
  15. mean=240.437
  16. """
  17. RANDOM_KEYVALUES = """abc=2025000
  18. aaa=55.5787925720215
  19. bbb=156.329864501953
  20. """
  21. # v.info bridges -t
  22. V_UNIVAR_BRIDGES_TOPO = dict(
  23. nodes=0,
  24. points=10938,
  25. lines=0,
  26. boundaries=0,
  27. centroids=0,
  28. areas=0,
  29. islands=0,
  30. primitives=10938,
  31. map3d=0,
  32. )
  33. # v.info bridges -g and rounded
  34. V_UNIVAR_BRIDGES_REGION = dict(
  35. north=317757,
  36. south=14691,
  37. east=915045,
  38. west=125794,
  39. top=0,
  40. bottom=0,
  41. )
  42. # v.info bridges -g and reduced to minumum
  43. V_UNIVAR_BRIDGES_EXTENDED = dict(
  44. name='bridges',
  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(map='bridges', column='WIDTH',
  53. reference=V_UNIVAR_BRIDGES_WIDTH_SUBSET,
  54. precision=0.01)
  55. self.assertRaises(self.failureException,
  56. self.assertVectorFitsUnivar,
  57. map='bridges', column='YEAR_BUILT',
  58. reference=V_UNIVAR_BRIDGES_WIDTH_SUBSET,
  59. precision=0.01)
  60. self.assertRaises(ValueError,
  61. self.assertVectorFitsUnivar,
  62. map='bridges', column='WIDTH',
  63. reference=RANDOM_KEYVALUES)
  64. def test_assertVectorFitsTopoInfo(self):
  65. self.assertVectorFitsTopoInfo('bridges', V_UNIVAR_BRIDGES_TOPO)
  66. self.assertRaises(self.failureException,
  67. self.assertVectorFitsTopoInfo,
  68. 'lakes',
  69. V_UNIVAR_BRIDGES_TOPO)
  70. self.assertRaises(ValueError,
  71. self.assertVectorFitsTopoInfo,
  72. 'bridges', RANDOM_KEYVALUES)
  73. self.assertRaises(ValueError,
  74. self.assertVectorFitsTopoInfo,
  75. 'bridges', V_UNIVAR_BRIDGES_REGION)
  76. def test_assertVectorFitsRegionInfo(self):
  77. self.assertVectorFitsRegionInfo('bridges', V_UNIVAR_BRIDGES_REGION, precision=1.0)
  78. self.assertRaises(self.failureException,
  79. self.assertVectorFitsRegionInfo,
  80. 'lakes', V_UNIVAR_BRIDGES_REGION, precision=1.0)
  81. self.assertRaises(ValueError,
  82. self.assertVectorFitsRegionInfo,
  83. 'bridges', RANDOM_KEYVALUES, precision=1.0)
  84. self.assertRaises(ValueError,
  85. self.assertVectorFitsRegionInfo,
  86. 'bridges', V_UNIVAR_BRIDGES_TOPO, precision=1.0)
  87. def test_assertVectorFitsExtendedInfo(self):
  88. self.assertVectorFitsExtendedInfo('bridges', V_UNIVAR_BRIDGES_EXTENDED)
  89. self.assertRaises(self.failureException,
  90. self.assertVectorFitsExtendedInfo,
  91. 'lakes',
  92. V_UNIVAR_BRIDGES_EXTENDED)
  93. self.assertRaises(ValueError,
  94. self.assertVectorFitsExtendedInfo,
  95. 'bridges',
  96. RANDOM_KEYVALUES)
  97. self.assertRaises(ValueError,
  98. self.assertVectorFitsExtendedInfo,
  99. 'bridges',
  100. V_UNIVAR_BRIDGES_TOPO)
  101. def test_assertVectorInfoEqualsVectorInfo(self):
  102. self.assertVectorInfoEqualsVectorInfo('bridges', 'bridges', precision=0.00000001)
  103. self.assertRaises(self.failureException,
  104. self.assertVectorInfoEqualsVectorInfo,
  105. 'lakes', 'bridges', precision=0.00000001)
  106. self.assertRaises(CalledModuleError,
  107. self.assertVectorInfoEqualsVectorInfo,
  108. 'bridges', 'does_not_exist', precision=0.00000001)
  109. class TestVectorGeometryAssertions(TestCase):
  110. """Test assertions of map geometry"""
  111. # pylint: disable=R0904
  112. maps_to_remove = []
  113. simple_base_file = 'data/simple_vector_map_ascii_4p_2l_2c_3b_dp14.txt'
  114. simple_modified_file = 'data/simple_vector_map_ascii_4p_2l_2c_3b_dp14_modified.txt'
  115. simple_diff_header_file = 'data/simple_vector_map_ascii_4p_2l_2c_3b_dp14_diff_header.txt'
  116. precision = 0.00001
  117. digits = 14
  118. @classmethod
  119. def tearDownClass(cls):
  120. # TODO: this should be decided globaly by cleanup variable
  121. # perhaps cls.gremove() wheoul be the right option
  122. # when invoking separately, no need to delete maps since mapset
  123. # is deleted
  124. if cls.maps_to_remove:
  125. cls.runModule('g.remove', flags='f', type='vector',
  126. name=','.join(cls.maps_to_remove))
  127. def test_assertVectorEqualsVector_basic(self):
  128. """Check completely different maps."""
  129. self.assertVectorEqualsVector(actual='bridges', reference='bridges',
  130. precision=0.01, digits=15)
  131. self.assertRaises(self.failureException,
  132. self.assertVectorEqualsVector,
  133. actual='bridges', reference='lakes',
  134. precision=0.01, digits=7)
  135. self.assertRaises(CalledModuleError,
  136. self.assertVectorEqualsVector,
  137. actual='does_not_exist', reference='lakes',
  138. precision=0.01, digits=7)
  139. def test_assertVectorEqualsVector_geometry_same_header(self):
  140. """Check small slighlty different maps with same header in ASCII."""
  141. amap = 'simple_vector_map_base_geom'
  142. bmap = 'simple_vector_map_modified_geom'
  143. self.runModule('v.in.ascii', format='standard',
  144. input=self.simple_base_file,
  145. output=amap)
  146. self.maps_to_remove.append(amap)
  147. self.runModule('v.in.ascii', format='standard',
  148. input=self.simple_modified_file,
  149. output=bmap)
  150. self.maps_to_remove.append(bmap)
  151. self.assertVectorEqualsVector(actual=amap, reference=amap,
  152. precision=self.precision, digits=self.digits)
  153. self.assertRaises(self.failureException,
  154. self.assertVectorEqualsVector,
  155. actual=amap, reference=bmap,
  156. precision=self.precision, digits=self.digits)
  157. def test_assertVectorEqualsVector_geometry(self):
  158. """Check small slighlty different maps with different headers in ASCII."""
  159. amap = 'simple_vector_map_base'
  160. bmap = 'simple_vector_map_different_header'
  161. self.runModule('v.in.ascii', format='standard',
  162. input=self.simple_base_file,
  163. output=amap)
  164. self.maps_to_remove.append(amap)
  165. self.runModule('v.in.ascii', format='standard',
  166. input=self.simple_diff_header_file,
  167. output=bmap)
  168. self.maps_to_remove.append(bmap)
  169. self.assertVectorEqualsVector(actual=amap, reference=bmap,
  170. precision=self.precision, digits=self.digits)
  171. def test_assertVectorAsciiEqualsVectorAscii_diff_header(self):
  172. """Test ASCII files with different header.
  173. Prove that files were not deleted if not requested.
  174. """
  175. self.assertVectorAsciiEqualsVectorAscii(actual=self.simple_base_file,
  176. reference=self.simple_diff_header_file)
  177. self.assertFileExists(self.simple_base_file)
  178. self.assertFileExists(self.simple_diff_header_file)
  179. def test_assertVectorAsciiEqualsVectorAscii_diff_content(self):
  180. """Test ASCII files with slighlty different content.
  181. Prove that files were not deleted if not requested.
  182. """
  183. self.assertRaises(self.failureException,
  184. self.assertVectorAsciiEqualsVectorAscii,
  185. actual=self.simple_base_file,
  186. reference=self.simple_modified_file)
  187. self.assertFileExists(self.simple_base_file)
  188. self.assertFileExists(self.simple_modified_file)
  189. def test_assertVectorEqualsAscii_by_import(self):
  190. amap = 'simple_vector_map_imported_base'
  191. self.runModule('v.in.ascii', format='standard',
  192. input=self.simple_base_file,
  193. output=amap)
  194. self.maps_to_remove.append(amap)
  195. self.assertVectorEqualsAscii(amap, self.simple_diff_header_file,
  196. precision=self.precision, digits=self.digits)
  197. self.assertRaises(self.failureException,
  198. self.assertVectorEqualsAscii,
  199. amap, self.simple_modified_file,
  200. precision=self.precision, digits=self.digits)
  201. self.assertFileExists(self.simple_base_file)
  202. self.assertFileExists(self.simple_modified_file)
  203. self.assertFileExists(self.simple_diff_header_file)
  204. if __name__ == '__main__':
  205. test()