xref: /vim-8.2.3635/src/testdir/test_let.vim (revision 5f1920ad)
1" 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)
27
28  let x = 0
29  if 0 | let x = 1 | endif
30  call assert_equal(0, x)
31endfunc
32
33func s:set_arg1(a) abort
34  let a:a = 1
35endfunction
36
37func s:set_arg2(a) abort
38  let a:b = 1
39endfunction
40
41func s:set_arg3(a) abort
42  let b = a:
43  let b['a'] = 1
44endfunction
45
46func s:set_arg4(a) abort
47  let b = a:
48  let b['a'] = 1
49endfunction
50
51func s:set_arg5(a) abort
52  let b = a:
53  let b['a'][0] = 1
54endfunction
55
56func s:set_arg6(a) abort
57  let a:a[0] = 1
58endfunction
59
60func s:set_arg7(a) abort
61  call extend(a:, {'a': 1})
62endfunction
63
64func s:set_arg8(a) abort
65  call extend(a:, {'b': 1})
66endfunction
67
68func s:set_arg9(a) abort
69  let a:['b'] = 1
70endfunction
71
72func s:set_arg10(a) abort
73  let b = a:
74  call extend(b, {'a': 1})
75endfunction
76
77func s:set_arg11(a) abort
78  let b = a:
79  call extend(b, {'b': 1})
80endfunction
81
82func s:set_arg12(a) abort
83  let b = a:
84  let b['b'] = 1
85endfunction
86
87func Test_let_arg_fail()
88  call assert_fails('call s:set_arg1(1)', 'E46:')
89  call assert_fails('call s:set_arg2(1)', 'E461:')
90  call assert_fails('call s:set_arg3(1)', 'E46:')
91  call assert_fails('call s:set_arg4(1)', 'E46:')
92  call assert_fails('call s:set_arg5(1)', 'E46:')
93  call s:set_arg6([0])
94  call assert_fails('call s:set_arg7(1)', 'E742:')
95  call assert_fails('call s:set_arg8(1)', 'E742:')
96  call assert_fails('call s:set_arg9(1)', 'E461:')
97  call assert_fails('call s:set_arg10(1)', 'E742:')
98  call assert_fails('call s:set_arg11(1)', 'E742:')
99  call assert_fails('call s:set_arg12(1)', 'E461:')
100endfunction
101
102func s:set_varg1(...) abort
103  let a:000 = []
104endfunction
105
106func s:set_varg2(...) abort
107  let a:000[0] = 1
108endfunction
109
110func s:set_varg3(...) abort
111  let a:000 += [1]
112endfunction
113
114func s:set_varg4(...) abort
115  call add(a:000, 1)
116endfunction
117
118func s:set_varg5(...) abort
119  let a:000[0][0] = 1
120endfunction
121
122func s:set_varg6(...) abort
123  let b = a:000
124  let b[0] = 1
125endfunction
126
127func s:set_varg7(...) abort
128  let b = a:000
129  let b += [1]
130endfunction
131
132func s:set_varg8(...) abort
133  let b = a:000
134  call add(b, 1)
135endfunction
136
137func s:set_varg9(...) abort
138  let b = a:000
139  let b[0][0] = 1
140endfunction
141
142func Test_let_varg_fail()
143  call assert_fails('call s:set_varg1(1)', 'E46:')
144  call assert_fails('call s:set_varg2(1)', 'E742:')
145  call assert_fails('call s:set_varg3(1)', 'E46:')
146  call assert_fails('call s:set_varg4(1)', 'E742:')
147  call s:set_varg5([0])
148  call assert_fails('call s:set_varg6(1)', 'E742:')
149  call assert_fails('call s:set_varg7(1)', 'E742:')
150  call assert_fails('call s:set_varg8(1)', 'E742:')
151  call s:set_varg9([0])
152endfunction
153
154func Test_let_utf8_environment()
155  let $a = 'ĀĒĪŌŪあいうえお'
156  call assert_equal('ĀĒĪŌŪあいうえお', $a)
157endfunc
158
159func Test_let_no_type_checking()
160  let v = 1
161  let v = [1,2,3]
162  let v = {'a': 1, 'b': 2}
163  let v = 3.4
164  let v = 'hello'
165endfunc
166
167func Test_let_termcap()
168  " Terminal code
169  let old_t_te = &t_te
170  let &t_te = "\<Esc>[yes;"
171  call assert_match('t_te.*^[[yes;', execute("set termcap"))
172  let &t_te = old_t_te
173
174  if exists("+t_k1")
175    " Key code
176    let old_t_k1 = &t_k1
177    let &t_k1 = "that"
178    call assert_match('t_k1.*that', execute("set termcap"))
179    let &t_k1 = old_t_k1
180  endif
181
182  call assert_fails('let x = &t_xx', 'E113')
183  let &t_xx = "yes"
184  call assert_equal("yes", &t_xx)
185  let &t_xx = ""
186  call assert_fails('let x = &t_xx', 'E113')
187endfunc
188
189func Test_let_option_error()
190  let _w = &tw
191  let &tw = 80
192  call assert_fails('let &tw .= 1', 'E734')
193  call assert_equal(80, &tw)
194  let &tw = _w
195
196  let _w = &fillchars
197  let &fillchars = "vert:|"
198  call assert_fails('let &fillchars += "diff:-"', 'E734')
199  call assert_equal("vert:|", &fillchars)
200  let &fillchars = _w
201endfunc
202
203func Test_let_errors()
204  let s = 'abcd'
205  call assert_fails('let s[1] = 5', 'E689:')
206
207  let l = [1, 2, 3]
208  call assert_fails('let l[:] = 5', 'E709:')
209endfunc
210
211func Test_let_heredoc_fails()
212  call assert_fails('let v =<< marker', 'E991:')
213
214  let text =<< trim END
215  func WrongSyntax()
216    let v =<< that there
217  endfunc
218  END
219  call writefile(text, 'XheredocFail')
220  call assert_fails('source XheredocFail', 'E126:')
221  call delete('XheredocFail')
222
223  let text =<< trim CodeEnd
224  func MissingEnd()
225    let v =<< END
226  endfunc
227  CodeEnd
228  call writefile(text, 'XheredocWrong')
229  call assert_fails('source XheredocWrong', 'E126:')
230  call delete('XheredocWrong')
231
232  let text =<< trim TEXTend
233    let v =<< " comment
234  TEXTend
235  call writefile(text, 'XheredocNoMarker')
236  call assert_fails('source XheredocNoMarker', 'E172:')
237  call delete('XheredocNoMarker')
238
239  let text =<< trim TEXTend
240    let v =<< text
241  TEXTend
242  call writefile(text, 'XheredocBadMarker')
243  call assert_fails('source XheredocBadMarker', 'E221:')
244  call delete('XheredocBadMarker')
245endfunc
246
247func Test_let_heredoc_trim_no_indent_marker()
248  let text =<< trim END
249  Text
250  with
251  indent
252END
253  call assert_equal(['Text', 'with', 'indent'], text)
254endfunc
255
256" Test for the setting a variable using the heredoc syntax
257func Test_let_heredoc()
258  let var1 =<< END
259Some sample text
260	Text with indent
261  !@#$%^&*()-+_={}|[]\~`:";'<>?,./
262END
263
264  call assert_equal(["Some sample text", "\tText with indent", "  !@#$%^&*()-+_={}|[]\\~`:\";'<>?,./"], var1)
265
266  let var2 =<< XXX
267Editor
268XXX
269  call assert_equal(['Editor'], var2)
270
271  let var3 =<<END
272END
273  call assert_equal([], var3)
274
275  let var3 =<<END
276vim
277
278end
279  END
280END
281END
282  call assert_equal(['vim', '', 'end', '  END', 'END '], var3)
283
284	let var1 =<< trim END
285	Line1
286	  Line2
287		Line3
288	 END
289	END
290  call assert_equal(['Line1', '  Line2', "\tLine3", ' END'], var1)
291
292  let var1 =<< trim !!!
293	Line1
294	 line2
295		Line3
296	!!!
297  !!!
298  call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1)
299
300  let var1 =<< trim XX
301    Line1
302  XX
303  call assert_equal(['Line1'], var1)
304
305  " ignore "endfunc"
306  let var1 =<< END
307something
308endfunc
309END
310  call assert_equal(['something', 'endfunc'], var1)
311
312  " ignore "endfunc" with trim
313  let var1 =<< trim END
314  something
315  endfunc
316  END
317  call assert_equal(['something', 'endfunc'], var1)
318
319  " not concatenate lines
320  let var1 =<< END
321some
322  \thing
323  \ else
324END
325  call assert_equal(['some', '  \thing', '  \ else'], var1)
326
327  " ignore "python << xx"
328  let var1 =<<END
329something
330python << xx
331END
332  call assert_equal(['something', 'python << xx'], var1)
333
334  " ignore "python << xx" with trim
335  let var1 =<< trim END
336  something
337  python << xx
338  END
339  call assert_equal(['something', 'python << xx'], var1)
340
341  " ignore "append"
342  let var1 =<< E
343something
344app
345E
346  call assert_equal(['something', 'app'], var1)
347
348  " ignore "append" with trim
349  let var1 =<< trim END
350  something
351  app
352  END
353  call assert_equal(['something', 'app'], var1)
354
355  let check = []
356  if 0
357     let check =<< trim END
358       from heredoc
359     END
360  endif
361  call assert_equal([], check)
362
363  " unpack assignment
364  let [a, b, c] =<< END
365     x
366     \y
367     z
368END
369  call assert_equal(['     x', '     \y', '     z'], [a, b, c])
370endfunc
371