xref: /openbsd-src/gnu/usr.bin/perl/ext/POSIX/t/fenv.t (revision 256a93a44f36679bee503f12e49566c2183f6181)
1*256a93a4Safresh1#! ./perl -w
2*256a93a4Safresh1
3*256a93a4Safresh1# These tests are in a separate .t file, because they may change
4*256a93a4Safresh1# execution environment of the perl process.
5*256a93a4Safresh1
6*256a93a4Safresh1use strict;
7*256a93a4Safresh1use warnings;
8*256a93a4Safresh1
9*256a93a4Safresh1use Test::More;
10*256a93a4Safresh1use POSIX qw/:fenv_h :float_h/;
11*256a93a4Safresh1
12*256a93a4Safresh1my $defmode;
13*256a93a4Safresh1plan skip_all => 'fegetround is unavailable'
14*256a93a4Safresh1    unless eval { $defmode = fegetround(); 1 };
15*256a93a4Safresh1
16*256a93a4Safresh1ok(defined $defmode, 'fegetround');
17*256a93a4Safresh1
18*256a93a4Safresh1SKIP: {
19*256a93a4Safresh1    skip 'default rounding mode is not FE_TONEAREST', 1
20*256a93a4Safresh1        unless eval { $defmode == FE_TONEAREST() };
21*256a93a4Safresh1    my $flt_rounds;
22*256a93a4Safresh1    skip 'FLT_ROUNDS is unavailable', 1
23*256a93a4Safresh1        unless eval { $flt_rounds = FLT_ROUNDS(); 1 };
24*256a93a4Safresh1    cmp_ok($flt_rounds, '==', 1, 'FLT_ROUNDS');
25*256a93a4Safresh1}
26*256a93a4Safresh1
27*256a93a4Safresh1cmp_ok(fesetround($defmode), '==', 0, 'fesetround');
28*256a93a4Safresh1cmp_ok(fegetround(), '==', $defmode, 'fesetround/fegetround round-trip');
29*256a93a4Safresh1
30*256a93a4Safresh1my @rounding = qw/TOWARDZERO TONEAREST UPWARD DOWNWARD/;
31*256a93a4Safresh1
32*256a93a4Safresh1for (my $i = 0; $i < @rounding; $i++) {
33*256a93a4Safresh1  SKIP: {
34*256a93a4Safresh1      my $macro = "FE_$rounding[$i]";
35*256a93a4Safresh1      my $femode = eval "$macro()";
36*256a93a4Safresh1      skip "no support for FE_$rounding[$i]", 3
37*256a93a4Safresh1          unless defined $femode;
38*256a93a4Safresh1
39*256a93a4Safresh1      cmp_ok(fesetround($femode), '==', 0, "fesetround($macro)");
40*256a93a4Safresh1      cmp_ok(fegetround(), '==', $femode, "fegetround() under $macro");
41*256a93a4Safresh1      cmp_ok(FLT_ROUNDS, '==', $i, "FLT_ROUNDS under $macro");
42*256a93a4Safresh1    }
43*256a93a4Safresh1}
44*256a93a4Safresh1
45*256a93a4Safresh1# Revert to default rounding mode
46*256a93a4Safresh1fesetround($defmode);
47*256a93a4Safresh1
48*256a93a4Safresh1done_testing();
49