test_assertions_vect.py 9.2 KB

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