blob: 4934780a620292e4692227e0fbf915e3fac0454d [file] [log] [blame]
Bram Moolenaare9b892e2016-01-17 21:15:58 +01001" Tests for Perl interface
2
3if !has('perl')
4 finish
5end
6
Bram Moolenaar021b5932016-01-17 22:05:48 +01007func Test_change_buffer()
8 call setline(line('$'), ['1 line 1'])
9 perl VIM::DoCommand("normal /^1\n")
10 perl $curline = VIM::Eval("line('.')")
11 perl $curbuf->Set($curline, "1 changed line 1")
12 call assert_equal('1 changed line 1', getline('$'))
13endfunc
14
15func Test_evaluate_list()
16 call setline(line('$'), ['2 line 2'])
17 perl VIM::DoCommand("normal /^2\n")
18 perl $curline = VIM::Eval("line('.')")
19 let l = ["abc", "def"]
20 perl << EOF
21 $l = VIM::Eval("l");
22 $curbuf->Append($curline, $l);
23EOF
24 normal j
25 .perldo s|\n|/|g
26 call assert_equal('abc/def/', getline('$'))
27endfunc
Bram Moolenaare9b892e2016-01-17 21:15:58 +010028
Bram Moolenaarae177b72017-02-23 13:45:57 +010029func Test_buffer_Delete()
30 new
31 call setline(1, ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
32 perl $curbuf->Delete(7)
33 perl $curbuf->Delete(2, 5)
34 perl $curbuf->Delete(10)
35 call assert_equal(['a', 'f', 'h'], getline(1, '$'))
36 bwipe!
37endfunc
38
39func Test_buffer_Append()
40 new
41 perl $curbuf->Append(1, '1')
42 perl $curbuf->Append(2, '2', '3', '4')
43 perl @l = ('5' ..'7')
44 perl $curbuf->Append(0, @l)
45 call assert_equal(['5', '6', '7', '', '1', '2', '3', '4'], getline(1, '$'))
46 bwipe!
47endfunc
48
49func Test_buffer_Set()
50 new
51 call setline(1, ['1', '2', '3', '4', '5'])
52 perl $curbuf->Set(2, 'a', 'b', 'c')
53 perl $curbuf->Set(4, 'A', 'B', 'C')
54 call assert_equal(['1', 'a', 'b', 'A', 'B'], getline(1, '$'))
55 bwipe!
56endfunc
57
58func Test_buffer_Get()
59 new
60 call setline(1, ['1', '2', '3', '4'])
61 call assert_equal('2:3', perleval('join(":", $curbuf->Get(2, 3))'))
62 bwipe!
63endfunc
64
65func Test_buffer_Count()
66 new
67 call setline(1, ['a', 'b', 'c'])
68 call assert_equal(3, perleval('$curbuf->Count()'))
69 bwipe!
70endfunc
71
72func Test_buffer_Name()
73 new
74 call assert_equal('', perleval('$curbuf->Name()'))
75 bwipe!
76 new Xfoo
77 call assert_equal('Xfoo', perleval('$curbuf->Name()'))
78 bwipe!
79endfunc
80
81func Test_buffer_Number()
82 call assert_equal(bufnr('%'), perleval('$curbuf->Number()'))
83endfunc
84
85func Test_window_Cursor()
86 new
87 call setline(1, ['line1', 'line2'])
88 perl $curwin->Cursor(2, 3)
89 call assert_equal('2:3', perleval('join(":", $curwin->Cursor())'))
90 " Col is numbered from 0 in Perl, and from 1 in Vim script.
91 call assert_equal([0, 2, 4, 0], getpos('.'))
92 bwipe!
93endfunc
94
95func Test_window_SetHeight()
96 new
97 perl $curwin->SetHeight(2)
98 call assert_equal(2, winheight(0))
99 bwipe!
100endfunc
101
102func Test_VIM_Windows()
103 new
104 " VIM::Windows() without argument in scalar and list context.
105 perl $winnr = VIM::Windows()
106 perl @winlist = VIM::Windows()
107 perl $curbuf->Append(0, $winnr, scalar(@winlist))
108 call assert_equal(['2', '2', ''], getline(1, '$'))
109
110 " VIM::Windows() with window number argument.
111 perl VIM::Windows(VIM::Eval('winnr()'))->Buffer()->Set(1, 'bar')
112 call assert_equal('bar', getline(1))
113 bwipe!
114endfunc
115
116func Test_VIM_Buffers()
117 new Xbar
118 " VIM::Buffers() without argument in scalar and list context.
119 perl $nbuf = VIM::Buffers()
120 perl @buflist = VIM::Buffers()
121
122 " VIM::Buffers() with argument.
123 perl $mybuf = (VIM::Buffers('Xbar'))[0]
124 perl $mybuf->Append(0, $nbuf, scalar(@buflist))
125 call assert_equal(['2', '2', ''], getline(1, '$'))
126 bwipe!
127endfunc
128
129func <SID>catch_peval(expr)
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100130 try
131 call perleval(a:expr)
132 catch
133 return v:exception
134 endtry
Bram Moolenaar37175402017-03-18 20:18:45 +0100135 call assert_report('no exception for `perleval("'.a:expr.'")`')
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100136 return ''
Bram Moolenaar95509e12016-04-15 21:16:11 +0200137endfunc
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100138
Bram Moolenaarae177b72017-02-23 13:45:57 +0100139func Test_perleval()
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100140 call assert_false(perleval('undef'))
141
142 " scalar
143 call assert_equal(0, perleval('0'))
144 call assert_equal(2, perleval('2'))
145 call assert_equal(-2, perleval('-2'))
146 if has('float')
147 call assert_equal(2.5, perleval('2.5'))
148 else
149 call assert_equal(2, perleval('2.5'))
150 end
151
152 sandbox call assert_equal(2, perleval('2'))
153
154 call assert_equal('abc', perleval('"abc"'))
155 call assert_equal("abc\ndef", perleval('"abc\0def"'))
156
157 " ref
158 call assert_equal([], perleval('[]'))
159 call assert_equal(['word', 42, [42],{}], perleval('["word", 42, [42], {}]'))
160
161 call assert_equal({}, perleval('{}'))
162 call assert_equal({'foo': 'bar'}, perleval('{foo => "bar"}'))
163
164 perl our %h; our @a;
165 let a = perleval('[\(%h, %h, @a, @a)]')
166 call assert_true((a[0] is a[1]))
167 call assert_true((a[2] is a[3]))
168 perl undef %h; undef @a;
169
170 call assert_true(<SID>catch_peval('{"" , 0}') =~ 'Malformed key Dictionary')
171 call assert_true(<SID>catch_peval('{"\0" , 0}') =~ 'Malformed key Dictionary')
172 call assert_true(<SID>catch_peval('{"foo\0bar" , 0}') =~ 'Malformed key Dictionary')
173
174 call assert_equal('*VIM', perleval('"*VIM"'))
175 call assert_true(perleval('\\0') =~ 'SCALAR(0x\x\+)')
Bram Moolenaar95509e12016-04-15 21:16:11 +0200176endfunc
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100177
Bram Moolenaarae177b72017-02-23 13:45:57 +0100178func Test_perldo()
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100179 sp __TEST__
180 exe 'read ' g:testname
181 perldo s/perl/vieux_chameau/g
182 1
183 call assert_false(search('\Cperl'))
184 bw!
Bram Moolenaar85b57432017-01-29 22:59:12 +0100185
186 " Check deleting lines does not trigger ml_get error.
187 new
188 call setline(1, ['one', 'two', 'three'])
189 perldo VIM::DoCommand("%d_")
190 bwipe!
191
192 " Check switching to another buffer does not trigger ml_get error.
193 new
194 let wincount = winnr('$')
195 call setline(1, ['one', 'two', 'three'])
196 perldo VIM::DoCommand("new")
197 call assert_equal(wincount + 1, winnr('$'))
198 bwipe!
199 bwipe!
Bram Moolenaar95509e12016-04-15 21:16:11 +0200200endfunc
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100201
Bram Moolenaarae177b72017-02-23 13:45:57 +0100202func Test_VIM_package()
Bram Moolenaare9b892e2016-01-17 21:15:58 +0100203 perl VIM::DoCommand('let l:var = "foo"')
204 call assert_equal(l:var, 'foo')
205
206 set noet
207 perl VIM::SetOption('et')
208 call assert_true(&et)
Bram Moolenaar95509e12016-04-15 21:16:11 +0200209endfunc
Bram Moolenaar6244a0f2016-04-14 14:09:25 +0200210
Bram Moolenaarae177b72017-02-23 13:45:57 +0100211func Test_stdio()
Bram Moolenaar6244a0f2016-04-14 14:09:25 +0200212 redir =>l:out
213 perl <<EOF
214 VIM::Msg("&VIM::Msg");
215 print "STDOUT";
216 print STDERR "STDERR";
217EOF
218 redir END
219 call assert_equal(['&VIM::Msg', 'STDOUT', 'STDERR'], split(l:out, "\n"))
Bram Moolenaar95509e12016-04-15 21:16:11 +0200220endfunc
221
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200222" Run first to get a clean namespace
223func Test_000_SvREFCNT()
224 for i in range(10)
225 exec 'new X'.i
226 endfor
Bram Moolenaar95509e12016-04-15 21:16:11 +0200227 new t
228 perl <<--perl
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200229#line 5 "Test_000_SvREFCNT()"
Bram Moolenaar95509e12016-04-15 21:16:11 +0200230 my ($b, $w);
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200231
232 $b = $curbuf for 0 .. 100;
233 $w = $curwin for 0 .. 100;
234 () = VIM::Buffers for 0 .. 100;
235 () = VIM::Windows for 0 .. 100;
236
Bram Moolenaar95509e12016-04-15 21:16:11 +0200237 VIM::DoCommand('bw! t');
238 if (exists &Internals::SvREFCNT) {
239 my $cb = Internals::SvREFCNT($$b);
240 my $cw = Internals::SvREFCNT($$w);
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200241 VIM::Eval("assert_equal(2, $cb, 'T1')");
242 VIM::Eval("assert_equal(2, $cw, 'T2')");
243 foreach ( VIM::Buffers, VIM::Windows ) {
244 my $c = Internals::SvREFCNT($_);
245 VIM::Eval("assert_equal(2, $c, 'T3')");
246 $c = Internals::SvREFCNT($$_);
247 # Why only one ref?
248 # Look wrong but work. Maybe not portable...
249 VIM::Eval("assert_equal(1, $c, 'T4')");
250 }
251 $cb = Internals::SvREFCNT($$curbuf);
252 $cw = Internals::SvREFCNT($$curwin);
253 VIM::Eval("assert_equal(3, $cb, 'T5')");
254 VIM::Eval("assert_equal(3, $cw, 'T6')");
Bram Moolenaar95509e12016-04-15 21:16:11 +0200255 }
256 VIM::Eval("assert_false($$b)");
257 VIM::Eval("assert_false($$w)");
258--perl
Bram Moolenaar18c4f1b2018-07-16 17:45:38 +0200259 %bw!
Bram Moolenaar95509e12016-04-15 21:16:11 +0200260endfunc