blob: 1b17108c4f3ff5daa3d940114576827aac225153 [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
zeertzjq6b97d7a2024-08-08 21:05:57 +02005import './vim9.vim' as v9
Bram Moolenaar2b6ef852020-07-11 22:25:57 +02006
Bram Moolenaarfabaf752017-12-23 17:26:11 +01007function s:foo() abort
8 try
9 return [] == 0
10 catch
11 return 1
12 endtry
13endfunction
14
15func Test_catch_return_with_error()
16 call assert_equal(1, s:foo())
17endfunc
Bram Moolenaar2be57332018-02-13 18:05:18 +010018
19func Test_nocatch_restore_silent_emsg()
20 silent! try
21 throw 1
22 catch
23 endtry
Bram Moolenaar2b6ef852020-07-11 22:25:57 +020024 echoerr 'wrong again'
25 call assert_equal('wrong again', ScreenLine(&lines))
Bram Moolenaar2be57332018-02-13 18:05:18 +010026endfunc
Bram Moolenaar78a16b02018-04-14 13:51:55 +020027
28func Test_mkdir_p()
Bram Moolenaar5c645a22022-09-21 22:00:03 +010029 call mkdir('Xmkdir/nested', 'pR')
Bram Moolenaar78a16b02018-04-14 13:51:55 +020030 call assert_true(isdirectory('Xmkdir/nested'))
31 try
32 " Trying to make existing directories doesn't error
33 call mkdir('Xmkdir', 'p')
34 call mkdir('Xmkdir/nested', 'p')
35 catch /E739:/
36 call assert_report('mkdir(..., "p") failed for an existing directory')
37 endtry
38 " 'p' doesn't suppress real errors
Bram Moolenaar5c645a22022-09-21 22:00:03 +010039 call writefile([], 'Xmkdirfile', 'D')
Bram Moolenaarb18b4962022-09-02 21:55:50 +010040 call assert_fails('call mkdir("Xmkdirfile", "p")', 'E739:')
Bram Moolenaar5c645a22022-09-21 22:00:03 +010041
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:')
zeertzjq6b97d7a2024-08-08 21:05:57 +0200130
131 let lines =<< trim END
132 for v:maxcol in range(5)
133 endfor
134 END
135
136 let save_v_maxcol = v:maxcol
137 call v9.CheckLegacyAndVim9Failure(lines, 'E46:')
138 call assert_equal(save_v_maxcol, v:maxcol)
139
140 let lines =<< trim END
141 for g:constvar in range(5)
142 endfor
143 END
144
145 const g:constvar = 10
146 call v9.CheckLegacyAndVim9Failure(lines, 'E741:')
147 call assert_equal(10, g:constvar)
148 unlet g:constvar
149
150 let g:constvar = 10
151 lockvar 0 g:constvar
152 call v9.CheckLegacyAndVim9Failure(lines, 'E1122:')
153 call assert_equal(10, g:constvar)
154 unlet g:constvar
Bram Moolenaardf2c2982021-01-28 20:18:08 +0100155
156 if 0
157 /1/5/2/s/\n
158 endif
159 redraw
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100160endfunc
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100161
Bram Moolenaarf6d39c32022-08-16 17:50:38 +0100162func Test_for_over_null_string()
163 let save_enc = &enc
164 set enc=iso8859
165 let cnt = 0
166 for c in test_null_string()
167 let cnt += 1
168 endfor
169 call assert_equal(0, cnt)
170
171 let &enc = save_enc
172endfunc
173
Bram Moolenaar91324262022-09-09 13:27:59 +0100174func Test_for_with_modifier()
175 " this checks has_loop_cmd() works with a modifier
176 let result = []
177 vim9cmd for i in range(3)
178 call extend(result, [i])
179 endfor
180 call assert_equal([0, 1, 2], result)
181endfunc
182
Bram Moolenaar35d21c62022-09-02 16:47:16 +0100183func Test_for_invalid_line_count()
184 let lines =<< trim END
185 111111111111111111111111 for line in ['one']
186 endfor
187 END
Bram Moolenaar5c645a22022-09-21 22:00:03 +0100188 call writefile(lines, 'XinvalidFor', 'D')
Bram Moolenaar35d21c62022-09-02 16:47:16 +0100189 " only test that this doesn't crash
190 call RunVim([], [], '-u NONE -e -s -S XinvalidFor -c qa')
Bram Moolenaar35d21c62022-09-02 16:47:16 +0100191endfunc
192
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100193func Test_readfile_binary()
194 new
195 call setline(1, ['one', 'two', 'three'])
196 setlocal ff=dos
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200197 silent write XReadfile_bin
198 let lines = 'XReadfile_bin'->readfile()
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100199 call assert_equal(['one', 'two', 'three'], lines)
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200200 let lines = readfile('XReadfile_bin', '', 2)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100201 call assert_equal(['one', 'two'], lines)
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200202 let lines = readfile('XReadfile_bin', 'b')
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100203 call assert_equal(["one\r", "two\r", "three\r", ""], lines)
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200204 let lines = readfile('XReadfile_bin', 'b', 2)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100205 call assert_equal(["one\r", "two\r"], lines)
206
207 bwipe!
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200208 call delete('XReadfile_bin')
209endfunc
210
Dominique Pellef5d639a2022-01-12 15:24:40 +0000211func Test_readfile_binary_empty()
Bram Moolenaar5c645a22022-09-21 22:00:03 +0100212 call writefile([], 'Xempty-file', 'D')
Dominique Pellef5d639a2022-01-12 15:24:40 +0000213 " This used to compare uninitialized memory in Vim <= 8.2.4065
214 call assert_equal([''], readfile('Xempty-file', 'b'))
Dominique Pellef5d639a2022-01-12 15:24:40 +0000215endfunc
216
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200217func Test_readfile_bom()
218 call writefile(["\ufeffFOO", "FOO\ufeffBAR"], 'XReadfile_bom')
219 call assert_equal(['FOO', 'FOOBAR'], readfile('XReadfile_bom'))
220 call delete('XReadfile_bom')
221endfunc
222
223func Test_readfile_max()
Bram Moolenaar5c645a22022-09-21 22:00:03 +0100224 call writefile(range(1, 4), 'XReadfile_max', 'D')
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200225 call assert_equal(['1', '2'], readfile('XReadfile_max', '', 2))
226 call assert_equal(['3', '4'], readfile('XReadfile_max', '', -2))
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100227endfunc
Bram Moolenaar4b9e91f2019-01-24 13:58:11 +0100228
229func Test_let_errmsg()
230 call assert_fails('let v:errmsg = []', 'E730:')
231 let v:errmsg = ''
232 call assert_fails('let v:errmsg = []', 'E730:')
233 let v:errmsg = ''
234endfunc
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200235
236func Test_string_concatenation()
237 call assert_equal('ab', 'a'.'b')
238 call assert_equal('ab', 'a' .'b')
239 call assert_equal('ab', 'a'. 'b')
240 call assert_equal('ab', 'a' . 'b')
241
242 call assert_equal('ab', 'a'..'b')
243 call assert_equal('ab', 'a' ..'b')
244 call assert_equal('ab', 'a'.. 'b')
245 call assert_equal('ab', 'a' .. 'b')
246
247 let a = 'a'
248 let b = 'b'
249 let a .= b
250 call assert_equal('ab', a)
251
252 let a = 'a'
253 let a.=b
254 call assert_equal('ab', a)
255
256 let a = 'a'
257 let a ..= b
258 call assert_equal('ab', a)
259
260 let a = 'a'
261 let a..=b
262 call assert_equal('ab', a)
Bram Moolenaar2e086612020-08-25 22:37:48 +0200263
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100264 let a = 'A'
265 let b = 1.234
266 call assert_equal('A1.234', a .. b)
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200267endfunc
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200268
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200269" Test fix for issue #4507
270func Test_skip_after_throw()
271 try
272 throw 'something'
273 let x = wincol() || &ts
274 catch /something/
275 endtry
276endfunc
277
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200278scriptversion 2
279func Test_string_concat_scriptversion2()
Bram Moolenaar93a48792019-04-20 21:54:28 +0200280 call assert_true(has('vimscript-2'))
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200281 let a = 'a'
282 let b = 'b'
283
284 call assert_fails('echo a . b', 'E15:')
285 call assert_fails('let a .= b', 'E985:')
Bram Moolenaarfae55a92021-06-17 22:08:30 +0200286 call assert_fails('let vers = 1.2.3', 'E488:')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200287
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100288 let f = .5
289 call assert_equal(0.5, f)
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200290endfunc
291
292scriptversion 1
293func Test_string_concat_scriptversion1()
Bram Moolenaar93a48792019-04-20 21:54:28 +0200294 call assert_true(has('vimscript-1'))
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200295 let a = 'a'
296 let b = 'b'
297
298 echo a . b
299 let a .= b
300 let vers = 1.2.3
301 call assert_equal('123', vers)
302
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100303 call assert_fails('let f = .5', 'E15:')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200304endfunc
305
Bram Moolenaard2e716e2019-04-20 14:39:52 +0200306scriptversion 3
307func Test_vvar_scriptversion3()
Bram Moolenaar93a48792019-04-20 21:54:28 +0200308 call assert_true(has('vimscript-3'))
Bram Moolenaard2e716e2019-04-20 14:39:52 +0200309 call assert_fails('echo version', 'E121:')
310 call assert_false(exists('version'))
311 let version = 1
312 call assert_equal(1, version)
313endfunc
314
315scriptversion 2
316func Test_vvar_scriptversion2()
317 call assert_true(exists('version'))
318 echo version
319 call assert_fails('let version = 1', 'E46:')
320 call assert_equal(v:version, version)
Bram Moolenaar37df9a42019-06-14 14:39:51 +0200321
322 call assert_equal(v:version, v:versionlong / 10000)
323 call assert_true(v:versionlong > 8011525)
Bram Moolenaard2e716e2019-04-20 14:39:52 +0200324endfunc
325
Bram Moolenaar61343f02019-07-20 21:11:13 +0200326func Test_dict_access_scriptversion2()
327 let l:x = {'foo': 1}
328
329 call assert_false(0 && l:x.foo)
330 call assert_true(1 && l:x.foo)
331endfunc
332
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200333scriptversion 4
334func Test_vvar_scriptversion4()
Bram Moolenaaraf914382019-09-15 17:49:10 +0200335 call assert_true(has('vimscript-4'))
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200336 call assert_equal(17, 017)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200337 call assert_equal(15, 0o17)
338 call assert_equal(15, 0O17)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200339 call assert_equal(18, 018)
Bram Moolenaarc37b6552021-01-07 19:36:30 +0100340 call assert_equal(511, 0o777)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200341 call assert_equal(64, 0b1'00'00'00)
342 call assert_equal(1048576, 0x10'00'00)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200343 call assert_equal(32768, 0o10'00'00)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200344 call assert_equal(1000000, 1'000'000)
Bram Moolenaarea8dcf82019-09-15 21:12:22 +0200345 call assert_equal("1234", execute("echo 1'234")->trim())
346 call assert_equal('1 234', execute("echo 1''234")->trim())
347 call assert_fails("echo 1'''234", 'E115:')
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200348endfunc
349
350scriptversion 1
351func Test_vvar_scriptversion1()
352 call assert_equal(15, 017)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200353 call assert_equal(15, 0o17)
354 call assert_equal(15, 0O17)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200355 call assert_equal(18, 018)
Bram Moolenaarc37b6552021-01-07 19:36:30 +0100356 call assert_equal(511, 0o777)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200357endfunc
358
359func Test_scriptversion_fail()
Bram Moolenaar5c645a22022-09-21 22:00:03 +0100360 call writefile(['scriptversion 9'], 'Xversionscript', 'D')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200361 call assert_fails('source Xversionscript', 'E999:')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200362endfunc
Bram Moolenaarb6625912020-01-08 20:09:01 +0100363
Bram Moolenaar9d8d0b52020-04-24 22:47:31 +0200364func Test_execute_cmd_with_null()
Bram Moolenaarb6625912020-01-08 20:09:01 +0100365 call assert_fails('execute test_null_list()', 'E730:')
366 call assert_fails('execute test_null_dict()', 'E731:')
367 call assert_fails('execute test_null_blob()', 'E976:')
368 execute test_null_string()
369 call assert_fails('execute test_null_partial()', 'E729:')
Bram Moolenaar92b83cc2020-04-25 15:24:44 +0200370 call assert_fails('execute test_unknown()', 'E908:')
Bram Moolenaarb6625912020-01-08 20:09:01 +0100371 if has('job')
372 call assert_fails('execute test_null_job()', 'E908:')
373 call assert_fails('execute test_null_channel()', 'E908:')
374 endif
375endfunc
Bram Moolenaarf9706e92020-02-22 14:27:04 +0100376
Bram Moolenaar57d5a012021-01-21 21:42:31 +0100377func Test_number_max_min_size()
378 " This will fail on systems without 64 bit number support or when not
379 " configured correctly.
Bram Moolenaarf9706e92020-02-22 14:27:04 +0100380 call assert_equal(64, v:numbersize)
Bram Moolenaar57d5a012021-01-21 21:42:31 +0100381
382 call assert_true(v:numbermin < -9999999)
383 call assert_true(v:numbermax > 9999999)
Bram Moolenaarf9706e92020-02-22 14:27:04 +0100384endfunc
Bram Moolenaar8b633132020-03-20 18:20:51 +0100385
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200386func Assert_reg(name, type, value, valuestr, expr, exprstr)
387 call assert_equal(a:type, getregtype(a:name))
388 call assert_equal(a:value, getreg(a:name))
389 call assert_equal(a:valuestr, string(getreg(a:name, 0, 1)))
390 call assert_equal(a:expr, getreg(a:name, 1))
391 call assert_equal(a:exprstr, string(getreg(a:name, 1, 1)))
392endfunc
393
394func Test_let_register()
395 let @" = 'abc'
396 call Assert_reg('"', 'v', "abc", "['abc']", "abc", "['abc']")
397 let @" = "abc\n"
398 call Assert_reg('"', 'V', "abc\n", "['abc']", "abc\n", "['abc']")
399 let @" = "abc\<C-m>"
400 call Assert_reg('"', 'V', "abc\r\n", "['abc\r']", "abc\r\n", "['abc\r']")
401 let @= = '"abc"'
402 call Assert_reg('=', 'v', "abc", "['abc']", '"abc"', "['\"abc\"']")
403endfunc
404
405func Assert_regput(name, result)
406 new
407 execute "silent normal! o==\n==\e\"" . a:name . "P"
408 call assert_equal(a:result, getline(2, line('$')))
Bram Moolenaar61fbb332020-04-18 23:20:37 +0200409 bwipe!
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200410endfunc
411
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200412func Test_setreg_basic()
413 call setreg('a', 'abcA', 'c')
414 call Assert_reg('a', 'v', "abcA", "['abcA']", "abcA", "['abcA']")
415 call Assert_regput('a', ['==', '=abcA='])
416
417 call setreg('A', 'abcAc', 'c')
418 call Assert_reg('A', 'v', "abcAabcAc", "['abcAabcAc']", "abcAabcAc", "['abcAabcAc']")
419 call Assert_regput('a', ['==', '=abcAabcAc='])
420
421 call setreg('A', 'abcAl', 'l')
422 call Assert_reg('A', 'V', "abcAabcAcabcAl\n", "['abcAabcAcabcAl']", "abcAabcAcabcAl\n", "['abcAabcAcabcAl']")
423 call Assert_regput('a', ['==', 'abcAabcAcabcAl', '=='])
424
425 call setreg('A', 'abcAc2','c')
426 call Assert_reg('A', 'v', "abcAabcAcabcAl\nabcAc2", "['abcAabcAcabcAl', 'abcAc2']", "abcAabcAcabcAl\nabcAc2", "['abcAabcAcabcAl', 'abcAc2']")
427 call Assert_regput('a', ['==', '=abcAabcAcabcAl', 'abcAc2='])
428
429 call setreg('b', 'abcB', 'v')
430 call Assert_reg('b', 'v', "abcB", "['abcB']", "abcB", "['abcB']")
431 call Assert_regput('b', ['==', '=abcB='])
432
433 call setreg('b', 'abcBc', 'ca')
434 call Assert_reg('b', 'v', "abcBabcBc", "['abcBabcBc']", "abcBabcBc", "['abcBabcBc']")
435 call Assert_regput('b', ['==', '=abcBabcBc='])
436
437 call setreg('b', 'abcBb', 'ba')
438 call Assert_reg('b', "\<C-V>5", "abcBabcBcabcBb", "['abcBabcBcabcBb']", "abcBabcBcabcBb", "['abcBabcBcabcBb']")
439 call Assert_regput('b', ['==', '=abcBabcBcabcBb='])
440
441 call setreg('b', 'abcBc2','ca')
442 call Assert_reg('b', "v", "abcBabcBcabcBb\nabcBc2", "['abcBabcBcabcBb', 'abcBc2']", "abcBabcBcabcBb\nabcBc2", "['abcBabcBcabcBb', 'abcBc2']")
443 call Assert_regput('b', ['==', '=abcBabcBcabcBb', 'abcBc2='])
444
445 call setreg('b', 'abcBb2','b50a')
446 call Assert_reg('b', "\<C-V>50", "abcBabcBcabcBb\nabcBc2abcBb2", "['abcBabcBcabcBb', 'abcBc2abcBb2']", "abcBabcBcabcBb\nabcBc2abcBb2", "['abcBabcBcabcBb', 'abcBc2abcBb2']")
447 call Assert_regput('b', ['==', '=abcBabcBcabcBb =', ' abcBc2abcBb2'])
448
449 call setreg('c', 'abcC', 'l')
450 call Assert_reg('c', 'V', "abcC\n", "['abcC']", "abcC\n", "['abcC']")
451 call Assert_regput('c', ['==', 'abcC', '=='])
452
453 call setreg('C', 'abcCl', 'l')
454 call Assert_reg('C', 'V', "abcC\nabcCl\n", "['abcC', 'abcCl']", "abcC\nabcCl\n", "['abcC', 'abcCl']")
455 call Assert_regput('c', ['==', 'abcC', 'abcCl', '=='])
456
457 call setreg('C', 'abcCc', 'c')
458 call Assert_reg('C', 'v', "abcC\nabcCl\nabcCc", "['abcC', 'abcCl', 'abcCc']", "abcC\nabcCl\nabcCc", "['abcC', 'abcCl', 'abcCc']")
459 call Assert_regput('c', ['==', '=abcC', 'abcCl', 'abcCc='])
460
461 call setreg('d', 'abcD', 'V')
462 call Assert_reg('d', 'V', "abcD\n", "['abcD']", "abcD\n", "['abcD']")
463 call Assert_regput('d', ['==', 'abcD', '=='])
464
465 call setreg('D', 'abcDb', 'b')
466 call Assert_reg('d', "\<C-V>5", "abcD\nabcDb", "['abcD', 'abcDb']", "abcD\nabcDb", "['abcD', 'abcDb']")
467 call Assert_regput('d', ['==', '=abcD =', ' abcDb'])
468
469 call setreg('e', 'abcE', 'b')
470 call Assert_reg('e', "\<C-V>4", "abcE", "['abcE']", "abcE", "['abcE']")
471 call Assert_regput('e', ['==', '=abcE='])
472
473 call setreg('E', 'abcEb', 'b')
474 call Assert_reg('E', "\<C-V>5", "abcE\nabcEb", "['abcE', 'abcEb']", "abcE\nabcEb", "['abcE', 'abcEb']")
475 call Assert_regput('e', ['==', '=abcE =', ' abcEb'])
476
477 call setreg('E', 'abcEl', 'l')
478 call Assert_reg('E', "V", "abcE\nabcEb\nabcEl\n", "['abcE', 'abcEb', 'abcEl']", "abcE\nabcEb\nabcEl\n", "['abcE', 'abcEb', 'abcEl']")
479 call Assert_regput('e', ['==', 'abcE', 'abcEb', 'abcEl', '=='])
480
481 call setreg('f', 'abcF', "\<C-v>")
482 call Assert_reg('f', "\<C-V>4", "abcF", "['abcF']", "abcF", "['abcF']")
483 call Assert_regput('f', ['==', '=abcF='])
484
485 call setreg('F', 'abcFc', 'c')
486 call Assert_reg('F', "v", "abcF\nabcFc", "['abcF', 'abcFc']", "abcF\nabcFc", "['abcF', 'abcFc']")
487 call Assert_regput('f', ['==', '=abcF', 'abcFc='])
488
489 call setreg('g', 'abcG', 'b10')
490 call Assert_reg('g', "\<C-V>10", "abcG", "['abcG']", "abcG", "['abcG']")
491 call Assert_regput('g', ['==', '=abcG ='])
492
493 call setreg('h', 'abcH', "\<C-v>10")
494 call Assert_reg('h', "\<C-V>10", "abcH", "['abcH']", "abcH", "['abcH']")
495 call Assert_regput('h', ['==', '=abcH ='])
496
497 call setreg('I', 'abcI')
498 call Assert_reg('I', "v", "abcI", "['abcI']", "abcI", "['abcI']")
499 call Assert_regput('I', ['==', '=abcI='])
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200500
Bram Moolenaar339d60c2020-04-29 22:01:21 +0200501 " Appending NL with setreg()
502 call setreg('a', 'abcA2', 'c')
503 call setreg('b', 'abcB2', 'v')
504 call setreg('c', 'abcC2', 'l')
505 call setreg('d', 'abcD2', 'V')
506 call setreg('e', 'abcE2', 'b')
507 call setreg('f', 'abcF2', "\<C-v>")
508 call setreg('g', 'abcG2', 'b10')
509 call setreg('h', 'abcH2', "\<C-v>10")
510 call setreg('I', 'abcI2')
511
512 call setreg('A', "\n")
513 call Assert_reg('A', 'V', "abcA2\n", "['abcA2']", "abcA2\n", "['abcA2']")
514 call Assert_regput('A', ['==', 'abcA2', '=='])
515
516 call setreg('B', "\n", 'c')
517 call Assert_reg('B', 'v', "abcB2\n", "['abcB2', '']", "abcB2\n", "['abcB2', '']")
518 call Assert_regput('B', ['==', '=abcB2', '='])
519
520 call setreg('C', "\n")
521 call Assert_reg('C', 'V', "abcC2\n\n", "['abcC2', '']", "abcC2\n\n", "['abcC2', '']")
522 call Assert_regput('C', ['==', 'abcC2', '', '=='])
523
524 call setreg('D', "\n", 'l')
525 call Assert_reg('D', 'V', "abcD2\n\n", "['abcD2', '']", "abcD2\n\n", "['abcD2', '']")
526 call Assert_regput('D', ['==', 'abcD2', '', '=='])
527
528 call setreg('E', "\n")
529 call Assert_reg('E', 'V', "abcE2\n\n", "['abcE2', '']", "abcE2\n\n", "['abcE2', '']")
530 call Assert_regput('E', ['==', 'abcE2', '', '=='])
531
532 call setreg('F', "\n", 'b')
533 call Assert_reg('F', "\<C-V>0", "abcF2\n", "['abcF2', '']", "abcF2\n", "['abcF2', '']")
534 call Assert_regput('F', ['==', '=abcF2=', ' '])
535
536 " Setting lists with setreg()
537 call setreg('a', ['abcA3'], 'c')
538 call Assert_reg('a', 'v', "abcA3", "['abcA3']", "abcA3", "['abcA3']")
539 call Assert_regput('a', ['==', '=abcA3='])
540
541 call setreg('b', ['abcB3'], 'l')
542 call Assert_reg('b', 'V', "abcB3\n", "['abcB3']", "abcB3\n", "['abcB3']")
543 call Assert_regput('b', ['==', 'abcB3', '=='])
544
545 call setreg('c', ['abcC3'], 'b')
546 call Assert_reg('c', "\<C-V>5", "abcC3", "['abcC3']", "abcC3", "['abcC3']")
547 call Assert_regput('c', ['==', '=abcC3='])
548
549 call setreg('d', ['abcD3'])
550 call Assert_reg('d', 'V', "abcD3\n", "['abcD3']", "abcD3\n", "['abcD3']")
551 call Assert_regput('d', ['==', 'abcD3', '=='])
552
553 call setreg('e', [1, 2, 'abc', 3])
554 call Assert_reg('e', 'V', "1\n2\nabc\n3\n", "['1', '2', 'abc', '3']", "1\n2\nabc\n3\n", "['1', '2', 'abc', '3']")
555 call Assert_regput('e', ['==', '1', '2', 'abc', '3', '=='])
556
557 call setreg('f', [1, 2, 3])
558 call Assert_reg('f', 'V', "1\n2\n3\n", "['1', '2', '3']", "1\n2\n3\n", "['1', '2', '3']")
559 call Assert_regput('f', ['==', '1', '2', '3', '=='])
560
561 " Appending lists with setreg()
562 call setreg('A', ['abcA3c'], 'c')
563 call Assert_reg('A', 'v', "abcA3\nabcA3c", "['abcA3', 'abcA3c']", "abcA3\nabcA3c", "['abcA3', 'abcA3c']")
564 call Assert_regput('A', ['==', '=abcA3', 'abcA3c='])
565
566 call setreg('b', ['abcB3l'], 'la')
567 call Assert_reg('b', 'V', "abcB3\nabcB3l\n", "['abcB3', 'abcB3l']", "abcB3\nabcB3l\n", "['abcB3', 'abcB3l']")
568 call Assert_regput('b', ['==', 'abcB3', 'abcB3l', '=='])
569
570 call setreg('C', ['abcC3b'], 'lb')
571 call Assert_reg('C', "\<C-V>6", "abcC3\nabcC3b", "['abcC3', 'abcC3b']", "abcC3\nabcC3b", "['abcC3', 'abcC3b']")
572 call Assert_regput('C', ['==', '=abcC3 =', ' abcC3b'])
573
574 call setreg('D', ['abcD32'])
575 call Assert_reg('D', 'V', "abcD3\nabcD32\n", "['abcD3', 'abcD32']", "abcD3\nabcD32\n", "['abcD3', 'abcD32']")
576 call Assert_regput('D', ['==', 'abcD3', 'abcD32', '=='])
577
578 call setreg('A', ['abcA32'])
579 call Assert_reg('A', 'V', "abcA3\nabcA3c\nabcA32\n", "['abcA3', 'abcA3c', 'abcA32']", "abcA3\nabcA3c\nabcA32\n", "['abcA3', 'abcA3c', 'abcA32']")
580 call Assert_regput('A', ['==', 'abcA3', 'abcA3c', 'abcA32', '=='])
581
582 call setreg('B', ['abcB3c'], 'c')
583 call Assert_reg('B', 'v', "abcB3\nabcB3l\nabcB3c", "['abcB3', 'abcB3l', 'abcB3c']", "abcB3\nabcB3l\nabcB3c", "['abcB3', 'abcB3l', 'abcB3c']")
584 call Assert_regput('B', ['==', '=abcB3', 'abcB3l', 'abcB3c='])
585
586 call setreg('C', ['abcC3l'], 'l')
587 call Assert_reg('C', 'V', "abcC3\nabcC3b\nabcC3l\n", "['abcC3', 'abcC3b', 'abcC3l']", "abcC3\nabcC3b\nabcC3l\n", "['abcC3', 'abcC3b', 'abcC3l']")
588 call Assert_regput('C', ['==', 'abcC3', 'abcC3b', 'abcC3l', '=='])
589
590 call setreg('D', ['abcD3b'], 'b')
591 call Assert_reg('D', "\<C-V>6", "abcD3\nabcD32\nabcD3b", "['abcD3', 'abcD32', 'abcD3b']", "abcD3\nabcD32\nabcD3b", "['abcD3', 'abcD32', 'abcD3b']")
592 call Assert_regput('D', ['==', '=abcD3 =', ' abcD32', ' abcD3b'])
593
594 " Appending lists with NL with setreg()
595 call setreg('A', ["\n", 'abcA3l2'], 'l')
596 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']")
597 call Assert_regput('A', ['==', 'abcA3', 'abcA3c', 'abcA32', "\n", 'abcA3l2', '=='])
598
599 call setreg('B', ["\n", 'abcB3c2'], 'c')
600 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']")
601 call Assert_regput('B', ['==', '=abcB3', 'abcB3l', 'abcB3c', "\n", 'abcB3c2='])
602
603 call setreg('C', ["\n", 'abcC3b2'], 'b')
604 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']")
605 call Assert_regput('C', ['==', '=abcC3 =', ' abcC3b', ' abcC3l', " \n", ' abcC3b2'])
606
607 call setreg('D', ["\n", 'abcD3b50'],'b50')
608 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']")
609 call Assert_regput('D', ['==', '=abcD3 =', ' abcD32', ' abcD3b', " \n", ' abcD3b50'])
610
611 " Setting lists with NLs with setreg()
612 call setreg('a', ['abcA4-0', "\n", "abcA4-2\n", "\nabcA4-3", "abcA4-4\nabcA4-4-2"])
613 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']")
614 call Assert_regput('a', ['==', 'abcA4-0', "\n", "abcA4-2\n", "\nabcA4-3", "abcA4-4\nabcA4-4-2", '=='])
615
616 call setreg('b', ['abcB4c-0', "\n", "abcB4c-2\n", "\nabcB4c-3", "abcB4c-4\nabcB4c-4-2"], 'c')
617 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']")
618 call Assert_regput('b', ['==', '=abcB4c-0', "\n", "abcB4c-2\n", "\nabcB4c-3", "abcB4c-4\nabcB4c-4-2="])
619
620 call setreg('c', ['abcC4l-0', "\n", "abcC4l-2\n", "\nabcC4l-3", "abcC4l-4\nabcC4l-4-2"], 'l')
621 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']")
622 call Assert_regput('c', ['==', 'abcC4l-0', "\n", "abcC4l-2\n", "\nabcC4l-3", "abcC4l-4\nabcC4l-4-2", '=='])
623
624 call setreg('d', ['abcD4b-0', "\n", "abcD4b-2\n", "\nabcD4b-3", "abcD4b-4\nabcD4b-4-2"], 'b')
625 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']")
626 call Assert_regput('d', ['==', '=abcD4b-0 =', " \n", " abcD4b-2\n", " \nabcD4b-3", " abcD4b-4\nabcD4b-4-2"])
627
628 call setreg('e', ['abcE4b10-0', "\n", "abcE4b10-2\n", "\nabcE4b10-3", "abcE4b10-4\nabcE4b10-4-2"], 'b10')
629 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']")
630 call Assert_regput('e', ['==', '=abcE4b10-0=', " \n", " abcE4b10-2\n", " \nabcE4b10-3", " abcE4b10-4\nabcE4b10-4-2"])
631
632 " Search and expressions
633 call setreg('/', ['abc/'])
634 call Assert_reg('/', 'v', "abc/", "['abc/']", "abc/", "['abc/']")
635 call Assert_regput('/', ['==', '=abc/='])
636
637 call setreg('/', ["abc/\n"])
638 call Assert_reg('/', 'v', "abc/\n", "['abc/\n']", "abc/\n", "['abc/\n']")
639 call Assert_regput('/', ['==', "=abc/\n="])
640
641 call setreg('=', ['"abc/"'])
642 call Assert_reg('=', 'v', "abc/", "['abc/']", '"abc/"', "['\"abc/\"']")
643
644 call setreg('=', ["\"abc/\n\""])
645 call Assert_reg('=', 'v', "abc/\n", "['abc/\n']", "\"abc/\n\"", "['\"abc/\n\"']")
646
647 " System clipboard
648 if has('clipboard')
649 new | only!
650 call setline(1, ['clipboard contents', 'something else'])
651 " Save and restore system clipboard.
652 " If no connection to X-Server is possible, test should succeed.
653 let _clipreg = ['*', getreg('*'), getregtype('*')]
654 let _clipopt = &cb
655 let &cb='unnamed'
656 1y
657 call Assert_reg('*', 'V', "clipboard contents\n", "['clipboard contents']", "clipboard contents\n", "['clipboard contents']")
658 tabdo :windo :echo "hi"
659 2y
660 call Assert_reg('*', 'V', "something else\n", "['something else']", "something else\n", "['something else']")
661 let &cb=_clipopt
662 call call('setreg', _clipreg)
663 enew!
664 endif
665
Bram Moolenaar08f41572020-04-20 16:50:00 +0200666 " Error cases
667 call assert_fails('call setreg()', 'E119:')
668 call assert_fails('call setreg(1)', 'E119:')
669 call assert_fails('call setreg(1, 2, 3, 4)', 'E118:')
670 call assert_fails('call setreg([], 2)', 'E730:')
Bram Moolenaar08f41572020-04-20 16:50:00 +0200671 call assert_fails('call setreg(1, 2, [])', 'E730:')
672 call assert_fails('call setreg("/", ["1", "2"])', 'E883:')
673 call assert_fails('call setreg("=", ["1", "2"])', 'E883:')
674 call assert_fails('call setreg(1, ["", "", [], ""])', 'E730:')
675endfunc
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200676
Bram Moolenaarae95a392020-08-06 16:38:12 +0200677func Test_curly_assignment()
678 let s:svar = 'svar'
679 let g:gvar = 'gvar'
680 let lname = 'gvar'
681 let gname = 'gvar'
682 let {'s:'.lname} = {'g:'.gname}
683 call assert_equal('gvar', s:gvar)
684 let s:gvar = ''
685 let { 's:'.lname } = { 'g:'.gname }
686 call assert_equal('gvar', s:gvar)
687 let s:gvar = ''
688 let { 's:' . lname } = { 'g:' . gname }
689 call assert_equal('gvar', s:gvar)
690 let s:gvar = ''
691 let { 's:' .. lname } = { 'g:' .. gname }
692 call assert_equal('gvar', s:gvar)
693
694 unlet s:svar
695 unlet s:gvar
696 unlet g:gvar
697endfunc
698
Bram Moolenaarfe6fb262022-01-24 18:16:12 +0000699func Test_deep_recursion()
700 " this was running out of stack
701 call assert_fails("exe 'if ' .. repeat('(', 1002)", 'E1169: Expression too recursive: ((')
702endfunc
703
zeertzjqdb088872022-05-02 22:53:45 +0100704" K_SPECIAL in the modified character used be escaped, which causes
705" double-escaping with feedkeys() or as the return value of an <expr> mapping,
706" and doesn't match what getchar() returns,
707func Test_modified_char_no_escape_special()
708 nnoremap <M-…> <Cmd>let g:got_m_ellipsis += 1<CR>
709 call feedkeys("\<M-…>", 't')
710 call assert_equal("\<M-…>", getchar())
711 let g:got_m_ellipsis = 0
712 call feedkeys("\<M-…>", 'xt')
713 call assert_equal(1, g:got_m_ellipsis)
714 func Func()
715 return "\<M-…>"
716 endfunc
717 nmap <expr> <F2> Func()
718 call feedkeys("\<F2>", 'xt')
719 call assert_equal(2, g:got_m_ellipsis)
720 delfunc Func
721 nunmap <F2>
722 unlet g:got_m_ellipsis
723 nunmap <M-…>
724endfunc
725
Bram Moolenaar1e56bda2022-07-29 15:28:27 +0100726func Test_eval_string_in_special_key()
727 " this was using the '{' inside <> as the start of an interpolated string
728 silent! echo 0{1-$"\<S--{>n|nö%�
729endfunc
730
Bram Moolenaar8b633132020-03-20 18:20:51 +0100731" vim: shiftwidth=2 sts=2 expandtab