Bram Moolenaar | 4a137b4 | 2017-08-04 22:37:11 +0200 | [diff] [blame] | 1 | " Tests for the :let command. |
| 2 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 3 | import './vim9.vim' as v9 |
| 4 | |
Bram Moolenaar | 4a137b4 | 2017-08-04 22:37:11 +0200 | [diff] [blame] | 5 | func Test_let() |
| 6 | " Test to not autoload when assigning. It causes internal error. |
| 7 | set runtimepath+=./sautest |
| 8 | let Test104#numvar = function('tr') |
| 9 | call assert_equal("function('tr')", string(Test104#numvar)) |
| 10 | |
thinca | 6c667bd | 2022-09-02 11:25:37 +0100 | [diff] [blame] | 11 | let foo#tr = function('tr') |
| 12 | call assert_equal("function('tr')", string(foo#tr)) |
| 13 | unlet foo#tr |
| 14 | |
Bram Moolenaar | 4a137b4 | 2017-08-04 22:37:11 +0200 | [diff] [blame] | 15 | let a = 1 |
| 16 | let b = 2 |
| 17 | |
| 18 | let out = execute('let a b') |
| 19 | let s = "\na #1\nb #2" |
| 20 | call assert_equal(s, out) |
| 21 | |
| 22 | let out = execute('let {0 == 1 ? "a" : "b"}') |
| 23 | let s = "\nb #2" |
| 24 | call assert_equal(s, out) |
| 25 | |
| 26 | let out = execute('let {0 == 1 ? "a" : "b"} a') |
| 27 | let s = "\nb #2\na #1" |
| 28 | call assert_equal(s, out) |
| 29 | |
| 30 | let out = execute('let a {0 == 1 ? "a" : "b"}') |
| 31 | let s = "\na #1\nb #2" |
| 32 | call assert_equal(s, out) |
Bram Moolenaar | 8f76e6b | 2019-11-26 16:50:30 +0100 | [diff] [blame] | 33 | |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 34 | " Test for displaying a string variable |
| 35 | let s = 'vim' |
| 36 | let out = execute('let s') |
| 37 | let s = "\ns vim" |
| 38 | call assert_equal(s, out) |
| 39 | |
| 40 | " Test for displaying a list variable |
| 41 | let l = [1, 2] |
| 42 | let out = execute('let l') |
| 43 | let s = "\nl [1, 2]" |
| 44 | call assert_equal(s, out) |
| 45 | |
| 46 | " Test for displaying a dict variable |
| 47 | let d = {'k' : 'v'} |
| 48 | let out = execute('let d') |
| 49 | let s = "\nd {'k': 'v'}" |
| 50 | call assert_equal(s, out) |
| 51 | |
| 52 | " Test for displaying a function reference variable |
| 53 | let F = function('min') |
| 54 | let out = execute('let F') |
| 55 | let s = "\nF *min()" |
| 56 | call assert_equal(s, out) |
| 57 | |
Bram Moolenaar | 8f76e6b | 2019-11-26 16:50:30 +0100 | [diff] [blame] | 58 | let x = 0 |
| 59 | if 0 | let x = 1 | endif |
| 60 | call assert_equal(0, x) |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 61 | |
| 62 | " Display a list item using an out of range index |
| 63 | let l = [10] |
| 64 | call assert_fails('let l[1]', 'E684:') |
| 65 | |
| 66 | " List special variable dictionaries |
| 67 | let g:Test_Global_Var = 5 |
| 68 | call assert_match("\nTest_Global_Var #5", execute('let g:')) |
| 69 | unlet g:Test_Global_Var |
| 70 | |
| 71 | let b:Test_Buf_Var = 8 |
| 72 | call assert_match("\nb:Test_Buf_Var #8", execute('let b:')) |
| 73 | unlet b:Test_Buf_Var |
| 74 | |
| 75 | let w:Test_Win_Var = 'foo' |
| 76 | call assert_equal("\nw:Test_Win_Var foo", execute('let w:')) |
| 77 | unlet w:Test_Win_Var |
| 78 | |
| 79 | let t:Test_Tab_Var = 'bar' |
| 80 | call assert_equal("\nt:Test_Tab_Var bar", execute('let t:')) |
| 81 | unlet t:Test_Tab_Var |
| 82 | |
| 83 | let s:Test_Script_Var = [7] |
| 84 | call assert_match("\ns:Test_Script_Var \\[7]", execute('let s:')) |
| 85 | unlet s:Test_Script_Var |
| 86 | |
| 87 | let l:Test_Local_Var = {'k' : 5} |
| 88 | call assert_match("\nl:Test_Local_Var {'k': 5}", execute('let l:')) |
| 89 | call assert_match("v:errors []", execute('let v:')) |
Bram Moolenaar | 9d8d0b5 | 2020-04-24 22:47:31 +0200 | [diff] [blame] | 90 | |
| 91 | " Test for assigning multiple list items |
| 92 | let l = [1, 2, 3] |
| 93 | let [l[0], l[1]] = [10, 20] |
| 94 | call assert_equal([10, 20, 3], l) |
| 95 | |
| 96 | " Test for errors in conditional expression |
| 97 | call assert_fails('let val = [] ? 1 : 2', 'E745:') |
| 98 | call assert_fails('let val = 1 ? 5+ : 6', 'E121:') |
| 99 | call assert_fails('let val = 1 ? 0 : 5+', 'E15:') |
| 100 | call assert_false(exists('val')) |
| 101 | |
| 102 | " Test for errors in logical operators |
| 103 | let @a = 'if [] || 0 | let val = 2 | endif' |
| 104 | call assert_fails('exe @a', 'E745:') |
| 105 | call assert_fails('call feedkeys(":let val = 0 || []\<cr>", "xt")', 'E745:') |
| 106 | call assert_fails('exe "let val = [] && 5"', 'E745:') |
| 107 | call assert_fails('exe "let val = 6 && []"', 'E745:') |
Bram Moolenaar | 4a137b4 | 2017-08-04 22:37:11 +0200 | [diff] [blame] | 108 | endfunc |
Bram Moolenaar | 31b8160 | 2019-02-10 22:14:27 +0100 | [diff] [blame] | 109 | |
| 110 | func s:set_arg1(a) abort |
| 111 | let a:a = 1 |
| 112 | endfunction |
| 113 | |
| 114 | func s:set_arg2(a) abort |
| 115 | let a:b = 1 |
| 116 | endfunction |
| 117 | |
| 118 | func s:set_arg3(a) abort |
| 119 | let b = a: |
| 120 | let b['a'] = 1 |
| 121 | endfunction |
| 122 | |
| 123 | func s:set_arg4(a) abort |
| 124 | let b = a: |
| 125 | let b['a'] = 1 |
| 126 | endfunction |
| 127 | |
| 128 | func s:set_arg5(a) abort |
| 129 | let b = a: |
| 130 | let b['a'][0] = 1 |
| 131 | endfunction |
| 132 | |
| 133 | func s:set_arg6(a) abort |
| 134 | let a:a[0] = 1 |
| 135 | endfunction |
| 136 | |
| 137 | func s:set_arg7(a) abort |
| 138 | call extend(a:, {'a': 1}) |
| 139 | endfunction |
| 140 | |
| 141 | func s:set_arg8(a) abort |
| 142 | call extend(a:, {'b': 1}) |
| 143 | endfunction |
| 144 | |
| 145 | func s:set_arg9(a) abort |
| 146 | let a:['b'] = 1 |
| 147 | endfunction |
| 148 | |
| 149 | func s:set_arg10(a) abort |
| 150 | let b = a: |
| 151 | call extend(b, {'a': 1}) |
| 152 | endfunction |
| 153 | |
| 154 | func s:set_arg11(a) abort |
| 155 | let b = a: |
| 156 | call extend(b, {'b': 1}) |
| 157 | endfunction |
| 158 | |
| 159 | func s:set_arg12(a) abort |
| 160 | let b = a: |
| 161 | let b['b'] = 1 |
| 162 | endfunction |
| 163 | |
| 164 | func Test_let_arg_fail() |
| 165 | call assert_fails('call s:set_arg1(1)', 'E46:') |
| 166 | call assert_fails('call s:set_arg2(1)', 'E461:') |
| 167 | call assert_fails('call s:set_arg3(1)', 'E46:') |
| 168 | call assert_fails('call s:set_arg4(1)', 'E46:') |
| 169 | call assert_fails('call s:set_arg5(1)', 'E46:') |
| 170 | call s:set_arg6([0]) |
| 171 | call assert_fails('call s:set_arg7(1)', 'E742:') |
| 172 | call assert_fails('call s:set_arg8(1)', 'E742:') |
| 173 | call assert_fails('call s:set_arg9(1)', 'E461:') |
| 174 | call assert_fails('call s:set_arg10(1)', 'E742:') |
| 175 | call assert_fails('call s:set_arg11(1)', 'E742:') |
| 176 | call assert_fails('call s:set_arg12(1)', 'E461:') |
| 177 | endfunction |
| 178 | |
| 179 | func s:set_varg1(...) abort |
| 180 | let a:000 = [] |
| 181 | endfunction |
| 182 | |
| 183 | func s:set_varg2(...) abort |
| 184 | let a:000[0] = 1 |
| 185 | endfunction |
| 186 | |
| 187 | func s:set_varg3(...) abort |
| 188 | let a:000 += [1] |
| 189 | endfunction |
| 190 | |
| 191 | func s:set_varg4(...) abort |
| 192 | call add(a:000, 1) |
| 193 | endfunction |
| 194 | |
| 195 | func s:set_varg5(...) abort |
| 196 | let a:000[0][0] = 1 |
| 197 | endfunction |
| 198 | |
| 199 | func s:set_varg6(...) abort |
| 200 | let b = a:000 |
| 201 | let b[0] = 1 |
| 202 | endfunction |
| 203 | |
| 204 | func s:set_varg7(...) abort |
| 205 | let b = a:000 |
| 206 | let b += [1] |
| 207 | endfunction |
| 208 | |
| 209 | func s:set_varg8(...) abort |
| 210 | let b = a:000 |
| 211 | call add(b, 1) |
| 212 | endfunction |
| 213 | |
| 214 | func s:set_varg9(...) abort |
| 215 | let b = a:000 |
| 216 | let b[0][0] = 1 |
| 217 | endfunction |
| 218 | |
| 219 | func Test_let_varg_fail() |
| 220 | call assert_fails('call s:set_varg1(1)', 'E46:') |
| 221 | call assert_fails('call s:set_varg2(1)', 'E742:') |
| 222 | call assert_fails('call s:set_varg3(1)', 'E46:') |
| 223 | call assert_fails('call s:set_varg4(1)', 'E742:') |
| 224 | call s:set_varg5([0]) |
| 225 | call assert_fails('call s:set_varg6(1)', 'E742:') |
Bram Moolenaar | 05c00c0 | 2019-02-11 22:00:11 +0100 | [diff] [blame] | 226 | call assert_fails('call s:set_varg7(1)', 'E742:') |
Bram Moolenaar | 31b8160 | 2019-02-10 22:14:27 +0100 | [diff] [blame] | 227 | call assert_fails('call s:set_varg8(1)', 'E742:') |
| 228 | call s:set_varg9([0]) |
| 229 | endfunction |
Bram Moolenaar | f0908e6 | 2019-03-30 20:11:50 +0100 | [diff] [blame] | 230 | |
| 231 | func Test_let_utf8_environment() |
| 232 | let $a = 'ĀĒĪŌŪあいうえお' |
| 233 | call assert_equal('ĀĒĪŌŪあいうえお', $a) |
| 234 | endfunc |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 235 | |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 236 | func Test_let_no_type_checking() |
| 237 | let v = 1 |
| 238 | let v = [1,2,3] |
| 239 | let v = {'a': 1, 'b': 2} |
| 240 | let v = 3.4 |
| 241 | let v = 'hello' |
| 242 | endfunc |
| 243 | |
| 244 | func Test_let_termcap() |
| 245 | " Terminal code |
| 246 | let old_t_te = &t_te |
| 247 | let &t_te = "\<Esc>[yes;" |
| 248 | call assert_match('t_te.*^[[yes;', execute("set termcap")) |
| 249 | let &t_te = old_t_te |
| 250 | |
| 251 | if exists("+t_k1") |
| 252 | " Key code |
| 253 | let old_t_k1 = &t_k1 |
| 254 | let &t_k1 = "that" |
| 255 | call assert_match('t_k1.*that', execute("set termcap")) |
| 256 | let &t_k1 = old_t_k1 |
| 257 | endif |
| 258 | |
Bram Moolenaar | e2e4075 | 2020-09-04 21:18:46 +0200 | [diff] [blame] | 259 | call assert_fails('let x = &t_xx', 'E113:') |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 260 | let &t_xx = "yes" |
| 261 | call assert_equal("yes", &t_xx) |
| 262 | let &t_xx = "" |
Bram Moolenaar | e2e4075 | 2020-09-04 21:18:46 +0200 | [diff] [blame] | 263 | call assert_fails('let x = &t_xx', 'E113:') |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 264 | endfunc |
| 265 | |
| 266 | func Test_let_option_error() |
| 267 | let _w = &tw |
| 268 | let &tw = 80 |
zeertzjq | 4c7cb37 | 2023-06-14 16:39:54 +0100 | [diff] [blame] | 269 | call assert_fails('let &tw .= 1', ['E734:', 'E734:']) |
| 270 | call assert_fails('let &tw .= []', ['E734:', 'E734:']) |
| 271 | call assert_fails('let &tw = []', ['E745:', 'E745:']) |
| 272 | call assert_fails('let &tw += []', ['E745:', 'E745:']) |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 273 | call assert_equal(80, &tw) |
| 274 | let &tw = _w |
| 275 | |
zeertzjq | 4c7cb37 | 2023-06-14 16:39:54 +0100 | [diff] [blame] | 276 | let _w = &autoread |
| 277 | let &autoread = 1 |
| 278 | call assert_fails('let &autoread .= 1', ['E734:', 'E734:']) |
| 279 | call assert_fails('let &autoread .= []', ['E734:', 'E734:']) |
| 280 | call assert_fails('let &autoread = []', ['E745:', 'E745:']) |
| 281 | call assert_fails('let &autoread += []', ['E745:', 'E745:']) |
| 282 | call assert_equal(1, &autoread) |
| 283 | let &autoread = _w |
| 284 | |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 285 | let _w = &fillchars |
| 286 | let &fillchars = "vert:|" |
zeertzjq | 4c7cb37 | 2023-06-14 16:39:54 +0100 | [diff] [blame] | 287 | call assert_fails('let &fillchars += "diff:-"', ['E734:', 'E734:']) |
| 288 | call assert_fails('let &fillchars += []', ['E734:', 'E734:']) |
| 289 | call assert_fails('let &fillchars = []', ['E730:', 'E730:']) |
| 290 | call assert_fails('let &fillchars .= []', ['E730:', 'E730:']) |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 291 | call assert_equal("vert:|", &fillchars) |
| 292 | let &fillchars = _w |
zeertzjq | 4c7cb37 | 2023-06-14 16:39:54 +0100 | [diff] [blame] | 293 | |
| 294 | call assert_fails('let &nosuchoption = 1', ['E355:', 'E355:']) |
| 295 | call assert_fails('let &nosuchoption = ""', ['E355:', 'E355:']) |
| 296 | call assert_fails('let &nosuchoption = []', ['E355:', 'E355:']) |
| 297 | call assert_fails('let &t_xx = []', ['E730:', 'E730:']) |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 298 | endfunc |
| 299 | |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 300 | " Errors with the :let statement |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 301 | func Test_let_errors() |
| 302 | let s = 'abcd' |
| 303 | call assert_fails('let s[1] = 5', 'E689:') |
| 304 | |
| 305 | let l = [1, 2, 3] |
| 306 | call assert_fails('let l[:] = 5', 'E709:') |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 307 | |
Bram Moolenaar | b521766 | 2021-08-14 14:27:30 +0200 | [diff] [blame] | 308 | call assert_fails('let x:lnum=5', ['E121:', 'E121:']) |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 309 | call assert_fails('let v:=5', 'E461:') |
| 310 | call assert_fails('let [a]', 'E474:') |
| 311 | call assert_fails('let [a, b] = [', 'E697:') |
| 312 | call assert_fails('let [a, b] = [10, 20', 'E696:') |
| 313 | call assert_fails('let [a, b] = 10', 'E714:') |
| 314 | call assert_fails('let [a, , b] = [10, 20]', 'E475:') |
| 315 | call assert_fails('let [a, b&] = [10, 20]', 'E475:') |
| 316 | call assert_fails('let $ = 10', 'E475:') |
| 317 | call assert_fails('let $FOO[1] = "abc"', 'E18:') |
| 318 | call assert_fails('let &buftype[1] = "nofile"', 'E18:') |
| 319 | let s = "var" |
| 320 | let var = 1 |
Bram Moolenaar | ea04a6e | 2020-04-23 13:38:02 +0200 | [diff] [blame] | 321 | call assert_fails('let var += [1,2]', 'E734:') |
Bram Moolenaar | 3a3b10e | 2021-06-26 15:00:59 +0200 | [diff] [blame] | 322 | call assert_fails('let {s}.1 = 2', 'E1203:') |
Bram Moolenaar | 8b63313 | 2020-03-20 18:20:51 +0100 | [diff] [blame] | 323 | call assert_fails('let a[1] = 5', 'E121:') |
| 324 | let l = [[1,2]] |
| 325 | call assert_fails('let l[:][0] = [5]', 'E708:') |
| 326 | let d = {'k' : 4} |
Bram Moolenaar | 63be3d4 | 2020-07-23 13:11:37 +0200 | [diff] [blame] | 327 | call assert_fails('let d.# = 5', 'E488:') |
Bram Moolenaar | 58fb7c3 | 2021-04-05 20:59:41 +0200 | [diff] [blame] | 328 | call assert_fails('let d.m += 5', 'E716:') |
Bram Moolenaar | 9d8d0b5 | 2020-04-24 22:47:31 +0200 | [diff] [blame] | 329 | call assert_fails('let m = d[{]', 'E15:') |
Bram Moolenaar | 8b63313 | 2020-03-20 18:20:51 +0100 | [diff] [blame] | 330 | let l = [1, 2] |
| 331 | call assert_fails('let l[2] = 0', 'E684:') |
| 332 | call assert_fails('let l[0:1] = [1, 2, 3]', 'E710:') |
| 333 | call assert_fails('let l[-2:-3] = [3, 4]', 'E684:') |
| 334 | call assert_fails('let l[0:4] = [5, 6]', 'E711:') |
Bram Moolenaar | 9d8d0b5 | 2020-04-24 22:47:31 +0200 | [diff] [blame] | 335 | call assert_fails('let l -= 2', 'E734:') |
| 336 | call assert_fails('let l += 2', 'E734:') |
Bram Moolenaar | ea04a6e | 2020-04-23 13:38:02 +0200 | [diff] [blame] | 337 | call assert_fails('let g:["a;b"] = 10', 'E461:') |
| 338 | call assert_fails('let g:.min = function("max")', 'E704:') |
zeertzjq | 91c75d1 | 2022-11-05 20:21:58 +0000 | [diff] [blame] | 339 | call assert_fails('let g:cos = "" | let g:.cos = {-> 42}', 'E704:') |
Bram Moolenaar | 9d8d0b5 | 2020-04-24 22:47:31 +0200 | [diff] [blame] | 340 | if has('channel') |
| 341 | let ch = test_null_channel() |
| 342 | call assert_fails('let ch += 1', 'E734:') |
| 343 | endif |
Bram Moolenaar | fae55a9 | 2021-06-17 22:08:30 +0200 | [diff] [blame] | 344 | call assert_fails('let name = "a" .. "b",', 'E488: Trailing characters: ,') |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 345 | |
| 346 | " This test works only when the language is English |
| 347 | if v:lang == "C" || v:lang =~ '^[Ee]n' |
| 348 | call assert_fails('let [a ; b;] = [10, 20]', |
| 349 | \ 'Double ; in list of variables') |
| 350 | endif |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 351 | endfunc |
| 352 | |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 353 | func Test_let_heredoc_fails() |
| 354 | call assert_fails('let v =<< marker', 'E991:') |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 355 | try |
| 356 | exe "let v =<< TEXT | abc | TEXT" |
| 357 | call assert_report('No exception thrown') |
| 358 | catch /E488:/ |
| 359 | catch |
zeertzjq | a93d9cd | 2023-05-02 16:25:47 +0100 | [diff] [blame] | 360 | call assert_report('Caught exception: ' .. v:exception) |
| 361 | endtry |
| 362 | |
| 363 | try |
| 364 | let &commentstring =<< trim TEXT |
| 365 | change |
| 366 | insert |
| 367 | append |
| 368 | TEXT |
| 369 | call assert_report('No exception thrown') |
| 370 | catch /E730:/ |
| 371 | catch |
| 372 | call assert_report('Caught exception: ' .. v:exception) |
| 373 | endtry |
| 374 | |
| 375 | try |
| 376 | let $SOME_ENV_VAR =<< trim TEXT |
| 377 | change |
| 378 | insert |
| 379 | append |
| 380 | TEXT |
| 381 | call assert_report('No exception thrown') |
| 382 | catch /E730:/ |
| 383 | catch |
| 384 | call assert_report('Caught exception: ' .. v:exception) |
| 385 | endtry |
| 386 | |
| 387 | try |
| 388 | let @r =<< trim TEXT |
| 389 | change |
| 390 | insert |
| 391 | append |
| 392 | TEXT |
| 393 | call assert_report('No exception thrown') |
| 394 | catch /E730:/ |
| 395 | catch |
| 396 | call assert_report('Caught exception: ' .. v:exception) |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 397 | endtry |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 398 | |
zeertzjq | 9a91d2b | 2024-04-09 21:47:10 +0200 | [diff] [blame] | 399 | try |
| 400 | let @- =<< trim TEXT |
| 401 | change |
| 402 | insert |
| 403 | append |
| 404 | TEXT |
| 405 | call assert_report('No exception thrown') |
| 406 | catch /E730:/ |
| 407 | catch |
| 408 | call assert_report('Caught exception: ' .. v:exception) |
| 409 | endtry |
| 410 | |
| 411 | try |
zeertzjq | 1817ccd | 2024-04-10 17:37:47 +0200 | [diff] [blame] | 412 | let [] =<< trim TEXT |
| 413 | TEXT |
| 414 | call assert_report('No exception thrown') |
| 415 | catch /E475:/ |
| 416 | catch |
| 417 | call assert_report('Caught exception: ' .. v:exception) |
| 418 | endtry |
| 419 | |
| 420 | try |
zeertzjq | 9a91d2b | 2024-04-09 21:47:10 +0200 | [diff] [blame] | 421 | let [a b c] =<< trim TEXT |
zeertzjq | 9a91d2b | 2024-04-09 21:47:10 +0200 | [diff] [blame] | 422 | TEXT |
| 423 | call assert_report('No exception thrown') |
| 424 | catch /E475:/ |
| 425 | catch |
| 426 | call assert_report('Caught exception: ' .. v:exception) |
| 427 | endtry |
| 428 | |
| 429 | try |
| 430 | let [a; b; c] =<< trim TEXT |
zeertzjq | 9a91d2b | 2024-04-09 21:47:10 +0200 | [diff] [blame] | 431 | TEXT |
| 432 | call assert_report('No exception thrown') |
| 433 | catch /E452:/ |
| 434 | catch |
| 435 | call assert_report('Caught exception: ' .. v:exception) |
| 436 | endtry |
| 437 | |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 438 | let text =<< trim END |
| 439 | func WrongSyntax() |
| 440 | let v =<< that there |
| 441 | endfunc |
| 442 | END |
Bram Moolenaar | 7dd5a78 | 2022-09-29 21:01:57 +0100 | [diff] [blame] | 443 | call writefile(text, 'XheredocFail', 'D') |
Bram Moolenaar | b5b9480 | 2020-12-13 17:50:20 +0100 | [diff] [blame] | 444 | call assert_fails('source XheredocFail', 'E1145:') |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 445 | |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 446 | let text =<< trim CodeEnd |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 447 | func MissingEnd() |
| 448 | let v =<< END |
| 449 | endfunc |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 450 | CodeEnd |
Bram Moolenaar | 7dd5a78 | 2022-09-29 21:01:57 +0100 | [diff] [blame] | 451 | call writefile(text, 'XheredocWrong', 'D') |
Bram Moolenaar | b5b9480 | 2020-12-13 17:50:20 +0100 | [diff] [blame] | 452 | call assert_fails('source XheredocWrong', 'E1145:') |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 453 | |
| 454 | let text =<< trim TEXTend |
| 455 | let v =<< " comment |
| 456 | TEXTend |
Bram Moolenaar | 7dd5a78 | 2022-09-29 21:01:57 +0100 | [diff] [blame] | 457 | call writefile(text, 'XheredocNoMarker', 'D') |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 458 | call assert_fails('source XheredocNoMarker', 'E172:') |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 459 | |
| 460 | let text =<< trim TEXTend |
| 461 | let v =<< text |
| 462 | TEXTend |
Bram Moolenaar | 7dd5a78 | 2022-09-29 21:01:57 +0100 | [diff] [blame] | 463 | call writefile(text, 'XheredocBadMarker', 'D') |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 464 | call assert_fails('source XheredocBadMarker', 'E221:') |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 465 | |
Bram Moolenaar | 7dd5a78 | 2022-09-29 21:01:57 +0100 | [diff] [blame] | 466 | call writefile(['let v =<< TEXT', 'abc'], 'XheredocMissingMarker', 'D') |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 467 | call assert_fails('source XheredocMissingMarker', 'E990:') |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 468 | endfunc |
| 469 | |
Bram Moolenaar | ecaa75b | 2019-07-21 23:04:21 +0200 | [diff] [blame] | 470 | func Test_let_heredoc_trim_no_indent_marker() |
| 471 | let text =<< trim END |
| 472 | Text |
| 473 | with |
| 474 | indent |
| 475 | END |
| 476 | call assert_equal(['Text', 'with', 'indent'], text) |
| 477 | endfunc |
| 478 | |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 479 | func Test_let_interpolated() |
| 480 | call assert_equal('{text}', $'{{text}}') |
| 481 | call assert_equal('{{text}}', $'{{{{text}}}}') |
| 482 | let text = 'text' |
| 483 | call assert_equal('text{{', $'{text .. "{{"}') |
| 484 | call assert_equal('text{{', $"{text .. '{{'}") |
Bram Moolenaar | 0abc287 | 2022-05-10 13:24:30 +0100 | [diff] [blame] | 485 | call assert_equal('text{{', $'{text .. '{{'}') |
| 486 | call assert_equal('text{{', $"{text .. "{{"}") |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 487 | endfunc |
| 488 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 489 | " Test for the setting a variable using the heredoc syntax. |
| 490 | " Keep near the end, this messes up highlighting. |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 491 | func Test_let_heredoc() |
| 492 | let var1 =<< END |
| 493 | Some sample text |
| 494 | Text with indent |
| 495 | !@#$%^&*()-+_={}|[]\~`:";'<>?,./ |
| 496 | END |
| 497 | |
| 498 | call assert_equal(["Some sample text", "\tText with indent", " !@#$%^&*()-+_={}|[]\\~`:\";'<>?,./"], var1) |
| 499 | |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 500 | let var2 =<< XXX |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 501 | Editor |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 502 | XXX |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 503 | call assert_equal(['Editor'], var2) |
| 504 | |
| 505 | let var3 =<<END |
| 506 | END |
| 507 | call assert_equal([], var3) |
| 508 | |
| 509 | let var3 =<<END |
| 510 | vim |
| 511 | |
| 512 | end |
| 513 | END |
| 514 | END |
| 515 | END |
| 516 | call assert_equal(['vim', '', 'end', ' END', 'END '], var3) |
| 517 | |
| 518 | let var1 =<< trim END |
| 519 | Line1 |
| 520 | Line2 |
| 521 | Line3 |
| 522 | END |
| 523 | END |
| 524 | call assert_equal(['Line1', ' Line2', "\tLine3", ' END'], var1) |
| 525 | |
Bram Moolenaar | e7eb927 | 2019-06-24 00:58:07 +0200 | [diff] [blame] | 526 | let var1 =<< trim !!! |
| 527 | Line1 |
| 528 | line2 |
| 529 | Line3 |
| 530 | !!! |
| 531 | !!! |
| 532 | call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1) |
| 533 | |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 534 | let var1 =<< trim XX |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 535 | Line1 |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 536 | XX |
Bram Moolenaar | e7eb927 | 2019-06-24 00:58:07 +0200 | [diff] [blame] | 537 | call assert_equal(['Line1'], var1) |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 538 | |
zeertzjq | 1f5175d | 2024-04-13 17:52:26 +0200 | [diff] [blame] | 539 | let var1 =<< trim XX " comment |
| 540 | Line1 |
| 541 | Line2 |
| 542 | Line3 |
| 543 | XX |
| 544 | call assert_equal(['Line1', ' Line2', 'Line3'], var1) |
| 545 | |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 546 | " ignore "endfunc" |
| 547 | let var1 =<< END |
| 548 | something |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 549 | endfunc |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 550 | END |
| 551 | call assert_equal(['something', 'endfunc'], var1) |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 552 | |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 553 | " ignore "endfunc" with trim |
| 554 | let var1 =<< trim END |
| 555 | something |
| 556 | endfunc |
| 557 | END |
| 558 | call assert_equal(['something', 'endfunc'], var1) |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 559 | |
Bram Moolenaar | e96a249 | 2019-06-25 04:12:16 +0200 | [diff] [blame] | 560 | " not concatenate lines |
| 561 | let var1 =<< END |
| 562 | some |
| 563 | \thing |
| 564 | \ else |
| 565 | END |
| 566 | call assert_equal(['some', ' \thing', ' \ else'], var1) |
| 567 | |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 568 | " ignore "python << xx" |
| 569 | let var1 =<<END |
| 570 | something |
| 571 | python << xx |
| 572 | END |
| 573 | call assert_equal(['something', 'python << xx'], var1) |
| 574 | |
| 575 | " ignore "python << xx" with trim |
| 576 | let var1 =<< trim END |
| 577 | something |
| 578 | python << xx |
| 579 | END |
| 580 | call assert_equal(['something', 'python << xx'], var1) |
| 581 | |
| 582 | " ignore "append" |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 583 | let var1 =<< E |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 584 | something |
| 585 | app |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 586 | E |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 587 | call assert_equal(['something', 'app'], var1) |
| 588 | |
| 589 | " ignore "append" with trim |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 590 | let var1 =<< trim END |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 591 | something |
| 592 | app |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 593 | END |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 594 | call assert_equal(['something', 'app'], var1) |
Bram Moolenaar | b1ba9ab | 2019-10-16 23:34:42 +0200 | [diff] [blame] | 595 | |
| 596 | let check = [] |
| 597 | if 0 |
| 598 | let check =<< trim END |
| 599 | from heredoc |
| 600 | END |
| 601 | endif |
| 602 | call assert_equal([], check) |
Bram Moolenaar | 1e673b9 | 2019-11-06 15:02:50 +0100 | [diff] [blame] | 603 | |
| 604 | " unpack assignment |
| 605 | let [a, b, c] =<< END |
| 606 | x |
| 607 | \y |
| 608 | z |
| 609 | END |
| 610 | call assert_equal([' x', ' \y', ' z'], [a, b, c]) |
zeertzjq | a93d9cd | 2023-05-02 16:25:47 +0100 | [diff] [blame] | 611 | |
| 612 | " unpack assignment without whitespace |
| 613 | let[a,b,c]=<<END |
| 614 | change |
| 615 | insert |
| 616 | append |
| 617 | END |
| 618 | call assert_equal(['change', 'insert', 'append'], [a, b, c]) |
| 619 | |
zeertzjq | 9a91d2b | 2024-04-09 21:47:10 +0200 | [diff] [blame] | 620 | " unpack assignment with semicolon |
| 621 | let [a; b] =<< END |
| 622 | change |
| 623 | insert |
| 624 | append |
| 625 | END |
| 626 | call assert_equal(['change', ['insert', 'append']], [a, b]) |
| 627 | |
| 628 | " unpack assignment with registers |
| 629 | let [@/, @", @-] =<< END |
| 630 | change |
| 631 | insert |
| 632 | append |
| 633 | END |
| 634 | call assert_equal(['change', 'insert', 'append'], [@/, @", @-]) |
| 635 | |
zeertzjq | a93d9cd | 2023-05-02 16:25:47 +0100 | [diff] [blame] | 636 | " curly braces name and list slice assignment |
| 637 | let foo_3_bar = ['', '', ''] |
| 638 | let foo_{1 + 2}_bar[ : ] =<< END |
| 639 | change |
| 640 | insert |
| 641 | append |
| 642 | END |
| 643 | call assert_equal(['change', 'insert', 'append'], foo_3_bar) |
| 644 | |
| 645 | " dictionary key containing brackets and spaces |
| 646 | let d = {'abc] 123': 'baz'} |
| 647 | let d[d['abc] 123'] .. '{'] =<< END |
| 648 | change |
| 649 | insert |
| 650 | append |
| 651 | END |
| 652 | call assert_equal(['change', 'insert', 'append'], d['baz{']) |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 653 | endfunc |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 654 | |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 655 | " Test for evaluating Vim expressions in a heredoc using {expr} |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 656 | " Keep near the end, this messes up highlighting. |
| 657 | func Test_let_heredoc_eval() |
| 658 | let str = '' |
| 659 | let code =<< trim eval END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 660 | let a = {5 + 10} |
| 661 | let b = {min([10, 6])} + {max([4, 6])} |
| 662 | {str} |
| 663 | let c = "abc{str}d" |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 664 | END |
| 665 | call assert_equal(['let a = 15', 'let b = 6 + 6', '', 'let c = "abcd"'], code) |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 666 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 667 | let $TESTVAR = "Hello" |
| 668 | let code =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 669 | let s = "{$TESTVAR}" |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 670 | END |
| 671 | call assert_equal(['let s = "Hello"'], code) |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 672 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 673 | let code =<< eval END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 674 | let s = "{$TESTVAR}" |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 675 | END |
| 676 | call assert_equal([' let s = "Hello"'], code) |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 677 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 678 | let a = 10 |
| 679 | let data =<< eval END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 680 | {a} |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 681 | END |
| 682 | call assert_equal(['10'], data) |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 683 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 684 | let x = 'X' |
| 685 | let code =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 686 | let a = {{abc}} |
| 687 | let b = {x} |
| 688 | let c = {{ |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 689 | END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 690 | call assert_equal(['let a = {abc}', 'let b = X', 'let c = {'], code) |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 691 | |
Yegappan Lakshmanan | f01493c | 2024-04-14 23:21:02 +0200 | [diff] [blame] | 692 | " Evaluate a dictionary |
| 693 | let d1 = #{a: 10, b: 'ss', c: {}} |
| 694 | let code =<< eval trim END |
| 695 | let d2 = {d1} |
| 696 | END |
| 697 | call assert_equal(["let d2 = {'a': 10, 'b': 'ss', 'c': {}}"], code) |
| 698 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 699 | let code = 'xxx' |
| 700 | let code =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 701 | let n = {5 + |
| 702 | 6} |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 703 | END |
| 704 | call assert_equal('xxx', code) |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 705 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 706 | let code =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 707 | let n = {min([1, 2]} + {max([3, 4])} |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 708 | END |
| 709 | call assert_equal('xxx', code) |
| 710 | |
| 711 | let lines =<< trim LINES |
| 712 | let text =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 713 | let b = { |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 714 | END |
| 715 | LINES |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 716 | call v9.CheckScriptFailure(lines, 'E1279:') |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 717 | |
| 718 | let lines =<< trim LINES |
| 719 | let text =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 720 | let b = {abc |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 721 | END |
| 722 | LINES |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 723 | call v9.CheckScriptFailure(lines, 'E1279:') |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 724 | |
| 725 | let lines =<< trim LINES |
| 726 | let text =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 727 | let b = {} |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 728 | END |
| 729 | LINES |
| 730 | call v9.CheckScriptFailure(lines, 'E15:') |
| 731 | |
zeertzjq | 3d93630 | 2024-04-14 18:49:56 +0200 | [diff] [blame] | 732 | " Test for using heredoc in a single string using :execute or execute() |
| 733 | for [cmd, res] in items({ |
| 734 | \ "let x =<< trim END\n one\n two\nEND": ['one', 'two'], |
| 735 | \ "let x =<< trim END\n one\n two\nEND": ['one', ' two'], |
| 736 | \ " let x =<< trim END\n one\n two\n END": ['one', 'two'], |
| 737 | \ " let x =<< trim END\n one\n two\n END": ['one', ' two'], |
| 738 | \ "let x =<< END\n one\n two\nEND": [' one', ' two'], |
| 739 | \ "let x =<< END\none\ntwo\nEND": ['one', 'two'], |
| 740 | \ "let x =<< END \" comment\none\ntwo\nEND": ['one', 'two'], |
| 741 | \ }) |
| 742 | execute cmd |
| 743 | call assert_equal(res, x) |
| 744 | unlet x |
| 745 | call assert_equal($"\n{string(res)}", execute($"{cmd}\necho x")) |
| 746 | unlet x |
| 747 | endfor |
| 748 | for [cmd, err] in items({ |
| 749 | \ "let x =<<\none\ntwo": "E172:", |
| 750 | \ "let x =<< trim\n one\n two": "E172:", |
| 751 | \ "let x =<< end\none\ntwo\nend": "E221:", |
| 752 | \ "let x =<< END\none\ntwo": "E990: Missing end marker 'END'", |
| 753 | \ "let x =<< END !\none\ntwo\nEND": "E488: Trailing characters: !", |
| 754 | \ "let x =<< eval END\none\ntwo{y}\nEND": "E121: Undefined variable: y", |
| 755 | \ }) |
| 756 | call assert_fails('execute cmd', err) |
| 757 | call assert_fails('call execute(cmd)', err) |
| 758 | endfor |
Yegappan Lakshmanan | e74cad3 | 2024-04-12 18:48:35 +0200 | [diff] [blame] | 759 | |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 760 | " skipped heredoc |
| 761 | if 0 |
| 762 | let msg =<< trim eval END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 763 | n is: {n} |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 764 | END |
| 765 | endif |
| 766 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 767 | " Test for sourcing a script containing a heredoc with invalid expression. |
| 768 | " Variable assignment should fail, if expression evaluation fails |
| 769 | new |
| 770 | let g:Xvar = 'test' |
| 771 | let g:b = 10 |
| 772 | let lines =<< trim END |
| 773 | let Xvar =<< eval CODE |
| 774 | let a = 1 |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 775 | let b = {5+} |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 776 | let c = 2 |
| 777 | CODE |
| 778 | let g:Count += 1 |
| 779 | END |
| 780 | call setline(1, lines) |
| 781 | let g:Count = 0 |
| 782 | call assert_fails('source', 'E15:') |
| 783 | call assert_equal(1, g:Count) |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 784 | call setline(3, 'let b = {abc}') |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 785 | call assert_fails('source', 'E121:') |
| 786 | call assert_equal(2, g:Count) |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 787 | call setline(3, 'let b = {abc} + {min([9, 4])} + 2') |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 788 | call assert_fails('source', 'E121:') |
| 789 | call assert_equal(3, g:Count) |
| 790 | call assert_equal('test', g:Xvar) |
| 791 | call assert_equal(10, g:b) |
| 792 | bw! |
| 793 | endfunc |
| 794 | |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 795 | " vim: shiftwidth=2 sts=2 expandtab |