blob: c69b8a41c30150d35675112c7b35713cf8f6d2a2 [file] [log] [blame]
Michael Walsh18176322016-11-15 15:11:21 -06001#!/usr/bin/env python
2
3r"""
4This file contains functions useful for validating variables in robot.
5"""
6
7import gen_robot_print as grp
8import gen_valid as gv
9
10from robot.libraries.BuiltIn import BuiltIn
11from robot.api import logger
12
13
Michael Walsh18176322016-11-15 15:11:21 -060014def rvalid_value(var_name,
15 invalid_values=[],
16 valid_values=[]):
Michael Walsh18176322016-11-15 15:11:21 -060017 r"""
Michael Walsh3e26e102017-01-10 11:29:28 -060018 Validate a robot value.
19
20 This function is the robot wrapper for gen_robot_print.svalid_value.
Michael Walsh18176322016-11-15 15:11:21 -060021
22 Description of arguments:
23 var_name The name of the variable whose value is to
24 be validated.
25 invalid_values A list of invalid values. If var_value is
26 equal to any of these, it is invalid.
27 Note that if you specify anything for
28 invalid_values (below), the valid_values
29 list is not even processed.
30 valid_values A list of invalid values. var_value must
31 be equal to one of these values to be
32 considered valid.
33
Michael Walsh4eeaea02018-10-11 17:01:24 -050034 If either the invalid_values or the valid_values parms are not of type
35 "list", they will be processed as python code in order to generate a list.
36 This allows the robot programmer to essentially specify a list literal.
37 For example, the robot code could contain the following:
38
39 Rvalid Value var1 valid_values=['one', 'two']
40
Michael Walsh18176322016-11-15 15:11:21 -060041 Examples of robot calls and corresponding output:
42
43 Robot code...
44 rvalid_value MY_PARM
45
46 Output...
47 #(CDT) 2016/11/02 10:04:20 - **ERROR** Variable "MY_PARM" not found (i.e.
48 #it's undefined).
49
50 or if it is defined but blank:
51
52 Output...
53 #(CDT) 2016/11/02 10:14:24 - **ERROR** The following variable has an
54 #invalid value:
55 MY_PARM:
56
57 It must NOT be one of the following values:
58 invalid_values:
59 invalid_values[0]: <blank>
60
61 Robot code...
62 ${invalid_values}= Create List one two three
63 ${MY_PARM}= Set Variable one
64 rvalid_value MY_PARM invalid_values=${invalid_values}
65
66 Output...
67 #(CDT) 2016/11/02 10:20:05 - **ERROR** The following variable has an
68 #invalid value:
69 MY_PARM: one
70
71 It must NOT be one of the following values:
72 invalid_values:
73 invalid_values[0]: one
74 invalid_values[1]: two
75 invalid_values[2]: three
76
77 """
78
79 # Note: get_variable_value() seems to have no trouble with local variables.
80 var_value = BuiltIn().get_variable_value("${" + var_name + "}")
81
Michael Walsh4eeaea02018-10-11 17:01:24 -050082 if type(valid_values) is not list:
83 # Evaluate python syntax to convert to a list.
84 exec("valid_values = " + valid_values)
85 if type(invalid_values) is not list:
86 # Evaluate python syntax to convert to a list.
87 exec("invalid_values = " + invalid_values)
88
Michael Walsh18176322016-11-15 15:11:21 -060089 if var_value is None:
90 var_value = ""
91 error_message = "Variable \"" + var_name +\
92 "\" not found (i.e. it's undefined).\n"
93 else:
94 error_message = gv.svalid_value(var_value, invalid_values,
95 valid_values, var_name)
96 if not error_message == "":
Michael Walsh8fb1f532016-12-09 14:06:15 -060097 error_message = grp.sprint_error_report(error_message)
Michael Walsh18176322016-11-15 15:11:21 -060098 BuiltIn().fail(error_message)
99
Michael Walsh18176322016-11-15 15:11:21 -0600100
Michael Walsh18176322016-11-15 15:11:21 -0600101def rvalid_integer(var_name):
Michael Walsh18176322016-11-15 15:11:21 -0600102 r"""
Michael Walsh3e26e102017-01-10 11:29:28 -0600103 Validate a robot integer.
104
105 This function is the robot wrapper for gen_robot_print.svalid_integer.
Michael Walsh18176322016-11-15 15:11:21 -0600106
107 Description of arguments:
108 var_name The name of the variable whose value is to
109 be validated.
110
111 Examples of robot calls and corresponding output:
112
113 Robot code...
114 Rvalid Integer MY_PARM
115
116 Output...
117 #(CDT) 2016/11/02 10:44:43 - **ERROR** Variable "MY_PARM" not found (i.e.
118 #it's undefined).
119
120 or if it is defined but blank:
121
122 Output...
123 #(CDT) 2016/11/02 10:45:37 - **ERROR** Invalid integer value:
124 MY_PARM: <blank>
125
126 Robot code...
127 ${MY_PARM}= Set Variable HELLO
128 Rvalid Integer MY_PARM
129
130 Output...
131 #(CDT) 2016/11/02 10:46:18 - **ERROR** Invalid integer value:
132 MY_PARM: HELLO
133
134 """
135
136 # Note: get_variable_value() seems to have no trouble with local variables.
137 var_value = BuiltIn().get_variable_value("${" + var_name + "}")
138
139 if var_value is None:
140 var_value = ""
141 error_message = "Variable \"" + var_name +\
142 "\" not found (i.e. it's undefined).\n"
143 else:
144 error_message = gv.svalid_integer(var_value, var_name)
145 if not error_message == "":
Michael Walsh8fb1f532016-12-09 14:06:15 -0600146 error_message = grp.sprint_error_report(error_message)
Michael Walsh18176322016-11-15 15:11:21 -0600147 BuiltIn().fail(error_message)
Michael Walsh2c687e92018-05-09 11:47:56 -0500148
149
150def rvalid_range(var_name,
151 range):
152 r"""
153 Validate that a robot integer is within the given range.
154
155 This function is the robot wrapper for gen_robot_print.svalid_range.
156
157 Description of arguments:
158 var_name The name of the variable whose value is to
159 be validated.
160 range A list comprised of one or two elements
161 which are the lower and upper ends of a
162 range. These values must be integers
163 except where noted. Valid specifications
164 may be of the following forms: [lower,
165 upper], [lower] or [None, upper]. The
166 caller may also specify this value as a
167 string which will then be converted to a
168 list in the aforementioned format:
169 lower..upper, lower.. or ..upper.
170
171 Examples of robot calls and corresponding output:
172
173 Robot code...
174 Rvalid Range MY_PARM 5..9
175
176 Output...
177 #(CDT) 2018/05/09 11:45:00.166344 - 0.004252 - **ERROR** The following
178 # variable is not within the expected range:
179 MY_PARM: 4
180 valid_range: 5..9
181 """
182
183 var_value = BuiltIn().get_variable_value("${" + var_name + "}")
184
185 if var_value is None:
186 var_value = ""
187 error_message = "Variable \"" + var_name +\
188 "\" not found (i.e. it's undefined).\n"
189 else:
George Keishing36efbc02018-12-12 10:18:23 -0600190 try:
Michael Walsh2c687e92018-05-09 11:47:56 -0500191 range = range.split("..")
George Keishing36efbc02018-12-12 10:18:23 -0600192 except AttributeError:
193 pass
Michael Walsh2c687e92018-05-09 11:47:56 -0500194 if range[0] == "":
195 range[0] = None
196 range = [x for x in range if x]
197 error_message = gv.svalid_range(var_value, range, var_name)
198 if not error_message == "":
199 error_message = grp.sprint_error_report(error_message)
200 BuiltIn().fail(error_message)