blob: 39bb4ba9f2d08305420511511a232fcef6d5ab16 [file] [log] [blame]
Bram Moolenaarfabaf752017-12-23 17:26:11 +01001" Tests for various eval things.
2
Christian Brabandteb380b92025-07-07 20:53:55 +02003source util/shared.vim
4import './util/vim9.vim' as v9
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()
Bram Moolenaar5c645a22022-09-21 22:00:03 +010028 call mkdir('Xmkdir/nested', 'pR')
Bram Moolenaar78a16b02018-04-14 13:51:55 +020029 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 Moolenaar5c645a22022-09-21 22:00:03 +010038 call writefile([], 'Xmkdirfile', 'D')
Bram Moolenaarb18b4962022-09-02 21:55:50 +010039 call assert_fails('call mkdir("Xmkdirfile", "p")', 'E739:')
Bram Moolenaar5c645a22022-09-21 22:00:03 +010040
Bram Moolenaar92b83cc2020-04-25 15:24:44 +020041 call assert_equal(0, mkdir(test_null_string()))
Bram Moolenaare2e40752020-09-04 21:18:46 +020042 call assert_fails('call mkdir([])', 'E730:')
43 call assert_fails('call mkdir("abc", [], [])', 'E745:')
Bram Moolenaar78a16b02018-04-14 13:51:55 +020044endfunc
Bram Moolenaar67f8ab82018-09-11 22:37:29 +020045
Bram Moolenaar6f14da12022-09-07 21:30:44 +010046func DoMkdirDel(name)
47 call mkdir(a:name, 'pD')
48 call assert_true(isdirectory(a:name))
49endfunc
50
51func DoMkdirDelAddFile(name)
52 call mkdir(a:name, 'pD')
53 call assert_true(isdirectory(a:name))
54 call writefile(['text'], a:name .. '/file')
55endfunc
56
57func DoMkdirDelRec(name)
58 call mkdir(a:name, 'pR')
59 call assert_true(isdirectory(a:name))
60endfunc
61
62func DoMkdirDelRecAddFile(name)
63 call mkdir(a:name, 'pR')
64 call assert_true(isdirectory(a:name))
65 call writefile(['text'], a:name .. '/file')
66endfunc
67
68func Test_mkdir_defer_del()
69 " Xtopdir/tmp is created thus deleted, not Xtopdir itself
70 call mkdir('Xtopdir', 'R')
71 call DoMkdirDel('Xtopdir/tmp')
72 call assert_true(isdirectory('Xtopdir'))
73 call assert_false(isdirectory('Xtopdir/tmp'))
74
75 " Deletion fails because "tmp" contains "sub"
76 call DoMkdirDel('Xtopdir/tmp/sub')
77 call assert_true(isdirectory('Xtopdir'))
78 call assert_true(isdirectory('Xtopdir/tmp'))
79 call delete('Xtopdir/tmp', 'rf')
80
81 " Deletion fails because "tmp" contains "file"
82 call DoMkdirDelAddFile('Xtopdir/tmp')
83 call assert_true(isdirectory('Xtopdir'))
84 call assert_true(isdirectory('Xtopdir/tmp'))
85 call assert_true(filereadable('Xtopdir/tmp/file'))
86 call delete('Xtopdir/tmp', 'rf')
87
88 " Xtopdir/tmp is created thus deleted, not Xtopdir itself
89 call DoMkdirDelRec('Xtopdir/tmp')
90 call assert_true(isdirectory('Xtopdir'))
91 call assert_false(isdirectory('Xtopdir/tmp'))
92
93 " Deletion works even though "tmp" contains "sub"
94 call DoMkdirDelRec('Xtopdir/tmp/sub')
95 call assert_true(isdirectory('Xtopdir'))
96 call assert_false(isdirectory('Xtopdir/tmp'))
97
98 " Deletion works even though "tmp" contains "file"
99 call DoMkdirDelRecAddFile('Xtopdir/tmp')
100 call assert_true(isdirectory('Xtopdir'))
101 call assert_false(isdirectory('Xtopdir/tmp'))
102endfunc
103
Bram Moolenaar67f8ab82018-09-11 22:37:29 +0200104func Test_line_continuation()
105 let array = [5,
106 "\ ignore this
107 \ 6,
108 "\ more to ignore
109 "\ more moreto ignore
110 \ ]
111 "\ and some more
112 call assert_equal([5, 6], array)
113endfunc
Bram Moolenaar88b53fd2018-12-05 18:43:28 +0100114
115func Test_E963()
116 " These commands used to cause an internal error prior to vim 8.1.0563
117 let v_e = v:errors
118 let v_o = v:oldfiles
119 call assert_fails("let v:errors=''", 'E963:')
120 call assert_equal(v_e, v:errors)
121 call assert_fails("let v:oldfiles=''", 'E963:')
122 call assert_equal(v_o, v:oldfiles)
123endfunc
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100124
125func Test_for_invalid()
Yegappan Lakshmanan9cb865e2025-03-23 16:42:16 +0100126 call assert_fails("for x in 99", 'E1523:')
127 call assert_fails("for x in function('winnr')", 'E1523:')
128 call assert_fails("for x in {'a': 9}", 'E1523:')
zeertzjq6b97d7a2024-08-08 21:05:57 +0200129
130 let lines =<< trim END
131 for v:maxcol in range(5)
132 endfor
133 END
134
135 let save_v_maxcol = v:maxcol
136 call v9.CheckLegacyAndVim9Failure(lines, 'E46:')
137 call assert_equal(save_v_maxcol, v:maxcol)
138
139 let lines =<< trim END
140 for g:constvar in range(5)
141 endfor
142 END
143
144 const g:constvar = 10
145 call v9.CheckLegacyAndVim9Failure(lines, 'E741:')
146 call assert_equal(10, g:constvar)
147 unlet g:constvar
148
149 let g:constvar = 10
150 lockvar 0 g:constvar
151 call v9.CheckLegacyAndVim9Failure(lines, 'E1122:')
152 call assert_equal(10, g:constvar)
153 unlet g:constvar
Bram Moolenaardf2c2982021-01-28 20:18:08 +0100154
155 if 0
156 /1/5/2/s/\n
157 endif
158 redraw
Bram Moolenaarc0f5a782019-01-13 15:16:13 +0100159endfunc
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100160
Bram Moolenaarf6d39c32022-08-16 17:50:38 +0100161func Test_for_over_null_string()
162 let save_enc = &enc
163 set enc=iso8859
164 let cnt = 0
165 for c in test_null_string()
166 let cnt += 1
167 endfor
168 call assert_equal(0, cnt)
169
170 let &enc = save_enc
171endfunc
172
Bram Moolenaar91324262022-09-09 13:27:59 +0100173func Test_for_with_modifier()
174 " this checks has_loop_cmd() works with a modifier
175 let result = []
176 vim9cmd for i in range(3)
177 call extend(result, [i])
178 endfor
179 call assert_equal([0, 1, 2], result)
180endfunc
181
Bram Moolenaar35d21c62022-09-02 16:47:16 +0100182func Test_for_invalid_line_count()
183 let lines =<< trim END
184 111111111111111111111111 for line in ['one']
185 endfor
186 END
Bram Moolenaar5c645a22022-09-21 22:00:03 +0100187 call writefile(lines, 'XinvalidFor', 'D')
Bram Moolenaar35d21c62022-09-02 16:47:16 +0100188 " only test that this doesn't crash
189 call RunVim([], [], '-u NONE -e -s -S XinvalidFor -c qa')
Bram Moolenaar35d21c62022-09-02 16:47:16 +0100190endfunc
191
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100192func Test_readfile_binary()
193 new
194 call setline(1, ['one', 'two', 'three'])
195 setlocal ff=dos
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200196 silent write XReadfile_bin
197 let lines = 'XReadfile_bin'->readfile()
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100198 call assert_equal(['one', 'two', 'three'], lines)
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200199 let lines = readfile('XReadfile_bin', '', 2)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100200 call assert_equal(['one', 'two'], lines)
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200201 let lines = readfile('XReadfile_bin', 'b')
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100202 call assert_equal(["one\r", "two\r", "three\r", ""], lines)
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200203 let lines = readfile('XReadfile_bin', 'b', 2)
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100204 call assert_equal(["one\r", "two\r"], lines)
205
206 bwipe!
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200207 call delete('XReadfile_bin')
208endfunc
209
Dominique Pellef5d639a2022-01-12 15:24:40 +0000210func Test_readfile_binary_empty()
Bram Moolenaar5c645a22022-09-21 22:00:03 +0100211 call writefile([], 'Xempty-file', 'D')
Dominique Pellef5d639a2022-01-12 15:24:40 +0000212 " This used to compare uninitialized memory in Vim <= 8.2.4065
213 call assert_equal([''], readfile('Xempty-file', 'b'))
Dominique Pellef5d639a2022-01-12 15:24:40 +0000214endfunc
215
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200216func Test_readfile_bom()
217 call writefile(["\ufeffFOO", "FOO\ufeffBAR"], 'XReadfile_bom')
218 call assert_equal(['FOO', 'FOOBAR'], readfile('XReadfile_bom'))
219 call delete('XReadfile_bom')
220endfunc
221
222func Test_readfile_max()
Bram Moolenaar5c645a22022-09-21 22:00:03 +0100223 call writefile(range(1, 4), 'XReadfile_max', 'D')
Bram Moolenaar1b04ce22020-08-21 22:46:11 +0200224 call assert_equal(['1', '2'], readfile('XReadfile_max', '', 2))
225 call assert_equal(['3', '4'], readfile('XReadfile_max', '', -2))
Bram Moolenaar05500ec2019-01-13 19:10:33 +0100226endfunc
Bram Moolenaar4b9e91f2019-01-24 13:58:11 +0100227
228func Test_let_errmsg()
229 call assert_fails('let v:errmsg = []', 'E730:')
230 let v:errmsg = ''
231 call assert_fails('let v:errmsg = []', 'E730:')
232 let v:errmsg = ''
233endfunc
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200234
235func Test_string_concatenation()
236 call assert_equal('ab', 'a'.'b')
237 call assert_equal('ab', 'a' .'b')
238 call assert_equal('ab', 'a'. 'b')
239 call assert_equal('ab', 'a' . 'b')
240
241 call assert_equal('ab', 'a'..'b')
242 call assert_equal('ab', 'a' ..'b')
243 call assert_equal('ab', 'a'.. 'b')
244 call assert_equal('ab', 'a' .. 'b')
245
246 let a = 'a'
247 let b = 'b'
248 let a .= b
249 call assert_equal('ab', a)
250
251 let a = 'a'
252 let a.=b
253 call assert_equal('ab', a)
254
255 let a = 'a'
256 let a ..= b
257 call assert_equal('ab', a)
258
259 let a = 'a'
260 let a..=b
261 call assert_equal('ab', a)
Bram Moolenaar2e086612020-08-25 22:37:48 +0200262
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100263 let a = 'A'
264 let b = 1.234
265 call assert_equal('A1.234', a .. b)
Bram Moolenaar0f248b02019-04-04 15:36:05 +0200266endfunc
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200267
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200268" Test fix for issue #4507
269func Test_skip_after_throw()
270 try
271 throw 'something'
272 let x = wincol() || &ts
273 catch /something/
274 endtry
275endfunc
276
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200277scriptversion 2
278func Test_string_concat_scriptversion2()
Bram Moolenaar93a48792019-04-20 21:54:28 +0200279 call assert_true(has('vimscript-2'))
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200280 let a = 'a'
281 let b = 'b'
282
283 call assert_fails('echo a . b', 'E15:')
284 call assert_fails('let a .= b', 'E985:')
Bram Moolenaarfae55a92021-06-17 22:08:30 +0200285 call assert_fails('let vers = 1.2.3', 'E488:')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200286
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100287 let f = .5
288 call assert_equal(0.5, f)
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200289endfunc
290
291scriptversion 1
292func Test_string_concat_scriptversion1()
Bram Moolenaar93a48792019-04-20 21:54:28 +0200293 call assert_true(has('vimscript-1'))
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200294 let a = 'a'
295 let b = 'b'
296
297 echo a . b
298 let a .= b
299 let vers = 1.2.3
300 call assert_equal('123', vers)
301
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100302 call assert_fails('let f = .5', 'E15:')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200303endfunc
304
Bram Moolenaard2e716e2019-04-20 14:39:52 +0200305scriptversion 3
306func Test_vvar_scriptversion3()
Bram Moolenaar93a48792019-04-20 21:54:28 +0200307 call assert_true(has('vimscript-3'))
Bram Moolenaard2e716e2019-04-20 14:39:52 +0200308 call assert_fails('echo version', 'E121:')
309 call assert_false(exists('version'))
310 let version = 1
311 call assert_equal(1, version)
312endfunc
313
314scriptversion 2
315func Test_vvar_scriptversion2()
316 call assert_true(exists('version'))
317 echo version
318 call assert_fails('let version = 1', 'E46:')
319 call assert_equal(v:version, version)
Bram Moolenaar37df9a42019-06-14 14:39:51 +0200320
321 call assert_equal(v:version, v:versionlong / 10000)
322 call assert_true(v:versionlong > 8011525)
Bram Moolenaard2e716e2019-04-20 14:39:52 +0200323endfunc
324
Bram Moolenaar61343f02019-07-20 21:11:13 +0200325func Test_dict_access_scriptversion2()
326 let l:x = {'foo': 1}
327
328 call assert_false(0 && l:x.foo)
329 call assert_true(1 && l:x.foo)
330endfunc
331
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200332scriptversion 4
333func Test_vvar_scriptversion4()
Bram Moolenaaraf914382019-09-15 17:49:10 +0200334 call assert_true(has('vimscript-4'))
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200335 call assert_equal(17, 017)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200336 call assert_equal(15, 0o17)
337 call assert_equal(15, 0O17)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200338 call assert_equal(18, 018)
Bram Moolenaarc37b6552021-01-07 19:36:30 +0100339 call assert_equal(511, 0o777)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200340 call assert_equal(64, 0b1'00'00'00)
341 call assert_equal(1048576, 0x10'00'00)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200342 call assert_equal(32768, 0o10'00'00)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200343 call assert_equal(1000000, 1'000'000)
Bram Moolenaarea8dcf82019-09-15 21:12:22 +0200344 call assert_equal("1234", execute("echo 1'234")->trim())
345 call assert_equal('1 234', execute("echo 1''234")->trim())
346 call assert_fails("echo 1'''234", 'E115:')
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200347endfunc
348
349scriptversion 1
350func Test_vvar_scriptversion1()
351 call assert_equal(15, 017)
Bram Moolenaarc17e66c2020-06-02 21:38:22 +0200352 call assert_equal(15, 0o17)
353 call assert_equal(15, 0O17)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200354 call assert_equal(18, 018)
Bram Moolenaarc37b6552021-01-07 19:36:30 +0100355 call assert_equal(511, 0o777)
Bram Moolenaar60a8de22019-09-15 14:33:22 +0200356endfunc
357
358func Test_scriptversion_fail()
Bram Moolenaar5c645a22022-09-21 22:00:03 +0100359 call writefile(['scriptversion 9'], 'Xversionscript', 'D')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200360 call assert_fails('source Xversionscript', 'E999:')
Bram Moolenaar558ca4a2019-04-04 18:15:38 +0200361endfunc
Bram Moolenaarb6625912020-01-08 20:09:01 +0100362
Bram Moolenaar9d8d0b52020-04-24 22:47:31 +0200363func Test_execute_cmd_with_null()
Bram Moolenaarb6625912020-01-08 20:09:01 +0100364 call assert_fails('execute test_null_list()', 'E730:')
365 call assert_fails('execute test_null_dict()', 'E731:')
366 call assert_fails('execute test_null_blob()', 'E976:')
367 execute test_null_string()
368 call assert_fails('execute test_null_partial()', 'E729:')
Bram Moolenaar92b83cc2020-04-25 15:24:44 +0200369 call assert_fails('execute test_unknown()', 'E908:')
Bram Moolenaarb6625912020-01-08 20:09:01 +0100370 if has('job')
371 call assert_fails('execute test_null_job()', 'E908:')
372 call assert_fails('execute test_null_channel()', 'E908:')
373 endif
374endfunc
Bram Moolenaarf9706e92020-02-22 14:27:04 +0100375
Bram Moolenaar57d5a012021-01-21 21:42:31 +0100376func Test_number_max_min_size()
377 " This will fail on systems without 64 bit number support or when not
378 " configured correctly.
Bram Moolenaarf9706e92020-02-22 14:27:04 +0100379 call assert_equal(64, v:numbersize)
Bram Moolenaar57d5a012021-01-21 21:42:31 +0100380
381 call assert_true(v:numbermin < -9999999)
382 call assert_true(v:numbermax > 9999999)
Bram Moolenaarf9706e92020-02-22 14:27:04 +0100383endfunc
Bram Moolenaar8b633132020-03-20 18:20:51 +0100384
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200385func Assert_reg(name, type, value, valuestr, expr, exprstr)
386 call assert_equal(a:type, getregtype(a:name))
387 call assert_equal(a:value, getreg(a:name))
388 call assert_equal(a:valuestr, string(getreg(a:name, 0, 1)))
389 call assert_equal(a:expr, getreg(a:name, 1))
390 call assert_equal(a:exprstr, string(getreg(a:name, 1, 1)))
391endfunc
392
393func Test_let_register()
394 let @" = 'abc'
395 call Assert_reg('"', 'v', "abc", "['abc']", "abc", "['abc']")
396 let @" = "abc\n"
397 call Assert_reg('"', 'V', "abc\n", "['abc']", "abc\n", "['abc']")
398 let @" = "abc\<C-m>"
399 call Assert_reg('"', 'V', "abc\r\n", "['abc\r']", "abc\r\n", "['abc\r']")
400 let @= = '"abc"'
401 call Assert_reg('=', 'v', "abc", "['abc']", '"abc"', "['\"abc\"']")
402endfunc
403
404func Assert_regput(name, result)
405 new
406 execute "silent normal! o==\n==\e\"" . a:name . "P"
407 call assert_equal(a:result, getline(2, line('$')))
Bram Moolenaar61fbb332020-04-18 23:20:37 +0200408 bwipe!
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200409endfunc
410
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200411func Test_setreg_basic()
412 call setreg('a', 'abcA', 'c')
413 call Assert_reg('a', 'v', "abcA", "['abcA']", "abcA", "['abcA']")
414 call Assert_regput('a', ['==', '=abcA='])
415
416 call setreg('A', 'abcAc', 'c')
417 call Assert_reg('A', 'v', "abcAabcAc", "['abcAabcAc']", "abcAabcAc", "['abcAabcAc']")
418 call Assert_regput('a', ['==', '=abcAabcAc='])
419
420 call setreg('A', 'abcAl', 'l')
421 call Assert_reg('A', 'V', "abcAabcAcabcAl\n", "['abcAabcAcabcAl']", "abcAabcAcabcAl\n", "['abcAabcAcabcAl']")
422 call Assert_regput('a', ['==', 'abcAabcAcabcAl', '=='])
423
424 call setreg('A', 'abcAc2','c')
425 call Assert_reg('A', 'v', "abcAabcAcabcAl\nabcAc2", "['abcAabcAcabcAl', 'abcAc2']", "abcAabcAcabcAl\nabcAc2", "['abcAabcAcabcAl', 'abcAc2']")
426 call Assert_regput('a', ['==', '=abcAabcAcabcAl', 'abcAc2='])
427
428 call setreg('b', 'abcB', 'v')
429 call Assert_reg('b', 'v', "abcB", "['abcB']", "abcB", "['abcB']")
430 call Assert_regput('b', ['==', '=abcB='])
431
432 call setreg('b', 'abcBc', 'ca')
433 call Assert_reg('b', 'v', "abcBabcBc", "['abcBabcBc']", "abcBabcBc", "['abcBabcBc']")
434 call Assert_regput('b', ['==', '=abcBabcBc='])
435
436 call setreg('b', 'abcBb', 'ba')
437 call Assert_reg('b', "\<C-V>5", "abcBabcBcabcBb", "['abcBabcBcabcBb']", "abcBabcBcabcBb", "['abcBabcBcabcBb']")
438 call Assert_regput('b', ['==', '=abcBabcBcabcBb='])
439
440 call setreg('b', 'abcBc2','ca')
441 call Assert_reg('b', "v", "abcBabcBcabcBb\nabcBc2", "['abcBabcBcabcBb', 'abcBc2']", "abcBabcBcabcBb\nabcBc2", "['abcBabcBcabcBb', 'abcBc2']")
442 call Assert_regput('b', ['==', '=abcBabcBcabcBb', 'abcBc2='])
443
444 call setreg('b', 'abcBb2','b50a')
445 call Assert_reg('b', "\<C-V>50", "abcBabcBcabcBb\nabcBc2abcBb2", "['abcBabcBcabcBb', 'abcBc2abcBb2']", "abcBabcBcabcBb\nabcBc2abcBb2", "['abcBabcBcabcBb', 'abcBc2abcBb2']")
446 call Assert_regput('b', ['==', '=abcBabcBcabcBb =', ' abcBc2abcBb2'])
447
448 call setreg('c', 'abcC', 'l')
449 call Assert_reg('c', 'V', "abcC\n", "['abcC']", "abcC\n", "['abcC']")
450 call Assert_regput('c', ['==', 'abcC', '=='])
451
452 call setreg('C', 'abcCl', 'l')
453 call Assert_reg('C', 'V', "abcC\nabcCl\n", "['abcC', 'abcCl']", "abcC\nabcCl\n", "['abcC', 'abcCl']")
454 call Assert_regput('c', ['==', 'abcC', 'abcCl', '=='])
455
456 call setreg('C', 'abcCc', 'c')
457 call Assert_reg('C', 'v', "abcC\nabcCl\nabcCc", "['abcC', 'abcCl', 'abcCc']", "abcC\nabcCl\nabcCc", "['abcC', 'abcCl', 'abcCc']")
458 call Assert_regput('c', ['==', '=abcC', 'abcCl', 'abcCc='])
459
460 call setreg('d', 'abcD', 'V')
461 call Assert_reg('d', 'V', "abcD\n", "['abcD']", "abcD\n", "['abcD']")
462 call Assert_regput('d', ['==', 'abcD', '=='])
463
464 call setreg('D', 'abcDb', 'b')
465 call Assert_reg('d', "\<C-V>5", "abcD\nabcDb", "['abcD', 'abcDb']", "abcD\nabcDb", "['abcD', 'abcDb']")
466 call Assert_regput('d', ['==', '=abcD =', ' abcDb'])
467
468 call setreg('e', 'abcE', 'b')
469 call Assert_reg('e', "\<C-V>4", "abcE", "['abcE']", "abcE", "['abcE']")
470 call Assert_regput('e', ['==', '=abcE='])
471
472 call setreg('E', 'abcEb', 'b')
473 call Assert_reg('E', "\<C-V>5", "abcE\nabcEb", "['abcE', 'abcEb']", "abcE\nabcEb", "['abcE', 'abcEb']")
474 call Assert_regput('e', ['==', '=abcE =', ' abcEb'])
475
476 call setreg('E', 'abcEl', 'l')
477 call Assert_reg('E', "V", "abcE\nabcEb\nabcEl\n", "['abcE', 'abcEb', 'abcEl']", "abcE\nabcEb\nabcEl\n", "['abcE', 'abcEb', 'abcEl']")
478 call Assert_regput('e', ['==', 'abcE', 'abcEb', 'abcEl', '=='])
479
480 call setreg('f', 'abcF', "\<C-v>")
481 call Assert_reg('f', "\<C-V>4", "abcF", "['abcF']", "abcF", "['abcF']")
482 call Assert_regput('f', ['==', '=abcF='])
483
484 call setreg('F', 'abcFc', 'c')
485 call Assert_reg('F', "v", "abcF\nabcFc", "['abcF', 'abcFc']", "abcF\nabcFc", "['abcF', 'abcFc']")
486 call Assert_regput('f', ['==', '=abcF', 'abcFc='])
487
488 call setreg('g', 'abcG', 'b10')
489 call Assert_reg('g', "\<C-V>10", "abcG", "['abcG']", "abcG", "['abcG']")
490 call Assert_regput('g', ['==', '=abcG ='])
491
492 call setreg('h', 'abcH', "\<C-v>10")
493 call Assert_reg('h', "\<C-V>10", "abcH", "['abcH']", "abcH", "['abcH']")
494 call Assert_regput('h', ['==', '=abcH ='])
495
496 call setreg('I', 'abcI')
497 call Assert_reg('I', "v", "abcI", "['abcI']", "abcI", "['abcI']")
498 call Assert_regput('I', ['==', '=abcI='])
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200499
Bram Moolenaar339d60c2020-04-29 22:01:21 +0200500 " Appending NL with setreg()
501 call setreg('a', 'abcA2', 'c')
502 call setreg('b', 'abcB2', 'v')
503 call setreg('c', 'abcC2', 'l')
504 call setreg('d', 'abcD2', 'V')
505 call setreg('e', 'abcE2', 'b')
506 call setreg('f', 'abcF2', "\<C-v>")
507 call setreg('g', 'abcG2', 'b10')
508 call setreg('h', 'abcH2', "\<C-v>10")
509 call setreg('I', 'abcI2')
510
511 call setreg('A', "\n")
512 call Assert_reg('A', 'V', "abcA2\n", "['abcA2']", "abcA2\n", "['abcA2']")
513 call Assert_regput('A', ['==', 'abcA2', '=='])
514
515 call setreg('B', "\n", 'c')
516 call Assert_reg('B', 'v', "abcB2\n", "['abcB2', '']", "abcB2\n", "['abcB2', '']")
517 call Assert_regput('B', ['==', '=abcB2', '='])
518
519 call setreg('C', "\n")
520 call Assert_reg('C', 'V', "abcC2\n\n", "['abcC2', '']", "abcC2\n\n", "['abcC2', '']")
521 call Assert_regput('C', ['==', 'abcC2', '', '=='])
522
523 call setreg('D', "\n", 'l')
524 call Assert_reg('D', 'V', "abcD2\n\n", "['abcD2', '']", "abcD2\n\n", "['abcD2', '']")
525 call Assert_regput('D', ['==', 'abcD2', '', '=='])
526
527 call setreg('E', "\n")
528 call Assert_reg('E', 'V', "abcE2\n\n", "['abcE2', '']", "abcE2\n\n", "['abcE2', '']")
529 call Assert_regput('E', ['==', 'abcE2', '', '=='])
530
531 call setreg('F', "\n", 'b')
532 call Assert_reg('F', "\<C-V>0", "abcF2\n", "['abcF2', '']", "abcF2\n", "['abcF2', '']")
533 call Assert_regput('F', ['==', '=abcF2=', ' '])
534
535 " Setting lists with setreg()
536 call setreg('a', ['abcA3'], 'c')
537 call Assert_reg('a', 'v', "abcA3", "['abcA3']", "abcA3", "['abcA3']")
538 call Assert_regput('a', ['==', '=abcA3='])
539
540 call setreg('b', ['abcB3'], 'l')
541 call Assert_reg('b', 'V', "abcB3\n", "['abcB3']", "abcB3\n", "['abcB3']")
542 call Assert_regput('b', ['==', 'abcB3', '=='])
543
544 call setreg('c', ['abcC3'], 'b')
545 call Assert_reg('c', "\<C-V>5", "abcC3", "['abcC3']", "abcC3", "['abcC3']")
546 call Assert_regput('c', ['==', '=abcC3='])
547
548 call setreg('d', ['abcD3'])
549 call Assert_reg('d', 'V', "abcD3\n", "['abcD3']", "abcD3\n", "['abcD3']")
550 call Assert_regput('d', ['==', 'abcD3', '=='])
551
552 call setreg('e', [1, 2, 'abc', 3])
553 call Assert_reg('e', 'V', "1\n2\nabc\n3\n", "['1', '2', 'abc', '3']", "1\n2\nabc\n3\n", "['1', '2', 'abc', '3']")
554 call Assert_regput('e', ['==', '1', '2', 'abc', '3', '=='])
555
556 call setreg('f', [1, 2, 3])
557 call Assert_reg('f', 'V', "1\n2\n3\n", "['1', '2', '3']", "1\n2\n3\n", "['1', '2', '3']")
558 call Assert_regput('f', ['==', '1', '2', '3', '=='])
559
560 " Appending lists with setreg()
561 call setreg('A', ['abcA3c'], 'c')
562 call Assert_reg('A', 'v', "abcA3\nabcA3c", "['abcA3', 'abcA3c']", "abcA3\nabcA3c", "['abcA3', 'abcA3c']")
563 call Assert_regput('A', ['==', '=abcA3', 'abcA3c='])
564
565 call setreg('b', ['abcB3l'], 'la')
566 call Assert_reg('b', 'V', "abcB3\nabcB3l\n", "['abcB3', 'abcB3l']", "abcB3\nabcB3l\n", "['abcB3', 'abcB3l']")
567 call Assert_regput('b', ['==', 'abcB3', 'abcB3l', '=='])
568
569 call setreg('C', ['abcC3b'], 'lb')
570 call Assert_reg('C', "\<C-V>6", "abcC3\nabcC3b", "['abcC3', 'abcC3b']", "abcC3\nabcC3b", "['abcC3', 'abcC3b']")
571 call Assert_regput('C', ['==', '=abcC3 =', ' abcC3b'])
572
573 call setreg('D', ['abcD32'])
574 call Assert_reg('D', 'V', "abcD3\nabcD32\n", "['abcD3', 'abcD32']", "abcD3\nabcD32\n", "['abcD3', 'abcD32']")
575 call Assert_regput('D', ['==', 'abcD3', 'abcD32', '=='])
576
577 call setreg('A', ['abcA32'])
578 call Assert_reg('A', 'V', "abcA3\nabcA3c\nabcA32\n", "['abcA3', 'abcA3c', 'abcA32']", "abcA3\nabcA3c\nabcA32\n", "['abcA3', 'abcA3c', 'abcA32']")
579 call Assert_regput('A', ['==', 'abcA3', 'abcA3c', 'abcA32', '=='])
580
581 call setreg('B', ['abcB3c'], 'c')
582 call Assert_reg('B', 'v', "abcB3\nabcB3l\nabcB3c", "['abcB3', 'abcB3l', 'abcB3c']", "abcB3\nabcB3l\nabcB3c", "['abcB3', 'abcB3l', 'abcB3c']")
583 call Assert_regput('B', ['==', '=abcB3', 'abcB3l', 'abcB3c='])
584
585 call setreg('C', ['abcC3l'], 'l')
586 call Assert_reg('C', 'V', "abcC3\nabcC3b\nabcC3l\n", "['abcC3', 'abcC3b', 'abcC3l']", "abcC3\nabcC3b\nabcC3l\n", "['abcC3', 'abcC3b', 'abcC3l']")
587 call Assert_regput('C', ['==', 'abcC3', 'abcC3b', 'abcC3l', '=='])
588
589 call setreg('D', ['abcD3b'], 'b')
590 call Assert_reg('D', "\<C-V>6", "abcD3\nabcD32\nabcD3b", "['abcD3', 'abcD32', 'abcD3b']", "abcD3\nabcD32\nabcD3b", "['abcD3', 'abcD32', 'abcD3b']")
591 call Assert_regput('D', ['==', '=abcD3 =', ' abcD32', ' abcD3b'])
592
593 " Appending lists with NL with setreg()
594 call setreg('A', ["\n", 'abcA3l2'], 'l')
595 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']")
596 call Assert_regput('A', ['==', 'abcA3', 'abcA3c', 'abcA32', "\n", 'abcA3l2', '=='])
597
598 call setreg('B', ["\n", 'abcB3c2'], 'c')
599 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']")
600 call Assert_regput('B', ['==', '=abcB3', 'abcB3l', 'abcB3c', "\n", 'abcB3c2='])
601
602 call setreg('C', ["\n", 'abcC3b2'], 'b')
603 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']")
604 call Assert_regput('C', ['==', '=abcC3 =', ' abcC3b', ' abcC3l', " \n", ' abcC3b2'])
605
606 call setreg('D', ["\n", 'abcD3b50'],'b50')
607 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']")
608 call Assert_regput('D', ['==', '=abcD3 =', ' abcD32', ' abcD3b', " \n", ' abcD3b50'])
609
610 " Setting lists with NLs with setreg()
611 call setreg('a', ['abcA4-0', "\n", "abcA4-2\n", "\nabcA4-3", "abcA4-4\nabcA4-4-2"])
612 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']")
613 call Assert_regput('a', ['==', 'abcA4-0', "\n", "abcA4-2\n", "\nabcA4-3", "abcA4-4\nabcA4-4-2", '=='])
614
615 call setreg('b', ['abcB4c-0', "\n", "abcB4c-2\n", "\nabcB4c-3", "abcB4c-4\nabcB4c-4-2"], 'c')
616 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']")
617 call Assert_regput('b', ['==', '=abcB4c-0', "\n", "abcB4c-2\n", "\nabcB4c-3", "abcB4c-4\nabcB4c-4-2="])
618
619 call setreg('c', ['abcC4l-0', "\n", "abcC4l-2\n", "\nabcC4l-3", "abcC4l-4\nabcC4l-4-2"], 'l')
620 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']")
621 call Assert_regput('c', ['==', 'abcC4l-0', "\n", "abcC4l-2\n", "\nabcC4l-3", "abcC4l-4\nabcC4l-4-2", '=='])
622
623 call setreg('d', ['abcD4b-0', "\n", "abcD4b-2\n", "\nabcD4b-3", "abcD4b-4\nabcD4b-4-2"], 'b')
624 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']")
625 call Assert_regput('d', ['==', '=abcD4b-0 =', " \n", " abcD4b-2\n", " \nabcD4b-3", " abcD4b-4\nabcD4b-4-2"])
626
627 call setreg('e', ['abcE4b10-0', "\n", "abcE4b10-2\n", "\nabcE4b10-3", "abcE4b10-4\nabcE4b10-4-2"], 'b10')
628 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']")
629 call Assert_regput('e', ['==', '=abcE4b10-0=', " \n", " abcE4b10-2\n", " \nabcE4b10-3", " abcE4b10-4\nabcE4b10-4-2"])
630
631 " Search and expressions
632 call setreg('/', ['abc/'])
633 call Assert_reg('/', 'v', "abc/", "['abc/']", "abc/", "['abc/']")
634 call Assert_regput('/', ['==', '=abc/='])
635
636 call setreg('/', ["abc/\n"])
637 call Assert_reg('/', 'v', "abc/\n", "['abc/\n']", "abc/\n", "['abc/\n']")
638 call Assert_regput('/', ['==', "=abc/\n="])
639
640 call setreg('=', ['"abc/"'])
641 call Assert_reg('=', 'v', "abc/", "['abc/']", '"abc/"', "['\"abc/\"']")
642
643 call setreg('=', ["\"abc/\n\""])
644 call Assert_reg('=', 'v', "abc/\n", "['abc/\n']", "\"abc/\n\"", "['\"abc/\n\"']")
645
646 " System clipboard
647 if has('clipboard')
648 new | only!
649 call setline(1, ['clipboard contents', 'something else'])
650 " Save and restore system clipboard.
651 " If no connection to X-Server is possible, test should succeed.
652 let _clipreg = ['*', getreg('*'), getregtype('*')]
653 let _clipopt = &cb
654 let &cb='unnamed'
655 1y
656 call Assert_reg('*', 'V', "clipboard contents\n", "['clipboard contents']", "clipboard contents\n", "['clipboard contents']")
657 tabdo :windo :echo "hi"
658 2y
659 call Assert_reg('*', 'V', "something else\n", "['something else']", "something else\n", "['something else']")
660 let &cb=_clipopt
661 call call('setreg', _clipreg)
662 enew!
663 endif
664
Bram Moolenaar08f41572020-04-20 16:50:00 +0200665 " Error cases
666 call assert_fails('call setreg()', 'E119:')
667 call assert_fails('call setreg(1)', 'E119:')
668 call assert_fails('call setreg(1, 2, 3, 4)', 'E118:')
669 call assert_fails('call setreg([], 2)', 'E730:')
Bram Moolenaar08f41572020-04-20 16:50:00 +0200670 call assert_fails('call setreg(1, 2, [])', 'E730:')
671 call assert_fails('call setreg("/", ["1", "2"])', 'E883:')
672 call assert_fails('call setreg("=", ["1", "2"])', 'E883:')
673 call assert_fails('call setreg(1, ["", "", [], ""])', 'E730:')
674endfunc
Bram Moolenaar90455cf2020-04-18 21:56:38 +0200675
Bram Moolenaarae95a392020-08-06 16:38:12 +0200676func Test_curly_assignment()
677 let s:svar = 'svar'
678 let g:gvar = 'gvar'
679 let lname = 'gvar'
680 let gname = 'gvar'
681 let {'s:'.lname} = {'g:'.gname}
682 call assert_equal('gvar', s:gvar)
683 let s:gvar = ''
684 let { 's:'.lname } = { 'g:'.gname }
685 call assert_equal('gvar', s:gvar)
686 let s:gvar = ''
687 let { 's:' . lname } = { 'g:' . gname }
688 call assert_equal('gvar', s:gvar)
689 let s:gvar = ''
690 let { 's:' .. lname } = { 'g:' .. gname }
691 call assert_equal('gvar', s:gvar)
692
693 unlet s:svar
694 unlet s:gvar
695 unlet g:gvar
696endfunc
697
Bram Moolenaarfe6fb262022-01-24 18:16:12 +0000698func Test_deep_recursion()
699 " this was running out of stack
700 call assert_fails("exe 'if ' .. repeat('(', 1002)", 'E1169: Expression too recursive: ((')
701endfunc
702
zeertzjqdb088872022-05-02 22:53:45 +0100703" K_SPECIAL in the modified character used be escaped, which causes
704" double-escaping with feedkeys() or as the return value of an <expr> mapping,
705" and doesn't match what getchar() returns,
706func Test_modified_char_no_escape_special()
707 nnoremap <M-…> <Cmd>let g:got_m_ellipsis += 1<CR>
708 call feedkeys("\<M-…>", 't')
709 call assert_equal("\<M-…>", getchar())
710 let g:got_m_ellipsis = 0
711 call feedkeys("\<M-…>", 'xt')
712 call assert_equal(1, g:got_m_ellipsis)
713 func Func()
714 return "\<M-…>"
715 endfunc
716 nmap <expr> <F2> Func()
717 call feedkeys("\<F2>", 'xt')
718 call assert_equal(2, g:got_m_ellipsis)
719 delfunc Func
720 nunmap <F2>
721 unlet g:got_m_ellipsis
722 nunmap <M-…>
723endfunc
724
Bram Moolenaar1e56bda2022-07-29 15:28:27 +0100725func Test_eval_string_in_special_key()
726 " this was using the '{' inside <> as the start of an interpolated string
727 silent! echo 0{1-$"\<S--{>n|nö%�
728endfunc
729
Bram Moolenaar8b633132020-03-20 18:20:51 +0100730" vim: shiftwidth=2 sts=2 expandtab