blob: d38fc079820ea238b04ba441e994eb584347b96d [file] [log] [blame]
Bram Moolenaare9b892e2016-01-17 21:15:58 +01001" Tests for Perl interface
2
3if !has('perl')
Bram Moolenaarb0f94c12019-06-13 22:19:53 +02004 throw 'Skipped, perl feature missing'
Bram Moolenaare9b892e2016-01-17 21:15:58 +01005end
6
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("")'))
34 call assert_equal('0z31326162', perleval('VIM::Blob("12ab")'))
35 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, '$'))
56 bwipe!
57endfunc
58
59func Test_buffer_Set()
60 new
61 call setline(1, ['1', '2', '3', '4', '5'])
62 perl $curbuf->Set(2, 'a', 'b', 'c')
63 perl $curbuf->Set(4, 'A', 'B', 'C')
64 call assert_equal(['1', 'a', 'b', 'A', 'B'], getline(1, '$'))
65 bwipe!
66endfunc
67
68func Test_buffer_Get()
69 new
70 call setline(1, ['1', '2', '3', '4'])
71 call assert_equal('2:3', perleval('join(":", $curbuf->Get(2, 3))'))
72 bwipe!
73endfunc
74
75func Test_buffer_Count()
76 new
77 call setline(1, ['a', 'b', 'c'])
78 call assert_equal(3, perleval('$curbuf->Count()'))
79 bwipe!
80endfunc
81
82func Test_buffer_Name()
83 new
84 call assert_equal('', perleval('$curbuf->Name()'))
85 bwipe!
86 new Xfoo
87 call assert_equal('Xfoo', perleval('$curbuf->Name()'))
88 bwipe!
89endfunc
90
91func Test_buffer_Number()
92 call assert_equal(bufnr('%'), perleval('$curbuf->Number()'))
93endfunc
94
95func Test_window_Cursor()
96 new
97 call setline(1, ['line1', 'line2'])
98 perl $curwin->Cursor(2, 3)
99 call assert_equal('2:3', perleval('join(":", $curwin->Cursor())'))
100 " Col is numbered from 0 in Perl, and from 1 in Vim script.
101 call assert_equal([0, 2, 4, 0], getpos('.'))
102 bwipe!
103endfunc
104
105func Test_window_SetHeight()
106 new
107 perl $curwin->SetHeight(2)
108 call assert_equal(2, winheight(0))
109 bwipe!
110endfunc
111
112func Test_VIM_Windows()
113 new
114 " VIM::Windows() without argument in scalar and list context.
115 perl $winnr = VIM::Windows()
116 perl @winlist = VIM::Windows()
117 perl $curbuf->Append(0, $winnr, scalar(@winlist))
118 call assert_equal(['2', '2', ''], getline(1, '$'))
119
120 " VIM::Windows() with window number argument.
121 perl VIM::Windows(VIM::Eval('winnr()'))->Buffer()->Set(1, 'bar')
122 call assert_equal('bar', getline(1))
123 bwipe!
124endfunc
125
126func Test_VIM_Buffers()
127 new Xbar
128 " VIM::Buffers() without argument in scalar and list context.
129 perl $nbuf = VIM::Buffers()
130 perl @buflist = VIM::Buffers()
131
132 " VIM::Buffers() with argument.
133 perl $mybuf = (VIM::Buffers('Xbar'))[0]
134 perl $mybuf->Append(0, $nbuf, scalar(@buflist))
135 call assert_equal(['2', '2', ''], getline(1, '$'))
136 bwipe!
137endfunc
138
139func <SID>catch_peval(expr)
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100140 try
141 call perleval(a:expr)
142 catch
143 return v:exception
144 endtry
Bram Moolenaar37175402017-03-18 20:18:45 +0100145 call assert_report('no exception for `perleval("'.a:expr.'")`')
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100146 return ''
Bram Moolenaar95509e12016-04-15 21:16:11 +0200147endfunc
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100148
Bram Moolenaarae177b72017-02-23 13:45:57 +0100149func Test_perleval()
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100150 call assert_false(perleval('undef'))
151
152 " scalar
153 call assert_equal(0, perleval('0'))
154 call assert_equal(2, perleval('2'))
155 call assert_equal(-2, perleval('-2'))
156 if has('float')
157 call assert_equal(2.5, perleval('2.5'))
158 else
159 call assert_equal(2, perleval('2.5'))
160 end
161
162 sandbox call assert_equal(2, perleval('2'))
163
164 call assert_equal('abc', perleval('"abc"'))
165 call assert_equal("abc\ndef", perleval('"abc\0def"'))
166
167 " ref
168 call assert_equal([], perleval('[]'))
169 call assert_equal(['word', 42, [42],{}], perleval('["word", 42, [42], {}]'))
170
171 call assert_equal({}, perleval('{}'))
172 call assert_equal({'foo': 'bar'}, perleval('{foo => "bar"}'))
173
174 perl our %h; our @a;
175 let a = perleval('[\(%h, %h, @a, @a)]')
176 call assert_true((a[0] is a[1]))
177 call assert_true((a[2] is a[3]))
178 perl undef %h; undef @a;
179
180 call assert_true(<SID>catch_peval('{"" , 0}') =~ 'Malformed key Dictionary')
181 call assert_true(<SID>catch_peval('{"\0" , 0}') =~ 'Malformed key Dictionary')
182 call assert_true(<SID>catch_peval('{"foo\0bar" , 0}') =~ 'Malformed key Dictionary')
183
184 call assert_equal('*VIM', perleval('"*VIM"'))
185 call assert_true(perleval('\\0') =~ 'SCALAR(0x\x\+)')
Bram Moolenaar95509e12016-04-15 21:16:11 +0200186endfunc
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100187
Bram Moolenaarae177b72017-02-23 13:45:57 +0100188func Test_perldo()
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100189 sp __TEST__
190 exe 'read ' g:testname
191 perldo s/perl/vieux_chameau/g
192 1
193 call assert_false(search('\Cperl'))
194 bw!
Bram Moolenaar85b57432017-01-29 22:59:12 +0100195
196 " Check deleting lines does not trigger ml_get error.
197 new
198 call setline(1, ['one', 'two', 'three'])
199 perldo VIM::DoCommand("%d_")
200 bwipe!
201
202 " Check switching to another buffer does not trigger ml_get error.
203 new
204 let wincount = winnr('$')
205 call setline(1, ['one', 'two', 'three'])
206 perldo VIM::DoCommand("new")
207 call assert_equal(wincount + 1, winnr('$'))
208 bwipe!
209 bwipe!
Bram Moolenaar95509e12016-04-15 21:16:11 +0200210endfunc
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100211
Bram Moolenaarae177b72017-02-23 13:45:57 +0100212func Test_VIM_package()
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100213 perl VIM::DoCommand('let l:var = "foo"')
214 call assert_equal(l:var, 'foo')
215
216 set noet
217 perl VIM::SetOption('et')
218 call assert_true(&et)
Bram Moolenaar95509e12016-04-15 21:16:11 +0200219endfunc
Bram Moolenaar6244a0f2016-04-14 14:09:25 +0200220
Bram Moolenaarae177b72017-02-23 13:45:57 +0100221func Test_stdio()
Bram Moolenaar6244a0f2016-04-14 14:09:25 +0200222 redir =>l:out
223 perl <<EOF
224 VIM::Msg("&VIM::Msg");
225 print "STDOUT";
226 print STDERR "STDERR";
227EOF
228 redir END
229 call assert_equal(['&VIM::Msg', 'STDOUT', 'STDERR'], split(l:out, "\n"))
Bram Moolenaar95509e12016-04-15 21:16:11 +0200230endfunc
231
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200232" Run first to get a clean namespace
233func Test_000_SvREFCNT()
Bram Moolenaar3166afd2018-07-16 18:09:14 +0200234 for i in range(8)
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200235 exec 'new X'.i
236 endfor
Bram Moolenaar95509e12016-04-15 21:16:11 +0200237 new t
238 perl <<--perl
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200239#line 5 "Test_000_SvREFCNT()"
Bram Moolenaar95509e12016-04-15 21:16:11 +0200240 my ($b, $w);
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200241
Bram Moolenaar41c363a2018-08-02 21:46:51 +0200242 my $num = 0;
243 for ( 0 .. 100 ) {
244 if ( ++$num >= 8 ) { $num = 0 }
245 VIM::DoCommand("buffer X$num");
246 $b = $curbuf;
247 }
248
249 VIM::DoCommand("buffer t");
250
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200251 $b = $curbuf for 0 .. 100;
252 $w = $curwin for 0 .. 100;
253 () = VIM::Buffers for 0 .. 100;
254 () = VIM::Windows for 0 .. 100;
255
Bram Moolenaar95509e12016-04-15 21:16:11 +0200256 VIM::DoCommand('bw! t');
257 if (exists &Internals::SvREFCNT) {
258 my $cb = Internals::SvREFCNT($$b);
259 my $cw = Internals::SvREFCNT($$w);
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200260 VIM::Eval("assert_equal(2, $cb, 'T1')");
261 VIM::Eval("assert_equal(2, $cw, 'T2')");
Bram Moolenaar41c363a2018-08-02 21:46:51 +0200262 my $strongref;
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200263 foreach ( VIM::Buffers, VIM::Windows ) {
Bram Moolenaar41c363a2018-08-02 21:46:51 +0200264 VIM::DoCommand("%bw!");
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200265 my $c = Internals::SvREFCNT($_);
266 VIM::Eval("assert_equal(2, $c, 'T3')");
267 $c = Internals::SvREFCNT($$_);
Bram Moolenaar41c363a2018-08-02 21:46:51 +0200268 next if $c == 2 && !$strongref++;
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200269 VIM::Eval("assert_equal(1, $c, 'T4')");
270 }
271 $cb = Internals::SvREFCNT($$curbuf);
272 $cw = Internals::SvREFCNT($$curwin);
273 VIM::Eval("assert_equal(3, $cb, 'T5')");
274 VIM::Eval("assert_equal(3, $cw, 'T6')");
Bram Moolenaar95509e12016-04-15 21:16:11 +0200275 }
276 VIM::Eval("assert_false($$b)");
277 VIM::Eval("assert_false($$w)");
278--perl
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200279 %bw!
Bram Moolenaar95509e12016-04-15 21:16:11 +0200280endfunc
Bram Moolenaar53901442018-07-25 22:02:36 +0200281
282func Test_set_cursor()
283 " Check that setting the cursor position works.
284 new
285 call setline(1, ['first line', 'second line'])
286 normal gg
287 perldo $curwin->Cursor(1, 5)
288 call assert_equal([1, 6], [line('.'), col('.')])
289
290 " Check that movement after setting cursor position keeps current column.
291 normal j
292 call assert_equal([2, 6], [line('.'), col('.')])
293endfunc