xref: /openbsd-src/gnu/usr.bin/perl/ext/POSIX/t/iv_const.t (revision 256a93a44f36679bee503f12e49566c2183f6181)
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