test_parameter.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. """
  2. Created on Fri Jul 4 16:32:54 2014
  3. @author: pietro
  4. """
  5. from __future__ import print_function
  6. from grass.gunittest.case import TestCase
  7. from grass.gunittest.main import 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(
  20. diz=dict(name="int_number", required="yes", multiple="no", type="all")
  21. )
  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(
  34. diz=dict(name="int_number", required="yes", multiple="no", type=ptype)
  35. )
  36. value = 1
  37. self.assertTupleEqual((float(value), value), _check_value(param, value))
  38. value = 1.2
  39. self.assertTupleEqual((value, value), _check_value(param, value))
  40. value = "1"
  41. self.assertTupleEqual((float(value), value), _check_value(param, value))
  42. value = "1.35"
  43. self.assertTupleEqual((float(value), value), _check_value(param, value))
  44. # test errors
  45. with self.assertRaises(ValueError):
  46. _check_value(param, "elev")
  47. with self.assertRaises(TypeError):
  48. _check_value(param, (1.0, 2.0))
  49. def test_multiple_float_double(self):
  50. for ptype in ("float", "double"):
  51. param = Parameter(
  52. diz=dict(name="number", required="yes", multiple="yes", type=ptype)
  53. )
  54. value = (1.4, 2.3)
  55. self.assertTupleEqual((list(value), value), _check_value(param, value))
  56. value = (1, 2)
  57. self.assertTupleEqual(
  58. ([float(v) for v in value], value), _check_value(param, value)
  59. )
  60. value = ("1", "2")
  61. self.assertTupleEqual(
  62. ([float(v) for v in value], value), _check_value(param, value)
  63. )
  64. value = ("1.4", "2.3")
  65. self.assertTupleEqual(
  66. ([float(v) for v in value], value), _check_value(param, value)
  67. )
  68. value = 1.0
  69. self.assertTupleEqual(
  70. (
  71. [
  72. value,
  73. ],
  74. value,
  75. ),
  76. _check_value(param, value),
  77. )
  78. value = 1
  79. self.assertTupleEqual(
  80. (
  81. [
  82. value,
  83. ],
  84. value,
  85. ),
  86. _check_value(param, value),
  87. )
  88. # test errors
  89. with self.assertRaises(ValueError):
  90. _check_value(param, "elev")
  91. with self.assertRaises(ValueError):
  92. _check_value(param, ("elev", "slope", "aspect"))
  93. def test_range_float_double(self):
  94. for ptype in ("float", "double"):
  95. param = Parameter(
  96. diz=dict(
  97. name="int_number",
  98. required="yes",
  99. multiple="no",
  100. type=ptype,
  101. values=[
  102. "0.0-2.5",
  103. ],
  104. )
  105. )
  106. value = 1
  107. self.assertTupleEqual((float(value), value), _check_value(param, value))
  108. value = 1.2
  109. self.assertTupleEqual((value, value), _check_value(param, value))
  110. value = "0"
  111. self.assertTupleEqual((float(value), value), _check_value(param, value))
  112. value = "2.5"
  113. self.assertTupleEqual((float(value), value), _check_value(param, value))
  114. # test errors
  115. with self.assertRaises(ValueError):
  116. _check_value(param, "elev")
  117. with self.assertRaises(TypeError):
  118. _check_value(param, (1.0, 2.0))
  119. with self.assertRaises(ValueError):
  120. _check_value(param, -1.0)
  121. with self.assertRaises(ValueError):
  122. _check_value(param, 2.6)
  123. def test_single_integer(self):
  124. param = Parameter(
  125. diz=dict(name="int_number", required="yes", multiple="no", type="integer")
  126. )
  127. value = 1
  128. self.assertTupleEqual((value, value), _check_value(param, value))
  129. value = 1.2
  130. self.assertTupleEqual((int(value), value), _check_value(param, value))
  131. value = "1"
  132. self.assertTupleEqual((int(value), value), _check_value(param, value))
  133. # test errors
  134. with self.assertRaises(ValueError):
  135. _check_value(param, "1.")
  136. with self.assertRaises(ValueError):
  137. _check_value(param, "elev")
  138. with self.assertRaises(TypeError):
  139. _check_value(param, (1, 2))
  140. def test_multiple_integer(self):
  141. param = Parameter(
  142. diz=dict(name="int_number", required="yes", multiple="yes", type="integer")
  143. )
  144. value = (1, 2)
  145. # import ipdb; ipdb.set_trace()
  146. self.assertTupleEqual((list(value), value), _check_value(param, value))
  147. value = (1.2, 2.3)
  148. self.assertTupleEqual(
  149. ([int(v) for v in value], value), _check_value(param, value)
  150. )
  151. value = ("1", "2")
  152. self.assertTupleEqual(
  153. ([int(v) for v in value], value), _check_value(param, value)
  154. )
  155. value = 1
  156. self.assertTupleEqual(
  157. (
  158. [
  159. 1,
  160. ],
  161. value,
  162. ),
  163. _check_value(param, value),
  164. )
  165. value = 1.2
  166. self.assertTupleEqual(
  167. (
  168. [
  169. int(value),
  170. ],
  171. value,
  172. ),
  173. _check_value(param, value),
  174. )
  175. value = "1"
  176. self.assertTupleEqual(
  177. (
  178. [
  179. int(value),
  180. ],
  181. value,
  182. ),
  183. _check_value(param, value),
  184. )
  185. # test errors
  186. with self.assertRaises(ValueError):
  187. _check_value(param, "elev")
  188. with self.assertRaises(ValueError):
  189. _check_value(param, ("elev", "slope", "aspect"))
  190. def test_keydescvalues(self):
  191. for ptype in ("integer", "float"):
  192. param = Parameter(
  193. diz=dict(
  194. name="int_number",
  195. required="yes",
  196. multiple="yes",
  197. keydesc=("range", "(min, max)"),
  198. type="integer",
  199. )
  200. )
  201. value = (1, 2)
  202. self.assertTupleEqual(
  203. (
  204. [
  205. value,
  206. ],
  207. value,
  208. ),
  209. _check_value(param, value),
  210. )
  211. value = [(1, 2), (2, 3)]
  212. self.assertTupleEqual((value, value), _check_value(param, value))
  213. with self.assertRaises(TypeError):
  214. _check_value(param, 1)
  215. def test_range_integer(self):
  216. param = Parameter(
  217. diz=dict(
  218. name="int_number",
  219. required="yes",
  220. multiple="no",
  221. type="integer",
  222. values=[
  223. "0-10",
  224. ],
  225. )
  226. )
  227. value = 1
  228. self.assertTupleEqual((value, value), _check_value(param, value))
  229. value = 0
  230. self.assertTupleEqual((value, value), _check_value(param, value))
  231. value = 10
  232. self.assertTupleEqual((value, value), _check_value(param, value))
  233. value = 1.2
  234. self.assertTupleEqual((int(value), value), _check_value(param, value))
  235. value = "1"
  236. self.assertTupleEqual((int(value), value), _check_value(param, value))
  237. # test errors
  238. with self.assertRaises(ValueError):
  239. _check_value(param, "1.")
  240. with self.assertRaises(ValueError):
  241. _check_value(param, "elev")
  242. with self.assertRaises(TypeError):
  243. _check_value(param, (1, 2))
  244. with self.assertRaises(ValueError):
  245. _check_value(param, -1)
  246. with self.assertRaises(ValueError):
  247. _check_value(param, 11)
  248. def test_choice_integer(self):
  249. param = Parameter(
  250. diz=dict(
  251. name="int_number",
  252. required="yes",
  253. multiple="no",
  254. type="integer",
  255. values=[2, 4, 6, 8],
  256. )
  257. )
  258. value = 4
  259. self.assertTupleEqual((value, value), _check_value(param, value))
  260. value = 2
  261. self.assertTupleEqual((int(value), value), _check_value(param, value))
  262. value = "8"
  263. self.assertTupleEqual((int(value), value), _check_value(param, value))
  264. # test errors
  265. with self.assertRaises(ValueError):
  266. _check_value(param, "2.")
  267. with self.assertRaises(ValueError):
  268. _check_value(param, "elev")
  269. with self.assertRaises(TypeError):
  270. _check_value(param, (1, 2))
  271. with self.assertRaises(ValueError):
  272. _check_value(param, 3)
  273. def test_single_string_file(self):
  274. for ptype in ("string", "file"):
  275. param = Parameter(
  276. diz=dict(name="name", required="yes", multiple="no", type=ptype)
  277. )
  278. value = "elev"
  279. self.assertTupleEqual((value, value), _check_value(param, value))
  280. value = 10
  281. self.assertTupleEqual((str(value), value), _check_value(param, value))
  282. value = 12.5
  283. self.assertTupleEqual((str(value), value), _check_value(param, value))
  284. # test errors
  285. with self.assertRaises(TypeError):
  286. _check_value(param, ("abc", "def"))
  287. def test_multiple_strings(self):
  288. param = Parameter(
  289. diz=dict(name="rastnames", required="yes", multiple="yes", type="string")
  290. )
  291. value = ["elev", "slope", "aspect"]
  292. self.assertTupleEqual((value, value), _check_value(param, value))
  293. value = ("elev", "slope", "aspect")
  294. self.assertTupleEqual((list(value), value), _check_value(param, value))
  295. value = ["1.3", "2.3", "4.5"]
  296. self.assertTupleEqual((value, value), _check_value(param, value))
  297. value = [1.3, 2.3, 4.5]
  298. self.assertTupleEqual(
  299. ([str(v) for v in value], value), _check_value(param, value)
  300. )
  301. value = (1, 2, 3)
  302. self.assertTupleEqual(
  303. ([str(v) for v in value], value), _check_value(param, value)
  304. )
  305. value = "elev"
  306. self.assertTupleEqual(
  307. (
  308. [
  309. value,
  310. ],
  311. value,
  312. ),
  313. _check_value(param, value),
  314. )
  315. # test errors
  316. with self.assertRaises(ValueError):
  317. _check_value(param, ({}, {}, {}))
  318. def test_choice_string(self):
  319. values = ["elev", "asp", "slp"]
  320. param = Parameter(
  321. diz=dict(
  322. name="rastname",
  323. required="yes",
  324. multiple="no",
  325. type="string",
  326. values=values,
  327. )
  328. )
  329. value = "asp"
  330. self.assertTupleEqual((value, value), _check_value(param, value))
  331. # test errors
  332. with self.assertRaises(ValueError):
  333. _check_value(param, "2")
  334. with self.assertRaises(ValueError):
  335. _check_value(param, "2.")
  336. with self.assertRaises(TypeError):
  337. _check_value(param, (1, 2))
  338. with self.assertRaises(ValueError):
  339. _check_value(param, "elevation")
  340. class TestParameterGetBash(TestCase):
  341. def test_single_float_double(self):
  342. for ptype in ("float", "double"):
  343. param = Parameter(
  344. diz=dict(name="number", required="yes", multiple="no", type=ptype)
  345. )
  346. # set private attributes to skip the check function
  347. param._value = 1.0
  348. param._rawvalue = 1.0
  349. self.assertEqual("number=1.0", param.get_bash())
  350. param._value = 1.0
  351. param._rawvalue = "1."
  352. self.assertEqual("number=1.", param.get_bash())
  353. def test_multiple_float_double(self):
  354. for ptype in ("float", "double"):
  355. param = Parameter(
  356. diz=dict(name="number", required="yes", multiple="yes", type=ptype)
  357. )
  358. # set private attributes to skip the check function
  359. param._value = [
  360. 1.0,
  361. ]
  362. param._rawvalue = 1.0
  363. self.assertEqual("number=1.0", param.get_bash())
  364. param._value = [
  365. 1.0,
  366. ]
  367. param._rawvalue = "1."
  368. self.assertEqual("number=1.", param.get_bash())
  369. param._value = [1.0, 2.0, 3.0]
  370. param._rawvalue = [1.0, 2.0, 3.0]
  371. self.assertEqual("number=1.0,2.0,3.0", param.get_bash())
  372. param._value = [1.0, 2.0, 3.0]
  373. param._rawvalue = ["1.", "2.", "3."]
  374. self.assertEqual("number=1.,2.,3.", param.get_bash())
  375. def test_single_string(self):
  376. param = Parameter(
  377. diz=dict(name="rast", required="yes", multiple="no", type="string")
  378. )
  379. # set private attributes to skip the check function
  380. param._value = "elev"
  381. param._rawvalue = "elev"
  382. self.assertEqual("rast=elev", param.get_bash())
  383. def test_multiple_strings(self):
  384. param = Parameter(
  385. diz=dict(name="rast", required="yes", multiple="yes", type="string")
  386. )
  387. # set private attributes to skip the check function
  388. param._value = ["elev", "asp", "slp"]
  389. param._rawvalue = ["elev", "asp", "slp"]
  390. self.assertEqual("rast=elev,asp,slp", param.get_bash())
  391. param._value = [
  392. "elev",
  393. ]
  394. param._rawvalue = "elev"
  395. self.assertEqual("rast=elev", param.get_bash())
  396. def test_keydescvalues(self):
  397. param = Parameter(
  398. diz=dict(
  399. name="range",
  400. required="yes",
  401. multiple="yes",
  402. keydesc=("range", "(min, max)"),
  403. type="integer",
  404. )
  405. )
  406. # set private attributes to skip the check function
  407. param._value = [
  408. (1.0, 2.0),
  409. ]
  410. param._rawvalue = (1.0, 2.0)
  411. self.assertEqual("range=1.0,2.0", param.get_bash())
  412. param._value = [(1.0, 2.0), (3.0, 4.0)]
  413. param._rawvalue = [(1.0, 2.0), (3.0, 4.0)]
  414. self.assertEqual("range=1.0,2.0,3.0,4.0", param.get_bash())
  415. param._value = [(1.0, 2.0), (3.0, 4.0)]
  416. param._rawvalue = [("1.0", "2.00"), ("3.000", "4.0000")]
  417. self.assertEqual("range=1.0,2.00,3.000,4.0000", param.get_bash())
  418. with self.assertRaises(TypeError):
  419. _check_value(param, 1)
  420. if __name__ == "__main__":
  421. test()