#!/usr/bin/perl
use strict;
use warnings;

use Test::More;
use lib qw(t/lib);
use BitStreamTest;

my @implementations = impl_list;
my @encodings       = encoding_list;

plan tests => scalar @encodings;

foreach my $encoding (@encodings) {
  subtest "$encoding" => sub { test_encoding($encoding); };
}
done_testing();


sub test_encoding {
  my $tencoding = shift;

  plan tests => 2 * scalar @implementations;

  foreach my $type (@implementations) {
    my $encoding = $tencoding;
    my $maxbits = 16;
    my $maxpat  = 0xFFFF;
    if (is_universal($encoding)) {
      my $stream = new_stream($type);
      $maxbits = $stream->maxbits;
      $maxpat = ($maxbits == 32)  ?  0xFFFFFFFF  :  ~0;
    }

    # Just in case the stream maxbits is different
    $encoding =~ s/BinWord\(\d+\)/BinWord($maxbits)/i;

    my @data;
    # Note we're not encoding 2^max-1.  The range test does that.
    foreach my $bits (1 .. $maxbits-1) {
      my $maxval = $maxpat >> ($maxbits - $bits);
      # maxvals separated by binary '10001' and '0'
      push @data, $maxval, 17, $maxval, 0, $maxval;
    }

    my $stream = stream_encode_array($type, $encoding, @data);
    BAIL_OUT("No stream of type $type") unless defined $stream;
    my @v = stream_decode_array($encoding, $stream);
    is_deeply( \@v, \@data, "$encoding put/get bit patterns using $type");
    is($stream->pos, $stream->len);
  }
}