#!/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);