| 156 | } |
| 157 | |
| 158 | func TestParseDataStringWithVariables(t *testing.T) { |
| 159 | variablesMapping := map[string]interface{}{ |
| 160 | "var_1": "abc", |
| 161 | "var_2": "def", |
| 162 | "var_3": 123, |
| 163 | "var_4": map[string]interface{}{"a": 1}, |
| 164 | "var_5": true, |
| 165 | "var_6": nil, |
| 166 | "v": 4.5, // variable name with one character |
| 167 | "_v": 6.9, // variable name starts with underscore |
| 168 | } |
| 169 | |
| 170 | testData := []struct { |
| 171 | expr string |
| 172 | expect interface{} |
| 173 | }{ |
| 174 | // no variable |
| 175 | {"var_1", "var_1"}, |
| 176 | // single variable |
| 177 | {"$var_1", "abc"}, |
| 178 | {"${var_1}", "abc"}, |
| 179 | {"$var_3", 123}, |
| 180 | {"$var_4", map[string]interface{}{"a": 1}}, |
| 181 | {"${var_4}", map[string]interface{}{"a": 1}}, |
| 182 | {"$var_5", true}, |
| 183 | {"$var_6", nil}, |
| 184 | {"$v", 4.5}, |
| 185 | {"var_1$_v", "var_16.9"}, |
| 186 | // single variable with prefix or suffix |
| 187 | {"$var_1#XYZ", "abc#XYZ"}, |
| 188 | {"${var_1}#XYZ", "abc#XYZ"}, |
| 189 | {"ABC$var_1", "ABCabc"}, |
| 190 | {"ABC${var_1}", "ABCabc"}, |
| 191 | {"ABC$var_1/", "ABCabc/"}, |
| 192 | {"ABC${v}/", "ABC4.5/"}, |
| 193 | // multiple variables |
| 194 | {"/$var_1/$var_2/var3", "/abc/def/var3"}, |
| 195 | {"/${var_1}/$var_2/var3", "/abc/def/var3"}, |
| 196 | {"ABC$var_1$var_3", "ABCabc123"}, |
| 197 | {"ABC$var_1${var_3}", "ABCabc123"}, |
| 198 | {"ABC$var_1/$var_3", "ABCabc/123"}, |
| 199 | {"ABC${var_1}/${var_3}", "ABCabc/123"}, |
| 200 | {"ABC$var_1/123$var_1/456", "ABCabc/123abc/456"}, |
| 201 | {"ABC$var_1/123${var_1}/456", "ABCabc/123abc/456"}, |
| 202 | {"ABC$var_1/$var_2/$var_1", "ABCabc/def/abc"}, |
| 203 | {"ABC$var_1/$var_2/${var_1}", "ABCabc/def/abc"}, |
| 204 | {"func1($var_1, $var_3)", "func1(abc, 123)"}, |
| 205 | {"func1($var_1, ${var_3})", "func1(abc, 123)"}, |
| 206 | // TODO: fix compatibility with python version |
| 207 | {"abc$var_4", "abcmap[a:1]"}, // "abc{'a': 1}" |
| 208 | {"abc$var_5", "abctrue"}, // "abcTrue" |
| 209 | } |
| 210 | |
| 211 | parser := newParser() |
| 212 | for _, data := range testData { |
| 213 | parsedData, err := parser.Parse(data.expr, variablesMapping) |
| 214 | if !assert.NoError(t, err) { |
| 215 | t.Fatal() |