test_assertions_vect.py 9.1 KB

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