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