blob: 4d9aae96f1e95656f4733e0f834dfc13068d719b [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)
27endfunc
Bram Moolenaar31b81602019-02-10 22:14:27 +010028
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:')
Bram Moolenaar05c00c02019-02-11 22:00:11 +0100145 call assert_fails('call s:set_varg7(1)', 'E742:')
Bram Moolenaar31b81602019-02-10 22:14:27 +0100146 call assert_fails('call s:set_varg8(1)', 'E742:')
147 call s:set_varg9([0])
148endfunction
Bram Moolenaarf0908e62019-03-30 20:11:50 +0100149
150func Test_let_utf8_environment()
151 let $a = 'ĀĒĪŌŪあいうえお'
152 call assert_equal('ĀĒĪŌŪあいうえお', $a)
153endfunc
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200154
Bram Moolenaarfcf8a872019-11-06 15:22:00 +0100155func 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
Bram Moolenaar8471e572019-05-19 21:37:18 +0200207func 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
Bram Moolenaar24582002019-07-21 14:14:26 +0200219 let text =<< trim CodeEnd
Bram Moolenaar8471e572019-05-19 21:37:18 +0200220 func MissingEnd()
221 let v =<< END
222 endfunc
Bram Moolenaar24582002019-07-21 14:14:26 +0200223 CodeEnd
Bram Moolenaar8471e572019-05-19 21:37:18 +0200224 call writefile(text, 'XheredocWrong')
225 call assert_fails('source XheredocWrong', 'E126:')
226 call delete('XheredocWrong')
Bram Moolenaar24582002019-07-21 14:14:26 +0200227
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')
Bram Moolenaar8471e572019-05-19 21:37:18 +0200241endfunc
242
Bram Moolenaarecaa75b2019-07-21 23:04:21 +0200243func 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
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200252" 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
Bram Moolenaar24582002019-07-21 14:14:26 +0200262 let var2 =<< XXX
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200263Editor
Bram Moolenaar24582002019-07-21 14:14:26 +0200264XXX
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200265 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
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200288 let var1 =<< trim !!!
289 Line1
290 line2
291 Line3
292 !!!
293 !!!
294 call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1)
295
Bram Moolenaar24582002019-07-21 14:14:26 +0200296 let var1 =<< trim XX
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200297 Line1
Bram Moolenaar24582002019-07-21 14:14:26 +0200298 XX
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200299 call assert_equal(['Line1'], var1)
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200300
Bram Moolenaar8471e572019-05-19 21:37:18 +0200301 " ignore "endfunc"
302 let var1 =<< END
303something
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200304endfunc
Bram Moolenaar8471e572019-05-19 21:37:18 +0200305END
306 call assert_equal(['something', 'endfunc'], var1)
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200307
Bram Moolenaar8471e572019-05-19 21:37:18 +0200308 " ignore "endfunc" with trim
309 let var1 =<< trim END
310 something
311 endfunc
312 END
313 call assert_equal(['something', 'endfunc'], var1)
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200314
Bram Moolenaare96a2492019-06-25 04:12:16 +0200315 " not concatenate lines
316 let var1 =<< END
317some
318 \thing
319 \ else
320END
321 call assert_equal(['some', ' \thing', ' \ else'], var1)
322
Bram Moolenaar8471e572019-05-19 21:37:18 +0200323 " 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"
Bram Moolenaar24582002019-07-21 14:14:26 +0200338 let var1 =<< E
Bram Moolenaar8471e572019-05-19 21:37:18 +0200339something
340app
Bram Moolenaar24582002019-07-21 14:14:26 +0200341E
Bram Moolenaar8471e572019-05-19 21:37:18 +0200342 call assert_equal(['something', 'app'], var1)
343
344 " ignore "append" with trim
Bram Moolenaar24582002019-07-21 14:14:26 +0200345 let var1 =<< trim END
Bram Moolenaar8471e572019-05-19 21:37:18 +0200346 something
347 app
Bram Moolenaar24582002019-07-21 14:14:26 +0200348 END
Bram Moolenaar8471e572019-05-19 21:37:18 +0200349 call assert_equal(['something', 'app'], var1)
Bram Moolenaarb1ba9ab2019-10-16 23:34:42 +0200350
351 let check = []
352 if 0
353 let check =<< trim END
354 from heredoc
355 END
356 endif
357 call assert_equal([], check)
Bram Moolenaar1e673b92019-11-06 15:02:50 +0100358
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])
Bram Moolenaarf5842c52019-05-19 18:41:26 +0200366endfunc