xref: /openbsd-src/gnu/usr.bin/perl/cpan/Math-BigInt/t/trap.t (revision 3d61058aa5c692477b6d18acfbbdb653a9930ff9)
1eac174f2Safresh1# -*- mode: perl; -*-
2b8851fccSafresh1
3b8851fccSafresh1# test that config ( trap_nan => 1, trap_inf => 1) really works/dies
4b8851fccSafresh1
5b8851fccSafresh1use strict;
6b8851fccSafresh1use warnings;
7b8851fccSafresh1
8*3d61058aSafresh1use Test::More tests => 90;
9b8851fccSafresh1
10b8851fccSafresh1my $mbi = 'Math::BigInt';
11b8851fccSafresh1my $mbf = 'Math::BigFloat';
12*3d61058aSafresh1my $mbr = 'Math::BigRat';
13b8851fccSafresh1
14*3d61058aSafresh1use_ok($mbi);
15*3d61058aSafresh1use_ok($mbf);
16*3d61058aSafresh1use_ok($mbr);
17*3d61058aSafresh1
18*3d61058aSafresh1my $x;
19*3d61058aSafresh1
20*3d61058aSafresh1foreach my $class ($mbi, $mbf, $mbr) {
21*3d61058aSafresh1
22*3d61058aSafresh1    # can do?
23*3d61058aSafresh1    can_ok($class, 'config');
24*3d61058aSafresh1
25*3d61058aSafresh1    ###########################################################################
26*3d61058aSafresh1    # Default values.
27*3d61058aSafresh1    ###########################################################################
28*3d61058aSafresh1
29*3d61058aSafresh1    # defaults are okay?
30b46d8ef2Safresh1    is($class->config("trap_nan"), 0, 'trap_nan defaults to 0');
31b46d8ef2Safresh1    is($class->config("trap_inf"), 0, 'trap_inf defaults to 0');
32b8851fccSafresh1
33*3d61058aSafresh1    ###########################################################################
34*3d61058aSafresh1    # Trap NaN.
35*3d61058aSafresh1    ###########################################################################
36*3d61058aSafresh1
37b8851fccSafresh1    # can set?
38*3d61058aSafresh1    $class->config( trap_nan => 1 );
39*3d61058aSafresh1    is($class->config("trap_nan"), 1, qq|$class->config( trap_nan => 1 );|);
40*3d61058aSafresh1
41*3d61058aSafresh1    # can reset?
42*3d61058aSafresh1    $class->config( trap_nan => 0 );
43*3d61058aSafresh1    is($class->config("trap_nan"), 0, qq|$class->config( trap_nan => 0 );|);
44*3d61058aSafresh1
45*3d61058aSafresh1    # can set via hash ref?
46*3d61058aSafresh1    $class->config( { trap_nan => 1 } );
47*3d61058aSafresh1    is($class->config("trap_nan"), 1, qq|$class->config( { trap_nan => 1 } );|);
48*3d61058aSafresh1
49*3d61058aSafresh1    # 0/0 => NaN
50*3d61058aSafresh1    $x = $class->new("0");
51*3d61058aSafresh1    eval { $x->bdiv(0); };
52*3d61058aSafresh1    like($@, qr/^Tried to /, qq|\$x = $class->new("0"); \$x->bdiv(0);|);
53*3d61058aSafresh1
54*3d61058aSafresh1    # new() didn't modify $x
55*3d61058aSafresh1    is($x, 0, qq|\$x = $class->new("0"); \$x->bdiv(0);|);
56b8851fccSafresh1
57b8851fccSafresh1    # also test that new() still works normally
58*3d61058aSafresh1    eval { $x = $class->new('42'); $x->bnan(); };
59*3d61058aSafresh1    like($@, qr/^Tried to /, 'died');
60b8851fccSafresh1    is($x, 42, '$x after new() never modified');
61b8851fccSafresh1
62b8851fccSafresh1    # can reset?
63*3d61058aSafresh1    $class->config( trap_nan => 0 );
64*3d61058aSafresh1    is($class->config("trap_nan"), 0, qq|$class->config( trap_nan => 0 );|);
65*3d61058aSafresh1
66*3d61058aSafresh1    ###########################################################################
67*3d61058aSafresh1    # Trap inf.
68*3d61058aSafresh1    ###########################################################################
69b8851fccSafresh1
70b8851fccSafresh1    # can set?
71*3d61058aSafresh1    $class->config( trap_inf => 1 );
72*3d61058aSafresh1    is($class->config("trap_inf"), 1, 'trap_inf enabled');
73b8851fccSafresh1
74*3d61058aSafresh1    eval { $x = $class->new('4711'); $x->binf(); };
75*3d61058aSafresh1    like($@, qr/^Tried to /, 'died');
76b8851fccSafresh1    is($x, 4711, '$x after new() never modified');
77b8851fccSafresh1
78*3d61058aSafresh1    eval { $x = $class->new('inf'); };
79*3d61058aSafresh1    like($@, qr/^Tried to /, 'died');
80b8851fccSafresh1    is($x, 4711, '$x after new() never modified');
81b8851fccSafresh1
82*3d61058aSafresh1    eval { $x = $class->new('-inf'); };
83*3d61058aSafresh1    like($@, qr/^Tried to /, 'died');
84b8851fccSafresh1    is($x, 4711, '$x after new() never modified');
85b8851fccSafresh1
86b8851fccSafresh1    # +$x/0 => +inf
87*3d61058aSafresh1    eval { $x = $class->new('4711'); $x->bdiv(0); };
88*3d61058aSafresh1    like($@, qr/^Tried to /, 'died');
89b8851fccSafresh1    is($x, 4711, '$x after new() never modified');
90b8851fccSafresh1
91b8851fccSafresh1    # -$x/0 => -inf
92*3d61058aSafresh1    eval { $x = $class->new('-0815'); $x->bdiv(0); };
93*3d61058aSafresh1    like($@, qr/^Tried to /, 'died');
94b8851fccSafresh1    is($x, '-815', '$x after new not modified');
95b8851fccSafresh1
96*3d61058aSafresh1    $class->config( trap_nan => 1 );
97b8851fccSafresh1    # 0/0 => NaN
98*3d61058aSafresh1    eval { $x = $class->new('0'); $x->bdiv(0); };
99*3d61058aSafresh1    like($@, qr/^Tried to /, 'died');
100b8851fccSafresh1    is($x, '0', '$x after new not modified');
101b8851fccSafresh1}
102b8851fccSafresh1
103b8851fccSafresh1##############################################################################
104b8851fccSafresh1# Math::BigInt
105b8851fccSafresh1
106b8851fccSafresh1$x = Math::BigInt->new(2);
107*3d61058aSafresh1eval { $x = $mbi->new('0.1'); };
108b8851fccSafresh1is($x, 2, 'never modified since it dies');
109*3d61058aSafresh1
110*3d61058aSafresh1eval { $x = $mbi->new('0a.1'); };
111b8851fccSafresh1is($x, 2, 'never modified since it dies');
112b8851fccSafresh1
113b8851fccSafresh1##############################################################################
114b8851fccSafresh1# Math::BigFloat
115b8851fccSafresh1
116b8851fccSafresh1$x = Math::BigFloat->new(2);
117*3d61058aSafresh1eval { $x = $mbf->new('0.1a'); };
118b8851fccSafresh1is($x, 2, 'never modified since it dies');
119b8851fccSafresh1
120*3d61058aSafresh1##############################################################################
121*3d61058aSafresh1# BigRat
122*3d61058aSafresh1
123*3d61058aSafresh1Math::BigRat->config(trap_nan => 1,
124*3d61058aSafresh1                     trap_inf => 1);
125*3d61058aSafresh1
126*3d61058aSafresh1for my $trap (qw/ 0.1a +inf inf -inf /) {
127*3d61058aSafresh1    my $x = Math::BigRat->new('7/4');
128*3d61058aSafresh1
129*3d61058aSafresh1    note("");           # this is just for some space in the output
130*3d61058aSafresh1
131*3d61058aSafresh1    # In each of the cases below, $x is not modified, because the code dies.
132*3d61058aSafresh1
133*3d61058aSafresh1    eval { $x = $mbr->new("$trap"); };
134*3d61058aSafresh1    is($x, "7/4", qq|\$x = $mbr->new("$trap");|);
135*3d61058aSafresh1
136*3d61058aSafresh1    eval { $x = $mbr->new("$trap"); };
137*3d61058aSafresh1    is($x, "7/4", qq|\$x = $mbr->new("$trap");|);
138*3d61058aSafresh1
139*3d61058aSafresh1    eval { $x = $mbr->new("$trap/7"); };
140*3d61058aSafresh1    is($x, "7/4", qq|\$x = $mbr->new("$trap/7");|);
141*3d61058aSafresh1}
142*3d61058aSafresh1
143b8851fccSafresh1# all tests done
144