my
@types
= (
SignedInt[4], SignedInt[8], SignedInt[16], SignedInt[32], SignedInt[64], SignedInt[128],
UnsignedInt[4], UnsignedInt[8], UnsignedInt[16], UnsignedInt[32], UnsignedInt[64], UnsignedInt[128],
BlessedInt[2], BlessedInt[3], BlessedInt[ 5], BlessedInt[10], BlessedInt[20], BlessedInt[ 39],
);
plan
tests
=>
scalar
@types
;
foreach
my
$type
(
@types
) {
my
$name
=
$type
->display_name;
$name
=~ /^(\w+)\[(\d+)\]/;
my
(
$base
,
$bits
) = ($1, $2);
$bits
= ceil(
$bits
/ _BASE2_LOG)
if
(
$base
eq
'BlessedInt'
);
subtest
$name
=>
sub
{
note explain {
name
=>
$name
,
inline
=>
$type
->inline_check(
'$num'
),
};
numbers_test(
undef
,
$type
, 0);
numbers_test(
'ABC'
,
$type
, 0);
numbers_test( 4.5,
$type
, 0);
numbers_test(
$nan
,
$type
, 0);
numbers_test(
$pinf
,
$type
, 0);
numbers_test(
$ninf
,
$type
, 0);
numbers_test(
$Inan
,
$type
, 0);
numbers_test(
$Ipinf
,
$type
, 0);
numbers_test(
$Ininf
,
$type
, 0);
numbers_test( 0,
$type
,
$base
ne
'BlessedInt'
);
numbers_test( 1,
$type
,
$base
ne
'BlessedInt'
);
numbers_test( -1,
$type
,
$base
eq
'SignedInt'
);
numbers_test(
$I0
,
$type
, 1);
numbers_test(
$I1
,
$type
, 1);
numbers_test(
$I_1
,
$type
,
$base
ne
'UnsignedInt'
);
return
if
(
$base
eq
'BlessedInt'
);
foreach
my
$test_bits
(4,8,16,24,32,48,64,128) {
my
$spos
= 2 ** (
$test_bits
-1) - 1;
my
$sneg
= -1 -
$spos
;
my
$upos
= 2 **
$test_bits
- 1;
note
"Bits = $test_bits"
;
my
$pass
=
$bits
<=>
$test_bits
;
unless
(
$test_bits
>=
int
(
log
(_SAFE_NUM_MAX) /
log
(2) ) ) {
if
(
$base
eq
'UnsignedInt'
) {
numbers_test(
$spos
+0,
$type
,
$pass
|| 1);
numbers_test(
$sneg
-0,
$type
, 0);
numbers_test(
$upos
+0,
$type
,
$pass
|| 1);
numbers_test(
$spos
+1,
$type
,
$pass
|| 1);
numbers_test(
$sneg
-1,
$type
, 0);
numbers_test(
$upos
+1,
$type
,
$pass
|| 0);
}
if
(
$base
eq
'SignedInt'
) {
numbers_test(
$spos
+0,
$type
,
$pass
|| 1);
numbers_test(
$sneg
-0,
$type
,
$pass
|| 1);
numbers_test(
$upos
+0,
$type
,
$pass
|| 0);
numbers_test(
$spos
+1,
$type
,
$pass
|| 0);
numbers_test(
$sneg
-1,
$type
,
$pass
|| 0);
numbers_test(
$upos
+1,
$type
,
$pass
|| 0);
}
}
$pass
=
$bits
<=>
$test_bits
;
$spos
=
$bigtwo
->copy ** (
$test_bits
-1) - 1;
$sneg
= -1 -
$spos
;
$upos
=
$bigtwo
->copy **
$test_bits
- 1;
if
(
$base
eq
'UnsignedInt'
) {
numbers_test(
$spos
+0,
$type
,
$pass
|| 1);
numbers_test(
$sneg
-0,
$type
, 0);
numbers_test(
$upos
+0,
$type
,
$pass
|| 1);
numbers_test(
$spos
+1,
$type
,
$pass
|| 1);
numbers_test(
$sneg
-1,
$type
, 0);
numbers_test(
$upos
+1,
$type
,
$pass
|| 0);
}
if
(
$base
eq
'SignedInt'
) {
numbers_test(
$spos
+0,
$type
,
$pass
|| 1);
numbers_test(
$sneg
-0,
$type
,
$pass
|| 1);
numbers_test(
$upos
+0,
$type
,
$pass
|| 0);
numbers_test(
$spos
+1,
$type
,
$pass
|| 0);
numbers_test(
$sneg
-1,
$type
,
$pass
|| 0);
numbers_test(
$upos
+1,
$type
,
$pass
|| 0);
}
}
} or diag explain {
name
=>
$name
,
inline
=>
$type
->inline_check(
'$num'
),
};
}
done_testing;