xref: /vim-8.2.3635/src/testdir/test_perl.vim (revision 8ee2d36e)
1" Tests for Perl interface
2
3if !has('perl')
4  finish
5end
6
7func 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
28
29func 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)
130  try
131    call perleval(a:expr)
132  catch
133    return v:exception
134  endtry
135  call assert_report('no exception for `perleval("'.a:expr.'")`')
136  return ''
137endfunc
138
139func Test_perleval()
140  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\+)')
176endfunc
177
178func Test_perldo()
179  sp __TEST__
180  exe 'read ' g:testname
181  perldo s/perl/vieux_chameau/g
182  1
183  call assert_false(search('\Cperl'))
184  bw!
185
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!
200endfunc
201
202func Test_VIM_package()
203  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)
209endfunc
210
211func Test_stdio()
212  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"))
220endfunc
221
222func Test_SvREFCNT()
223  new t
224  perl <<--perl
225  my ($b, $w);
226  $b = $curbuf for 0 .. 10;
227  $w = $curwin for 0 .. 10;
228  VIM::DoCommand('bw! t');
229  if (exists &Internals::SvREFCNT) {
230      my $cb = Internals::SvREFCNT($$b);
231      my $cw = Internals::SvREFCNT($$w);
232      VIM::Eval("assert_equal(2, $cb)");
233      VIM::Eval("assert_equal(2, $cw)");
234  }
235  VIM::Eval("assert_false($$b)");
236  VIM::Eval("assert_false($$w)");
237--perl
238endfunc
239