#!perl -w

use strict;

open (VALUES, shift) || die "Couldn't open values : $!\n";

my $test;
my $current_tests = {};
my $num = 1;

while (<VALUES>) {
	next if /^\s*$/;

	if (/^Series: (.+)$/) {
		dump_tests(\$num,$test, $current_tests);
		$current_tests = {};
		$test = $1;
		
		next;
	} 

	my ($val, $tests) = split /:/, $_;
	($val) = split /\s/, $val;
	my @tests = split /\s/, $tests;
	foreach my $test (@tests) {
		push @{$current_tests->{$test}}, $val;
	}

}


sub dump_tests {
	my ($numr, $test, $current_tests) = @_;


	foreach my $key (keys %{$current_tests}) {

		my $filename = "$test.$key.ints";	
		my @tests = @{$current_tests->{$key}};
		


		my $read  = "";
		my $write = "";
		my $modifier = 1;
		my $func = '$bin->';
		my $efunc;
		if ($key =~ s/^u//) {
			$efunc .= "ui$key";
		} elsif ($key =~ s/^p//) {
			$efunc .= "si$key";

		} elsif ($key =~ s/^n//) {
			$efunc .= "si$key";
			$modifier = -1;
		} else {
			next;
			#die "Invalid key : '$key'\n";
		}

		
		foreach my $test (@tests) {
			my $val = $test*$modifier;
		
			$read  .=  "is(${func}get_${efunc}(),$val);\n";
			$write .=  "ok(${func}put_${efunc}($val));\n";
		}
		
		my $tfile = sprintf "%.2d%s", $$numr++, $filename;


		foreach my $what (qw(be le)) {
			my $const = ($what eq 'be')? "BIG" : "LITTLE";
		    open TEST, ">$tfile.$what.t" || die "Couldn't open $tfile.$what.t : $!\n";
		    print TEST <<"EOF";
#!perl -w

use strict;
use Test::More qw(no_plan);
use File::Binary;
use IO::Scalar;

my \$bin = File::Binary->new('t/$what.$filename');
\$bin->set_endian(\$File::Binary::${const}_ENDIAN);

$read

\$bin->close();



\$bin = File::Binary->new('>t/temp');
\$bin->set_endian(\$File::Binary::${const}_ENDIAN);

$write

\$bin->close();


\$bin = File::Binary->new('t/temp');
\$bin->set_endian(\$File::Binary::${const}_ENDIAN);

$read

\$bin->close();

open(BINDATA, 't/$what.$filename');
my \$data = do { local \$/ = undef; <BINDATA> };
\$bin = File::Binary->new(IO::Scalar->new(\\\$data));
\$bin->set_endian(\$File::Binary::${const}_ENDIAN);

$read

\$bin->close;


EOF
		    close TEST;
	    }
    }
}
