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