xref: /vim-8.2.3635/src/testdir/test_perl.vim (revision 577fadfc)
1" Tests for Perl interface
2
3if !has('perl')
4  finish
5end
6
7" FIXME: RunTest don't see any error when Perl abort...
8perl $SIG{__WARN__} = sub { die "Unexpected warnings from perl: @_" };
9
10func 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
31
32funct 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
39func 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)
140  try
141    call perleval(a:expr)
142  catch
143    return v:exception
144  endtry
145  call assert_report('no exception for `perleval("'.a:expr.'")`')
146  return ''
147endfunc
148
149func Test_perleval()
150  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\+)')
186endfunc
187
188func Test_perldo()
189  sp __TEST__
190  exe 'read ' g:testname
191  perldo s/perl/vieux_chameau/g
192  1
193  call assert_false(search('\Cperl'))
194  bw!
195
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!
210endfunc
211
212func Test_VIM_package()
213  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)
219endfunc
220
221func Test_stdio()
222  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"))
230endfunc
231
232" Run first to get a clean namespace
233func Test_000_SvREFCNT()
234  for i in range(8)
235    exec 'new X'.i
236  endfor
237  new t
238  perl <<--perl
239#line 5 "Test_000_SvREFCNT()"
240  my ($b, $w);
241
242  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
251  $b = $curbuf      for 0 .. 100;
252  $w = $curwin      for 0 .. 100;
253  () = VIM::Buffers for 0 .. 100;
254  () = VIM::Windows for 0 .. 100;
255
256  VIM::DoCommand('bw! t');
257  if (exists &Internals::SvREFCNT) {
258      my $cb = Internals::SvREFCNT($$b);
259      my $cw = Internals::SvREFCNT($$w);
260      VIM::Eval("assert_equal(2, $cb, 'T1')");
261      VIM::Eval("assert_equal(2, $cw, 'T2')");
262      my $strongref;
263      foreach ( VIM::Buffers, VIM::Windows ) {
264	  VIM::DoCommand("%bw!");
265	  my $c = Internals::SvREFCNT($_);
266	  VIM::Eval("assert_equal(2, $c, 'T3')");
267	  $c = Internals::SvREFCNT($$_);
268	  next if $c == 2 && !$strongref++;
269	  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')");
275  }
276  VIM::Eval("assert_false($$b)");
277  VIM::Eval("assert_false($$w)");
278--perl
279  %bw!
280endfunc
281
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
294