blob: 681aaae733c281e6d6b37283a5e909c7074063ea [file] [log] [blame]
Bram Moolenaare9b892e2016-01-17 21:15:58 +01001" Tests for Perl interface
2
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02003source check.vim
Dominique Pelle588cf752021-05-10 23:49:39 +02004source shared.vim
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02005CheckFeature perl
Bram Moolenaare9b892e2016-01-17 21:15:58 +01006
Bram Moolenaar41c363a2018-08-02 21:46:51 +02007" FIXME: RunTest don't see any error when Perl abort...
8perl $SIG{__WARN__} = sub { die "Unexpected warnings from perl: @_" };
9
Bram Moolenaar021b5932016-01-17 22:05:48 +010010func Test_change_buffer()
11 call setline(line('$'), ['1 line 1'])
12 perl VIM::DoCommand("normal /^1\n")
13 perl $curline = VIM::Eval("line('.')")
14 perl $curbuf->Set($curline, "1 changed line 1")
15 call assert_equal('1 changed line 1', getline('$'))
16endfunc
17
18func Test_evaluate_list()
19 call setline(line('$'), ['2 line 2'])
20 perl VIM::DoCommand("normal /^2\n")
21 perl $curline = VIM::Eval("line('.')")
22 let l = ["abc", "def"]
23 perl << EOF
24 $l = VIM::Eval("l");
25 $curbuf->Append($curline, $l);
26EOF
27 normal j
28 .perldo s|\n|/|g
29 call assert_equal('abc/def/', getline('$'))
30endfunc
Bram Moolenaare9b892e2016-01-17 21:15:58 +010031
Bram Moolenaar2472ae82019-02-23 15:04:17 +010032funct Test_VIM_Blob()
33 call assert_equal('0z', perleval('VIM::Blob("")'))
Bram Moolenaar3f4f3d82019-09-04 20:05:59 +020034 call assert_equal('0z31326162', 'VIM::Blob("12ab")'->perleval())
Bram Moolenaar2472ae82019-02-23 15:04:17 +010035 call assert_equal('0z00010203', perleval('VIM::Blob("\x00\x01\x02\x03")'))
36 call assert_equal('0z8081FEFF', perleval('VIM::Blob("\x80\x81\xfe\xff")'))
37endfunc
38
Bram Moolenaarae177b72017-02-23 13:45:57 +010039func Test_buffer_Delete()
40 new
41 call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
42 perl $curbuf->Delete(7)
43 perl $curbuf->Delete(2, 5)
44 perl $curbuf->Delete(10)
45 call assert_equal(['a', 'f', 'h'], getline(1, '$'))
46 bwipe!
47endfunc
48
49func Test_buffer_Append()
50 new
51 perl $curbuf->Append(1, '1')
52 perl $curbuf->Append(2, '2', '3', '4')
53 perl @l = ('5' ..'7')
54 perl $curbuf->Append(0, @l)
55 call assert_equal(['5', '6', '7', '', '1', '2', '3', '4'], getline(1, '$'))
Dominique Pelle588cf752021-05-10 23:49:39 +020056
57 perl $curbuf->Append(0)
58 call assert_match('^Usage: VIBUF::Append(vimbuf, lnum, @lines) at .* line 1\.$',
59 \ GetMessages()[-1])
60
Bram Moolenaarae177b72017-02-23 13:45:57 +010061 bwipe!
62endfunc
63
64func Test_buffer_Set()
65 new
66 call setline(1, ['1', '2', '3', '4', '5'])
67 perl $curbuf->Set(2, 'a', 'b', 'c')
68 perl $curbuf->Set(4, 'A', 'B', 'C')
69 call assert_equal(['1', 'a', 'b', 'A', 'B'], getline(1, '$'))
Dominique Pelle588cf752021-05-10 23:49:39 +020070
71 perl $curbuf->Set(0)
72 call assert_match('^Usage: VIBUF::Set(vimbuf, lnum, @lines) at .* line 1\.$',
73 \ GetMessages()[-1])
74
Bram Moolenaarae177b72017-02-23 13:45:57 +010075 bwipe!
76endfunc
77
78func Test_buffer_Get()
79 new
80 call setline(1, ['1', '2', '3', '4'])
81 call assert_equal('2:3', perleval('join(":", $curbuf->Get(2, 3))'))
82 bwipe!
83endfunc
84
85func Test_buffer_Count()
86 new
87 call setline(1, ['a', 'b', 'c'])
88 call assert_equal(3, perleval('$curbuf->Count()'))
89 bwipe!
90endfunc
91
92func Test_buffer_Name()
93 new
94 call assert_equal('', perleval('$curbuf->Name()'))
95 bwipe!
96 new Xfoo
97 call assert_equal('Xfoo', perleval('$curbuf->Name()'))
98 bwipe!
99endfunc
100
101func Test_buffer_Number()
102 call assert_equal(bufnr('%'), perleval('$curbuf->Number()'))
103endfunc
104
105func Test_window_Cursor()
106 new
107 call setline(1, ['line1', 'line2'])
108 perl $curwin->Cursor(2, 3)
109 call assert_equal('2:3', perleval('join(":", $curwin->Cursor())'))
110 " Col is numbered from 0 in Perl, and from 1 in Vim script.
111 call assert_equal([0, 2, 4, 0], getpos('.'))
112 bwipe!
113endfunc
114
115func Test_window_SetHeight()
116 new
117 perl $curwin->SetHeight(2)
118 call assert_equal(2, winheight(0))
119 bwipe!
120endfunc
121
122func Test_VIM_Windows()
123 new
124 " VIM::Windows() without argument in scalar and list context.
125 perl $winnr = VIM::Windows()
126 perl @winlist = VIM::Windows()
127 perl $curbuf->Append(0, $winnr, scalar(@winlist))
128 call assert_equal(['2', '2', ''], getline(1, '$'))
129
130 " VIM::Windows() with window number argument.
131 perl VIM::Windows(VIM::Eval('winnr()'))->Buffer()->Set(1, 'bar')
132 call assert_equal('bar', getline(1))
133 bwipe!
134endfunc
135
136func Test_VIM_Buffers()
137 new Xbar
138 " VIM::Buffers() without argument in scalar and list context.
139 perl $nbuf = VIM::Buffers()
140 perl @buflist = VIM::Buffers()
141
142 " VIM::Buffers() with argument.
143 perl $mybuf = (VIM::Buffers('Xbar'))[0]
144 perl $mybuf->Append(0, $nbuf, scalar(@buflist))
145 call assert_equal(['2', '2', ''], getline(1, '$'))
146 bwipe!
147endfunc
148
149func <SID>catch_peval(expr)
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100150 try
151 call perleval(a:expr)
152 catch
153 return v:exception
154 endtry
Bram Moolenaar37175402017-03-18 20:18:45 +0100155 call assert_report('no exception for `perleval("'.a:expr.'")`')
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100156 return ''
Bram Moolenaar95509e12016-04-15 21:16:11 +0200157endfunc
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100158
Bram Moolenaarae177b72017-02-23 13:45:57 +0100159func Test_perleval()
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100160 call assert_false(perleval('undef'))
161
162 " scalar
163 call assert_equal(0, perleval('0'))
164 call assert_equal(2, perleval('2'))
165 call assert_equal(-2, perleval('-2'))
Bram Moolenaar73e28dc2022-09-17 21:08:33 +0100166 call assert_equal(2.5, perleval('2.5'))
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100167
168 sandbox call assert_equal(2, perleval('2'))
169
170 call assert_equal('abc', perleval('"abc"'))
171 call assert_equal("abc\ndef", perleval('"abc\0def"'))
172
173 " ref
174 call assert_equal([], perleval('[]'))
175 call assert_equal(['word', 42, [42],{}], perleval('["word", 42, [42], {}]'))
176
177 call assert_equal({}, perleval('{}'))
178 call assert_equal({'foo': 'bar'}, perleval('{foo => "bar"}'))
179
180 perl our %h; our @a;
181 let a = perleval('[\(%h, %h, @a, @a)]')
182 call assert_true((a[0] is a[1]))
183 call assert_true((a[2] is a[3]))
184 perl undef %h; undef @a;
185
186 call assert_true(<SID>catch_peval('{"" , 0}') =~ 'Malformed key Dictionary')
187 call assert_true(<SID>catch_peval('{"\0" , 0}') =~ 'Malformed key Dictionary')
188 call assert_true(<SID>catch_peval('{"foo\0bar" , 0}') =~ 'Malformed key Dictionary')
189
190 call assert_equal('*VIM', perleval('"*VIM"'))
191 call assert_true(perleval('\\0') =~ 'SCALAR(0x\x\+)')
Bram Moolenaar730677a2020-12-09 16:05:45 +0100192
193 " typeglob
194 call assert_equal('*main::STDOUT', perleval('*STDOUT'))
195'
196 call perleval("++-$foo")
197 let messages = split(execute('message'), "\n")
198 call assert_match("Can't modify negation", messages[-1])
Bram Moolenaar95509e12016-04-15 21:16:11 +0200199endfunc
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100200
Bram Moolenaarae177b72017-02-23 13:45:57 +0100201func Test_perldo()
Bram Moolenaar730677a2020-12-09 16:05:45 +0100202 new
203 " :perldo in empty buffer does nothing.
204 perldo ++$counter
205 call assert_equal(0, perleval("$counter"))
206
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100207 sp __TEST__
208 exe 'read ' g:testname
209 perldo s/perl/vieux_chameau/g
210 1
211 call assert_false(search('\Cperl'))
212 bw!
Bram Moolenaar85b57432017-01-29 22:59:12 +0100213
214 " Check deleting lines does not trigger ml_get error.
215 new
216 call setline(1, ['one', 'two', 'three'])
217 perldo VIM::DoCommand("%d_")
218 bwipe!
219
Dominique Pelle588cf752021-05-10 23:49:39 +0200220 " Check a Perl expression which gives an error.
221 new
222 call setline(1, 'one')
223 perldo 1/0
224 call assert_match('^Illegal division by zero at .* line 1\.$', GetMessages()[-1])
225 bwipe!
226
Bram Moolenaar85b57432017-01-29 22:59:12 +0100227 " Check switching to another buffer does not trigger ml_get error.
228 new
229 let wincount = winnr('$')
230 call setline(1, ['one', 'two', 'three'])
231 perldo VIM::DoCommand("new")
232 call assert_equal(wincount + 1, winnr('$'))
Bram Moolenaar730677a2020-12-09 16:05:45 +0100233 %bwipe!
Bram Moolenaar95509e12016-04-15 21:16:11 +0200234endfunc
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100235
Bram Moolenaarae177b72017-02-23 13:45:57 +0100236func Test_VIM_package()
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100237 perl VIM::DoCommand('let l:var = "foo"')
238 call assert_equal(l:var, 'foo')
239
240 set noet
241 perl VIM::SetOption('et')
242 call assert_true(&et)
Bram Moolenaar95509e12016-04-15 21:16:11 +0200243endfunc
Bram Moolenaar6244a0f2016-04-14 14:09:25 +0200244
Bram Moolenaarae177b72017-02-23 13:45:57 +0100245func Test_stdio()
Bram Moolenaar6244a0f2016-04-14 14:09:25 +0200246 redir =>l:out
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200247 perl << trim EOF
Dominique Pelle588cf752021-05-10 23:49:39 +0200248 VIM::Msg("VIM::Msg");
249 VIM::Msg("VIM::Msg Error", "Error");
Bram Moolenaar6244a0f2016-04-14 14:09:25 +0200250 print "STDOUT";
251 print STDERR "STDERR";
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200252 EOF
Bram Moolenaar6244a0f2016-04-14 14:09:25 +0200253 redir END
Dominique Pelle588cf752021-05-10 23:49:39 +0200254 call assert_equal(['VIM::Msg', 'VIM::Msg Error', 'STDOUT', 'STDERR'], split(l:out, "\n"))
Bram Moolenaar95509e12016-04-15 21:16:11 +0200255endfunc
256
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200257" Run first to get a clean namespace
258func Test_000_SvREFCNT()
Bram Moolenaar3166afd2018-07-16 18:09:14 +0200259 for i in range(8)
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200260 exec 'new X'.i
261 endfor
Bram Moolenaar95509e12016-04-15 21:16:11 +0200262 new t
263 perl <<--perl
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200264#line 5 "Test_000_SvREFCNT()"
Bram Moolenaar95509e12016-04-15 21:16:11 +0200265 my ($b, $w);
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200266
Bram Moolenaar41c363a2018-08-02 21:46:51 +0200267 my $num = 0;
268 for ( 0 .. 100 ) {
269 if ( ++$num >= 8 ) { $num = 0 }
270 VIM::DoCommand("buffer X$num");
271 $b = $curbuf;
272 }
273
274 VIM::DoCommand("buffer t");
275
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200276 $b = $curbuf for 0 .. 100;
277 $w = $curwin for 0 .. 100;
278 () = VIM::Buffers for 0 .. 100;
279 () = VIM::Windows for 0 .. 100;
280
Bram Moolenaar95509e12016-04-15 21:16:11 +0200281 VIM::DoCommand('bw! t');
282 if (exists &Internals::SvREFCNT) {
283 my $cb = Internals::SvREFCNT($$b);
284 my $cw = Internals::SvREFCNT($$w);
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200285 VIM::Eval("assert_equal(2, $cb, 'T1')");
286 VIM::Eval("assert_equal(2, $cw, 'T2')");
Bram Moolenaar41c363a2018-08-02 21:46:51 +0200287 my $strongref;
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200288 foreach ( VIM::Buffers, VIM::Windows ) {
Bram Moolenaar41c363a2018-08-02 21:46:51 +0200289 VIM::DoCommand("%bw!");
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200290 my $c = Internals::SvREFCNT($_);
291 VIM::Eval("assert_equal(2, $c, 'T3')");
292 $c = Internals::SvREFCNT($$_);
Bram Moolenaar41c363a2018-08-02 21:46:51 +0200293 next if $c == 2 && !$strongref++;
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200294 VIM::Eval("assert_equal(1, $c, 'T4')");
295 }
296 $cb = Internals::SvREFCNT($$curbuf);
297 $cw = Internals::SvREFCNT($$curwin);
298 VIM::Eval("assert_equal(3, $cb, 'T5')");
299 VIM::Eval("assert_equal(3, $cw, 'T6')");
Bram Moolenaar95509e12016-04-15 21:16:11 +0200300 }
301 VIM::Eval("assert_false($$b)");
302 VIM::Eval("assert_false($$w)");
303--perl
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200304 %bw!
Bram Moolenaar95509e12016-04-15 21:16:11 +0200305endfunc
Bram Moolenaar53901442018-07-25 22:02:36 +0200306
Bram Moolenaaread24152022-05-10 21:11:12 +0100307" This caused a memory error before issue #10386 was fixed
308func Test_stack_usage_fix()
309 let script =<< CODE
310 " This will grow Perl's stack in first invocation
311 eval [0, 0]->map({ -> perleval("push@_,0..4096;0") })
312 q!
313CODE
314 call RunVim([], script, '')
315endfunc
316
Bram Moolenaar53901442018-07-25 22:02:36 +0200317func Test_set_cursor()
318 " Check that setting the cursor position works.
319 new
320 call setline(1, ['first line', 'second line'])
321 normal gg
322 perldo $curwin->Cursor(1, 5)
323 call assert_equal([1, 6], [line('.'), col('.')])
324
325 " Check that movement after setting cursor position keeps current column.
326 normal j
327 call assert_equal([2, 6], [line('.'), col('.')])
328endfunc
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200329
330" Test for various heredoc syntax
331func Test_perl_heredoc()
332 perl << END
333VIM::DoCommand('let s = "A"')
334END
335 perl <<
336VIM::DoCommand('let s ..= "B"')
337.
338 perl << trim END
339 VIM::DoCommand('let s ..= "C"')
340 END
341 perl << trim
342 VIM::DoCommand('let s ..= "D"')
343 .
Bram Moolenaar6ab09532020-05-01 14:10:13 +0200344 perl << trim eof
345 VIM::DoCommand('let s ..= "E"')
346 eof
347 call assert_equal('ABCDE', s)
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200348endfunc
349
Bram Moolenaar730677a2020-12-09 16:05:45 +0100350func Test_perl_in_sandbox()
351 sandbox perl print 'test'
352 let messages = split(execute('message'), "\n")
353 call assert_match("'print' trapped by operation mask", messages[-1])
354endfunc
355
Bram Moolenaar6c2b7b82020-04-14 20:15:49 +0200356" vim: shiftwidth=2 sts=2 expandtab