Skip to content

Commit

Permalink
add tests for XSRETURN* macros
Browse files Browse the repository at this point in the history
  • Loading branch information
preaction authored and iabyn committed Sep 24, 2015
1 parent e436582 commit 7a36e61
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 0 deletions.
55 changes: 55 additions & 0 deletions ext/XS-APItest/APItest.xs
Expand Up @@ -1388,6 +1388,61 @@ XS_APIVERSION_valid(...)
XS_APIVERSION_BOOTCHECK;
XSRETURN_EMPTY;

void
xsreturn( int len )
PPCODE:
int i = 0;
EXTEND( SP, len );
for ( ; i < len; i++ ) {
ST(i) = sv_2mortal( newSViv(i) );
}
XSRETURN( len );

void
xsreturn_iv()
PPCODE:
XSRETURN_IV( (1<<31) + 1 );

void
xsreturn_uv()
PPCODE:
XSRETURN_UV( (U32)((1<<31) + 1) );

void
xsreturn_nv()
PPCODE:
XSRETURN_NV(0.1);

void
xsreturn_pv()
PPCODE:
XSRETURN_PV("returned");

void
xsreturn_pvn()
PPCODE:
XSRETURN_PVN("returned too much",8);

void
xsreturn_no()
PPCODE:
XSRETURN_NO;

void
xsreturn_yes()
PPCODE:
XSRETURN_YES;

void
xsreturn_undef()
PPCODE:
XSRETURN_UNDEF;

void
xsreturn_empty()
PPCODE:
XSRETURN_EMPTY;

MODULE = XS::APItest:Hash PACKAGE = XS::APItest::Hash

void
Expand Down
31 changes: 31 additions & 0 deletions ext/XS-APItest/t/xsub_h.t
Expand Up @@ -120,4 +120,35 @@ is(eval {XS_APIVERSION_invalid("Pie"); 1}, undef,
like($@, qr/Perl API version v1.0.16 of Pie does not match v5\.\d+\.\d+/,
"expected error");

my @xsreturn;
@xsreturn = XS::APItest::XSUB::xsreturn(2);
is scalar @xsreturn, 2, 'returns a list of 2 elements';
is $xsreturn[0], 0;
is $xsreturn[1], 1;

my $xsreturn = XS::APItest::XSUB::xsreturn(3);
is $xsreturn, 2, 'returns the last item on the stack';

( $xsreturn ) = XS::APItest::XSUB::xsreturn(3);
is $xsreturn, 0, 'gets the first item on the stack';

is XS::APItest::XSUB::xsreturn_iv(), -2**31+1, 'XSRETURN_IV returns signed int';
is XS::APItest::XSUB::xsreturn_uv(), 2**31+1, 'XSRETURN_UV returns unsigned int';
is XS::APItest::XSUB::xsreturn_nv(), 0.1, 'XSRETURN_NV returns double';
is XS::APItest::XSUB::xsreturn_pv(), "returned", 'XSRETURN_PV returns string';
is XS::APItest::XSUB::xsreturn_pvn(), "returned", 'XSRETURN_PVN returns string with length';
ok !XS::APItest::XSUB::xsreturn_no(), 'XSRETURN_NO returns falsey';
ok XS::APItest::XSUB::xsreturn_yes(), 'XSRETURN_YES returns truthy';

is XS::APItest::XSUB::xsreturn_undef(), undef, 'XSRETURN_UNDEF returns undef in scalar context';
my @xs_undef = XS::APItest::XSUB::xsreturn_undef();
is scalar @xs_undef, 1, 'XSRETURN_UNDEF returns a single-element list';
is $xs_undef[0], undef, 'XSRETURN_UNDEF returns undef in list context';

my @xs_empty = XS::APItest::XSUB::xsreturn_empty();
is scalar @xs_empty, 0, 'XSRETURN_EMPTY returns empty list in array context';
my $xs_empty = XS::APItest::XSUB::xsreturn_empty();
is $xs_empty, undef, 'XSRETURN_EMPTY returns undef in scalar context';


done_testing();

0 comments on commit 7a36e61

Please sign in to comment.