blob: 2755862a25649d01b193939df5402c34adf65a9f [file] [log] [blame]
#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 416;
BEGIN { use_ok('li_typemaps') }
require_ok('li_typemaps');
sub batch { my($type, @values) = @_;
# this is a little ugly because I'm trying to be clever and save my
# wrists from hammering out all these tests.
for my $val (@values) {
for my $tst (qw(
in inr
out outr
inout inoutr
)) {
my $func = $tst . '_' . $type;
is(eval { li_typemaps->can($func)->($val) }, $val, "$func $val");
if($@) {
my $err = $@;
$err =~ s/^/#\$\@# /mg;
print $err;
}
}
}
}
batch('bool', '', 1);
# let's assume we're at least on a 32 bit machine
batch('int', -0x80000000, -1, 0, 1, 12, 0x7fffffff);
# long could be bigger, but it's at least this big
batch('long', -0x80000000, -1, 0, 1, 12, 0x7fffffff);
batch('short', -0x8000, -1, 0, 1, 12, 0x7fff);
batch('uint', 0, 1, 12, 0xffffffff);
batch('ushort', 0, 1, 12, 0xffff);
batch('ulong', 0, 1, 12, 0xffffffff);
batch('uchar', 0, 1, 12, 0xff);
batch('schar', -0x80, 0, 1, 12, 0x7f);
{
use Math::BigInt qw();
# the pack dance is to get plain old NVs out of the
# Math::BigInt objects.
my $inf = unpack 'd', pack 'd', Math::BigInt->new('Inf');
my $nan = unpack 'd', pack 'd', Math::BigInt->new('NaN');
batch('float',
-(2 - 2 ** -23) * 2 ** 127,
-1, -2 ** -149, 0, 2 ** -149, 1,
(2 - 2 ** -23) * 2 ** 127,
$nan);
{ local $TODO = "float typemaps don't pass infinity";
# it seems as though SWIG is unwilling to pass infinity around
# because that value always fails bounds checking. I think that
# is a bug.
batch('float', $inf);
}
batch('double',
-(2 - 2 ** -53) ** 1023,
-1, -2 ** -1074, 0, 2 ** 1074,
(2 - 2 ** -53) ** 1023,
$nan, $inf);
}
batch('longlong', -1, 0, 1, 12);
batch('ulonglong', 0, 1, 12);
SKIP: {
use Math::BigInt qw();
skip "not a 64bit Perl", 18 unless eval { pack 'q', 1 };
my $a = unpack 'q', pack 'q',
Math::BigInt->new('-9223372036854775808');
my $b = unpack 'q', pack 'q',
Math::BigInt->new('9223372036854775807');
my $c = unpack 'Q', pack 'Q',
Math::BigInt->new('18446744073709551615');
batch('longlong', $a, $b);
batch('ulonglong', $c);
}
my($foo, $int, $int2) = li_typemaps::out_foo(10);
isa_ok($foo, 'li_typemaps::Foo');
is($foo->{a}, 10);
is($int, 20);
is($int2, 30);
my($a, $b) = li_typemaps::inoutr_int2(13, 31);
is($a, 13);
is($b, 31);