test_parameter.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Jul 4 16:32:54 2014
  4. @author: pietro
  5. """
  6. from __future__ import print_function
  7. from grass.gunittest import TestCase, test
  8. from grass.pygrass.modules.interface.parameter import Parameter, _check_value
  9. GETTYPE = {
  10. 'string': str,
  11. 'integer': int,
  12. 'float': float,
  13. 'double': float,
  14. 'file': str,
  15. 'all': lambda x: x,
  16. }
  17. class TestCheckValueFunction(TestCase):
  18. def test_single_all(self):
  19. param = Parameter(diz=dict(name='int_number', required='yes',
  20. multiple='no', type='all'))
  21. value = 1
  22. self.assertTupleEqual((value, value), _check_value(param, value))
  23. value = 1.2
  24. self.assertTupleEqual((value, value), _check_value(param, value))
  25. value = "elev"
  26. self.assertTupleEqual((value, value), _check_value(param, value))
  27. # test errors
  28. with self.assertRaises(TypeError):
  29. _check_value(param, (1, 2))
  30. def test_single_float_double(self):
  31. for ptype in ('float', 'double'):
  32. param = Parameter(diz=dict(name='int_number', required='yes',
  33. multiple='no', type=ptype))
  34. value = 1
  35. self.assertTupleEqual((float(value), value), _check_value(param, value))
  36. value = 1.2
  37. self.assertTupleEqual((value, value), _check_value(param, value))
  38. value = "1"
  39. self.assertTupleEqual((float(value), value), _check_value(param, value))
  40. value = "1.35"
  41. self.assertTupleEqual((float(value), value), _check_value(param, value))
  42. # test errors
  43. with self.assertRaises(ValueError):
  44. _check_value(param, "elev")
  45. with self.assertRaises(TypeError):
  46. _check_value(param, (1., 2.))
  47. def test_multiple_float_double(self):
  48. for ptype in ('float', 'double'):
  49. param = Parameter(diz=dict(name='number', required='yes',
  50. multiple='yes', type=ptype))
  51. value = (1.4, 2.3)
  52. self.assertTupleEqual((list(value), value),
  53. _check_value(param, value))
  54. value = (1, 2)
  55. self.assertTupleEqual(([float(v) for v in value], value),
  56. _check_value(param, value))
  57. value = ("1", "2")
  58. self.assertTupleEqual(([float(v) for v in value], value),
  59. _check_value(param, value))
  60. value = ("1.4", "2.3")
  61. self.assertTupleEqual(([float(v) for v in value], value),
  62. _check_value(param, value))
  63. value = 1.
  64. self.assertTupleEqual(([value, ], value),
  65. _check_value(param, value))
  66. value = 1
  67. self.assertTupleEqual(([value, ], value),
  68. _check_value(param, value))
  69. # test errors
  70. with self.assertRaises(ValueError):
  71. _check_value(param, "elev")
  72. with self.assertRaises(ValueError):
  73. _check_value(param, ("elev", "slope", "aspect"))
  74. def test_range_float_double(self):
  75. for ptype in ('float', 'double'):
  76. param = Parameter(diz=dict(name='int_number', required='yes',
  77. multiple='no', type=ptype,
  78. values=["0.0-2.5", ]))
  79. value = 1
  80. self.assertTupleEqual((float(value), value), _check_value(param, value))
  81. value = 1.2
  82. self.assertTupleEqual((value, value), _check_value(param, value))
  83. value = "0"
  84. self.assertTupleEqual((float(value), value), _check_value(param, value))
  85. value = "2.5"
  86. self.assertTupleEqual((float(value), value), _check_value(param, value))
  87. # test errors
  88. with self.assertRaises(ValueError):
  89. _check_value(param, "elev")
  90. with self.assertRaises(TypeError):
  91. _check_value(param, (1., 2.))
  92. with self.assertRaises(ValueError):
  93. _check_value(param, -1.)
  94. with self.assertRaises(ValueError):
  95. _check_value(param, 2.6)
  96. def test_single_integer(self):
  97. param = Parameter(diz=dict(name='int_number', required='yes',
  98. multiple='no', type='integer'))
  99. value = 1
  100. self.assertTupleEqual((value, value), _check_value(param, value))
  101. value = 1.2
  102. self.assertTupleEqual((int(value), value), _check_value(param, value))
  103. value = "1"
  104. self.assertTupleEqual((int(value), value), _check_value(param, value))
  105. # test errors
  106. with self.assertRaises(ValueError):
  107. _check_value(param, "1.")
  108. with self.assertRaises(ValueError):
  109. _check_value(param, "elev")
  110. with self.assertRaises(TypeError):
  111. _check_value(param, (1, 2))
  112. def test_multiple_integer(self):
  113. param = Parameter(diz=dict(name='int_number', required='yes',
  114. multiple='yes', type='integer'))
  115. value = (1, 2)
  116. #import ipdb; ipdb.set_trace()
  117. self.assertTupleEqual((list(value), value), _check_value(param, value))
  118. value = (1.2, 2.3)
  119. self.assertTupleEqual(([int(v) for v in value], value),
  120. _check_value(param, value))
  121. value = ("1", "2")
  122. self.assertTupleEqual(([int(v) for v in value], value),
  123. _check_value(param, value))
  124. value = 1
  125. self.assertTupleEqual(([1, ], value), _check_value(param, value))
  126. value = 1.2
  127. self.assertTupleEqual(([int(value), ], value),
  128. _check_value(param, value))
  129. value = "1"
  130. self.assertTupleEqual(([int(value), ], value),
  131. _check_value(param, value))
  132. # test errors
  133. with self.assertRaises(ValueError):
  134. _check_value(param, "elev")
  135. with self.assertRaises(ValueError):
  136. _check_value(param, ("elev", "slope", "aspect"))
  137. def test_keydescvalues(self):
  138. for ptype in ('integer', 'float'):
  139. param = Parameter(diz=dict(name='int_number', required='yes',
  140. multiple='yes',
  141. keydesc=('range', '(min, max)'),
  142. type='integer'))
  143. value = (1, 2)
  144. self.assertTupleEqual(([value, ], value),
  145. _check_value(param, value))
  146. value = [(1, 2), (2, 3)]
  147. self.assertTupleEqual((value, value), _check_value(param, value))
  148. with self.assertRaises(TypeError):
  149. _check_value(param, 1)
  150. def test_range_integer(self):
  151. param = Parameter(diz=dict(name='int_number', required='yes',
  152. multiple='no', type='integer',
  153. values=["0-10", ]))
  154. value = 1
  155. self.assertTupleEqual((value, value), _check_value(param, value))
  156. value = 0
  157. self.assertTupleEqual((value, value), _check_value(param, value))
  158. value = 10
  159. self.assertTupleEqual((value, value), _check_value(param, value))
  160. value = 1.2
  161. self.assertTupleEqual((int(value), value), _check_value(param, value))
  162. value = "1"
  163. self.assertTupleEqual((int(value), value), _check_value(param, value))
  164. # test errors
  165. with self.assertRaises(ValueError):
  166. _check_value(param, "1.")
  167. with self.assertRaises(ValueError):
  168. _check_value(param, "elev")
  169. with self.assertRaises(TypeError):
  170. _check_value(param, (1, 2))
  171. with self.assertRaises(ValueError):
  172. _check_value(param, -1)
  173. with self.assertRaises(ValueError):
  174. _check_value(param, 11)
  175. def test_choice_integer(self):
  176. param = Parameter(diz=dict(name='int_number', required='yes',
  177. multiple='no', type='integer',
  178. values=[2, 4, 6, 8]))
  179. value = 4
  180. self.assertTupleEqual((value, value), _check_value(param, value))
  181. value = 2
  182. self.assertTupleEqual((int(value), value), _check_value(param, value))
  183. value = "8"
  184. self.assertTupleEqual((int(value), value), _check_value(param, value))
  185. # test errors
  186. with self.assertRaises(ValueError):
  187. _check_value(param, "2.")
  188. with self.assertRaises(ValueError):
  189. _check_value(param, "elev")
  190. with self.assertRaises(TypeError):
  191. _check_value(param, (1, 2))
  192. with self.assertRaises(ValueError):
  193. _check_value(param, 3)
  194. def test_single_string_file(self):
  195. for ptype in ('string', 'file'):
  196. param = Parameter(diz=dict(name='name', required='yes',
  197. multiple='no', type=ptype))
  198. value = u'elev'
  199. self.assertTupleEqual((value, value), _check_value(param, value))
  200. value = 10
  201. self.assertTupleEqual((str(value), value),
  202. _check_value(param, value))
  203. value = 12.5
  204. self.assertTupleEqual((str(value), value),
  205. _check_value(param, value))
  206. # test errors
  207. with self.assertRaises(TypeError):
  208. _check_value(param, ('abc', 'def'))
  209. def test_multiple_strings(self):
  210. param = Parameter(diz=dict(name='rastnames', required='yes',
  211. multiple='yes', type='string'))
  212. value = ['elev', 'slope', 'aspect']
  213. self.assertTupleEqual((value, value), _check_value(param, value))
  214. value = ('elev', 'slope', 'aspect')
  215. self.assertTupleEqual((list(value), value), _check_value(param, value))
  216. value = ['1.3', '2.3', '4.5']
  217. self.assertTupleEqual((value, value), _check_value(param, value))
  218. value = [1.3, 2.3, 4.5]
  219. self.assertTupleEqual(([str(v) for v in value], value),
  220. _check_value(param, value))
  221. value = (1, 2, 3)
  222. self.assertTupleEqual(([str(v) for v in value], value),
  223. _check_value(param, value))
  224. value = 'elev'
  225. self.assertTupleEqual(([value, ], value), _check_value(param, value))
  226. # test errors
  227. with self.assertRaises(ValueError):
  228. _check_value(param, ({}, {}, {}))
  229. def test_choice_string(self):
  230. values = ["elev", "asp", "slp"]
  231. param = Parameter(diz=dict(name='rastname', required='yes',
  232. multiple='no', type='string',
  233. values=values))
  234. value = "asp"
  235. self.assertTupleEqual((value, value), _check_value(param, value))
  236. # test errors
  237. with self.assertRaises(ValueError):
  238. _check_value(param, "2")
  239. with self.assertRaises(ValueError):
  240. _check_value(param, "2.")
  241. with self.assertRaises(TypeError):
  242. _check_value(param, (1, 2))
  243. with self.assertRaises(ValueError):
  244. _check_value(param, "elevation")
  245. class TestParameterGetBash(TestCase):
  246. def test_single_float_double(self):
  247. for ptype in ('float', 'double'):
  248. param = Parameter(diz=dict(name='number', required='yes',
  249. multiple='no', type=ptype))
  250. # set private attributes to skip the check function
  251. param._value = 1.0
  252. param._rawvalue = 1.0
  253. self.assertEqual("number=1.0", param.get_bash())
  254. param._value = 1.0
  255. param._rawvalue = "1."
  256. self.assertEqual("number=1.", param.get_bash())
  257. def test_multiple_float_double(self):
  258. for ptype in ('float', 'double'):
  259. param = Parameter(diz=dict(name='number', required='yes',
  260. multiple='yes', type=ptype))
  261. # set private attributes to skip the check function
  262. param._value = [1.0, ]
  263. param._rawvalue = 1.0
  264. self.assertEqual("number=1.0", param.get_bash())
  265. param._value = [1.0, ]
  266. param._rawvalue = "1."
  267. self.assertEqual("number=1.", param.get_bash())
  268. param._value = [1.0, 2.0, 3.0]
  269. param._rawvalue = [1.0, 2.0, 3.0]
  270. self.assertEqual("number=1.0,2.0,3.0", param.get_bash())
  271. param._value = [1.0, 2.0, 3.0]
  272. param._rawvalue = ["1.", "2.", "3."]
  273. self.assertEqual("number=1.,2.,3.", param.get_bash())
  274. def test_single_string(self):
  275. param = Parameter(diz=dict(name='rast', required='yes',
  276. multiple='no', type='string'))
  277. # set private attributes to skip the check function
  278. param._value = 'elev'
  279. param._rawvalue = 'elev'
  280. self.assertEqual("rast=elev", param.get_bash())
  281. def test_multiple_strings(self):
  282. param = Parameter(diz=dict(name='rast', required='yes',
  283. multiple='yes', type='string'))
  284. # set private attributes to skip the check function
  285. param._value = ['elev', 'asp', 'slp']
  286. param._rawvalue = ['elev', 'asp', 'slp']
  287. self.assertEqual("rast=elev,asp,slp", param.get_bash())
  288. param._value = ['elev', ]
  289. param._rawvalue = 'elev'
  290. self.assertEqual("rast=elev", param.get_bash())
  291. def test_keydescvalues(self):
  292. param = Parameter(diz=dict(name='range', required='yes',
  293. multiple='yes',
  294. keydesc=('range', '(min, max)'),
  295. type='integer'))
  296. # set private attributes to skip the check function
  297. param._value = [(1., 2.), ]
  298. param._rawvalue = (1., 2.)
  299. self.assertEqual("range=1.0,2.0", param.get_bash())
  300. param._value = [(1., 2.), (3., 4.)]
  301. param._rawvalue = [(1., 2.), (3., 4.)]
  302. self.assertEqual("range=1.0,2.0,3.0,4.0", param.get_bash())
  303. param._value = [(1., 2.), (3., 4.)]
  304. param._rawvalue = [('1.0', '2.00'), ('3.000', '4.0000')]
  305. self.assertEqual("range=1.0,2.00,3.000,4.0000", param.get_bash())
  306. with self.assertRaises(TypeError):
  307. _check_value(param, 1)
  308. if __name__ == '__main__':
  309. test()