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