1*256a93a4Safresh1#! perl -w 2*256a93a4Safresh1 3*256a93a4Safresh1# Test integer constants (DBL_DIG, DBL_MAX_EXP, FP_*, ...) are IV, not NV. 4*256a93a4Safresh1 5*256a93a4Safresh1use strict; 6*256a93a4Safresh1use Test::More; 7*256a93a4Safresh1use Devel::Peek; 8*256a93a4Safresh1use POSIX; 9*256a93a4Safresh1use Config; 10*256a93a4Safresh1 11*256a93a4Safresh1# Capture output from Devel::Peek::Dump() into Perl string 12*256a93a4Safresh1sub capture_dump 13*256a93a4Safresh1{ 14*256a93a4Safresh1 open my $olderr, '>&', *STDERR 15*256a93a4Safresh1 or die "Can't save STDERR: $!"; 16*256a93a4Safresh1 my $str; 17*256a93a4Safresh1 my $result = eval { 18*256a93a4Safresh1 local $SIG{__DIE__}; 19*256a93a4Safresh1 close STDERR; 20*256a93a4Safresh1 open STDERR, '>', \$str 21*256a93a4Safresh1 or die "Can't redirect STDERR: $!"; 22*256a93a4Safresh1 Dump($_[0]); 23*256a93a4Safresh1 1; 24*256a93a4Safresh1 }; 25*256a93a4Safresh1 my $reason = $@; 26*256a93a4Safresh1 open STDERR, '>&', $olderr 27*256a93a4Safresh1 or die "Can't restore STDERR: $!"; 28*256a93a4Safresh1 $result or die $reason; 29*256a93a4Safresh1 $str; 30*256a93a4Safresh1} 31*256a93a4Safresh1 32*256a93a4Safresh1# Avoid die() in a test harness. 33*256a93a4Safresh1sub capture_dump_in_test 34*256a93a4Safresh1{ 35*256a93a4Safresh1 my $str; 36*256a93a4Safresh1 eval { $str = capture_dump($_[0]); 1 } or BAIL_OUT $@; 37*256a93a4Safresh1 $str; 38*256a93a4Safresh1} 39*256a93a4Safresh1 40*256a93a4Safresh1sub is_iv ($$) 41*256a93a4Safresh1{ 42*256a93a4Safresh1 # We would write "ok(SvIOK($_[0]), ...)", 43*256a93a4Safresh1 # but unfortunately SvIOK is not available in Perl. 44*256a93a4Safresh1 45*256a93a4Safresh1 my $dump = capture_dump_in_test($_[0]); 46*256a93a4Safresh1 #note($dump); 47*256a93a4Safresh1 ok($dump =~ /^\h*FLAGS = .*\bIOK\b/m && $dump =~ /^\h*IV =/m, $_[1]); 48*256a93a4Safresh1} 49*256a93a4Safresh1 50*256a93a4Safresh1my @tests = qw(EXIT_SUCCESS); 51*256a93a4Safresh1 52*256a93a4Safresh1push @tests, qw(FLT_RADIX FP_NORMAL FP_ZERO FP_SUBNORMAL FP_INFINITE FP_NAN); 53*256a93a4Safresh1 54*256a93a4Safresh1if ($Config{uselongdouble} ? $Config{d_ilogbl} : $Config{d_ilogb}) { 55*256a93a4Safresh1 push @tests, qw(FP_ILOGB0); 56*256a93a4Safresh1 push @tests, qw(FP_ILOGBNAN) if $Config{d_double_has_nan}; 57*256a93a4Safresh1} 58*256a93a4Safresh1 59*256a93a4Safresh1foreach my $flt ('FLT', 'DBL', ($Config{d_longdbl} ? ('LDBL') : ())) { 60*256a93a4Safresh1 push @tests, "${flt}_$_" 61*256a93a4Safresh1 foreach qw(DIG MANT_DIG MAX_10_EXP MAX_EXP MIN_10_EXP MIN_EXP); 62*256a93a4Safresh1} 63*256a93a4Safresh1 64*256a93a4Safresh1push @tests, qw(FE_TONEAREST FE_TOWARDZERO FE_UPWARD FE_DOWNWARD) 65*256a93a4Safresh1 if $Config{d_fegetround}; 66*256a93a4Safresh1 67*256a93a4Safresh1is_iv(eval "POSIX::$_", "$_ is an integer") foreach @tests; 68*256a93a4Safresh1 69*256a93a4Safresh1SKIP: { 70*256a93a4Safresh1 my $x; 71*256a93a4Safresh1 skip $@, 1 unless eval '$x = FLT_ROUNDS; 1'; 72*256a93a4Safresh1 is_iv($x, 'FLT_ROUNDS is an integer'); 73*256a93a4Safresh1} 74*256a93a4Safresh1 75*256a93a4Safresh1done_testing(); 76