blob: 33ab45fcd4a16e6fa59e34d1df278e963abef02b [file] [log] [blame]
Bram Moolenaarfabaf752017-12-23 17:26:11 +01001" Tests for various eval things.
2
Bram Moolenaar2b6ef852020-07-11 22:25:57 +02003source view_util.vim
Bram Moolenaar35d21c62022-09-02 16:47:16 +01004source shared.vim
Bram Moolenaar2b6ef852020-07-11 22:25:57 +02005
Bram Moolenaarfabaf752017-12-23 17:26:11 +01006function s:foo() abort
7 try
8 return [] == 0
9 catch
10 return 1
11 endtry
12endfunction
13
14func Test_catch_return_with_error()
15 call assert_equal(1, s:foo())
16endfunc
Bram Moolenaar2be57332018-02-13 18:05:18 +010017
18func Test_nocatch_restore_silent_emsg()
19 silent! try
20 throw 1
21 catch
22 endtry
Bram Moolenaar2b6ef852020-07-11 22:25:57 +020023 echoerr 'wrong again'
24 call assert_equal('wrong again', ScreenLine(&lines))
Bram Moolenaar2be57332018-02-13 18:05:18 +010025endfunc
Bram Moolenaar78a16b02018-04-14 13:51:55 +020026
27func Test_mkdir_p()
28 call mkdir('Xmkdir/nested', 'p')
29 call assert_true(isdirectory('Xmkdir/nested'))
30 try
31 " Trying to make existing directories doesn't error
32 call mkdir('Xmkdir', 'p')
33 call mkdir('Xmkdir/nested', 'p')
34 catch /E739:/
35 call assert_report('mkdir(..., "p") failed for an existing directory')
36 endtry
37 " 'p' doesn't suppress real errors
Bram Moolenaarb18b4962022-09-02 21:55:50 +010038 call writefile([], 'Xmkdirfile')
39 call assert_fails('call mkdir("Xmkdirfile", "p")', 'E739:')
40 call delete('Xmkdirfile')
Bram Moolenaar78a16b02018-04-14 13:51:55 +020041 call delete('Xmkdir', 'rf')
Bram Moolenaar92b83cc2020-04-25 15:24:44 +020042 call assert_equal(0, mkdir(test_null_string()))
Bram Moolenaare2e40752020-09-04 21:18:46 +020043 call assert_fails('call mkdir([])', 'E730:')
44 call assert_fails('call mkdir("abc", [], [])', 'E745:')
Bram Moolenaar78a16b02018-04-14 13:51:55 +020045endfunc
Bram Moolenaar67f8ab82018-09-11 22:37:29 +020046
Bram Moolenaar6f14da12022-09-07 21:30:44 +010047func DoMkdirDel(name)
48 call mkdir(a:name, 'pD')
49 call assert_true(isdirectory(a:name))
50endfunc
51
52func DoMkdirDelAddFile(name)
53 call mkdir(a:name, 'pD')
54 call assert_true(isdirectory(a:name))
55 call writefile(['text'], a:name .. '/file')
56endfunc
57
58func DoMkdirDelRec(name)
59 call mkdir(a:name, 'pR')
60 call assert_true(isdirectory(a:name))
61endfunc
62
63func DoMkdirDelRecAddFile(name)
64 call mkdir(a:name, 'pR')
65 call assert_true(isdirectory(a:name))
66 call writefile(['text'], a:name .. '/file')
67endfunc
68
69func Test_mkdir_defer_del()
70 " Xtopdir/tmp is created thus deleted, not Xtopdir itself
71 call mkdir('Xtopdir', 'R')
72 call DoMkdirDel('Xtopdir/tmp')
73 call assert_true(isdirectory('Xtopdir'))
74 call assert_false(isdirectory('Xtopdir/tmp'))
75
76 " Deletion fails because "tmp" contains "sub"
77 call DoMkdirDel('Xtopdir/tmp/sub')
78 call assert_true(isdirectory('Xtopdir'))
79 call assert_true(isdirectory('Xtopdir/tmp'))
80 call delete('Xtopdir/tmp', 'rf')
81
82 " Deletion fails because "tmp" contains "file"
83 call DoMkdirDelAddFile('Xtopdir/tmp')
84 call assert_true(isdirectory('Xtopdir'))
85 call assert_true(isdirectory('Xtopdir/tmp'))
86 call assert_true(filereadable('Xtopdir/tmp/file'))
87 call delete('Xtopdir/tmp', 'rf')
88
89 " Xtopdir/tmp is created thus deleted, not Xtopdir itself
90 call DoMkdirDelRec('Xtopdir/tmp')
91 call assert_true(isdirectory('Xtopdir'))
92 call assert_false(isdirectory('Xtopdir/tmp'))
93
94 " Deletion works even though "tmp" contains "sub"
95 call DoMkdirDelRec('Xtopdir/tmp/sub')
96 call assert_true(isdirectory('Xtopdir'))
97 call assert_false(isdirectory('Xtopdir/tmp'))
98
99 " Deletion works even though "tmp" contains "file"
100 call DoMkdirDelRecAddFile('Xtopdir/tmp')
101 call assert_true(isdirectory('Xtopdir'))
102 call assert_false(isdirectory('Xtopdir/tmp'))
103endfunc
104
Bram Moolenaar67f8ab82018-09-11 22:37:29 +0200105func Test_line_continuation()
106 let array = [5,
107 "\ ignore this
108 \ 6,
109 "\ more to ignore
110 "\ more moreto ignore
111 \ ]
112 "\ and some more
113 call assert_equal([5, 6], array)
114endfunc
Bram Moolenaar88b53fd2018-12-05 18:43:28 +0100115
116func Test_E963()
117 " These commands used to cause an internal error prior to vim 8.1.0563
118 let v_e = v:errors
119 let v_o = v:oldfiles
120 call assert_fails("let v:errors=''", 'E963:')
121 call assert_equal(v_e, v:errors)
122 call assert_fails("let v:oldfiles=''", 'E963:')
123 call assert_equal(v_o, v:oldfiles)
124endfunc
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100125
126func Test_for_invalid()
Sean Dewar80d73952021-08-04 19:25:54 +0200127 call assert_fails("for x in 99", 'E1098:')
128 call assert_fails("for x in function('winnr')", 'E1098:')
129 call assert_fails("for x in {'a': 9}", 'E1098:')
Bram Moolenaardf2c2982021-01-28 20:18:08 +0100130
131 if 0
132 /1/5/2/s/\n
133 endif
134 redraw
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100135endfunc
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100136
Bram Moolenaarf6d39c32022-08-16 17:50:38 +0100137func Test_for_over_null_string()
138 let save_enc = &enc
139 set enc=iso8859
140 let cnt = 0
141 for c in test_null_string()
142 let cnt += 1
143 endfor
144 call assert_equal(0, cnt)
145
146 let &enc = save_enc
147endfunc
148
Bram Moolenaar91324262022-09-09 13:27:59 +0100149func Test_for_with_modifier()
150 " this checks has_loop_cmd() works with a modifier
151 let result = []
152 vim9cmd for i in range(3)
153 call extend(result, [i])
154 endfor
155 call assert_equal([0, 1, 2], result)
156endfunc
157
Bram Moolenaar35d21c62022-09-02 16:47:16 +0100158func Test_for_invalid_line_count()
159 let lines =<< trim END
160 111111111111111111111111 for line in ['one']
161 endfor
162 END
163 call writefile(lines, 'XinvalidFor')
164 " only test that this doesn't crash
165 call RunVim([], [], '-u NONE -e -s -S XinvalidFor -c qa')
166
167 call delete('XinvalidFor')
168endfunc
169
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100170func Test_readfile_binary()
171 new
172 call setline(1, ['one', 'two', 'three'])
173 setlocal ff=dos
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200174 silent write XReadfile_bin
175 let lines = 'XReadfile_bin'->readfile()
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100176 call assert_equal(['one', 'two', 'three'], lines)
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200177 let lines = readfile('XReadfile_bin', '', 2)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100178 call assert_equal(['one', 'two'], lines)
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200179 let lines = readfile('XReadfile_bin', 'b')
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100180 call assert_equal(["one\r", "two\r", "three\r", ""], lines)
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200181 let lines = readfile('XReadfile_bin', 'b', 2)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100182 call assert_equal(["one\r", "two\r"], lines)
183
184 bwipe!
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200185 call delete('XReadfile_bin')
186endfunc
187
Dominique Pellef5d639a2022-01-12 15:24:40 +0000188func Test_readfile_binary_empty()
189 call writefile([], 'Xempty-file')
190 " This used to compare uninitialized memory in Vim <= 8.2.4065
191 call assert_equal([''], readfile('Xempty-file', 'b'))
192 call delete('Xempty-file')
193endfunc
194
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200195func Test_readfile_bom()
196 call writefile(["\ufeffFOO", "FOO\ufeffBAR"], 'XReadfile_bom')
197 call assert_equal(['FOO', 'FOOBAR'], readfile('XReadfile_bom'))
198 call delete('XReadfile_bom')
199endfunc
200
201func Test_readfile_max()
202 call writefile(range(1, 4), 'XReadfile_max')
203 call assert_equal(['1', '2'], readfile('XReadfile_max', '', 2))
204 call assert_equal(['3', '4'], readfile('XReadfile_max', '', -2))
205 call delete('XReadfile_max')
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100206endfunc
Bram Moolenaar4b9e91f2019-01-24 13:58:11 +0100207
208func Test_let_errmsg()
209 call assert_fails('let v:errmsg = []', 'E730:')
210 let v:errmsg = ''
211 call assert_fails('let v:errmsg = []', 'E730:')
212 let v:errmsg = ''
213endfunc
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200214
215func Test_string_concatenation()
216 call assert_equal('ab', 'a'.'b')
217 call assert_equal('ab', 'a' .'b')
218 call assert_equal('ab', 'a'. 'b')
219 call assert_equal('ab', 'a' . 'b')
220
221 call assert_equal('ab', 'a'..'b')
222 call assert_equal('ab', 'a' ..'b')
223 call assert_equal('ab', 'a'.. 'b')
224 call assert_equal('ab', 'a' .. 'b')
225
226 let a = 'a'
227 let b = 'b'
228 let a .= b
229 call assert_equal('ab', a)
230
231 let a = 'a'
232 let a.=b
233 call assert_equal('ab', a)
234
235 let a = 'a'
236 let a ..= b
237 call assert_equal('ab', a)
238
239 let a = 'a'
240 let a..=b
241 call assert_equal('ab', a)
Bram Moolenaar2e086612020-08-25 22:37:48 +0200242
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100243 let a = 'A'
244 let b = 1.234
245 call assert_equal('A1.234', a .. b)
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200246endfunc
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200247
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200248" Test fix for issue #4507
249func Test_skip_after_throw()
250 try
251 throw 'something'
252 let x = wincol() || &ts
253 catch /something/
254 endtry
255endfunc
256
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200257scriptversion 2
258func Test_string_concat_scriptversion2()
Bram Moolenaar93a48792019-04-20 21:54:28 +0200259 call assert_true(has('vimscript-2'))
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200260 let a = 'a'
261 let b = 'b'
262
263 call assert_fails('echo a . b', 'E15:')
264 call assert_fails('let a .= b', 'E985:')
Bram Moolenaarfae55a92021-06-17 22:08:30 +0200265 call assert_fails('let vers = 1.2.3', 'E488:')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200266
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100267 let f = .5
268 call assert_equal(0.5, f)
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200269endfunc
270
271scriptversion 1
272func Test_string_concat_scriptversion1()
Bram Moolenaar93a48792019-04-20 21:54:28 +0200273 call assert_true(has('vimscript-1'))
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200274 let a = 'a'
275 let b = 'b'
276
277 echo a . b
278 let a .= b
279 let vers = 1.2.3
280 call assert_equal('123', vers)
281
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100282 call assert_fails('let f = .5', 'E15:')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200283endfunc
284
Bram Moolenaard2e716e2019-04-20 14:39:52 +0200285scriptversion 3
286func Test_vvar_scriptversion3()
Bram Moolenaar93a48792019-04-20 21:54:28 +0200287 call assert_true(has('vimscript-3'))
Bram Moolenaard2e716e2019-04-20 14:39:52 +0200288 call assert_fails('echo version', 'E121:')
289 call assert_false(exists('version'))
290 let version = 1
291 call assert_equal(1, version)
292endfunc
293
294scriptversion 2
295func Test_vvar_scriptversion2()
296 call assert_true(exists('version'))
297 echo version
298 call assert_fails('let version = 1', 'E46:')
299 call assert_equal(v:version, version)
Bram Moolenaar37df9a42019-06-14 14:39:51 +0200300
301 call assert_equal(v:version, v:versionlong / 10000)
302 call assert_true(v:versionlong > 8011525)
Bram Moolenaard2e716e2019-04-20 14:39:52 +0200303endfunc
304
Bram Moolenaar61343f02019-07-20 21:11:13 +0200305func Test_dict_access_scriptversion2()
306 let l:x = {'foo': 1}
307
308 call assert_false(0 && l:x.foo)
309 call assert_true(1 && l:x.foo)
310endfunc
311
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200312scriptversion 4
313func Test_vvar_scriptversion4()
Bram Moolenaaraf914382019-09-15 17:49:10 +0200314 call assert_true(has('vimscript-4'))
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200315 call assert_equal(17, 017)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200316 call assert_equal(15, 0o17)
317 call assert_equal(15, 0O17)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200318 call assert_equal(18, 018)
Bram Moolenaarc37b6552021-01-07 19:36:30 +0100319 call assert_equal(511, 0o777)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200320 call assert_equal(64, 0b1'00'00'00)
321 call assert_equal(1048576, 0x10'00'00)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200322 call assert_equal(32768, 0o10'00'00)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200323 call assert_equal(1000000, 1'000'000)
Bram Moolenaarea8dcf82019-09-15 21:12:22 +0200324 call assert_equal("1234", execute("echo 1'234")->trim())
325 call assert_equal('1 234', execute("echo 1''234")->trim())
326 call assert_fails("echo 1'''234", 'E115:')
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200327endfunc
328
329scriptversion 1
330func Test_vvar_scriptversion1()
331 call assert_equal(15, 017)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200332 call assert_equal(15, 0o17)
333 call assert_equal(15, 0O17)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200334 call assert_equal(18, 018)
Bram Moolenaarc37b6552021-01-07 19:36:30 +0100335 call assert_equal(511, 0o777)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200336endfunc
337
338func Test_scriptversion_fail()
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200339 call writefile(['scriptversion 9'], 'Xversionscript')
340 call assert_fails('source Xversionscript', 'E999:')
341 call delete('Xversionscript')
342endfunc
Bram Moolenaarb6625912020-01-08 20:09:01 +0100343
Bram Moolenaar9d8d0b52020-04-24 22:47:31 +0200344func Test_execute_cmd_with_null()
Bram Moolenaarb6625912020-01-08 20:09:01 +0100345 call assert_fails('execute test_null_list()', 'E730:')
346 call assert_fails('execute test_null_dict()', 'E731:')
347 call assert_fails('execute test_null_blob()', 'E976:')
348 execute test_null_string()
349 call assert_fails('execute test_null_partial()', 'E729:')
Bram Moolenaar92b83cc2020-04-25 15:24:44 +0200350 call assert_fails('execute test_unknown()', 'E908:')
Bram Moolenaarb6625912020-01-08 20:09:01 +0100351 if has('job')
352 call assert_fails('execute test_null_job()', 'E908:')
353 call assert_fails('execute test_null_channel()', 'E908:')
354 endif
355endfunc
Bram Moolenaarf9706e92020-02-22 14:27:04 +0100356
Bram Moolenaar57d5a012021-01-21 21:42:31 +0100357func Test_number_max_min_size()
358 " This will fail on systems without 64 bit number support or when not
359 " configured correctly.
Bram Moolenaarf9706e92020-02-22 14:27:04 +0100360 call assert_equal(64, v:numbersize)
Bram Moolenaar57d5a012021-01-21 21:42:31 +0100361
362 call assert_true(v:numbermin < -9999999)
363 call assert_true(v:numbermax > 9999999)
Bram Moolenaarf9706e92020-02-22 14:27:04 +0100364endfunc
Bram Moolenaar8b633132020-03-20 18:20:51 +0100365
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200366func Assert_reg(name, type, value, valuestr, expr, exprstr)
367 call assert_equal(a:type, getregtype(a:name))
368 call assert_equal(a:value, getreg(a:name))
369 call assert_equal(a:valuestr, string(getreg(a:name, 0, 1)))
370 call assert_equal(a:expr, getreg(a:name, 1))
371 call assert_equal(a:exprstr, string(getreg(a:name, 1, 1)))
372endfunc
373
374func Test_let_register()
375 let @" = 'abc'
376 call Assert_reg('"', 'v', "abc", "['abc']", "abc", "['abc']")
377 let @" = "abc\n"
378 call Assert_reg('"', 'V', "abc\n", "['abc']", "abc\n", "['abc']")
379 let @" = "abc\<C-m>"
380 call Assert_reg('"', 'V', "abc\r\n", "['abc\r']", "abc\r\n", "['abc\r']")
381 let @= = '"abc"'
382 call Assert_reg('=', 'v', "abc", "['abc']", '"abc"', "['\"abc\"']")
383endfunc
384
385func Assert_regput(name, result)
386 new
387 execute "silent normal! o==\n==\e\"" . a:name . "P"
388 call assert_equal(a:result, getline(2, line('$')))
Bram Moolenaar61fbb332020-04-18 23:20:37 +0200389 bwipe!
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200390endfunc
391
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200392func Test_setreg_basic()
393 call setreg('a', 'abcA', 'c')
394 call Assert_reg('a', 'v', "abcA", "['abcA']", "abcA", "['abcA']")
395 call Assert_regput('a', ['==', '=abcA='])
396
397 call setreg('A', 'abcAc', 'c')
398 call Assert_reg('A', 'v', "abcAabcAc", "['abcAabcAc']", "abcAabcAc", "['abcAabcAc']")
399 call Assert_regput('a', ['==', '=abcAabcAc='])
400
401 call setreg('A', 'abcAl', 'l')
402 call Assert_reg('A', 'V', "abcAabcAcabcAl\n", "['abcAabcAcabcAl']", "abcAabcAcabcAl\n", "['abcAabcAcabcAl']")
403 call Assert_regput('a', ['==', 'abcAabcAcabcAl', '=='])
404
405 call setreg('A', 'abcAc2','c')
406 call Assert_reg('A', 'v', "abcAabcAcabcAl\nabcAc2", "['abcAabcAcabcAl', 'abcAc2']", "abcAabcAcabcAl\nabcAc2", "['abcAabcAcabcAl', 'abcAc2']")
407 call Assert_regput('a', ['==', '=abcAabcAcabcAl', 'abcAc2='])
408
409 call setreg('b', 'abcB', 'v')
410 call Assert_reg('b', 'v', "abcB", "['abcB']", "abcB", "['abcB']")
411 call Assert_regput('b', ['==', '=abcB='])
412
413 call setreg('b', 'abcBc', 'ca')
414 call Assert_reg('b', 'v', "abcBabcBc", "['abcBabcBc']", "abcBabcBc", "['abcBabcBc']")
415 call Assert_regput('b', ['==', '=abcBabcBc='])
416
417 call setreg('b', 'abcBb', 'ba')
418 call Assert_reg('b', "\<C-V>5", "abcBabcBcabcBb", "['abcBabcBcabcBb']", "abcBabcBcabcBb", "['abcBabcBcabcBb']")
419 call Assert_regput('b', ['==', '=abcBabcBcabcBb='])
420
421 call setreg('b', 'abcBc2','ca')
422 call Assert_reg('b', "v", "abcBabcBcabcBb\nabcBc2", "['abcBabcBcabcBb', 'abcBc2']", "abcBabcBcabcBb\nabcBc2", "['abcBabcBcabcBb', 'abcBc2']")
423 call Assert_regput('b', ['==', '=abcBabcBcabcBb', 'abcBc2='])
424
425 call setreg('b', 'abcBb2','b50a')
426 call Assert_reg('b', "\<C-V>50", "abcBabcBcabcBb\nabcBc2abcBb2", "['abcBabcBcabcBb', 'abcBc2abcBb2']", "abcBabcBcabcBb\nabcBc2abcBb2", "['abcBabcBcabcBb', 'abcBc2abcBb2']")
427 call Assert_regput('b', ['==', '=abcBabcBcabcBb =', ' abcBc2abcBb2'])
428
429 call setreg('c', 'abcC', 'l')
430 call Assert_reg('c', 'V', "abcC\n", "['abcC']", "abcC\n", "['abcC']")
431 call Assert_regput('c', ['==', 'abcC', '=='])
432
433 call setreg('C', 'abcCl', 'l')
434 call Assert_reg('C', 'V', "abcC\nabcCl\n", "['abcC', 'abcCl']", "abcC\nabcCl\n", "['abcC', 'abcCl']")
435 call Assert_regput('c', ['==', 'abcC', 'abcCl', '=='])
436
437 call setreg('C', 'abcCc', 'c')
438 call Assert_reg('C', 'v', "abcC\nabcCl\nabcCc", "['abcC', 'abcCl', 'abcCc']", "abcC\nabcCl\nabcCc", "['abcC', 'abcCl', 'abcCc']")
439 call Assert_regput('c', ['==', '=abcC', 'abcCl', 'abcCc='])
440
441 call setreg('d', 'abcD', 'V')
442 call Assert_reg('d', 'V', "abcD\n", "['abcD']", "abcD\n", "['abcD']")
443 call Assert_regput('d', ['==', 'abcD', '=='])
444
445 call setreg('D', 'abcDb', 'b')
446 call Assert_reg('d', "\<C-V>5", "abcD\nabcDb", "['abcD', 'abcDb']", "abcD\nabcDb", "['abcD', 'abcDb']")
447 call Assert_regput('d', ['==', '=abcD =', ' abcDb'])
448
449 call setreg('e', 'abcE', 'b')
450 call Assert_reg('e', "\<C-V>4", "abcE", "['abcE']", "abcE", "['abcE']")
451 call Assert_regput('e', ['==', '=abcE='])
452
453 call setreg('E', 'abcEb', 'b')
454 call Assert_reg('E', "\<C-V>5", "abcE\nabcEb", "['abcE', 'abcEb']", "abcE\nabcEb", "['abcE', 'abcEb']")
455 call Assert_regput('e', ['==', '=abcE =', ' abcEb'])
456
457 call setreg('E', 'abcEl', 'l')
458 call Assert_reg('E', "V", "abcE\nabcEb\nabcEl\n", "['abcE', 'abcEb', 'abcEl']", "abcE\nabcEb\nabcEl\n", "['abcE', 'abcEb', 'abcEl']")
459 call Assert_regput('e', ['==', 'abcE', 'abcEb', 'abcEl', '=='])
460
461 call setreg('f', 'abcF', "\<C-v>")
462 call Assert_reg('f', "\<C-V>4", "abcF", "['abcF']", "abcF", "['abcF']")
463 call Assert_regput('f', ['==', '=abcF='])
464
465 call setreg('F', 'abcFc', 'c')
466 call Assert_reg('F', "v", "abcF\nabcFc", "['abcF', 'abcFc']", "abcF\nabcFc", "['abcF', 'abcFc']")
467 call Assert_regput('f', ['==', '=abcF', 'abcFc='])
468
469 call setreg('g', 'abcG', 'b10')
470 call Assert_reg('g', "\<C-V>10", "abcG", "['abcG']", "abcG", "['abcG']")
471 call Assert_regput('g', ['==', '=abcG ='])
472
473 call setreg('h', 'abcH', "\<C-v>10")
474 call Assert_reg('h', "\<C-V>10", "abcH", "['abcH']", "abcH", "['abcH']")
475 call Assert_regput('h', ['==', '=abcH ='])
476
477 call setreg('I', 'abcI')
478 call Assert_reg('I', "v", "abcI", "['abcI']", "abcI", "['abcI']")
479 call Assert_regput('I', ['==', '=abcI='])
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200480
Bram Moolenaar339d60c2020-04-29 22:01:21 +0200481 " Appending NL with setreg()
482 call setreg('a', 'abcA2', 'c')
483 call setreg('b', 'abcB2', 'v')
484 call setreg('c', 'abcC2', 'l')
485 call setreg('d', 'abcD2', 'V')
486 call setreg('e', 'abcE2', 'b')
487 call setreg('f', 'abcF2', "\<C-v>")
488 call setreg('g', 'abcG2', 'b10')
489 call setreg('h', 'abcH2', "\<C-v>10")
490 call setreg('I', 'abcI2')
491
492 call setreg('A', "\n")
493 call Assert_reg('A', 'V', "abcA2\n", "['abcA2']", "abcA2\n", "['abcA2']")
494 call Assert_regput('A', ['==', 'abcA2', '=='])
495
496 call setreg('B', "\n", 'c')
497 call Assert_reg('B', 'v', "abcB2\n", "['abcB2', '']", "abcB2\n", "['abcB2', '']")
498 call Assert_regput('B', ['==', '=abcB2', '='])
499
500 call setreg('C', "\n")
501 call Assert_reg('C', 'V', "abcC2\n\n", "['abcC2', '']", "abcC2\n\n", "['abcC2', '']")
502 call Assert_regput('C', ['==', 'abcC2', '', '=='])
503
504 call setreg('D', "\n", 'l')
505 call Assert_reg('D', 'V', "abcD2\n\n", "['abcD2', '']", "abcD2\n\n", "['abcD2', '']")
506 call Assert_regput('D', ['==', 'abcD2', '', '=='])
507
508 call setreg('E', "\n")
509 call Assert_reg('E', 'V', "abcE2\n\n", "['abcE2', '']", "abcE2\n\n", "['abcE2', '']")
510 call Assert_regput('E', ['==', 'abcE2', '', '=='])
511
512 call setreg('F', "\n", 'b')
513 call Assert_reg('F', "\<C-V>0", "abcF2\n", "['abcF2', '']", "abcF2\n", "['abcF2', '']")
514 call Assert_regput('F', ['==', '=abcF2=', ' '])
515
516 " Setting lists with setreg()
517 call setreg('a', ['abcA3'], 'c')
518 call Assert_reg('a', 'v', "abcA3", "['abcA3']", "abcA3", "['abcA3']")
519 call Assert_regput('a', ['==', '=abcA3='])
520
521 call setreg('b', ['abcB3'], 'l')
522 call Assert_reg('b', 'V', "abcB3\n", "['abcB3']", "abcB3\n", "['abcB3']")
523 call Assert_regput('b', ['==', 'abcB3', '=='])
524
525 call setreg('c', ['abcC3'], 'b')
526 call Assert_reg('c', "\<C-V>5", "abcC3", "['abcC3']", "abcC3", "['abcC3']")
527 call Assert_regput('c', ['==', '=abcC3='])
528
529 call setreg('d', ['abcD3'])
530 call Assert_reg('d', 'V', "abcD3\n", "['abcD3']", "abcD3\n", "['abcD3']")
531 call Assert_regput('d', ['==', 'abcD3', '=='])
532
533 call setreg('e', [1, 2, 'abc', 3])
534 call Assert_reg('e', 'V', "1\n2\nabc\n3\n", "['1', '2', 'abc', '3']", "1\n2\nabc\n3\n", "['1', '2', 'abc', '3']")
535 call Assert_regput('e', ['==', '1', '2', 'abc', '3', '=='])
536
537 call setreg('f', [1, 2, 3])
538 call Assert_reg('f', 'V', "1\n2\n3\n", "['1', '2', '3']", "1\n2\n3\n", "['1', '2', '3']")
539 call Assert_regput('f', ['==', '1', '2', '3', '=='])
540
541 " Appending lists with setreg()
542 call setreg('A', ['abcA3c'], 'c')
543 call Assert_reg('A', 'v', "abcA3\nabcA3c", "['abcA3', 'abcA3c']", "abcA3\nabcA3c", "['abcA3', 'abcA3c']")
544 call Assert_regput('A', ['==', '=abcA3', 'abcA3c='])
545
546 call setreg('b', ['abcB3l'], 'la')
547 call Assert_reg('b', 'V', "abcB3\nabcB3l\n", "['abcB3', 'abcB3l']", "abcB3\nabcB3l\n", "['abcB3', 'abcB3l']")
548 call Assert_regput('b', ['==', 'abcB3', 'abcB3l', '=='])
549
550 call setreg('C', ['abcC3b'], 'lb')
551 call Assert_reg('C', "\<C-V>6", "abcC3\nabcC3b", "['abcC3', 'abcC3b']", "abcC3\nabcC3b", "['abcC3', 'abcC3b']")
552 call Assert_regput('C', ['==', '=abcC3 =', ' abcC3b'])
553
554 call setreg('D', ['abcD32'])
555 call Assert_reg('D', 'V', "abcD3\nabcD32\n", "['abcD3', 'abcD32']", "abcD3\nabcD32\n", "['abcD3', 'abcD32']")
556 call Assert_regput('D', ['==', 'abcD3', 'abcD32', '=='])
557
558 call setreg('A', ['abcA32'])
559 call Assert_reg('A', 'V', "abcA3\nabcA3c\nabcA32\n", "['abcA3', 'abcA3c', 'abcA32']", "abcA3\nabcA3c\nabcA32\n", "['abcA3', 'abcA3c', 'abcA32']")
560 call Assert_regput('A', ['==', 'abcA3', 'abcA3c', 'abcA32', '=='])
561
562 call setreg('B', ['abcB3c'], 'c')
563 call Assert_reg('B', 'v', "abcB3\nabcB3l\nabcB3c", "['abcB3', 'abcB3l', 'abcB3c']", "abcB3\nabcB3l\nabcB3c", "['abcB3', 'abcB3l', 'abcB3c']")
564 call Assert_regput('B', ['==', '=abcB3', 'abcB3l', 'abcB3c='])
565
566 call setreg('C', ['abcC3l'], 'l')
567 call Assert_reg('C', 'V', "abcC3\nabcC3b\nabcC3l\n", "['abcC3', 'abcC3b', 'abcC3l']", "abcC3\nabcC3b\nabcC3l\n", "['abcC3', 'abcC3b', 'abcC3l']")
568 call Assert_regput('C', ['==', 'abcC3', 'abcC3b', 'abcC3l', '=='])
569
570 call setreg('D', ['abcD3b'], 'b')
571 call Assert_reg('D', "\<C-V>6", "abcD3\nabcD32\nabcD3b", "['abcD3', 'abcD32', 'abcD3b']", "abcD3\nabcD32\nabcD3b", "['abcD3', 'abcD32', 'abcD3b']")
572 call Assert_regput('D', ['==', '=abcD3 =', ' abcD32', ' abcD3b'])
573
574 " Appending lists with NL with setreg()
575 call setreg('A', ["\n", 'abcA3l2'], 'l')
576 call Assert_reg('A', "V", "abcA3\nabcA3c\nabcA32\n\n\nabcA3l2\n", "['abcA3', 'abcA3c', 'abcA32', '\n', 'abcA3l2']", "abcA3\nabcA3c\nabcA32\n\n\nabcA3l2\n", "['abcA3', 'abcA3c', 'abcA32', '\n', 'abcA3l2']")
577 call Assert_regput('A', ['==', 'abcA3', 'abcA3c', 'abcA32', "\n", 'abcA3l2', '=='])
578
579 call setreg('B', ["\n", 'abcB3c2'], 'c')
580 call Assert_reg('B', "v", "abcB3\nabcB3l\nabcB3c\n\n\nabcB3c2", "['abcB3', 'abcB3l', 'abcB3c', '\n', 'abcB3c2']", "abcB3\nabcB3l\nabcB3c\n\n\nabcB3c2", "['abcB3', 'abcB3l', 'abcB3c', '\n', 'abcB3c2']")
581 call Assert_regput('B', ['==', '=abcB3', 'abcB3l', 'abcB3c', "\n", 'abcB3c2='])
582
583 call setreg('C', ["\n", 'abcC3b2'], 'b')
584 call Assert_reg('C', "7", "abcC3\nabcC3b\nabcC3l\n\n\nabcC3b2", "['abcC3', 'abcC3b', 'abcC3l', '\n', 'abcC3b2']", "abcC3\nabcC3b\nabcC3l\n\n\nabcC3b2", "['abcC3', 'abcC3b', 'abcC3l', '\n', 'abcC3b2']")
585 call Assert_regput('C', ['==', '=abcC3 =', ' abcC3b', ' abcC3l', " \n", ' abcC3b2'])
586
587 call setreg('D', ["\n", 'abcD3b50'],'b50')
588 call Assert_reg('D', "50", "abcD3\nabcD32\nabcD3b\n\n\nabcD3b50", "['abcD3', 'abcD32', 'abcD3b', '\n', 'abcD3b50']", "abcD3\nabcD32\nabcD3b\n\n\nabcD3b50", "['abcD3', 'abcD32', 'abcD3b', '\n', 'abcD3b50']")
589 call Assert_regput('D', ['==', '=abcD3 =', ' abcD32', ' abcD3b', " \n", ' abcD3b50'])
590
591 " Setting lists with NLs with setreg()
592 call setreg('a', ['abcA4-0', "\n", "abcA4-2\n", "\nabcA4-3", "abcA4-4\nabcA4-4-2"])
593 call Assert_reg('a', "V", "abcA4-0\n\n\nabcA4-2\n\n\nabcA4-3\nabcA4-4\nabcA4-4-2\n", "['abcA4-0', '\n', 'abcA4-2\n', '\nabcA4-3', 'abcA4-4\nabcA4-4-2']", "abcA4-0\n\n\nabcA4-2\n\n\nabcA4-3\nabcA4-4\nabcA4-4-2\n", "['abcA4-0', '\n', 'abcA4-2\n', '\nabcA4-3', 'abcA4-4\nabcA4-4-2']")
594 call Assert_regput('a', ['==', 'abcA4-0', "\n", "abcA4-2\n", "\nabcA4-3", "abcA4-4\nabcA4-4-2", '=='])
595
596 call setreg('b', ['abcB4c-0', "\n", "abcB4c-2\n", "\nabcB4c-3", "abcB4c-4\nabcB4c-4-2"], 'c')
597 call Assert_reg('b', "v", "abcB4c-0\n\n\nabcB4c-2\n\n\nabcB4c-3\nabcB4c-4\nabcB4c-4-2", "['abcB4c-0', '\n', 'abcB4c-2\n', '\nabcB4c-3', 'abcB4c-4\nabcB4c-4-2']", "abcB4c-0\n\n\nabcB4c-2\n\n\nabcB4c-3\nabcB4c-4\nabcB4c-4-2", "['abcB4c-0', '\n', 'abcB4c-2\n', '\nabcB4c-3', 'abcB4c-4\nabcB4c-4-2']")
598 call Assert_regput('b', ['==', '=abcB4c-0', "\n", "abcB4c-2\n", "\nabcB4c-3", "abcB4c-4\nabcB4c-4-2="])
599
600 call setreg('c', ['abcC4l-0', "\n", "abcC4l-2\n", "\nabcC4l-3", "abcC4l-4\nabcC4l-4-2"], 'l')
601 call Assert_reg('c', "V", "abcC4l-0\n\n\nabcC4l-2\n\n\nabcC4l-3\nabcC4l-4\nabcC4l-4-2\n", "['abcC4l-0', '\n', 'abcC4l-2\n', '\nabcC4l-3', 'abcC4l-4\nabcC4l-4-2']", "abcC4l-0\n\n\nabcC4l-2\n\n\nabcC4l-3\nabcC4l-4\nabcC4l-4-2\n", "['abcC4l-0', '\n', 'abcC4l-2\n', '\nabcC4l-3', 'abcC4l-4\nabcC4l-4-2']")
602 call Assert_regput('c', ['==', 'abcC4l-0', "\n", "abcC4l-2\n", "\nabcC4l-3", "abcC4l-4\nabcC4l-4-2", '=='])
603
604 call setreg('d', ['abcD4b-0', "\n", "abcD4b-2\n", "\nabcD4b-3", "abcD4b-4\nabcD4b-4-2"], 'b')
605 call Assert_reg('d', "19", "abcD4b-0\n\n\nabcD4b-2\n\n\nabcD4b-3\nabcD4b-4\nabcD4b-4-2", "['abcD4b-0', '\n', 'abcD4b-2\n', '\nabcD4b-3', 'abcD4b-4\nabcD4b-4-2']", "abcD4b-0\n\n\nabcD4b-2\n\n\nabcD4b-3\nabcD4b-4\nabcD4b-4-2", "['abcD4b-0', '\n', 'abcD4b-2\n', '\nabcD4b-3', 'abcD4b-4\nabcD4b-4-2']")
606 call Assert_regput('d', ['==', '=abcD4b-0 =', " \n", " abcD4b-2\n", " \nabcD4b-3", " abcD4b-4\nabcD4b-4-2"])
607
608 call setreg('e', ['abcE4b10-0', "\n", "abcE4b10-2\n", "\nabcE4b10-3", "abcE4b10-4\nabcE4b10-4-2"], 'b10')
609 call Assert_reg('e', "10", "abcE4b10-0\n\n\nabcE4b10-2\n\n\nabcE4b10-3\nabcE4b10-4\nabcE4b10-4-2", "['abcE4b10-0', '\n', 'abcE4b10-2\n', '\nabcE4b10-3', 'abcE4b10-4\nabcE4b10-4-2']", "abcE4b10-0\n\n\nabcE4b10-2\n\n\nabcE4b10-3\nabcE4b10-4\nabcE4b10-4-2", "['abcE4b10-0', '\n', 'abcE4b10-2\n', '\nabcE4b10-3', 'abcE4b10-4\nabcE4b10-4-2']")
610 call Assert_regput('e', ['==', '=abcE4b10-0=', " \n", " abcE4b10-2\n", " \nabcE4b10-3", " abcE4b10-4\nabcE4b10-4-2"])
611
612 " Search and expressions
613 call setreg('/', ['abc/'])
614 call Assert_reg('/', 'v', "abc/", "['abc/']", "abc/", "['abc/']")
615 call Assert_regput('/', ['==', '=abc/='])
616
617 call setreg('/', ["abc/\n"])
618 call Assert_reg('/', 'v', "abc/\n", "['abc/\n']", "abc/\n", "['abc/\n']")
619 call Assert_regput('/', ['==', "=abc/\n="])
620
621 call setreg('=', ['"abc/"'])
622 call Assert_reg('=', 'v', "abc/", "['abc/']", '"abc/"', "['\"abc/\"']")
623
624 call setreg('=', ["\"abc/\n\""])
625 call Assert_reg('=', 'v', "abc/\n", "['abc/\n']", "\"abc/\n\"", "['\"abc/\n\"']")
626
627 " System clipboard
628 if has('clipboard')
629 new | only!
630 call setline(1, ['clipboard contents', 'something else'])
631 " Save and restore system clipboard.
632 " If no connection to X-Server is possible, test should succeed.
633 let _clipreg = ['*', getreg('*'), getregtype('*')]
634 let _clipopt = &cb
635 let &cb='unnamed'
636 1y
637 call Assert_reg('*', 'V', "clipboard contents\n", "['clipboard contents']", "clipboard contents\n", "['clipboard contents']")
638 tabdo :windo :echo "hi"
639 2y
640 call Assert_reg('*', 'V', "something else\n", "['something else']", "something else\n", "['something else']")
641 let &cb=_clipopt
642 call call('setreg', _clipreg)
643 enew!
644 endif
645
Bram Moolenaar08f41572020-04-20 16:50:00 +0200646 " Error cases
647 call assert_fails('call setreg()', 'E119:')
648 call assert_fails('call setreg(1)', 'E119:')
649 call assert_fails('call setreg(1, 2, 3, 4)', 'E118:')
650 call assert_fails('call setreg([], 2)', 'E730:')
Bram Moolenaar08f41572020-04-20 16:50:00 +0200651 call assert_fails('call setreg(1, 2, [])', 'E730:')
652 call assert_fails('call setreg("/", ["1", "2"])', 'E883:')
653 call assert_fails('call setreg("=", ["1", "2"])', 'E883:')
654 call assert_fails('call setreg(1, ["", "", [], ""])', 'E730:')
655endfunc
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200656
Bram Moolenaarae95a392020-08-06 16:38:12 +0200657func Test_curly_assignment()
658 let s:svar = 'svar'
659 let g:gvar = 'gvar'
660 let lname = 'gvar'
661 let gname = 'gvar'
662 let {'s:'.lname} = {'g:'.gname}
663 call assert_equal('gvar', s:gvar)
664 let s:gvar = ''
665 let { 's:'.lname } = { 'g:'.gname }
666 call assert_equal('gvar', s:gvar)
667 let s:gvar = ''
668 let { 's:' . lname } = { 'g:' . gname }
669 call assert_equal('gvar', s:gvar)
670 let s:gvar = ''
671 let { 's:' .. lname } = { 'g:' .. gname }
672 call assert_equal('gvar', s:gvar)
673
674 unlet s:svar
675 unlet s:gvar
676 unlet g:gvar
677endfunc
678
Bram Moolenaarfe6fb262022-01-24 18:16:12 +0000679func Test_deep_recursion()
680 " this was running out of stack
681 call assert_fails("exe 'if ' .. repeat('(', 1002)", 'E1169: Expression too recursive: ((')
682endfunc
683
zeertzjqdb088872022-05-02 22:53:45 +0100684" K_SPECIAL in the modified character used be escaped, which causes
685" double-escaping with feedkeys() or as the return value of an <expr> mapping,
686" and doesn't match what getchar() returns,
687func Test_modified_char_no_escape_special()
688 nnoremap <M-…> <Cmd>let g:got_m_ellipsis += 1<CR>
689 call feedkeys("\<M-…>", 't')
690 call assert_equal("\<M-…>", getchar())
691 let g:got_m_ellipsis = 0
692 call feedkeys("\<M-…>", 'xt')
693 call assert_equal(1, g:got_m_ellipsis)
694 func Func()
695 return "\<M-…>"
696 endfunc
697 nmap <expr> <F2> Func()
698 call feedkeys("\<F2>", 'xt')
699 call assert_equal(2, g:got_m_ellipsis)
700 delfunc Func
701 nunmap <F2>
702 unlet g:got_m_ellipsis
703 nunmap <M-…>
704endfunc
705
Bram Moolenaar1e56bda2022-07-29 15:28:27 +0100706func Test_eval_string_in_special_key()
707 " this was using the '{' inside <> as the start of an interpolated string
708 silent! echo 0{1-$"\<S--{>n|nö%�
709endfunc
710
Bram Moolenaar8b633132020-03-20 18:20:51 +0100711" vim: shiftwidth=2 sts=2 expandtab