xref: /vim-8.2.3635/src/testdir/test_perl.vim (revision 588cf754)
1e9b892ebSBram Moolenaar" Tests for Perl interface
2e9b892ebSBram Moolenaar
3b46fecd3SBram Moolenaarsource check.vim
4*588cf754SDominique Pellesource shared.vim
5b46fecd3SBram MoolenaarCheckFeature perl
6e9b892ebSBram Moolenaar
741c363a3SBram Moolenaar" FIXME: RunTest don't see any error when Perl abort...
841c363a3SBram Moolenaarperl $SIG{__WARN__} = sub { die "Unexpected warnings from perl: @_" };
941c363a3SBram Moolenaar
10021b593eSBram Moolenaarfunc Test_change_buffer()
11021b593eSBram Moolenaar  call setline(line('$'), ['1 line 1'])
12021b593eSBram Moolenaar  perl VIM::DoCommand("normal /^1\n")
13021b593eSBram Moolenaar  perl $curline = VIM::Eval("line('.')")
14021b593eSBram Moolenaar  perl $curbuf->Set($curline, "1 changed line 1")
15021b593eSBram Moolenaar  call assert_equal('1 changed line 1', getline('$'))
16021b593eSBram Moolenaarendfunc
17021b593eSBram Moolenaar
18021b593eSBram Moolenaarfunc Test_evaluate_list()
19021b593eSBram Moolenaar  call setline(line('$'), ['2 line 2'])
20021b593eSBram Moolenaar  perl VIM::DoCommand("normal /^2\n")
21021b593eSBram Moolenaar  perl $curline = VIM::Eval("line('.')")
22021b593eSBram Moolenaar  let l = ["abc", "def"]
23021b593eSBram Moolenaar  perl << EOF
24021b593eSBram Moolenaar  $l = VIM::Eval("l");
25021b593eSBram Moolenaar  $curbuf->Append($curline, $l);
26021b593eSBram MoolenaarEOF
27021b593eSBram Moolenaar  normal j
28021b593eSBram Moolenaar  .perldo s|\n|/|g
29021b593eSBram Moolenaar  call assert_equal('abc/def/', getline('$'))
30021b593eSBram Moolenaarendfunc
31e9b892ebSBram Moolenaar
322472ae81SBram Moolenaarfunct Test_VIM_Blob()
332472ae81SBram Moolenaar  call assert_equal('0z',         perleval('VIM::Blob("")'))
343f4f3d8eSBram Moolenaar  call assert_equal('0z31326162', 'VIM::Blob("12ab")'->perleval())
352472ae81SBram Moolenaar  call assert_equal('0z00010203', perleval('VIM::Blob("\x00\x01\x02\x03")'))
362472ae81SBram Moolenaar  call assert_equal('0z8081FEFF', perleval('VIM::Blob("\x80\x81\xfe\xff")'))
372472ae81SBram Moolenaarendfunc
382472ae81SBram Moolenaar
39ae177b71SBram Moolenaarfunc Test_buffer_Delete()
40ae177b71SBram Moolenaar  new
41ae177b71SBram Moolenaar  call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
42ae177b71SBram Moolenaar  perl $curbuf->Delete(7)
43ae177b71SBram Moolenaar  perl $curbuf->Delete(2, 5)
44ae177b71SBram Moolenaar  perl $curbuf->Delete(10)
45ae177b71SBram Moolenaar  call assert_equal(['a', 'f', 'h'],  getline(1, '$'))
46ae177b71SBram Moolenaar  bwipe!
47ae177b71SBram Moolenaarendfunc
48ae177b71SBram Moolenaar
49ae177b71SBram Moolenaarfunc Test_buffer_Append()
50ae177b71SBram Moolenaar  new
51ae177b71SBram Moolenaar  perl $curbuf->Append(1, '1')
52ae177b71SBram Moolenaar  perl $curbuf->Append(2, '2', '3', '4')
53ae177b71SBram Moolenaar  perl @l = ('5' ..'7')
54ae177b71SBram Moolenaar  perl $curbuf->Append(0, @l)
55ae177b71SBram Moolenaar  call assert_equal(['5', '6', '7', '', '1', '2', '3', '4'], getline(1, '$'))
56*588cf754SDominique Pelle
57*588cf754SDominique Pelle  perl $curbuf->Append(0)
58*588cf754SDominique Pelle  call assert_match('^Usage: VIBUF::Append(vimbuf, lnum, @lines) at .* line 1\.$',
59*588cf754SDominique Pelle        \           GetMessages()[-1])
60*588cf754SDominique Pelle
61ae177b71SBram Moolenaar  bwipe!
62ae177b71SBram Moolenaarendfunc
63ae177b71SBram Moolenaar
64ae177b71SBram Moolenaarfunc Test_buffer_Set()
65ae177b71SBram Moolenaar  new
66ae177b71SBram Moolenaar  call setline(1, ['1', '2', '3', '4', '5'])
67ae177b71SBram Moolenaar  perl $curbuf->Set(2, 'a', 'b', 'c')
68ae177b71SBram Moolenaar  perl $curbuf->Set(4, 'A', 'B', 'C')
69ae177b71SBram Moolenaar  call assert_equal(['1', 'a', 'b', 'A', 'B'], getline(1, '$'))
70*588cf754SDominique Pelle
71*588cf754SDominique Pelle  perl $curbuf->Set(0)
72*588cf754SDominique Pelle  call assert_match('^Usage: VIBUF::Set(vimbuf, lnum, @lines) at .* line 1\.$',
73*588cf754SDominique Pelle        \           GetMessages()[-1])
74*588cf754SDominique Pelle
75ae177b71SBram Moolenaar  bwipe!
76ae177b71SBram Moolenaarendfunc
77ae177b71SBram Moolenaar
78ae177b71SBram Moolenaarfunc Test_buffer_Get()
79ae177b71SBram Moolenaar  new
80ae177b71SBram Moolenaar  call setline(1, ['1', '2', '3', '4'])
81ae177b71SBram Moolenaar  call assert_equal('2:3', perleval('join(":", $curbuf->Get(2, 3))'))
82ae177b71SBram Moolenaar  bwipe!
83ae177b71SBram Moolenaarendfunc
84ae177b71SBram Moolenaar
85ae177b71SBram Moolenaarfunc Test_buffer_Count()
86ae177b71SBram Moolenaar  new
87ae177b71SBram Moolenaar  call setline(1, ['a', 'b', 'c'])
88ae177b71SBram Moolenaar  call assert_equal(3, perleval('$curbuf->Count()'))
89ae177b71SBram Moolenaar  bwipe!
90ae177b71SBram Moolenaarendfunc
91ae177b71SBram Moolenaar
92ae177b71SBram Moolenaarfunc Test_buffer_Name()
93ae177b71SBram Moolenaar  new
94ae177b71SBram Moolenaar  call assert_equal('', perleval('$curbuf->Name()'))
95ae177b71SBram Moolenaar  bwipe!
96ae177b71SBram Moolenaar  new Xfoo
97ae177b71SBram Moolenaar  call assert_equal('Xfoo', perleval('$curbuf->Name()'))
98ae177b71SBram Moolenaar  bwipe!
99ae177b71SBram Moolenaarendfunc
100ae177b71SBram Moolenaar
101ae177b71SBram Moolenaarfunc Test_buffer_Number()
102ae177b71SBram Moolenaar  call assert_equal(bufnr('%'), perleval('$curbuf->Number()'))
103ae177b71SBram Moolenaarendfunc
104ae177b71SBram Moolenaar
105ae177b71SBram Moolenaarfunc Test_window_Cursor()
106ae177b71SBram Moolenaar  new
107ae177b71SBram Moolenaar  call setline(1, ['line1', 'line2'])
108ae177b71SBram Moolenaar  perl $curwin->Cursor(2, 3)
109ae177b71SBram Moolenaar  call assert_equal('2:3', perleval('join(":", $curwin->Cursor())'))
110ae177b71SBram Moolenaar  " Col is numbered from 0 in Perl, and from 1 in Vim script.
111ae177b71SBram Moolenaar  call assert_equal([0, 2, 4, 0], getpos('.'))
112ae177b71SBram Moolenaar  bwipe!
113ae177b71SBram Moolenaarendfunc
114ae177b71SBram Moolenaar
115ae177b71SBram Moolenaarfunc Test_window_SetHeight()
116ae177b71SBram Moolenaar  new
117ae177b71SBram Moolenaar  perl $curwin->SetHeight(2)
118ae177b71SBram Moolenaar  call assert_equal(2, winheight(0))
119ae177b71SBram Moolenaar  bwipe!
120ae177b71SBram Moolenaarendfunc
121ae177b71SBram Moolenaar
122ae177b71SBram Moolenaarfunc Test_VIM_Windows()
123ae177b71SBram Moolenaar  new
124ae177b71SBram Moolenaar  " VIM::Windows() without argument in scalar and list context.
125ae177b71SBram Moolenaar  perl $winnr = VIM::Windows()
126ae177b71SBram Moolenaar  perl @winlist = VIM::Windows()
127ae177b71SBram Moolenaar  perl $curbuf->Append(0, $winnr, scalar(@winlist))
128ae177b71SBram Moolenaar  call assert_equal(['2', '2', ''], getline(1, '$'))
129ae177b71SBram Moolenaar
130ae177b71SBram Moolenaar  " VIM::Windows() with window number argument.
131ae177b71SBram Moolenaar  perl VIM::Windows(VIM::Eval('winnr()'))->Buffer()->Set(1, 'bar')
132ae177b71SBram Moolenaar  call assert_equal('bar', getline(1))
133ae177b71SBram Moolenaar  bwipe!
134ae177b71SBram Moolenaarendfunc
135ae177b71SBram Moolenaar
136ae177b71SBram Moolenaarfunc Test_VIM_Buffers()
137ae177b71SBram Moolenaar  new Xbar
138ae177b71SBram Moolenaar  " VIM::Buffers() without argument in scalar and list context.
139ae177b71SBram Moolenaar  perl $nbuf = VIM::Buffers()
140ae177b71SBram Moolenaar  perl @buflist = VIM::Buffers()
141ae177b71SBram Moolenaar
142ae177b71SBram Moolenaar  " VIM::Buffers() with argument.
143ae177b71SBram Moolenaar  perl $mybuf = (VIM::Buffers('Xbar'))[0]
144ae177b71SBram Moolenaar  perl $mybuf->Append(0, $nbuf, scalar(@buflist))
145ae177b71SBram Moolenaar  call assert_equal(['2', '2', ''], getline(1, '$'))
146ae177b71SBram Moolenaar  bwipe!
147ae177b71SBram Moolenaarendfunc
148ae177b71SBram Moolenaar
149ae177b71SBram Moolenaarfunc <SID>catch_peval(expr)
150e9b892ebSBram Moolenaar  try
151e9b892ebSBram Moolenaar    call perleval(a:expr)
152e9b892ebSBram Moolenaar  catch
153e9b892ebSBram Moolenaar    return v:exception
154e9b892ebSBram Moolenaar  endtry
15537175409SBram Moolenaar  call assert_report('no exception for `perleval("'.a:expr.'")`')
156e9b892ebSBram Moolenaar  return ''
15795509e18SBram Moolenaarendfunc
158e9b892ebSBram Moolenaar
159ae177b71SBram Moolenaarfunc Test_perleval()
160e9b892ebSBram Moolenaar  call assert_false(perleval('undef'))
161e9b892ebSBram Moolenaar
162e9b892ebSBram Moolenaar  " scalar
163e9b892ebSBram Moolenaar  call assert_equal(0, perleval('0'))
164e9b892ebSBram Moolenaar  call assert_equal(2, perleval('2'))
165e9b892ebSBram Moolenaar  call assert_equal(-2, perleval('-2'))
166e9b892ebSBram Moolenaar  if has('float')
167e9b892ebSBram Moolenaar    call assert_equal(2.5, perleval('2.5'))
168e9b892ebSBram Moolenaar  else
169e9b892ebSBram Moolenaar    call assert_equal(2, perleval('2.5'))
170e9b892ebSBram Moolenaar  end
171e9b892ebSBram Moolenaar
172e9b892ebSBram Moolenaar  sandbox call assert_equal(2, perleval('2'))
173e9b892ebSBram Moolenaar
174e9b892ebSBram Moolenaar  call assert_equal('abc', perleval('"abc"'))
175e9b892ebSBram Moolenaar  call assert_equal("abc\ndef", perleval('"abc\0def"'))
176e9b892ebSBram Moolenaar
177e9b892ebSBram Moolenaar  " ref
178e9b892ebSBram Moolenaar  call assert_equal([], perleval('[]'))
179e9b892ebSBram Moolenaar  call assert_equal(['word', 42, [42],{}], perleval('["word", 42, [42], {}]'))
180e9b892ebSBram Moolenaar
181e9b892ebSBram Moolenaar  call assert_equal({}, perleval('{}'))
182e9b892ebSBram Moolenaar  call assert_equal({'foo': 'bar'}, perleval('{foo => "bar"}'))
183e9b892ebSBram Moolenaar
184e9b892ebSBram Moolenaar  perl our %h; our @a;
185e9b892ebSBram Moolenaar  let a = perleval('[\(%h, %h, @a, @a)]')
186e9b892ebSBram Moolenaar  call assert_true((a[0] is a[1]))
187e9b892ebSBram Moolenaar  call assert_true((a[2] is a[3]))
188e9b892ebSBram Moolenaar  perl undef %h; undef @a;
189e9b892ebSBram Moolenaar
190e9b892ebSBram Moolenaar  call assert_true(<SID>catch_peval('{"" , 0}') =~ 'Malformed key Dictionary')
191e9b892ebSBram Moolenaar  call assert_true(<SID>catch_peval('{"\0" , 0}') =~ 'Malformed key Dictionary')
192e9b892ebSBram Moolenaar  call assert_true(<SID>catch_peval('{"foo\0bar" , 0}') =~ 'Malformed key Dictionary')
193e9b892ebSBram Moolenaar
194e9b892ebSBram Moolenaar  call assert_equal('*VIM', perleval('"*VIM"'))
195e9b892ebSBram Moolenaar  call assert_true(perleval('\\0') =~ 'SCALAR(0x\x\+)')
196730677a0SBram Moolenaar
197730677a0SBram Moolenaar  " typeglob
198730677a0SBram Moolenaar  call assert_equal('*main::STDOUT', perleval('*STDOUT'))
199730677a0SBram Moolenaar'
200730677a0SBram Moolenaar  call perleval("++-$foo")
201730677a0SBram Moolenaar  let messages = split(execute('message'), "\n")
202730677a0SBram Moolenaar  call assert_match("Can't modify negation", messages[-1])
20395509e18SBram Moolenaarendfunc
204e9b892ebSBram Moolenaar
205ae177b71SBram Moolenaarfunc Test_perldo()
206730677a0SBram Moolenaar  new
207730677a0SBram Moolenaar  " :perldo in empty buffer does nothing.
208730677a0SBram Moolenaar  perldo ++$counter
209730677a0SBram Moolenaar  call assert_equal(0, perleval("$counter"))
210730677a0SBram Moolenaar
211e9b892ebSBram Moolenaar  sp __TEST__
212e9b892ebSBram Moolenaar  exe 'read ' g:testname
213e9b892ebSBram Moolenaar  perldo s/perl/vieux_chameau/g
214e9b892ebSBram Moolenaar  1
215e9b892ebSBram Moolenaar  call assert_false(search('\Cperl'))
216e9b892ebSBram Moolenaar  bw!
21785b5743dSBram Moolenaar
21885b5743dSBram Moolenaar  " Check deleting lines does not trigger ml_get error.
21985b5743dSBram Moolenaar  new
22085b5743dSBram Moolenaar  call setline(1, ['one', 'two', 'three'])
22185b5743dSBram Moolenaar  perldo VIM::DoCommand("%d_")
22285b5743dSBram Moolenaar  bwipe!
22385b5743dSBram Moolenaar
224*588cf754SDominique Pelle  " Check a Perl expression which gives an error.
225*588cf754SDominique Pelle  new
226*588cf754SDominique Pelle  call setline(1, 'one')
227*588cf754SDominique Pelle  perldo 1/0
228*588cf754SDominique Pelle  call assert_match('^Illegal division by zero at .* line 1\.$', GetMessages()[-1])
229*588cf754SDominique Pelle  bwipe!
230*588cf754SDominique Pelle
23185b5743dSBram Moolenaar  " Check switching to another buffer does not trigger ml_get error.
23285b5743dSBram Moolenaar  new
23385b5743dSBram Moolenaar  let wincount = winnr('$')
23485b5743dSBram Moolenaar  call setline(1, ['one', 'two', 'three'])
23585b5743dSBram Moolenaar  perldo VIM::DoCommand("new")
23685b5743dSBram Moolenaar  call assert_equal(wincount + 1, winnr('$'))
237730677a0SBram Moolenaar  %bwipe!
23895509e18SBram Moolenaarendfunc
239e9b892ebSBram Moolenaar
240ae177b71SBram Moolenaarfunc Test_VIM_package()
241e9b892ebSBram Moolenaar  perl VIM::DoCommand('let l:var = "foo"')
242e9b892ebSBram Moolenaar  call assert_equal(l:var, 'foo')
243e9b892ebSBram Moolenaar
244e9b892ebSBram Moolenaar  set noet
245e9b892ebSBram Moolenaar  perl VIM::SetOption('et')
246e9b892ebSBram Moolenaar  call assert_true(&et)
24795509e18SBram Moolenaarendfunc
2486244a0fcSBram Moolenaar
249ae177b71SBram Moolenaarfunc Test_stdio()
2506244a0fcSBram Moolenaar  redir =>l:out
2516c2b7b80SBram Moolenaar  perl << trim EOF
252*588cf754SDominique Pelle    VIM::Msg("VIM::Msg");
253*588cf754SDominique Pelle    VIM::Msg("VIM::Msg Error", "Error");
2546244a0fcSBram Moolenaar    print "STDOUT";
2556244a0fcSBram Moolenaar    print STDERR "STDERR";
2566244a0fcSBram Moolenaar  EOF
2576244a0fcSBram Moolenaar  redir END
258*588cf754SDominique Pelle  call assert_equal(['VIM::Msg', 'VIM::Msg Error', 'STDOUT', 'STDERR'], split(l:out, "\n"))
25995509e18SBram Moolenaarendfunc
26095509e18SBram Moolenaar
26118c4f1baSBram Moolenaar" Run first to get a clean namespace
26218c4f1baSBram Moolenaarfunc Test_000_SvREFCNT()
2633166afd9SBram Moolenaar  for i in range(8)
26418c4f1baSBram Moolenaar    exec 'new X'.i
26518c4f1baSBram Moolenaar  endfor
26695509e18SBram Moolenaar  new t
26795509e18SBram Moolenaar  perl <<--perl
26818c4f1baSBram Moolenaar#line 5 "Test_000_SvREFCNT()"
26995509e18SBram Moolenaar  my ($b, $w);
27018c4f1baSBram Moolenaar
27141c363a3SBram Moolenaar  my $num = 0;
27241c363a3SBram Moolenaar  for ( 0 .. 100 ) {
27341c363a3SBram Moolenaar      if ( ++$num >= 8 ) { $num = 0 }
27441c363a3SBram Moolenaar      VIM::DoCommand("buffer X$num");
27541c363a3SBram Moolenaar      $b = $curbuf;
27641c363a3SBram Moolenaar  }
27741c363a3SBram Moolenaar
27841c363a3SBram Moolenaar  VIM::DoCommand("buffer t");
27941c363a3SBram Moolenaar
28018c4f1baSBram Moolenaar  $b = $curbuf      for 0 .. 100;
28118c4f1baSBram Moolenaar  $w = $curwin      for 0 .. 100;
28218c4f1baSBram Moolenaar  () = VIM::Buffers for 0 .. 100;
28318c4f1baSBram Moolenaar  () = VIM::Windows for 0 .. 100;
28418c4f1baSBram Moolenaar
28595509e18SBram Moolenaar  VIM::DoCommand('bw! t');
28695509e18SBram Moolenaar  if (exists &Internals::SvREFCNT) {
28795509e18SBram Moolenaar      my $cb = Internals::SvREFCNT($$b);
28895509e18SBram Moolenaar      my $cw = Internals::SvREFCNT($$w);
28918c4f1baSBram Moolenaar      VIM::Eval("assert_equal(2, $cb, 'T1')");
29018c4f1baSBram Moolenaar      VIM::Eval("assert_equal(2, $cw, 'T2')");
29141c363a3SBram Moolenaar      my $strongref;
29218c4f1baSBram Moolenaar      foreach ( VIM::Buffers, VIM::Windows ) {
29341c363a3SBram Moolenaar	  VIM::DoCommand("%bw!");
29418c4f1baSBram Moolenaar	  my $c = Internals::SvREFCNT($_);
29518c4f1baSBram Moolenaar	  VIM::Eval("assert_equal(2, $c, 'T3')");
29618c4f1baSBram Moolenaar	  $c = Internals::SvREFCNT($$_);
29741c363a3SBram Moolenaar	  next if $c == 2 && !$strongref++;
29818c4f1baSBram Moolenaar	  VIM::Eval("assert_equal(1, $c, 'T4')");
29918c4f1baSBram Moolenaar      }
30018c4f1baSBram Moolenaar      $cb = Internals::SvREFCNT($$curbuf);
30118c4f1baSBram Moolenaar      $cw = Internals::SvREFCNT($$curwin);
30218c4f1baSBram Moolenaar      VIM::Eval("assert_equal(3, $cb, 'T5')");
30318c4f1baSBram Moolenaar      VIM::Eval("assert_equal(3, $cw, 'T6')");
30495509e18SBram Moolenaar  }
30595509e18SBram Moolenaar  VIM::Eval("assert_false($$b)");
30695509e18SBram Moolenaar  VIM::Eval("assert_false($$w)");
30795509e18SBram Moolenaar--perl
30818c4f1baSBram Moolenaar  %bw!
30995509e18SBram Moolenaarendfunc
31053901442SBram Moolenaar
31153901442SBram Moolenaarfunc Test_set_cursor()
31253901442SBram Moolenaar  " Check that setting the cursor position works.
31353901442SBram Moolenaar  new
31453901442SBram Moolenaar  call setline(1, ['first line', 'second line'])
31553901442SBram Moolenaar  normal gg
31653901442SBram Moolenaar  perldo $curwin->Cursor(1, 5)
31753901442SBram Moolenaar  call assert_equal([1, 6], [line('.'), col('.')])
31853901442SBram Moolenaar
31953901442SBram Moolenaar  " Check that movement after setting cursor position keeps current column.
32053901442SBram Moolenaar  normal j
32153901442SBram Moolenaar  call assert_equal([2, 6], [line('.'), col('.')])
32253901442SBram Moolenaarendfunc
3236c2b7b80SBram Moolenaar
3246c2b7b80SBram Moolenaar" Test for various heredoc syntax
3256c2b7b80SBram Moolenaarfunc Test_perl_heredoc()
3266c2b7b80SBram Moolenaar  perl << END
3276c2b7b80SBram MoolenaarVIM::DoCommand('let s = "A"')
3286c2b7b80SBram MoolenaarEND
3296c2b7b80SBram Moolenaar  perl <<
3306c2b7b80SBram MoolenaarVIM::DoCommand('let s ..= "B"')
3316c2b7b80SBram Moolenaar.
3326c2b7b80SBram Moolenaar  perl << trim END
3336c2b7b80SBram Moolenaar    VIM::DoCommand('let s ..= "C"')
3346c2b7b80SBram Moolenaar  END
3356c2b7b80SBram Moolenaar  perl << trim
3366c2b7b80SBram Moolenaar    VIM::DoCommand('let s ..= "D"')
3376c2b7b80SBram Moolenaar  .
3386ab0953fSBram Moolenaar  perl << trim eof
3396ab0953fSBram Moolenaar    VIM::DoCommand('let s ..= "E"')
3406ab0953fSBram Moolenaar  eof
3416ab0953fSBram Moolenaar  call assert_equal('ABCDE', s)
3426c2b7b80SBram Moolenaarendfunc
3436c2b7b80SBram Moolenaar
344730677a0SBram Moolenaarfunc Test_perl_in_sandbox()
345730677a0SBram Moolenaar  sandbox perl print 'test'
346730677a0SBram Moolenaar  let messages = split(execute('message'), "\n")
347730677a0SBram Moolenaar  call assert_match("'print' trapped by operation mask", messages[-1])
348730677a0SBram Moolenaarendfunc
349730677a0SBram Moolenaar
3506c2b7b80SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
351