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