blob: 520b5b915301910baff4057760b5d98edbdb5557 [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:')
278
279 " This test works only when the language is English
280 if v:lang == "C" || v:lang =~ '^[Ee]n'
281 call assert_fails('let [a ; b;] = [10, 20]',
282 \ 'Double ; in list of variables')
283 endif
Bram Moolenaarfcf8a872019-11-06 15:22:00 +0100284endfunc
285
Bram Moolenaar8471e572019-05-19 21:37:18 +0200286func Test_let_heredoc_fails()
287 call assert_fails('let v =<< marker', 'E991:')
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100288 try
289 exe "let v =<< TEXT | abc | TEXT"
290 call assert_report('No exception thrown')
291 catch /E488:/
292 catch
293 call assert_report("Caught exception: " .. v:exception)
294 endtry
Bram Moolenaar8471e572019-05-19 21:37:18 +0200295
296 let text =<< trim END
297 func WrongSyntax()
298 let v =<< that there
299 endfunc
300 END
301 call writefile(text, 'XheredocFail')
302 call assert_fails('source XheredocFail', 'E126:')
303 call delete('XheredocFail')
304
Bram Moolenaar24582002019-07-21 14:14:26 +0200305 let text =<< trim CodeEnd
Bram Moolenaar8471e572019-05-19 21:37:18 +0200306 func MissingEnd()
307 let v =<< END
308 endfunc
Bram Moolenaar24582002019-07-21 14:14:26 +0200309 CodeEnd
Bram Moolenaar8471e572019-05-19 21:37:18 +0200310 call writefile(text, 'XheredocWrong')
311 call assert_fails('source XheredocWrong', 'E126:')
312 call delete('XheredocWrong')
Bram Moolenaar24582002019-07-21 14:14:26 +0200313
314 let text =<< trim TEXTend
315 let v =<< " comment
316 TEXTend
317 call writefile(text, 'XheredocNoMarker')
318 call assert_fails('source XheredocNoMarker', 'E172:')
319 call delete('XheredocNoMarker')
320
321 let text =<< trim TEXTend
322 let v =<< text
323 TEXTend
324 call writefile(text, 'XheredocBadMarker')
325 call assert_fails('source XheredocBadMarker', 'E221:')
326 call delete('XheredocBadMarker')
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100327
328 call writefile(['let v =<< TEXT', 'abc'], 'XheredocMissingMarker')
329 call assert_fails('source XheredocMissingMarker', 'E990:')
330 call delete('XheredocMissingMarker')
Bram Moolenaar8471e572019-05-19 21:37:18 +0200331endfunc
332
Bram Moolenaarecaa75b2019-07-21 23:04:21 +0200333func Test_let_heredoc_trim_no_indent_marker()
334 let text =<< trim END
335 Text
336 with
337 indent
338END
339 call assert_equal(['Text', 'with', 'indent'], text)
340endfunc
341
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200342" Test for the setting a variable using the heredoc syntax
343func Test_let_heredoc()
344 let var1 =<< END
345Some sample text
346 Text with indent
347 !@#$%^&*()-+_={}|[]\~`:";'<>?,./
348END
349
350 call assert_equal(["Some sample text", "\tText with indent", " !@#$%^&*()-+_={}|[]\\~`:\";'<>?,./"], var1)
351
Bram Moolenaar24582002019-07-21 14:14:26 +0200352 let var2 =<< XXX
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200353Editor
Bram Moolenaar24582002019-07-21 14:14:26 +0200354XXX
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200355 call assert_equal(['Editor'], var2)
356
357 let var3 =<<END
358END
359 call assert_equal([], var3)
360
361 let var3 =<<END
362vim
363
364end
365 END
366END
367END
368 call assert_equal(['vim', '', 'end', ' END', 'END '], var3)
369
370 let var1 =<< trim END
371 Line1
372 Line2
373 Line3
374 END
375 END
376 call assert_equal(['Line1', ' Line2', "\tLine3", ' END'], var1)
377
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200378 let var1 =<< trim !!!
379 Line1
380 line2
381 Line3
382 !!!
383 !!!
384 call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1)
385
Bram Moolenaar24582002019-07-21 14:14:26 +0200386 let var1 =<< trim XX
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200387 Line1
Bram Moolenaar24582002019-07-21 14:14:26 +0200388 XX
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200389 call assert_equal(['Line1'], var1)
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200390
Bram Moolenaar8471e572019-05-19 21:37:18 +0200391 " ignore "endfunc"
392 let var1 =<< END
393something
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200394endfunc
Bram Moolenaar8471e572019-05-19 21:37:18 +0200395END
396 call assert_equal(['something', 'endfunc'], var1)
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200397
Bram Moolenaar8471e572019-05-19 21:37:18 +0200398 " ignore "endfunc" with trim
399 let var1 =<< trim END
400 something
401 endfunc
402 END
403 call assert_equal(['something', 'endfunc'], var1)
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200404
Bram Moolenaare96a2492019-06-25 04:12:16 +0200405 " not concatenate lines
406 let var1 =<< END
407some
408 \thing
409 \ else
410END
411 call assert_equal(['some', ' \thing', ' \ else'], var1)
412
Bram Moolenaar8471e572019-05-19 21:37:18 +0200413 " ignore "python << xx"
414 let var1 =<<END
415something
416python << xx
417END
418 call assert_equal(['something', 'python << xx'], var1)
419
420 " ignore "python << xx" with trim
421 let var1 =<< trim END
422 something
423 python << xx
424 END
425 call assert_equal(['something', 'python << xx'], var1)
426
427 " ignore "append"
Bram Moolenaar24582002019-07-21 14:14:26 +0200428 let var1 =<< E
Bram Moolenaar8471e572019-05-19 21:37:18 +0200429something
430app
Bram Moolenaar24582002019-07-21 14:14:26 +0200431E
Bram Moolenaar8471e572019-05-19 21:37:18 +0200432 call assert_equal(['something', 'app'], var1)
433
434 " ignore "append" with trim
Bram Moolenaar24582002019-07-21 14:14:26 +0200435 let var1 =<< trim END
Bram Moolenaar8471e572019-05-19 21:37:18 +0200436 something
437 app
Bram Moolenaar24582002019-07-21 14:14:26 +0200438 END
Bram Moolenaar8471e572019-05-19 21:37:18 +0200439 call assert_equal(['something', 'app'], var1)
Bram Moolenaarb1ba9ab2019-10-16 23:34:42 +0200440
441 let check = []
442 if 0
443 let check =<< trim END
444 from heredoc
445 END
446 endif
447 call assert_equal([], check)
Bram Moolenaar1e673b92019-11-06 15:02:50 +0100448
449 " unpack assignment
450 let [a, b, c] =<< END
451 x
452 \y
453 z
454END
455 call assert_equal([' x', ' \y', ' z'], [a, b, c])
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200456endfunc
Bram Moolenaar8dfcce32020-03-18 19:32:26 +0100457
458" vim: shiftwidth=2 sts=2 expandtab