#!/usr/bin/perl
use strict;
use warnings;
$| = 1; # fast pipes
# Load up the integercoding.pl routines directly from that file
require 'integercoding.pl';
IntegerCoding->import;
use FindBin; use lib "$FindBin::Bin/../lib";
use Data::BitStream;
my $stream = Data::BitStream->new();
my $ntest = 4095;
my $nrand = 16_000;
if (1) {
print "Unary...";
foreach my $n (0 .. $ntest) { test_unary($n); }
print "...SUCCESS\n";
print "Gamma...";
foreach my $n (1 .. $ntest) { test_gamma($n); }
print "...SUCCESS\n";
print "Delta...";
foreach my $n (1 .. $ntest) { test_delta($n); }
print "...SUCCESS\n";
print "Omega...";
foreach my $n (1 .. $ntest) { test_omega($n); }
print "...SUCCESS\n";
print "Fib.....";
foreach my $n (1 .. $ntest) { test_fib($n); }
print "...SUCCESS\n";
}
srand(101);
print "Random gamma/delta/omega/fib..";
foreach my $i (1 .. $nrand) {
print "." if $i % int($nrand/30) == 0;
my $n = int(rand( (~0 > 0xFFFFFFFF) ? 10_000_000_000 : 1_000_000_000 ));
test_gamma($n);
test_delta($n);
test_omega($n);
test_fib($n);
}
print "SUCCESS\n";
sub test_unary {
my $n = shift;
my $s1 = encode_unary($n);
my $v1 = decode_unary($s1);
$stream->erase_for_write();
$stream->put_unary($n);
my $s2 = $stream->to_string();
$stream->from_string($s2);
my $v2 = $stream->get_unary();
die "encode mismatch for $n" unless $s1 eq $s2;
die "decode mismatch for $n" unless $v1 == $v2 && $v1 == $n;
1;
}
sub test_gamma {
my $n = shift;
my $s1 = encode_gamma($n);
my $v1 = decode_gamma($s1);
$stream->erase_for_write();
$stream->put_gamma($n-1);
my $s2 = $stream->to_string();
$stream->from_string($s2);
my $v2 = $stream->get_gamma() + 1;
die "encode mismatch for $n" unless $s1 eq $s2;
die "decode mismatch for $n" unless $v1 == $v2 && $v1 == $n;
1;
}
sub test_delta {
my $n = shift;
my $s1 = encode_delta($n);
my $v1 = decode_delta($s1);
$stream->erase_for_write();
$stream->put_delta($n-1);
my $s2 = $stream->to_string();
$stream->from_string($s2);
my $v2 = $stream->get_delta() + 1;
die "encode mismatch for $n" unless $s1 eq $s2;
die "decode mismatch for $n" unless $v1 == $v2 && $v1 == $n;
1;
}
sub test_omega {
my $n = shift;
my $s1 = encode_omega($n);
my $v1 = decode_omega($s1);
$stream->erase_for_write();
$stream->put_omega($n-1);
my $s2 = $stream->to_string();
$stream->from_string($s2);
my $v2 = $stream->get_omega() + 1;
die "encode mismatch for $n" unless $s1 eq $s2;
die "decode mismatch for $n" unless $v1 == $v2 && $v1 == $n;
1;
}
sub test_fib {
my $n = shift;
my $s1 = encode_fib($n);
my $v1 = decode_fib($s1);
$stream->erase_for_write();
$stream->put_fib($n-1);
my $s2 = $stream->to_string();
$stream->from_string($s2);
my $v2 = $stream->get_fib() + 1;
die "encode mismatch for $n" unless $s1 eq $s2;
die "decode mismatch for $n" unless $v1 == $v2 && $v1 == $n;
1;
}