1use warnings; 2use strict; 3use Test::More tests => 64; 4 5use XS::APItest; 6 7XS::APItest::test_cv_getset_call_checker(); 8ok 1; 9 10my @z = (); 11my @a = qw(a); 12my @b = qw(a b); 13my @c = qw(a b c); 14 15my($foo_got, $foo_ret); 16sub foo($@) { $foo_got = [ @_ ]; return "z"; } 17 18sub bar (\@$) { } 19sub baz { } 20 21$foo_got = undef; 22eval q{$foo_ret = foo(@b, @c);}; 23is $@, ""; 24is_deeply $foo_got, [ 2, qw(a b c) ]; 25is $foo_ret, "z"; 26 27$foo_got = undef; 28eval q{$foo_ret = &foo(@b, @c);}; 29is $@, ""; 30is_deeply $foo_got, [ qw(a b), qw(a b c) ]; 31is $foo_ret, "z"; 32 33cv_set_call_checker_lists(\&foo); 34 35$foo_got = undef; 36eval q{$foo_ret = foo(@b, @c);}; 37is $@, ""; 38is_deeply $foo_got, [ qw(a b), qw(a b c) ]; 39is $foo_ret, "z"; 40 41$foo_got = undef; 42eval q{$foo_ret = &foo(@b, @c);}; 43is $@, ""; 44is_deeply $foo_got, [ qw(a b), qw(a b c) ]; 45is $foo_ret, "z"; 46 47cv_set_call_checker_scalars(\&foo); 48 49$foo_got = undef; 50eval q{$foo_ret = foo(@b, @c);}; 51is $@, ""; 52is_deeply $foo_got, [ 2, 3 ]; 53is $foo_ret, "z"; 54 55$foo_got = undef; 56eval q{$foo_ret = foo(@b, @c, @a, @c);}; 57is $@, ""; 58is_deeply $foo_got, [ 2, 3, 1, 3 ]; 59is $foo_ret, "z"; 60 61$foo_got = undef; 62eval q{$foo_ret = foo(@b);}; 63is $@, ""; 64is_deeply $foo_got, [ 2 ]; 65is $foo_ret, "z"; 66 67$foo_got = undef; 68eval q{$foo_ret = foo();}; 69is $@, ""; 70is_deeply $foo_got, []; 71is $foo_ret, "z"; 72 73$foo_got = undef; 74eval q{$foo_ret = &foo(@b, @c);}; 75is $@, ""; 76is_deeply $foo_got, [ qw(a b), qw(a b c) ]; 77is $foo_ret, "z"; 78 79cv_set_call_checker_proto(\&foo, "\\\@\$"); 80$foo_got = undef; 81eval q{$foo_ret = foo(@b, @c);}; 82is $@, ""; 83is_deeply $foo_got, [ \@b, 3 ]; 84is $foo_ret, "z"; 85 86cv_set_call_checker_proto(\&foo, undef); 87$foo_got = undef; 88eval q{$foo_ret = foo(@b, @c);}; 89isnt $@, ""; 90is_deeply $foo_got, undef; 91is $foo_ret, "z"; 92 93cv_set_call_checker_proto(\&foo, \&bar); 94$foo_got = undef; 95eval q{$foo_ret = foo(@b, @c);}; 96is $@, ""; 97is_deeply $foo_got, [ \@b, 3 ]; 98is $foo_ret, "z"; 99 100cv_set_call_checker_proto(\&foo, \&baz); 101$foo_got = undef; 102eval q{$foo_ret = foo(@b, @c);}; 103isnt $@, ""; 104is_deeply $foo_got, undef; 105is $foo_ret, "z"; 106 107cv_set_call_checker_proto_or_list(\&foo, "\\\@\$"); 108$foo_got = undef; 109eval q{$foo_ret = foo(@b, @c);}; 110is $@, ""; 111is_deeply $foo_got, [ \@b, 3 ]; 112is $foo_ret, "z"; 113 114cv_set_call_checker_proto_or_list(\&foo, undef); 115$foo_got = undef; 116eval q{$foo_ret = foo(@b, @c);}; 117is $@, ""; 118is_deeply $foo_got, [ qw(a b), qw(a b c) ]; 119is $foo_ret, "z"; 120 121cv_set_call_checker_proto_or_list(\&foo, \&bar); 122$foo_got = undef; 123eval q{$foo_ret = foo(@b, @c);}; 124is $@, ""; 125is_deeply $foo_got, [ \@b, 3 ]; 126is $foo_ret, "z"; 127 128cv_set_call_checker_proto_or_list(\&foo, \&baz); 129$foo_got = undef; 130eval q{$foo_ret = foo(@b, @c);}; 131is $@, ""; 132is_deeply $foo_got, [ qw(a b), qw(a b c) ]; 133is $foo_ret, "z"; 134 135cv_set_call_checker_multi_sum(\&foo); 136 137$foo_got = undef; 138eval q{$foo_ret = foo(@b, @c);}; 139is $@, ""; 140is_deeply $foo_got, undef; 141is $foo_ret, 5; 142 143$foo_got = undef; 144eval q{$foo_ret = foo(@b);}; 145is $@, ""; 146is_deeply $foo_got, undef; 147is $foo_ret, 2; 148 149$foo_got = undef; 150eval q{$foo_ret = foo();}; 151is $@, ""; 152is_deeply $foo_got, undef; 153is $foo_ret, 0; 154 155$foo_got = undef; 156eval q{$foo_ret = foo(@b, @c, @a, @c);}; 157is $@, ""; 158is_deeply $foo_got, undef; 159is $foo_ret, 9; 160 1611; 162