test_parameter.py 14 KB

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