The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use warnings;
use strict;

use Test::More tests => 1 + 2*9*9 + 8*9;

BEGIN { use_ok "Data::Float", qw(
	have_infinite have_signed_zero have_nan float_id_cmp totalorder
); }

no strict "refs";
my @values = (
	sub { have_nan ? &{"Data::Float::nan"} : undef },
	sub { have_infinite ? &{"Data::Float::neg_infinity"} : undef },
	-1000.0,
	-0.125,
	sub { have_signed_zero ? &{"Data::Float::neg_zero"} : undef },
	+0.0,
	+0.125,
	+1000.0,
	sub { have_infinite ? &{"Data::Float::pos_infinity"} : undef },
);

foreach(@values) {
	$_ = $_->() if ref($_) eq "CODE";
}

sub zpat($) { my($z) = @_; my $nz = -$z; sprintf("%+.f%+.f%+.f",$z,$nz,-$nz) }

for(my $ia = @values; $ia--; ) {
	for(my $ib = @values; $ib--; ) {
		SKIP: {
			my($a, $b) = @values[$ia, $ib];
			my $az = $ia == 4 || $ia == 5 ? 1 : 0;
			my $bz = $ib == 4 || $ib == 5 ? 1 : 0;
			skip "special value not available", 2*(1+$az+$bz)
				unless defined($a) && defined($b);
			my($ta, $tb) = ($a, $b);
			is float_id_cmp($ta, $tb), ($ia <=> $ib);
			is zpat($ta), zpat($a) if $az;
			is zpat($tb), zpat($b) if $bz;
			($ta, $tb) = ($a, $b);
			is !!totalorder($ta, $tb), ($ia <= $ib);
			is zpat($ta), zpat($a) if $az;
			is zpat($tb), zpat($b) if $bz;
		}
	}
}

1;