This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to Devel::PPPort 3.02.
[perl5.git] / ext / Devel / PPPort / t / call.t
1 ################################################################################
2 #
3 #            !!!!!   Do NOT edit this file directly!   !!!!!
4 #
5 #            Edit mktests.PL and/or parts/inc/call instead.
6 #
7 ################################################################################
8
9 BEGIN {
10   if ($ENV{'PERL_CORE'}) {
11     chdir 't' if -d 't';
12     @INC = ('../lib', '../ext/Devel/PPPort/t') if -d '../lib' && -d '../ext';
13     require Config; import Config;
14     use vars '%Config';
15     if (" $Config{'extensions'} " !~ m[ Devel/PPPort ]) {
16       print "1..0 # Skip -- Perl configured without Devel::PPPort module\n";
17       exit 0;
18     }
19   }
20   else {
21     unshift @INC, 't';
22   }
23
24   eval "use Test";
25   if ($@) {
26     require 'testutil.pl';
27     print "1..44\n";
28   }
29   else {
30     plan(tests => 44);
31   }
32 }
33
34 use Devel::PPPort;
35 use strict;
36 $^W = 1;
37
38 sub eq_array
39 {
40   my($a, $b) = @_;
41   join(':', @$a) eq join(':', @$b);
42 }
43
44 sub f
45 {
46   shift;
47   unshift @_, 'b';
48   pop @_;
49   @_, defined wantarray ? wantarray ? 'x' : 'y' : 'z';
50 }
51
52 my $obj = bless [], 'Foo';
53
54 sub Foo::meth
55 {
56   return 'bad_self' unless @_ && ref $_[0] && ref($_[0]) eq 'Foo';
57   shift;
58   shift;
59   unshift @_, 'b';
60   pop @_;
61   @_, defined wantarray ? wantarray ? 'x' : 'y' : 'z';
62 }
63
64 my $test;
65
66 for $test (
67     # flags                      args           expected         description
68     [ &Devel::PPPort::G_SCALAR,  [ ],           [ qw(y 1) ],     '0 args, G_SCALAR'  ],
69     [ &Devel::PPPort::G_SCALAR,  [ qw(a p q) ], [ qw(y 1) ],     '3 args, G_SCALAR'  ],
70     [ &Devel::PPPort::G_ARRAY,   [ ],           [ qw(x 1) ],     '0 args, G_ARRAY'   ],
71     [ &Devel::PPPort::G_ARRAY,   [ qw(a p q) ], [ qw(b p x 3) ], '3 args, G_ARRAY'   ],
72     [ &Devel::PPPort::G_DISCARD, [ ],           [ qw(0) ],       '0 args, G_DISCARD' ],
73     [ &Devel::PPPort::G_DISCARD, [ qw(a p q) ], [ qw(0) ],       '3 args, G_DISCARD' ],
74 )
75 {
76     my ($flags, $args, $expected, $description) = @$test;
77     print "# --- $description ---\n";
78     ok(eq_array( [ &Devel::PPPort::call_sv(\&f, $flags, @$args) ], $expected));
79     ok(eq_array( [ &Devel::PPPort::call_sv(*f,  $flags, @$args) ], $expected));
80     ok(eq_array( [ &Devel::PPPort::call_sv('f', $flags, @$args) ], $expected));
81     ok(eq_array( [ &Devel::PPPort::call_pv('f', $flags, @$args) ], $expected));
82     ok(eq_array( [ &Devel::PPPort::call_argv('f', $flags, @$args) ], $expected));
83     ok(eq_array( [ &Devel::PPPort::eval_sv("f(qw(@$args))", $flags) ], $expected));
84     ok(eq_array( [ &Devel::PPPort::call_method('meth', $flags, $obj, @$args) ], $expected));
85 };
86
87 ok(&Devel::PPPort::eval_pv('f()', 0), 'y');
88 ok(&Devel::PPPort::eval_pv('f(qw(a b c))', 0), 'y');
89