neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

test_perl.vim (8321B)


      1 " Tests for Perl interface
      2 
      3 source check.vim
      4 CheckFeature perl
      5 CheckNotMSWindows
      6 
      7 " FIXME: RunTest don't see any error when Perl abort...
      8 perl $SIG{__WARN__} = sub { die "Unexpected warnings from perl: @_" };
      9 
     10 func 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('$'))
     16 endfunc
     17 
     18 func 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);
     26 EOF
     27  normal j
     28  .perldo s|\n|/|g
     29  " call assert_equal('abc/def/', getline('$'))
     30  call assert_equal('def', getline('$'))
     31 endfunc
     32 
     33 funct Test_VIM_Blob()
     34  call assert_equal('0z',         perleval('VIM::Blob("")'))
     35  call assert_equal('0z31326162', 'VIM::Blob("12ab")'->perleval())
     36  call assert_equal('0z00010203', perleval('VIM::Blob("\x00\x01\x02\x03")'))
     37  call assert_equal('0z8081FEFF', perleval('VIM::Blob("\x80\x81\xfe\xff")'))
     38 endfunc
     39 
     40 func Test_buffer_Delete()
     41  new
     42  call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
     43  perl $curbuf->Delete(7)
     44  perl $curbuf->Delete(2, 5)
     45  perl $curbuf->Delete(10)
     46  call assert_equal(['a', 'f', 'h'],  getline(1, '$'))
     47  bwipe!
     48 endfunc
     49 
     50 func Test_buffer_Append()
     51  new
     52  perl $curbuf->Append(1, '1')
     53  perl $curbuf->Append(2, '2', '3', '4')
     54  perl @l = ('5' ..'7')
     55  perl $curbuf->Append(0, @l)
     56  call assert_equal(['5', '6', '7', '', '1', '2', '3', '4'], getline(1, '$'))
     57  bwipe!
     58 endfunc
     59 
     60 func Test_buffer_Set()
     61  new
     62  call setline(1, ['1', '2', '3', '4', '5'])
     63  perl $curbuf->Set(2, 'a', 'b', 'c')
     64  perl $curbuf->Set(4, 'A', 'B', 'C')
     65  call assert_equal(['1', 'a', 'b', 'A', 'B'], getline(1, '$'))
     66  bwipe!
     67 endfunc
     68 
     69 func Test_buffer_Get()
     70  new
     71  call setline(1, ['1', '2', '3', '4'])
     72  call assert_equal('2:3', perleval('join(":", $curbuf->Get(2, 3))'))
     73  bwipe!
     74 endfunc
     75 
     76 func Test_buffer_Count()
     77  new
     78  call setline(1, ['a', 'b', 'c'])
     79  call assert_equal(3, perleval('$curbuf->Count()'))
     80  bwipe!
     81 endfunc
     82 
     83 func Test_buffer_Name()
     84  new
     85  call assert_equal('', perleval('$curbuf->Name()'))
     86  bwipe!
     87  new Xfoo
     88  call assert_equal('Xfoo', perleval('$curbuf->Name()'))
     89  bwipe!
     90 endfunc
     91 
     92 func Test_buffer_Number()
     93  call assert_equal(bufnr('%'), perleval('$curbuf->Number()'))
     94 endfunc
     95 
     96 func Test_window_Cursor()
     97  throw 'skipped: flaky '
     98  new
     99  call setline(1, ['line1', 'line2'])
    100  perl $curwin->Cursor(2, 3)
    101  call assert_equal('2:3', perleval('join(":", $curwin->Cursor())'))
    102  " Col is numbered from 0 in Perl, and from 1 in Vim script.
    103  call assert_equal([0, 2, 4, 0], getpos('.'))
    104  bwipe!
    105 endfunc
    106 
    107 func Test_window_SetHeight()
    108  throw 'skipped: flaky '
    109  new
    110  perl $curwin->SetHeight(2)
    111  call assert_equal(2, winheight(0))
    112  bwipe!
    113 endfunc
    114 
    115 func Test_VIM_Windows()
    116  new
    117  " VIM::Windows() without argument in scalar and list context.
    118  perl $winnr = VIM::Windows()
    119  perl @winlist = VIM::Windows()
    120  perl $curbuf->Append(0, $winnr, scalar(@winlist))
    121  call assert_equal(['2', '2', ''], getline(1, '$'))
    122 
    123  " VIM::Windows() with window number argument.
    124  perl (VIM::Windows(VIM::Eval('winnr()')))[0]->Buffer()->Set(1, 'bar')
    125  call assert_equal('bar', getline(1))
    126  bwipe!
    127 endfunc
    128 
    129 func Test_VIM_Buffers()
    130  new Xbar
    131  " VIM::Buffers() without argument in scalar and list context.
    132  perl $nbuf = VIM::Buffers()
    133  perl @buflist = VIM::Buffers()
    134 
    135  " VIM::Buffers() with argument.
    136  perl $curbuf = (VIM::Buffers('Xbar'))[0]
    137  perl $curbuf->Append(0, $nbuf, scalar(@buflist))
    138  call assert_equal(['2', '2', ''], getline(1, '$'))
    139  bwipe!
    140 endfunc
    141 
    142 func <SID>catch_peval(expr)
    143  try
    144    call perleval(a:expr)
    145  catch
    146    return v:exception
    147  endtry
    148  call assert_report('no exception for `perleval("'.a:expr.'")`')
    149  return ''
    150 endfunc
    151 
    152 func Test_perleval()
    153  call assert_false(perleval('undef'))
    154 
    155  " scalar
    156  call assert_equal(0, perleval('0'))
    157  call assert_equal(2, perleval('2'))
    158  call assert_equal(-2, perleval('-2'))
    159  if has('float')
    160    call assert_equal(2.5, perleval('2.5'))
    161  else
    162    call assert_equal(2, perleval('2.5'))
    163  end
    164 
    165  " sandbox call assert_equal(2, perleval('2'))
    166 
    167  call assert_equal('abc', perleval('"abc"'))
    168  " call assert_equal("abc\ndef", perleval('"abc\0def"'))
    169 
    170  " ref
    171  call assert_equal([], perleval('[]'))
    172  call assert_equal(['word', 42, [42],{}], perleval('["word", 42, [42], {}]'))
    173 
    174  call assert_equal({}, perleval('{}'))
    175  call assert_equal({'foo': 'bar'}, perleval('{foo => "bar"}'))
    176 
    177  perl our %h; our @a;
    178  let a = perleval('[\(%h, %h, @a, @a)]')
    179  " call assert_true((a[0] is a[1]))
    180  call assert_equal(a[0], a[1])
    181  " call assert_true((a[2] is a[3]))
    182  call assert_equal(a[2], a[3])
    183  perl undef %h; undef @a;
    184 
    185  " call assert_true(<SID>catch_peval('{"" , 0}') =~ 'Malformed key Dictionary')
    186  " call assert_true(<SID>catch_peval('{"\0" , 0}') =~ 'Malformed key Dictionary')
    187  " call assert_true(<SID>catch_peval('{"foo\0bar" , 0}') =~ 'Malformed key Dictionary')
    188 
    189  call assert_equal('*VIM', perleval('"*VIM"'))
    190  " call assert_true(perleval('\\0') =~ 'SCALAR(0x\x\+)')
    191 endfunc
    192 
    193 func Test_perldo()
    194  sp __TEST__
    195  exe 'read ' g:testname
    196  perldo s/perl/vieux_chameau/g
    197  1
    198  call assert_false(search('\Cperl'))
    199  bw!
    200 
    201  " Check deleting lines does not trigger ml_get error.
    202  new
    203  call setline(1, ['one', 'two', 'three'])
    204  perldo VIM::DoCommand("%d_")
    205  bwipe!
    206 
    207  " Check switching to another buffer does not trigger ml_get error.
    208  new
    209  let wincount = winnr('$')
    210  call setline(1, ['one', 'two', 'three'])
    211  perldo VIM::DoCommand("new")
    212  call assert_equal(wincount + 1, winnr('$'))
    213  bwipe!
    214  bwipe!
    215 endfunc
    216 
    217 func Test_VIM_package()
    218  perl VIM::DoCommand('let l:var = "foo"')
    219  call assert_equal(l:var, 'foo')
    220 
    221  set noet
    222  perl VIM::SetOption('et')
    223  call assert_true(&et)
    224 endfunc
    225 
    226 func Test_stdio()
    227  throw 'skipped: TODO: '
    228  redir =>l:out
    229  perl << trim EOF
    230    VIM::Msg("&VIM::Msg");
    231    print "STDOUT";
    232    print STDERR "STDERR";
    233  EOF
    234  redir END
    235  call assert_equal(['&VIM::Msg', 'STDOUT', 'STDERR'], split(l:out, "\n"))
    236 endfunc
    237 
    238 " Run first to get a clean namespace
    239 func Test_000_SvREFCNT()
    240  throw 'skipped: TODO: '
    241  for i in range(8)
    242    exec 'new X'.i
    243  endfor
    244  new t
    245  perl <<--perl
    246 #line 5 "Test_000_SvREFCNT()"
    247  my ($b, $w);
    248 
    249  my $num = 0;
    250  for ( 0 .. 100 ) {
    251      if ( ++$num >= 8 ) { $num = 0 }
    252      VIM::DoCommand("buffer X$num");
    253      $b = $curbuf;
    254  }
    255 
    256  VIM::DoCommand("buffer t");
    257 
    258  $b = $curbuf      for 0 .. 100;
    259  $w = $curwin      for 0 .. 100;
    260  () = VIM::Buffers for 0 .. 100;
    261  () = VIM::Windows for 0 .. 100;
    262 
    263  VIM::DoCommand('bw! t');
    264  if (exists &Internals::SvREFCNT) {
    265      my $cb = Internals::SvREFCNT($$b);
    266      my $cw = Internals::SvREFCNT($$w);
    267      VIM::Eval("assert_equal(2, $cb, 'T1')");
    268      VIM::Eval("assert_equal(2, $cw, 'T2')");
    269      my $strongref;
    270      foreach ( VIM::Buffers, VIM::Windows ) {
    271   VIM::DoCommand("%bw!");
    272   my $c = Internals::SvREFCNT($_);
    273   VIM::Eval("assert_equal(2, $c, 'T3')");
    274   $c = Internals::SvREFCNT($$_);
    275   next if $c == 2 && !$strongref++;
    276   VIM::Eval("assert_equal(1, $c, 'T4')");
    277      }
    278      $cb = Internals::SvREFCNT($$curbuf);
    279      $cw = Internals::SvREFCNT($$curwin);
    280      VIM::Eval("assert_equal(3, $cb, 'T5')");
    281      VIM::Eval("assert_equal(3, $cw, 'T6')");
    282  }
    283  VIM::Eval("assert_false($$b)");
    284  VIM::Eval("assert_false($$w)");
    285 --perl
    286  %bw!
    287 endfunc
    288 
    289 func Test_set_cursor()
    290  " Check that setting the cursor position works.
    291  new
    292  call setline(1, ['first line', 'second line'])
    293  normal gg
    294  perldo $curwin->Cursor(1, 5)
    295  call assert_equal([1, 6], [line('.'), col('.')])
    296 
    297  " Check that movement after setting cursor position keeps current column.
    298  normal j
    299  call assert_equal([2, 6], [line('.'), col('.')])
    300 endfunc
    301 
    302 " Test for various heredoc syntax
    303 func Test_perl_heredoc()
    304  perl << END
    305 VIM::DoCommand('let s = "A"')
    306 END
    307  perl <<
    308 VIM::DoCommand('let s ..= "B"')
    309 .
    310  perl << trim END
    311    VIM::DoCommand('let s ..= "C"')
    312  END
    313  perl << trim
    314    VIM::DoCommand('let s ..= "D"')
    315  .
    316  perl << trim eof
    317    VIM::DoCommand('let s ..= "E"')
    318  eof
    319  perl << trimm
    320 VIM::DoCommand('let s ..= "F"')
    321 trimm
    322  call assert_equal('ABCDEF', s)
    323 endfunc
    324 
    325 " vim: shiftwidth=2 sts=2 expandtab