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 |
Bram Moolenaar | e2e4075 | 2020-09-04 21:18:46 +0200 | [diff] [blame] | 269 | call assert_fails('let &tw .= 1', 'E734:') |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 270 | call assert_equal(80, &tw) |
| 271 | let &tw = _w |
| 272 | |
| 273 | let _w = &fillchars |
| 274 | let &fillchars = "vert:|" |
Bram Moolenaar | e2e4075 | 2020-09-04 21:18:46 +0200 | [diff] [blame] | 275 | call assert_fails('let &fillchars += "diff:-"', 'E734:') |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 276 | call assert_equal("vert:|", &fillchars) |
| 277 | let &fillchars = _w |
| 278 | endfunc |
| 279 | |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 280 | " Errors with the :let statement |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 281 | func Test_let_errors() |
| 282 | let s = 'abcd' |
| 283 | call assert_fails('let s[1] = 5', 'E689:') |
| 284 | |
| 285 | let l = [1, 2, 3] |
| 286 | call assert_fails('let l[:] = 5', 'E709:') |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 287 | |
Bram Moolenaar | b521766 | 2021-08-14 14:27:30 +0200 | [diff] [blame] | 288 | call assert_fails('let x:lnum=5', ['E121:', 'E121:']) |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 289 | call assert_fails('let v:=5', 'E461:') |
| 290 | call assert_fails('let [a]', 'E474:') |
| 291 | call assert_fails('let [a, b] = [', 'E697:') |
| 292 | call assert_fails('let [a, b] = [10, 20', 'E696:') |
| 293 | call assert_fails('let [a, b] = 10', 'E714:') |
| 294 | call assert_fails('let [a, , b] = [10, 20]', 'E475:') |
| 295 | call assert_fails('let [a, b&] = [10, 20]', 'E475:') |
| 296 | call assert_fails('let $ = 10', 'E475:') |
| 297 | call assert_fails('let $FOO[1] = "abc"', 'E18:') |
| 298 | call assert_fails('let &buftype[1] = "nofile"', 'E18:') |
| 299 | let s = "var" |
| 300 | let var = 1 |
Bram Moolenaar | ea04a6e | 2020-04-23 13:38:02 +0200 | [diff] [blame] | 301 | call assert_fails('let var += [1,2]', 'E734:') |
Bram Moolenaar | 3a3b10e | 2021-06-26 15:00:59 +0200 | [diff] [blame] | 302 | call assert_fails('let {s}.1 = 2', 'E1203:') |
Bram Moolenaar | 8b63313 | 2020-03-20 18:20:51 +0100 | [diff] [blame] | 303 | call assert_fails('let a[1] = 5', 'E121:') |
| 304 | let l = [[1,2]] |
| 305 | call assert_fails('let l[:][0] = [5]', 'E708:') |
| 306 | let d = {'k' : 4} |
Bram Moolenaar | 63be3d4 | 2020-07-23 13:11:37 +0200 | [diff] [blame] | 307 | call assert_fails('let d.# = 5', 'E488:') |
Bram Moolenaar | 58fb7c3 | 2021-04-05 20:59:41 +0200 | [diff] [blame] | 308 | call assert_fails('let d.m += 5', 'E716:') |
Bram Moolenaar | 9d8d0b5 | 2020-04-24 22:47:31 +0200 | [diff] [blame] | 309 | call assert_fails('let m = d[{]', 'E15:') |
Bram Moolenaar | 8b63313 | 2020-03-20 18:20:51 +0100 | [diff] [blame] | 310 | let l = [1, 2] |
| 311 | call assert_fails('let l[2] = 0', 'E684:') |
| 312 | call assert_fails('let l[0:1] = [1, 2, 3]', 'E710:') |
| 313 | call assert_fails('let l[-2:-3] = [3, 4]', 'E684:') |
| 314 | call assert_fails('let l[0:4] = [5, 6]', 'E711:') |
Bram Moolenaar | 9d8d0b5 | 2020-04-24 22:47:31 +0200 | [diff] [blame] | 315 | call assert_fails('let l -= 2', 'E734:') |
| 316 | call assert_fails('let l += 2', 'E734:') |
Bram Moolenaar | ea04a6e | 2020-04-23 13:38:02 +0200 | [diff] [blame] | 317 | call assert_fails('let g:["a;b"] = 10', 'E461:') |
| 318 | call assert_fails('let g:.min = function("max")', 'E704:') |
Bram Moolenaar | 9d8d0b5 | 2020-04-24 22:47:31 +0200 | [diff] [blame] | 319 | if has('channel') |
| 320 | let ch = test_null_channel() |
| 321 | call assert_fails('let ch += 1', 'E734:') |
| 322 | endif |
Bram Moolenaar | fae55a9 | 2021-06-17 22:08:30 +0200 | [diff] [blame] | 323 | call assert_fails('let name = "a" .. "b",', 'E488: Trailing characters: ,') |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 324 | |
| 325 | " This test works only when the language is English |
| 326 | if v:lang == "C" || v:lang =~ '^[Ee]n' |
| 327 | call assert_fails('let [a ; b;] = [10, 20]', |
| 328 | \ 'Double ; in list of variables') |
| 329 | endif |
Bram Moolenaar | fcf8a87 | 2019-11-06 15:22:00 +0100 | [diff] [blame] | 330 | endfunc |
| 331 | |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 332 | func Test_let_heredoc_fails() |
| 333 | call assert_fails('let v =<< marker', 'E991:') |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 334 | try |
| 335 | exe "let v =<< TEXT | abc | TEXT" |
| 336 | call assert_report('No exception thrown') |
| 337 | catch /E488:/ |
| 338 | catch |
| 339 | call assert_report("Caught exception: " .. v:exception) |
| 340 | endtry |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 341 | |
| 342 | let text =<< trim END |
| 343 | func WrongSyntax() |
| 344 | let v =<< that there |
| 345 | endfunc |
| 346 | END |
Bram Moolenaar | 7dd5a78 | 2022-09-29 21:01:57 +0100 | [diff] [blame] | 347 | call writefile(text, 'XheredocFail', 'D') |
Bram Moolenaar | b5b9480 | 2020-12-13 17:50:20 +0100 | [diff] [blame] | 348 | call assert_fails('source XheredocFail', 'E1145:') |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 349 | |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 350 | let text =<< trim CodeEnd |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 351 | func MissingEnd() |
| 352 | let v =<< END |
| 353 | endfunc |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 354 | CodeEnd |
Bram Moolenaar | 7dd5a78 | 2022-09-29 21:01:57 +0100 | [diff] [blame] | 355 | call writefile(text, 'XheredocWrong', 'D') |
Bram Moolenaar | b5b9480 | 2020-12-13 17:50:20 +0100 | [diff] [blame] | 356 | call assert_fails('source XheredocWrong', 'E1145:') |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 357 | |
| 358 | let text =<< trim TEXTend |
| 359 | let v =<< " comment |
| 360 | TEXTend |
Bram Moolenaar | 7dd5a78 | 2022-09-29 21:01:57 +0100 | [diff] [blame] | 361 | call writefile(text, 'XheredocNoMarker', 'D') |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 362 | call assert_fails('source XheredocNoMarker', 'E172:') |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 363 | |
| 364 | let text =<< trim TEXTend |
| 365 | let v =<< text |
| 366 | TEXTend |
Bram Moolenaar | 7dd5a78 | 2022-09-29 21:01:57 +0100 | [diff] [blame] | 367 | call writefile(text, 'XheredocBadMarker', 'D') |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 368 | call assert_fails('source XheredocBadMarker', 'E221:') |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 369 | |
Bram Moolenaar | 7dd5a78 | 2022-09-29 21:01:57 +0100 | [diff] [blame] | 370 | call writefile(['let v =<< TEXT', 'abc'], 'XheredocMissingMarker', 'D') |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 371 | call assert_fails('source XheredocMissingMarker', 'E990:') |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 372 | endfunc |
| 373 | |
Bram Moolenaar | ecaa75b | 2019-07-21 23:04:21 +0200 | [diff] [blame] | 374 | func Test_let_heredoc_trim_no_indent_marker() |
| 375 | let text =<< trim END |
| 376 | Text |
| 377 | with |
| 378 | indent |
| 379 | END |
| 380 | call assert_equal(['Text', 'with', 'indent'], text) |
| 381 | endfunc |
| 382 | |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 383 | func Test_let_interpolated() |
| 384 | call assert_equal('{text}', $'{{text}}') |
| 385 | call assert_equal('{{text}}', $'{{{{text}}}}') |
| 386 | let text = 'text' |
| 387 | call assert_equal('text{{', $'{text .. "{{"}') |
| 388 | call assert_equal('text{{', $"{text .. '{{'}") |
Bram Moolenaar | 0abc287 | 2022-05-10 13:24:30 +0100 | [diff] [blame] | 389 | call assert_equal('text{{', $'{text .. '{{'}') |
| 390 | call assert_equal('text{{', $"{text .. "{{"}") |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 391 | endfunc |
| 392 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 393 | " Test for the setting a variable using the heredoc syntax. |
| 394 | " Keep near the end, this messes up highlighting. |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 395 | func Test_let_heredoc() |
| 396 | let var1 =<< END |
| 397 | Some sample text |
| 398 | Text with indent |
| 399 | !@#$%^&*()-+_={}|[]\~`:";'<>?,./ |
| 400 | END |
| 401 | |
| 402 | call assert_equal(["Some sample text", "\tText with indent", " !@#$%^&*()-+_={}|[]\\~`:\";'<>?,./"], var1) |
| 403 | |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 404 | let var2 =<< XXX |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 405 | Editor |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 406 | XXX |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 407 | call assert_equal(['Editor'], var2) |
| 408 | |
| 409 | let var3 =<<END |
| 410 | END |
| 411 | call assert_equal([], var3) |
| 412 | |
| 413 | let var3 =<<END |
| 414 | vim |
| 415 | |
| 416 | end |
| 417 | END |
| 418 | END |
| 419 | END |
| 420 | call assert_equal(['vim', '', 'end', ' END', 'END '], var3) |
| 421 | |
| 422 | let var1 =<< trim END |
| 423 | Line1 |
| 424 | Line2 |
| 425 | Line3 |
| 426 | END |
| 427 | END |
| 428 | call assert_equal(['Line1', ' Line2', "\tLine3", ' END'], var1) |
| 429 | |
Bram Moolenaar | e7eb927 | 2019-06-24 00:58:07 +0200 | [diff] [blame] | 430 | let var1 =<< trim !!! |
| 431 | Line1 |
| 432 | line2 |
| 433 | Line3 |
| 434 | !!! |
| 435 | !!! |
| 436 | call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1) |
| 437 | |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 438 | let var1 =<< trim XX |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 439 | Line1 |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 440 | XX |
Bram Moolenaar | e7eb927 | 2019-06-24 00:58:07 +0200 | [diff] [blame] | 441 | call assert_equal(['Line1'], var1) |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 442 | |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 443 | " ignore "endfunc" |
| 444 | let var1 =<< END |
| 445 | something |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 446 | endfunc |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 447 | END |
| 448 | call assert_equal(['something', 'endfunc'], var1) |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 449 | |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 450 | " ignore "endfunc" with trim |
| 451 | let var1 =<< trim END |
| 452 | something |
| 453 | endfunc |
| 454 | END |
| 455 | call assert_equal(['something', 'endfunc'], var1) |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 456 | |
Bram Moolenaar | e96a249 | 2019-06-25 04:12:16 +0200 | [diff] [blame] | 457 | " not concatenate lines |
| 458 | let var1 =<< END |
| 459 | some |
| 460 | \thing |
| 461 | \ else |
| 462 | END |
| 463 | call assert_equal(['some', ' \thing', ' \ else'], var1) |
| 464 | |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 465 | " ignore "python << xx" |
| 466 | let var1 =<<END |
| 467 | something |
| 468 | python << xx |
| 469 | END |
| 470 | call assert_equal(['something', 'python << xx'], var1) |
| 471 | |
| 472 | " ignore "python << xx" with trim |
| 473 | let var1 =<< trim END |
| 474 | something |
| 475 | python << xx |
| 476 | END |
| 477 | call assert_equal(['something', 'python << xx'], var1) |
| 478 | |
| 479 | " ignore "append" |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 480 | let var1 =<< E |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 481 | something |
| 482 | app |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 483 | E |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 484 | call assert_equal(['something', 'app'], var1) |
| 485 | |
| 486 | " ignore "append" with trim |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 487 | let var1 =<< trim END |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 488 | something |
| 489 | app |
Bram Moolenaar | 2458200 | 2019-07-21 14:14:26 +0200 | [diff] [blame] | 490 | END |
Bram Moolenaar | 8471e57 | 2019-05-19 21:37:18 +0200 | [diff] [blame] | 491 | call assert_equal(['something', 'app'], var1) |
Bram Moolenaar | b1ba9ab | 2019-10-16 23:34:42 +0200 | [diff] [blame] | 492 | |
| 493 | let check = [] |
| 494 | if 0 |
| 495 | let check =<< trim END |
| 496 | from heredoc |
| 497 | END |
| 498 | endif |
| 499 | call assert_equal([], check) |
Bram Moolenaar | 1e673b9 | 2019-11-06 15:02:50 +0100 | [diff] [blame] | 500 | |
| 501 | " unpack assignment |
| 502 | let [a, b, c] =<< END |
| 503 | x |
| 504 | \y |
| 505 | z |
| 506 | END |
| 507 | call assert_equal([' x', ' \y', ' z'], [a, b, c]) |
Bram Moolenaar | f5842c5 | 2019-05-19 18:41:26 +0200 | [diff] [blame] | 508 | endfunc |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 509 | |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 510 | " Test for evaluating Vim expressions in a heredoc using {expr} |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 511 | " Keep near the end, this messes up highlighting. |
| 512 | func Test_let_heredoc_eval() |
| 513 | let str = '' |
| 514 | let code =<< trim eval END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 515 | let a = {5 + 10} |
| 516 | let b = {min([10, 6])} + {max([4, 6])} |
| 517 | {str} |
| 518 | let c = "abc{str}d" |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 519 | END |
| 520 | 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] | 521 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 522 | let $TESTVAR = "Hello" |
| 523 | let code =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 524 | let s = "{$TESTVAR}" |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 525 | END |
| 526 | call assert_equal(['let s = "Hello"'], code) |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 527 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 528 | let code =<< eval END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 529 | let s = "{$TESTVAR}" |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 530 | END |
| 531 | call assert_equal([' let s = "Hello"'], code) |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 532 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 533 | let a = 10 |
| 534 | let data =<< eval END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 535 | {a} |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 536 | END |
| 537 | call assert_equal(['10'], data) |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 538 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 539 | let x = 'X' |
| 540 | let code =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 541 | let a = {{abc}} |
| 542 | let b = {x} |
| 543 | let c = {{ |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 544 | END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 545 | call assert_equal(['let a = {abc}', 'let b = X', 'let c = {'], code) |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 546 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 547 | let code = 'xxx' |
| 548 | let code =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 549 | let n = {5 + |
| 550 | 6} |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 551 | END |
| 552 | call assert_equal('xxx', code) |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 553 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 554 | let code =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 555 | let n = {min([1, 2]} + {max([3, 4])} |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 556 | END |
| 557 | call assert_equal('xxx', code) |
| 558 | |
| 559 | let lines =<< trim LINES |
| 560 | let text =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 561 | let b = { |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 562 | END |
| 563 | LINES |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 564 | call v9.CheckScriptFailure(lines, 'E1279:') |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 565 | |
| 566 | let lines =<< trim LINES |
| 567 | let text =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 568 | let b = {abc |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 569 | END |
| 570 | LINES |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 571 | call v9.CheckScriptFailure(lines, 'E1279:') |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 572 | |
| 573 | let lines =<< trim LINES |
| 574 | let text =<< eval trim END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 575 | let b = {} |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 576 | END |
| 577 | LINES |
| 578 | call v9.CheckScriptFailure(lines, 'E15:') |
| 579 | |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 580 | " skipped heredoc |
| 581 | if 0 |
| 582 | let msg =<< trim eval END |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 583 | n is: {n} |
Bram Moolenaar | 05c7f5d | 2022-04-28 16:51:41 +0100 | [diff] [blame] | 584 | END |
| 585 | endif |
| 586 | |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 587 | " Test for sourcing a script containing a heredoc with invalid expression. |
| 588 | " Variable assignment should fail, if expression evaluation fails |
| 589 | new |
| 590 | let g:Xvar = 'test' |
| 591 | let g:b = 10 |
| 592 | let lines =<< trim END |
| 593 | let Xvar =<< eval CODE |
| 594 | let a = 1 |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 595 | let b = {5+} |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 596 | let c = 2 |
| 597 | CODE |
| 598 | let g:Count += 1 |
| 599 | END |
| 600 | call setline(1, lines) |
| 601 | let g:Count = 0 |
| 602 | call assert_fails('source', 'E15:') |
| 603 | call assert_equal(1, g:Count) |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 604 | call setline(3, 'let b = {abc}') |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 605 | call assert_fails('source', 'E121:') |
| 606 | call assert_equal(2, g:Count) |
LemonBoy | 2eaef10 | 2022-05-06 13:14:50 +0100 | [diff] [blame] | 607 | call setline(3, 'let b = {abc} + {min([9, 4])} + 2') |
Yegappan Lakshmanan | efbfa86 | 2022-04-17 12:47:40 +0100 | [diff] [blame] | 608 | call assert_fails('source', 'E121:') |
| 609 | call assert_equal(3, g:Count) |
| 610 | call assert_equal('test', g:Xvar) |
| 611 | call assert_equal(10, g:b) |
| 612 | bw! |
| 613 | endfunc |
| 614 | |
Bram Moolenaar | 8dfcce3 | 2020-03-18 19:32:26 +0100 | [diff] [blame] | 615 | " vim: shiftwidth=2 sts=2 expandtab |