IPC-MMA
view release on metacpan or search on metacpan
t/04_fixedArray.t view on Meta::CPAN
#!/usr/local/bin/perl
# test fixed-length array features of IPC::MMA
use strict;
use warnings;
use Test::More tests => 4750;
use IPC::MMA qw(:basic :array);
our @typeNames = ("MM_ARRAY", "MM_UINT_ARRAY", "MM_INT_ARRAY", "MM_DOUBLE_ARRAY");
# removed $entries 11/5/09
our ($array, $type, $option, $var_size_bytes, $cVexp_got);
our @checkArray;
our ($ALLOC_SIZE, $ALLOCBASE, $PSIZE, $IVSIZE, $NVSIZE, $DEFENTS);
our $isrand = open (RAND, "</dev/urandom");
sub randStr {
my $len = shift;
my $ret = '';
my ($r, $le);
if ($len) {
if ($isrand) {sysread (RAND, $ret, $len)}
else {
while (($le = $len - length($ret)) > 0) {
$r = pack 'L', int(rand(0xFFFFFFFF));
$ret .= $le >= 4 ? $r : substr($r, 0, $le);
} } }
return $ret;
}
sub randVar {
my ($x, $len);
if ($type == MM_INT_ARRAY) {
return unpack('i', randStr($IVSIZE));
} elsif ($type == MM_UINT_ARRAY) {
return unpack('I', randStr($IVSIZE));
} elsif ($type == MM_DOUBLE_ARRAY) {
# eliminate NaN's that random number generation will yield
do {$x = unpack('d', randStr($NVSIZE))} until ($x == $x);
return $x;
} elsif ($option==MM_CSTRING) {
# C string mode
$len = int(rand $var_size_bytes+1);
$x = '';
while ($len--) {$x .= chr(int(rand 255)+1)} # no NULs
return $x;
} else {
return randStr($var_size_bytes);
} }
sub typeName {
return ($type > 0) ? (($option==MM_CSTRING) ? "C string <= $type" : "fixed len $type")
: $typeNames[-$type];
}
sub makeZero {
if ($type < MM_ARRAY) {return 0}
if ($option == MM_CSTRING) {return ''}
return (chr(0))x$var_size_bytes;
}
# check a returned value
# this needs to use the right kind of equality operator
# (numeric == or string eq) because perl 5.6 has problems
# with converting large UVs to strings
sub checkVal {
my ($val, $ckval) = @_;
my $ret = $type < 0 ? $val == $ckval
: $val eq $ckval;
my $form = ($type == MM_DOUBLE_ARRAY) ? 'g'
: ($type < 0) ? 'd'
: 's';
$cVexp_got = $ret ? "" : sprintf(": expected %$form (len %d), got %$form (len %d)",
$ckval, length($ckval), $val, length($val));
return $ret;
}
# check the whole array
sub checkArray {
my $testName = shift;
my $size = mm_array_fetchsize($array);
my $size2 = scalar @checkArray;
is ($size, $size2,
"$testName: size of test array and check array should match");
if ($size2 < $size) {$size = $size2}
for (my $i=0; $i < $size; $i++) {
ok (checkVal(mm_array_fetch ($array, $i), $checkArray[$i]),
"$testName: element $i$cVexp_got (type=" . typeName . ")");
} }
# compare 2 arrays
sub compArray {
my ($array1ref, $array2ref, $testName) = @_;
my $size1 = scalar @$array1ref;
my $size2 = scalar @$array2ref;
is ($size1, $size2, "$testName: arrays should be same size");
if ($size2 < $size1) {$size1 = $size2}
for (my $i=0; $i <$size1; $i++) {
( run in 1.263 second using v1.01-cache-2.11-cpan-39bf76dae61 )