#!/usr/bin/perl use strict; use warnings; use Test::More; use lib qw(t/lib); use BitStreamTest; my @implementations = impl_list; plan tests => scalar @implementations; srand(8177); foreach my $type (@implementations) { my $stream = new_stream($type); my $maxbits = $stream->maxbits; # first make a big random string my $str = ''; my $nbits = 10000; for (1 .. $nbits) { $str .= (rand(1) < 0.5) ? '0' : '1'; } die unless $nbits == length($str); die if $str =~ /[^01]/; # cycle through offsets and sizes if (0) { foreach my $offset (0 .. 65) { foreach my $size (1 .. 65) { $stream->erase_for_write; $stream->put_string(substr($str, 0, $offset)); die unless $stream->len == $offset; $stream->put_string(substr($str, $offset, $size)); die unless $stream->len == $offset+$size; my $rstr = $stream->to_string; is($rstr, substr($str, 0, $offset+$size), "$type: offset $offset, size $size"); } } } # Insert the string in chunks $stream->erase_for_write; my $pos = 0; while ($pos < $nbits) { my $maxput = $nbits - $pos; my $putlen = 1 + int(rand($maxbits * 4)); # 1-4*$maxbits $putlen = $maxput if $putlen > $maxput; $stream->put_string( substr($str, $pos, $putlen) ); $pos += $putlen; } # Now read the resulting stream and see if it matches. ok( $str eq $stream->to_string, "$type streams match after put_string"); } done_testing();