blob: e0d543c6ce396f16be2ecc80c38c817acfd82654 [file] [log] [blame]
Bram Moolenaar4a137b42017-08-04 22:37:11 +02001" Tests for the :let command.
2
3func Test_let()
4 " Test to not autoload when assigning. It causes internal error.
5 set runtimepath+=./sautest
6 let Test104#numvar = function('tr')
7 call assert_equal("function('tr')", string(Test104#numvar))
8
9 let a = 1
10 let b = 2
11
12 let out = execute('let a b')
13 let s = "\na #1\nb #2"
14 call assert_equal(s, out)
15
16 let out = execute('let {0 == 1 ? "a" : "b"}')
17 let s = "\nb #2"
18 call assert_equal(s, out)
19
20 let out = execute('let {0 == 1 ? "a" : "b"} a')
21 let s = "\nb #2\na #1"
22 call assert_equal(s, out)
23
24 let out = execute('let a {0 == 1 ? "a" : "b"}')
25 let s = "\na #1\nb #2"
26 call assert_equal(s, out)
Bram Moolenaar8f76e6b2019-11-26 16:50:30 +010027
Bram Moolenaar8dfcce32020-03-18 19:32:26 +010028 " Test for displaying a string variable
29 let s = 'vim'
30 let out = execute('let s')
31 let s = "\ns vim"
32 call assert_equal(s, out)
33
34 " Test for displaying a list variable
35 let l = [1, 2]
36 let out = execute('let l')
37 let s = "\nl [1, 2]"
38 call assert_equal(s, out)
39
40 " Test for displaying a dict variable
41 let d = {'k' : 'v'}
42 let out = execute('let d')
43 let s = "\nd {'k': 'v'}"
44 call assert_equal(s, out)
45
46 " Test for displaying a function reference variable
47 let F = function('min')
48 let out = execute('let F')
49 let s = "\nF *min()"
50 call assert_equal(s, out)
51
Bram Moolenaar8f76e6b2019-11-26 16:50:30 +010052 let x = 0
53 if 0 | let x = 1 | endif
54 call assert_equal(0, x)
Bram Moolenaar8dfcce32020-03-18 19:32:26 +010055
56 " Display a list item using an out of range index
57 let l = [10]
58 call assert_fails('let l[1]', 'E684:')
59
60 " List special variable dictionaries
61 let g:Test_Global_Var = 5
62 call assert_match("\nTest_Global_Var #5", execute('let g:'))
63 unlet g:Test_Global_Var
64
65 let b:Test_Buf_Var = 8
66 call assert_match("\nb:Test_Buf_Var #8", execute('let b:'))
67 unlet b:Test_Buf_Var
68
69 let w:Test_Win_Var = 'foo'
70 call assert_equal("\nw:Test_Win_Var foo", execute('let w:'))
71 unlet w:Test_Win_Var
72
73 let t:Test_Tab_Var = 'bar'
74 call assert_equal("\nt:Test_Tab_Var bar", execute('let t:'))
75 unlet t:Test_Tab_Var
76
77 let s:Test_Script_Var = [7]
78 call assert_match("\ns:Test_Script_Var \\[7]", execute('let s:'))
79 unlet s:Test_Script_Var
80
81 let l:Test_Local_Var = {'k' : 5}
82 call assert_match("\nl:Test_Local_Var {'k': 5}", execute('let l:'))
83 call assert_match("v:errors []", execute('let v:'))
Bram Moolenaar4a137b42017-08-04 22:37:11 +020084endfunc
Bram Moolenaar31b81602019-02-10 22:14:27 +010085
86func s:set_arg1(a) abort
87 let a:a = 1
88endfunction
89
90func s:set_arg2(a) abort
91 let a:b = 1
92endfunction
93
94func s:set_arg3(a) abort
95 let b = a:
96 let b['a'] = 1
97endfunction
98
99func s:set_arg4(a) abort
100 let b = a:
101 let b['a'] = 1
102endfunction
103
104func s:set_arg5(a) abort
105 let b = a:
106 let b['a'][0] = 1
107endfunction
108
109func s:set_arg6(a) abort
110 let a:a[0] = 1
111endfunction
112
113func s:set_arg7(a) abort
114 call extend(a:, {'a': 1})
115endfunction
116
117func s:set_arg8(a) abort
118 call extend(a:, {'b': 1})
119endfunction
120
121func s:set_arg9(a) abort
122 let a:['b'] = 1
123endfunction
124
125func s:set_arg10(a) abort
126 let b = a:
127 call extend(b, {'a': 1})
128endfunction
129
130func s:set_arg11(a) abort
131 let b = a:
132 call extend(b, {'b': 1})
133endfunction
134
135func s:set_arg12(a) abort
136 let b = a:
137 let b['b'] = 1
138endfunction
139
140func Test_let_arg_fail()
141 call assert_fails('call s:set_arg1(1)', 'E46:')
142 call assert_fails('call s:set_arg2(1)', 'E461:')
143 call assert_fails('call s:set_arg3(1)', 'E46:')
144 call assert_fails('call s:set_arg4(1)', 'E46:')
145 call assert_fails('call s:set_arg5(1)', 'E46:')
146 call s:set_arg6([0])
147 call assert_fails('call s:set_arg7(1)', 'E742:')
148 call assert_fails('call s:set_arg8(1)', 'E742:')
149 call assert_fails('call s:set_arg9(1)', 'E461:')
150 call assert_fails('call s:set_arg10(1)', 'E742:')
151 call assert_fails('call s:set_arg11(1)', 'E742:')
152 call assert_fails('call s:set_arg12(1)', 'E461:')
153endfunction
154
155func s:set_varg1(...) abort
156 let a:000 = []
157endfunction
158
159func s:set_varg2(...) abort
160 let a:000[0] = 1
161endfunction
162
163func s:set_varg3(...) abort
164 let a:000 += [1]
165endfunction
166
167func s:set_varg4(...) abort
168 call add(a:000, 1)
169endfunction
170
171func s:set_varg5(...) abort
172 let a:000[0][0] = 1
173endfunction
174
175func s:set_varg6(...) abort
176 let b = a:000
177 let b[0] = 1
178endfunction
179
180func s:set_varg7(...) abort
181 let b = a:000
182 let b += [1]
183endfunction
184
185func s:set_varg8(...) abort
186 let b = a:000
187 call add(b, 1)
188endfunction
189
190func s:set_varg9(...) abort
191 let b = a:000
192 let b[0][0] = 1
193endfunction
194
195func Test_let_varg_fail()
196 call assert_fails('call s:set_varg1(1)', 'E46:')
197 call assert_fails('call s:set_varg2(1)', 'E742:')
198 call assert_fails('call s:set_varg3(1)', 'E46:')
199 call assert_fails('call s:set_varg4(1)', 'E742:')
200 call s:set_varg5([0])
201 call assert_fails('call s:set_varg6(1)', 'E742:')
Bram Moolenaar05c00c02019-02-11 22:00:11 +0100202 call assert_fails('call s:set_varg7(1)', 'E742:')
Bram Moolenaar31b81602019-02-10 22:14:27 +0100203 call assert_fails('call s:set_varg8(1)', 'E742:')
204 call s:set_varg9([0])
205endfunction
Bram Moolenaarf0908e62019-03-30 20:11:50 +0100206
207func Test_let_utf8_environment()
208 let $a = 'ĀĒĪŌŪあいうえお'
209 call assert_equal('ĀĒĪŌŪあいうえお', $a)
210endfunc
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200211
Bram Moolenaarfcf8a872019-11-06 15:22:00 +0100212func Test_let_no_type_checking()
213 let v = 1
214 let v = [1,2,3]
215 let v = {'a': 1, 'b': 2}
216 let v = 3.4
217 let v = 'hello'
218endfunc
219
220func Test_let_termcap()
221 " Terminal code
222 let old_t_te = &t_te
223 let &t_te = "\<Esc>[yes;"
224 call assert_match('t_te.*^[[yes;', execute("set termcap"))
225 let &t_te = old_t_te
226
227 if exists("+t_k1")
228 " Key code
229 let old_t_k1 = &t_k1
230 let &t_k1 = "that"
231 call assert_match('t_k1.*that', execute("set termcap"))
232 let &t_k1 = old_t_k1
233 endif
234
235 call assert_fails('let x = &t_xx', 'E113')
236 let &t_xx = "yes"
237 call assert_equal("yes", &t_xx)
238 let &t_xx = ""
239 call assert_fails('let x = &t_xx', 'E113')
240endfunc
241
242func Test_let_option_error()
243 let _w = &tw
244 let &tw = 80
245 call assert_fails('let &tw .= 1', 'E734')
246 call assert_equal(80, &tw)
247 let &tw = _w
248
249 let _w = &fillchars
250 let &fillchars = "vert:|"
251 call assert_fails('let &fillchars += "diff:-"', 'E734')
252 call assert_equal("vert:|", &fillchars)
253 let &fillchars = _w
254endfunc
255
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100256" Errors with the :let statement
Bram Moolenaarfcf8a872019-11-06 15:22:00 +0100257func Test_let_errors()
258 let s = 'abcd'
259 call assert_fails('let s[1] = 5', 'E689:')
260
261 let l = [1, 2, 3]
262 call assert_fails('let l[:] = 5', 'E709:')
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100263
264 call assert_fails('let x:lnum=5', 'E488:')
265 call assert_fails('let v:=5', 'E461:')
266 call assert_fails('let [a]', 'E474:')
267 call assert_fails('let [a, b] = [', 'E697:')
268 call assert_fails('let [a, b] = [10, 20', 'E696:')
269 call assert_fails('let [a, b] = 10', 'E714:')
270 call assert_fails('let [a, , b] = [10, 20]', 'E475:')
271 call assert_fails('let [a, b&] = [10, 20]', 'E475:')
272 call assert_fails('let $ = 10', 'E475:')
273 call assert_fails('let $FOO[1] = "abc"', 'E18:')
274 call assert_fails('let &buftype[1] = "nofile"', 'E18:')
275 let s = "var"
276 let var = 1
Bram Moolenaarea04a6e2020-04-23 13:38:02 +0200277 call assert_fails('let var += [1,2]', 'E734:')
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100278 call assert_fails('let {s}.1 = 2', 'E18:')
Bram Moolenaar8b633132020-03-20 18:20:51 +0100279 call assert_fails('let a[1] = 5', 'E121:')
280 let l = [[1,2]]
281 call assert_fails('let l[:][0] = [5]', 'E708:')
282 let d = {'k' : 4}
283 call assert_fails('let d.# = 5', 'E713:')
284 call assert_fails('let d.m += 5', 'E734:')
285 let l = [1, 2]
286 call assert_fails('let l[2] = 0', 'E684:')
287 call assert_fails('let l[0:1] = [1, 2, 3]', 'E710:')
288 call assert_fails('let l[-2:-3] = [3, 4]', 'E684:')
289 call assert_fails('let l[0:4] = [5, 6]', 'E711:')
Bram Moolenaarea04a6e2020-04-23 13:38:02 +0200290 call assert_fails('let g:["a;b"] = 10', 'E461:')
291 call assert_fails('let g:.min = function("max")', 'E704:')
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100292
293 " This test works only when the language is English
294 if v:lang == "C" || v:lang =~ '^[Ee]n'
295 call assert_fails('let [a ; b;] = [10, 20]',
296 \ 'Double ; in list of variables')
297 endif
Bram Moolenaarfcf8a872019-11-06 15:22:00 +0100298endfunc
299
Bram Moolenaar8471e572019-05-19 21:37:18 +0200300func Test_let_heredoc_fails()
301 call assert_fails('let v =<< marker', 'E991:')
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100302 try
303 exe "let v =<< TEXT | abc | TEXT"
304 call assert_report('No exception thrown')
305 catch /E488:/
306 catch
307 call assert_report("Caught exception: " .. v:exception)
308 endtry
Bram Moolenaar8471e572019-05-19 21:37:18 +0200309
310 let text =<< trim END
311 func WrongSyntax()
312 let v =<< that there
313 endfunc
314 END
315 call writefile(text, 'XheredocFail')
316 call assert_fails('source XheredocFail', 'E126:')
317 call delete('XheredocFail')
318
Bram Moolenaar24582002019-07-21 14:14:26 +0200319 let text =<< trim CodeEnd
Bram Moolenaar8471e572019-05-19 21:37:18 +0200320 func MissingEnd()
321 let v =<< END
322 endfunc
Bram Moolenaar24582002019-07-21 14:14:26 +0200323 CodeEnd
Bram Moolenaar8471e572019-05-19 21:37:18 +0200324 call writefile(text, 'XheredocWrong')
325 call assert_fails('source XheredocWrong', 'E126:')
326 call delete('XheredocWrong')
Bram Moolenaar24582002019-07-21 14:14:26 +0200327
328 let text =<< trim TEXTend
329 let v =<< " comment
330 TEXTend
331 call writefile(text, 'XheredocNoMarker')
332 call assert_fails('source XheredocNoMarker', 'E172:')
333 call delete('XheredocNoMarker')
334
335 let text =<< trim TEXTend
336 let v =<< text
337 TEXTend
338 call writefile(text, 'XheredocBadMarker')
339 call assert_fails('source XheredocBadMarker', 'E221:')
340 call delete('XheredocBadMarker')
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100341
342 call writefile(['let v =<< TEXT', 'abc'], 'XheredocMissingMarker')
343 call assert_fails('source XheredocMissingMarker', 'E990:')
344 call delete('XheredocMissingMarker')
Bram Moolenaar8471e572019-05-19 21:37:18 +0200345endfunc
346
Bram Moolenaarecaa75b2019-07-21 23:04:21 +0200347func Test_let_heredoc_trim_no_indent_marker()
348 let text =<< trim END
349 Text
350 with
351 indent
352END
353 call assert_equal(['Text', 'with', 'indent'], text)
354endfunc
355
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200356" Test for the setting a variable using the heredoc syntax
357func Test_let_heredoc()
358 let var1 =<< END
359Some sample text
360 Text with indent
361 !@#$%^&*()-+_={}|[]\~`:";'<>?,./
362END
363
364 call assert_equal(["Some sample text", "\tText with indent", " !@#$%^&*()-+_={}|[]\\~`:\";'<>?,./"], var1)
365
Bram Moolenaar24582002019-07-21 14:14:26 +0200366 let var2 =<< XXX
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200367Editor
Bram Moolenaar24582002019-07-21 14:14:26 +0200368XXX
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200369 call assert_equal(['Editor'], var2)
370
371 let var3 =<<END
372END
373 call assert_equal([], var3)
374
375 let var3 =<<END
376vim
377
378end
379 END
380END
381END
382 call assert_equal(['vim', '', 'end', ' END', 'END '], var3)
383
384 let var1 =<< trim END
385 Line1
386 Line2
387 Line3
388 END
389 END
390 call assert_equal(['Line1', ' Line2', "\tLine3", ' END'], var1)
391
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200392 let var1 =<< trim !!!
393 Line1
394 line2
395 Line3
396 !!!
397 !!!
398 call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1)
399
Bram Moolenaar24582002019-07-21 14:14:26 +0200400 let var1 =<< trim XX
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200401 Line1
Bram Moolenaar24582002019-07-21 14:14:26 +0200402 XX
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200403 call assert_equal(['Line1'], var1)
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200404
Bram Moolenaar8471e572019-05-19 21:37:18 +0200405 " ignore "endfunc"
406 let var1 =<< END
407something
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200408endfunc
Bram Moolenaar8471e572019-05-19 21:37:18 +0200409END
410 call assert_equal(['something', 'endfunc'], var1)
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200411
Bram Moolenaar8471e572019-05-19 21:37:18 +0200412 " ignore "endfunc" with trim
413 let var1 =<< trim END
414 something
415 endfunc
416 END
417 call assert_equal(['something', 'endfunc'], var1)
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200418
Bram Moolenaare96a2492019-06-25 04:12:16 +0200419 " not concatenate lines
420 let var1 =<< END
421some
422 \thing
423 \ else
424END
425 call assert_equal(['some', ' \thing', ' \ else'], var1)
426
Bram Moolenaar8471e572019-05-19 21:37:18 +0200427 " ignore "python << xx"
428 let var1 =<<END
429something
430python << xx
431END
432 call assert_equal(['something', 'python << xx'], var1)
433
434 " ignore "python << xx" with trim
435 let var1 =<< trim END
436 something
437 python << xx
438 END
439 call assert_equal(['something', 'python << xx'], var1)
440
441 " ignore "append"
Bram Moolenaar24582002019-07-21 14:14:26 +0200442 let var1 =<< E
Bram Moolenaar8471e572019-05-19 21:37:18 +0200443something
444app
Bram Moolenaar24582002019-07-21 14:14:26 +0200445E
Bram Moolenaar8471e572019-05-19 21:37:18 +0200446 call assert_equal(['something', 'app'], var1)
447
448 " ignore "append" with trim
Bram Moolenaar24582002019-07-21 14:14:26 +0200449 let var1 =<< trim END
Bram Moolenaar8471e572019-05-19 21:37:18 +0200450 something
451 app
Bram Moolenaar24582002019-07-21 14:14:26 +0200452 END
Bram Moolenaar8471e572019-05-19 21:37:18 +0200453 call assert_equal(['something', 'app'], var1)
Bram Moolenaarb1ba9ab2019-10-16 23:34:42 +0200454
455 let check = []
456 if 0
457 let check =<< trim END
458 from heredoc
459 END
460 endif
461 call assert_equal([], check)
Bram Moolenaar1e673b92019-11-06 15:02:50 +0100462
463 " unpack assignment
464 let [a, b, c] =<< END
465 x
466 \y
467 z
468END
469 call assert_equal([' x', ' \y', ' z'], [a, b, c])
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200470endfunc
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100471
472" vim: shiftwidth=2 sts=2 expandtab