The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Data::Float 0.008 qw(have_nan have_infinite significand_bits);
use Data::Integer 0.001 qw(natint_bits);
use Test::More;

do "t/num_forms.pl" or die $@ || $!;
my @zeroes = ( natint_forms("0"), float_forms("+0"), float_forms("-0") );
my @values = ( have_nan ? [ float_forms("nan") ] : [] );
open(TEST_VALS, "<", "t/values.data") or die "t/values.data: $!";
while(1) {
	$_ = <TEST_VALS>;
	die "t/values.data: $!" unless defined $_;
	chomp;
	last if $_ eq "_";
	next if $_ eq "";
	if($_ eq "z") {
		push @values, \@zeroes;
		next;
	}
	/\A(?:I+|i([0-9]+)"([^"]+)")=f(\*|[0-9]+)"([^"]+)"\z/
		or die "t/values.data: malformed line [$_]";
	my($isz, $ihex, $fsz, $fhex) = ($1, $2, $3, $4);
	my $igood = defined($isz) && natint_bits >= $isz;
	my $fgood = $fsz eq "*" ? have_infinite : significand_bits >= $fsz;
	my @forms;
	push @forms, natint_forms($ihex) if $igood;
	push @forms, float_forms($fhex) if $fgood;
	push @values, \@forms if @forms;
}

my $nforms = 0;
$nforms += @$_ foreach @values;
plan tests => 1 + 2*@zeroes*$nforms + $nforms*$nforms;

use_ok "Scalar::Number", qw(sclnum_val_cmp);

foreach my $vz (@zeroes) {
	my $pz = zpat($vz);
	for(my $ib = @values; $ib--; ) { foreach my $vb (@{$values[$ib]}) {
		my($tz, $tb) = ($vz, $vb);
		sclnum_val_cmp($tz, $tb);
		is zpat($tz), $pz;
		($tz, $tb) = ($vz, $vb);
		sclnum_val_cmp($tb, $tz);
		is zpat($tz), $pz;
	} }
}

for(my $ia = @values; $ia--; ) { foreach my $va (@{$values[$ia]}) {
	for(my $ib = @values; $ib--; ) { foreach my $vb (@{$values[$ib]}) {
		my $expect = ($ia <=> $ib);
		$expect = undef if $ia == 0 || $ib == 0;
		my($ta, $tb) = ($va, $vb);
		is sclnum_val_cmp($ta, $tb), $expect, "val[$ia] <=> val[$ib]";
	} }
} }

1;