|
Packit |
3f72c8 |
#!/usr/bin/perl
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
use strict;
|
|
Packit |
3f72c8 |
use warnings;
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
use Test::More 0.88;
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
use Math::Int64 qw(uint64 uint64_to_number
|
|
Packit |
3f72c8 |
net_to_uint64 uint64_to_net
|
|
Packit |
3f72c8 |
native_to_uint64 uint64_to_native
|
|
Packit |
3f72c8 |
uint64_to_hex hex_to_uint64
|
|
Packit |
3f72c8 |
uint64_to_string string_to_uint64
|
|
Packit |
3f72c8 |
uint64_to_BER BER_to_uint64
|
|
Packit |
3f72c8 |
uint64_rand );
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
my $i = uint64('1234567890123456789');
|
|
Packit |
3f72c8 |
my $j = $i + 1;
|
|
Packit |
3f72c8 |
my $k = (uint64(1) << 60) + 255;
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
# 1
|
|
Packit |
3f72c8 |
ok($i == '1234567890123456789');
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok($j - 1 == '1234567890123456789');
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (($k & 127) == 127);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (($k & 256) == 0);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
# 5
|
|
Packit |
3f72c8 |
ok ($i * 2 == $j + $j - 2);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok ($i * $i * $i * $i == ($j * $j - 2 * $j + 1) * ($j * $j - 2 * $j + 1));
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (($i / $j) == 0);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok ($j / $i == 1);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok ($i % $j == $i);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
# 10
|
|
Packit |
3f72c8 |
ok ($j % $i == 1);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (($j += 1) == $i + 2);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok ($j == $i + 2);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (($j -= 3) == $i - 1);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok ($j == $i - 1);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
$j = $i;
|
|
Packit |
3f72c8 |
# 15
|
|
Packit |
3f72c8 |
ok (($j *= 2) == $i << 1);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (($j >> 1) == $i);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (($j / 2) == $i);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
$j = $i + 2;
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (($j %= $i) == 2);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok ($j == 2);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
# 20
|
|
Packit |
3f72c8 |
ok (($j <=> $i) < 0);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (($i <=> $j) > 0);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (($i <=> $i) == 0);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (($j <=> 2) == 0);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok ($j < $i);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
# 25
|
|
Packit |
3f72c8 |
ok ($j <= $i);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (!($i < $j));
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (!($i <= $j));
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok ($i <= $i);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok ($j >= $j);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
# 30
|
|
Packit |
3f72c8 |
ok ($i > $j);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok ($i >= $j);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (!($j > $i));
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (!($j >= $i));
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (int(log(uint64(1)<<50)/log(2)+0.001) == 50);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
# 35
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
my $l = uint64("1271310319617");
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
is ("$l", "1271310319617", "string to/from int64 conversion");
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (native_to_uint64(uint64_to_native(1)) == 1);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (native_to_uint64(uint64_to_native(0)) == 0);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (native_to_uint64(uint64_to_native(12343)) == 12343);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (native_to_uint64(uint64_to_native($l)) == $l);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
# 40
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (native_to_uint64(uint64_to_native($j)) == $j);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (native_to_uint64(uint64_to_native($i)) == $i);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (net_to_uint64(uint64_to_net(1)) == 1);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (net_to_uint64(uint64_to_net(0)) == 0);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (net_to_uint64(uint64_to_net(12343)) == 12343);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
# 45
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (net_to_uint64(uint64_to_net($l)) == $l);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (net_to_uint64(uint64_to_net($j)) == $j);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
ok (net_to_uint64(uint64_to_net($i)) == $i);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
for (1..50) {
|
|
Packit |
3f72c8 |
my $n = uint64_rand;
|
|
Packit |
3f72c8 |
# $n = uint64("8420970171052099265");
|
|
Packit |
3f72c8 |
my $hex = uint64_to_hex($n);
|
|
Packit |
3f72c8 |
ok($n == uint64("$n"));
|
|
Packit |
3f72c8 |
ok($n == string_to_uint64(uint64_to_string($n)), "uint64->string->uint64 n: $n hex: $hex");
|
|
Packit |
3f72c8 |
ok(uint64_to_hex($n) eq uint64_to_hex(string_to_uint64(uint64_to_string($n))));
|
|
Packit |
3f72c8 |
ok($n == hex_to_uint64(uint64_to_hex($n)));
|
|
Packit |
3f72c8 |
is("$n", string_to_uint64(uint64_to_string($n)));
|
|
Packit |
3f72c8 |
is("$n", string_to_uint64(uint64_to_string($n, 25), 25));
|
|
Packit |
3f72c8 |
is("$n", string_to_uint64(uint64_to_string($n, 36), 36));
|
|
Packit |
3f72c8 |
is("$n", string_to_uint64(uint64_to_string($n, 2), 2));
|
|
Packit |
3f72c8 |
is("$n", native_to_uint64(uint64_to_native($n)));
|
|
Packit |
3f72c8 |
is("$n", net_to_uint64(uint64_to_net($n)));
|
|
Packit |
3f72c8 |
is("$n", BER_to_uint64(uint64_to_BER($n)));
|
|
Packit |
3f72c8 |
}
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
# pow (**) precision sometimes is not good enough!
|
|
Packit |
3f72c8 |
sub ipow {
|
|
Packit |
3f72c8 |
my ($base, $exp) = @_;
|
|
Packit |
3f72c8 |
my $r = 1;
|
|
Packit |
3f72c8 |
$r *= $base for (1..$exp);
|
|
Packit |
3f72c8 |
$r;
|
|
Packit |
3f72c8 |
}
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
my $two = uint64(2);
|
|
Packit |
3f72c8 |
my $four = uint64(4);
|
|
Packit |
3f72c8 |
is ($two ** -1, 0, "signed pow 2**-1");
|
|
Packit |
3f72c8 |
is ($four ** -1, 0, "signed pow 4**-1");
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
for my $j (0..63) {
|
|
Packit |
3f72c8 |
my $one = uint64(1);
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
is($two ** $j, $one << $j, "signed pow 2**$j");
|
|
Packit |
3f72c8 |
is($four ** $j, $one << 2 * $j, "signed pow 4**$j") if $j < 32;
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
is($one << $j, $two ** $j, "$one << $j");
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
$one <<= $j;
|
|
Packit |
3f72c8 |
is($one, $two ** $j, "$one <<= $j");
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
next unless $j;
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
my $max = (((uint64(2)**63)-1)*2)+1;
|
|
Packit |
3f72c8 |
is($max >> $j, $max / ipow(2, $j), "max uint64 >> $j");
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
my $copy = uint64($max);
|
|
Packit |
3f72c8 |
$copy >>= $j;
|
|
Packit |
3f72c8 |
is($copy, $max / ipow(2, $j), "max uint64 >>= $j");
|
|
Packit |
3f72c8 |
}
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
|
|
Packit |
3f72c8 |
done_testing();
|