blob: cfe095cfefde3ba34276e3190c9cea9a0e4ad1ce [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
277 call assert_fails('let {s}.1 = 2', 'E18:')
Bram Moolenaar8b633132020-03-20 18:20:51 +0100278 call assert_fails('let a[1] = 5', 'E121:')
279 let l = [[1,2]]
280 call assert_fails('let l[:][0] = [5]', 'E708:')
281 let d = {'k' : 4}
282 call assert_fails('let d.# = 5', 'E713:')
283 call assert_fails('let d.m += 5', 'E734:')
284 let l = [1, 2]
285 call assert_fails('let l[2] = 0', 'E684:')
286 call assert_fails('let l[0:1] = [1, 2, 3]', 'E710:')
287 call assert_fails('let l[-2:-3] = [3, 4]', 'E684:')
288 call assert_fails('let l[0:4] = [5, 6]', 'E711:')
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100289
290 " This test works only when the language is English
291 if v:lang == "C" || v:lang =~ '^[Ee]n'
292 call assert_fails('let [a ; b;] = [10, 20]',
293 \ 'Double ; in list of variables')
294 endif
Bram Moolenaarfcf8a872019-11-06 15:22:00 +0100295endfunc
296
Bram Moolenaar8471e572019-05-19 21:37:18 +0200297func Test_let_heredoc_fails()
298 call assert_fails('let v =<< marker', 'E991:')
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100299 try
300 exe "let v =<< TEXT | abc | TEXT"
301 call assert_report('No exception thrown')
302 catch /E488:/
303 catch
304 call assert_report("Caught exception: " .. v:exception)
305 endtry
Bram Moolenaar8471e572019-05-19 21:37:18 +0200306
307 let text =<< trim END
308 func WrongSyntax()
309 let v =<< that there
310 endfunc
311 END
312 call writefile(text, 'XheredocFail')
313 call assert_fails('source XheredocFail', 'E126:')
314 call delete('XheredocFail')
315
Bram Moolenaar24582002019-07-21 14:14:26 +0200316 let text =<< trim CodeEnd
Bram Moolenaar8471e572019-05-19 21:37:18 +0200317 func MissingEnd()
318 let v =<< END
319 endfunc
Bram Moolenaar24582002019-07-21 14:14:26 +0200320 CodeEnd
Bram Moolenaar8471e572019-05-19 21:37:18 +0200321 call writefile(text, 'XheredocWrong')
322 call assert_fails('source XheredocWrong', 'E126:')
323 call delete('XheredocWrong')
Bram Moolenaar24582002019-07-21 14:14:26 +0200324
325 let text =<< trim TEXTend
326 let v =<< " comment
327 TEXTend
328 call writefile(text, 'XheredocNoMarker')
329 call assert_fails('source XheredocNoMarker', 'E172:')
330 call delete('XheredocNoMarker')
331
332 let text =<< trim TEXTend
333 let v =<< text
334 TEXTend
335 call writefile(text, 'XheredocBadMarker')
336 call assert_fails('source XheredocBadMarker', 'E221:')
337 call delete('XheredocBadMarker')
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100338
339 call writefile(['let v =<< TEXT', 'abc'], 'XheredocMissingMarker')
340 call assert_fails('source XheredocMissingMarker', 'E990:')
341 call delete('XheredocMissingMarker')
Bram Moolenaar8471e572019-05-19 21:37:18 +0200342endfunc
343
Bram Moolenaarecaa75b2019-07-21 23:04:21 +0200344func Test_let_heredoc_trim_no_indent_marker()
345 let text =<< trim END
346 Text
347 with
348 indent
349END
350 call assert_equal(['Text', 'with', 'indent'], text)
351endfunc
352
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200353" Test for the setting a variable using the heredoc syntax
354func Test_let_heredoc()
355 let var1 =<< END
356Some sample text
357 Text with indent
358 !@#$%^&*()-+_={}|[]\~`:";'<>?,./
359END
360
361 call assert_equal(["Some sample text", "\tText with indent", " !@#$%^&*()-+_={}|[]\\~`:\";'<>?,./"], var1)
362
Bram Moolenaar24582002019-07-21 14:14:26 +0200363 let var2 =<< XXX
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200364Editor
Bram Moolenaar24582002019-07-21 14:14:26 +0200365XXX
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200366 call assert_equal(['Editor'], var2)
367
368 let var3 =<<END
369END
370 call assert_equal([], var3)
371
372 let var3 =<<END
373vim
374
375end
376 END
377END
378END
379 call assert_equal(['vim', '', 'end', ' END', 'END '], var3)
380
381 let var1 =<< trim END
382 Line1
383 Line2
384 Line3
385 END
386 END
387 call assert_equal(['Line1', ' Line2', "\tLine3", ' END'], var1)
388
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200389 let var1 =<< trim !!!
390 Line1
391 line2
392 Line3
393 !!!
394 !!!
395 call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1)
396
Bram Moolenaar24582002019-07-21 14:14:26 +0200397 let var1 =<< trim XX
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200398 Line1
Bram Moolenaar24582002019-07-21 14:14:26 +0200399 XX
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200400 call assert_equal(['Line1'], var1)
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200401
Bram Moolenaar8471e572019-05-19 21:37:18 +0200402 " ignore "endfunc"
403 let var1 =<< END
404something
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200405endfunc
Bram Moolenaar8471e572019-05-19 21:37:18 +0200406END
407 call assert_equal(['something', 'endfunc'], var1)
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200408
Bram Moolenaar8471e572019-05-19 21:37:18 +0200409 " ignore "endfunc" with trim
410 let var1 =<< trim END
411 something
412 endfunc
413 END
414 call assert_equal(['something', 'endfunc'], var1)
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200415
Bram Moolenaare96a2492019-06-25 04:12:16 +0200416 " not concatenate lines
417 let var1 =<< END
418some
419 \thing
420 \ else
421END
422 call assert_equal(['some', ' \thing', ' \ else'], var1)
423
Bram Moolenaar8471e572019-05-19 21:37:18 +0200424 " ignore "python << xx"
425 let var1 =<<END
426something
427python << xx
428END
429 call assert_equal(['something', 'python << xx'], var1)
430
431 " ignore "python << xx" with trim
432 let var1 =<< trim END
433 something
434 python << xx
435 END
436 call assert_equal(['something', 'python << xx'], var1)
437
438 " ignore "append"
Bram Moolenaar24582002019-07-21 14:14:26 +0200439 let var1 =<< E
Bram Moolenaar8471e572019-05-19 21:37:18 +0200440something
441app
Bram Moolenaar24582002019-07-21 14:14:26 +0200442E
Bram Moolenaar8471e572019-05-19 21:37:18 +0200443 call assert_equal(['something', 'app'], var1)
444
445 " ignore "append" with trim
Bram Moolenaar24582002019-07-21 14:14:26 +0200446 let var1 =<< trim END
Bram Moolenaar8471e572019-05-19 21:37:18 +0200447 something
448 app
Bram Moolenaar24582002019-07-21 14:14:26 +0200449 END
Bram Moolenaar8471e572019-05-19 21:37:18 +0200450 call assert_equal(['something', 'app'], var1)
Bram Moolenaarb1ba9ab2019-10-16 23:34:42 +0200451
452 let check = []
453 if 0
454 let check =<< trim END
455 from heredoc
456 END
457 endif
458 call assert_equal([], check)
Bram Moolenaar1e673b92019-11-06 15:02:50 +0100459
460 " unpack assignment
461 let [a, b, c] =<< END
462 x
463 \y
464 z
465END
466 call assert_equal([' x', ' \y', ' z'], [a, b, c])
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200467endfunc
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100468
469" vim: shiftwidth=2 sts=2 expandtab