xref: /openbsd/gnu/usr.bin/perl/cpan/Math-BigRat/t/trap.t (revision eac174f2)
1*eac174f2Safresh1# -*- mode: perl; -*-
2b8851fccSafresh1
3b8851fccSafresh1# test that config( trap_nan => 1, trap_inf => 1) really works/dies
4b8851fccSafresh1
5b8851fccSafresh1use strict;
6b8851fccSafresh1use warnings;
7b8851fccSafresh1
8b8851fccSafresh1use Test::More tests => 29;
9b8851fccSafresh1
10b8851fccSafresh1use Math::BigRat;
11b8851fccSafresh1
12b46d8ef2Safresh1my $mbr = 'Math::BigRat';
13b46d8ef2Safresh1my $x;
14b8851fccSafresh1
15b46d8ef2Safresh1foreach my $class ($mbr) {
169f11ffb7Safresh1
17b46d8ef2Safresh1    # can do?
18b8851fccSafresh1    can_ok($class, 'config');
19b46d8ef2Safresh1
20b46d8ef2Safresh1    ###########################################################################
21b46d8ef2Safresh1    # Default values.
22b46d8ef2Safresh1    ###########################################################################
23b46d8ef2Safresh1
24b46d8ef2Safresh1    # defaults are okay?
25b46d8ef2Safresh1    is($class->config("trap_nan"), 0, qq|$class->config("trap_nan")|);
26b46d8ef2Safresh1    is($class->config("trap_inf"), 0, qq|$class->config("trap_inf")|);
27b46d8ef2Safresh1
28b46d8ef2Safresh1    ###########################################################################
29b46d8ef2Safresh1    # Trap NaN.
30b46d8ef2Safresh1    ###########################################################################
31b8851fccSafresh1
32b8851fccSafresh1    # can set?
33b46d8ef2Safresh1    $class->config( trap_nan => 1 );
34b46d8ef2Safresh1    is($class->config("trap_nan"), 1, q|$class->config("trap_nan")|);
35b8851fccSafresh1
36b8851fccSafresh1    # can reset?
37b46d8ef2Safresh1    $class->config( trap_nan => 0 );
38b46d8ef2Safresh1    is($class->config("trap_nan"), 0, qq|$class->config("trap_nan")|);
39b46d8ef2Safresh1
40b46d8ef2Safresh1    # can set via hash ref?
41b46d8ef2Safresh1    $class->config( { trap_nan => 1 } );
42b46d8ef2Safresh1    is($class->config("trap_nan"), 1, q|$class->config("trap_nan")|);
43b46d8ef2Safresh1
44b46d8ef2Safresh1    # also test that new() still works normally
45b46d8ef2Safresh1    eval { $x = $class->new("42"); $x->bnan(); };
46b46d8ef2Safresh1    like($@, qr/^Tried to set/, qq|\$x = $class->new("42"); \$x->bnan();|);
47b46d8ef2Safresh1    # after new() never modified
48b46d8ef2Safresh1    is($x, 42, qq|\$x = $class->new("42"); \$x->bnan();|);
49b46d8ef2Safresh1
50b46d8ef2Safresh1    # 0/0 => NaN
51b46d8ef2Safresh1    eval { $x = $class->new("0"); $x->bdiv(0); };
52b46d8ef2Safresh1    like($@, qr/^Tried to set/, qq|\$x = $class->new("0"); \$x->bdiv(0);|);
53b46d8ef2Safresh1    # after new() never modified
54b46d8ef2Safresh1    is($x, 0, qq|\$x = $class->new("0"); \$x->bdiv(0);|);
55b46d8ef2Safresh1
56b46d8ef2Safresh1    ###########################################################################
57b46d8ef2Safresh1    # Trap inf.
58b46d8ef2Safresh1    ###########################################################################
59b8851fccSafresh1
60b8851fccSafresh1    # can set?
61b46d8ef2Safresh1    $class->config( trap_inf => 1 );
62b46d8ef2Safresh1    is($class->config("trap_inf"), 1, qq|$class->config("trap_inf")|);
63b46d8ef2Safresh1
64b46d8ef2Safresh1    eval { $x = $class->new("4711"); $x->binf(); };
65b46d8ef2Safresh1    like($@, qr/^Tried to set/, qq|\$x = $class->new("4711"); \$x->binf();|);
669f11ffb7Safresh1    # after new() never modified
67b46d8ef2Safresh1    is($x, 4711, qq|\$x = $class->new("4711"); \$x->binf();|);
68b8851fccSafresh1
69b8851fccSafresh1    # +$x/0 => +inf
70b46d8ef2Safresh1    eval { $x = $class->new("4711"); $x->bdiv(0); };
71b46d8ef2Safresh1    like($@, qr/^Tried to set/, qq|\$x =\$class->new("4711"); \$x->bdiv(0);|);
729f11ffb7Safresh1    # after new() never modified
73b46d8ef2Safresh1    is($x, 4711, qq|\$x =\$class->new("4711"); \$x->bdiv(0);|);
74b8851fccSafresh1
75b8851fccSafresh1    # -$x/0 => -inf
76b46d8ef2Safresh1    eval { $x = $class->new("-0815"); $x->bdiv(0); };
77b46d8ef2Safresh1    like($@, qr/^Tried to set/, qq|\$x = $class->new("-0815"); \$x->bdiv(0);|);
789f11ffb7Safresh1    # after new() never modified
79b46d8ef2Safresh1    is($x, -815, qq|\$x = $class->new("-0815"); \$x->bdiv(0);|);
80b8851fccSafresh1}
81b8851fccSafresh1
82b8851fccSafresh1##############################################################################
83b8851fccSafresh1# BigRat
84b8851fccSafresh1
859f11ffb7Safresh1Math::BigRat->config(trap_nan => 1,
869f11ffb7Safresh1                     trap_inf => 1);
87b8851fccSafresh1
889f11ffb7Safresh1for my $trap (qw/ 0.1a +inf inf -inf /) {
89b8851fccSafresh1    my $x = Math::BigRat->new('7/4');
90b8851fccSafresh1
919f11ffb7Safresh1    note("");           # this is just for some space in the output
929f11ffb7Safresh1
939f11ffb7Safresh1    # In each of the cases below, $x is not modified, because the code dies.
949f11ffb7Safresh1
95b46d8ef2Safresh1    eval { $x = $mbr->new("$trap"); };
96b46d8ef2Safresh1    is($x, "7/4", qq|\$x = $mbr->new("$trap");|);
979f11ffb7Safresh1
98b46d8ef2Safresh1    eval { $x = $mbr->new("$trap"); };
99b46d8ef2Safresh1    is($x, "7/4", qq|\$x = $mbr->new("$trap");|);
1009f11ffb7Safresh1
101b46d8ef2Safresh1    eval { $x = $mbr->new("$trap/7"); };
102b46d8ef2Safresh1    is($x, "7/4", qq|\$x = $mbr->new("$trap/7");|);
103b8851fccSafresh1}
104b8851fccSafresh1
105b8851fccSafresh1# all tests done
106