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