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