#!/usr/bin/perl
use strict;
use warnings;
#use FindBin;  use lib "$FindBin::Bin/../lib";
use Data::BitStream qw(code_is_supported code_is_universal);
use Test::More;

my @codes = qw|
  Gamma
  Delta
  Omega
  EvenRodeh
  Levenstein
  Fibonacci
  Unary
  Unary1
  Baer(0)
  Baer(-1)
  Baer(-2)
  Baer(-8)
  Baer(1)
  Baer(2)
  Baer(8)
  Golomb(1)
  Golomb(2)
  Golomb(3)
  Golomb(177)
  Rice(0)
  Rice(1)
  Rice(2)
  Rice(7)
  Golomb(177)
  GammaGolomb(1)
  GammaGolomb(2)
  GammaGolomb(3)
  GammaGolomb(16)
  ExpGolomb(1)
  ExpGolomb(2)
  ExpGolomb(3)
  ExpGolomb(16)
  StartStop(0-0-2-3-9)
  StartStop(3-2-9)
  StartStepStop(3-2-13)
  Comma(2)
  Comma(5)
  BlockTaboo(00)
  BlockTaboo(1001)
  BinWord(15)
|;

plan tests => 3 * scalar @codes;

foreach my $code (@codes) {
  my $issupported = code_is_supported($code);
  my $isuniversal = code_is_universal($code);
  ok($issupported, "$code is supported");
  ok($isuniversal || !$isuniversal, "$code is or is not universal");
}

my $stream = Data::BitStream->new;
my $mod = 8000;

foreach my $code (@codes) {
  my $v = unpack("%32C*", $code) % $mod;
  #print "putting $v with $code\n";
  $stream->code_put($code, $v);
}
$stream->rewind_for_read;
foreach my $code (@codes) {
  my $expect = unpack("%32C*", $code) % $mod;
  my $v = $stream->code_get($code);
  is($v,$expect, "get with $code");
}