1#!perl
2
3use strict;
4use warnings;
5
6use Test::More tests => 72;
7
8# test whether Math::BigInt->config() and Math::BigFloat->config() work
9
10use Math::BigInt lib => 'Calc';
11use Math::BigFloat;
12
13my $mbi = 'Math::BigInt';
14my $mbf = 'Math::BigFloat';
15
16my @defaults =
17  ([ 'lib',         'Math::BigInt::Calc'           ],
18   [ 'lib_version', $Math::BigInt::Calc::VERSION, ],
19   [ 'upgrade',     undef,  ],
20   [ 'div_scale',   40,     ],
21   [ 'precision',   undef,  ],
22   [ 'accuracy',    undef,  ],
23   [ 'round_mode',  'even', ],
24   [ 'trap_nan',    0,      ],
25   [ 'trap_inf',    0,      ]);
26
27##############################################################################
28# Math::BigInt
29
30{
31    can_ok($mbi, 'config');
32
33    my @table = @defaults;
34    unshift @table, ['class', $mbi ];
35
36    # Test getting via the new-style $class->($key):
37
38    for (my $i = 0 ; $i <= $#table ; ++ $i) {
39        my $key = $table[$i][0];
40        my $val = $table[$i][1];
41        is($mbi->config($key), $val, qq|$mbi->config("$key")|);
42    }
43
44    # Test getting via the old-style $class->()->{$key}, which is still
45    # supported:
46
47    my $cfg = $mbi->config();
48    is(ref($cfg), 'HASH', 'ref() of output from $mbi->config()');
49
50    for (my $i = 0 ; $i <= $#table ; ++ $i) {
51        my $key = $table[$i][0];
52        my $val = $table[$i][1];
53        is($cfg->{$key}, $val, qq|$mbi->config()->{$key}|);
54    }
55
56    # can set via hash ref?
57    $cfg = $mbi->config({ trap_nan => 1 });
58    is($cfg->{trap_nan}, 1, 'can set "trap_nan" via hash ref');
59
60    # reset for later
61    $mbi->config(trap_nan => 0);
62}
63
64##############################################################################
65# Math::BigFloat
66
67{
68    can_ok($mbf, 'config');
69
70    my @table = @defaults;
71    unshift @table, ['class', $mbf ];
72
73    # Test getting via the new-style $class->($key):
74
75    for (my $i = 0 ; $i <= $#table ; ++ $i) {
76        my $key = $table[$i][0];
77        my $val = $table[$i][1];
78        is($mbf->config($key), $val, qq|$mbf->config("$key")|);
79    }
80
81    # Test getting via the old-style $class->()->{$key}, which is still
82    # supported:
83
84    my $cfg = $mbf->config();
85    is(ref($cfg), 'HASH', 'ref() of output from $mbf->config()');
86
87    for (my $i = 0 ; $i <= $#table ; ++ $i) {
88        my $key = $table[$i][0];
89        my $val = $table[$i][1];
90        is($cfg->{$key}, $val, qq|$mbf->config()->{$key}|);
91    }
92
93    # can set via hash ref?
94    $cfg = $mbf->config({ trap_nan => 1 });
95    is($cfg->{trap_nan}, 1, 'can set "trap_nan" via hash ref');
96
97    # reset for later
98    $mbf->config(trap_nan => 0);
99}
100
101##############################################################################
102# test setting values
103
104my $test = {
105    trap_nan   => 1,
106    trap_inf   => 1,
107    accuracy   => 2,
108    precision  => 3,
109    round_mode => 'zero',
110    div_scale  => '100',
111    upgrade    => 'Math::BigInt::SomeClass',
112    downgrade  => 'Math::BigInt::SomeClass',
113};
114
115my $cfg;
116
117foreach my $key (keys %$test) {
118
119    # see if setting in MBI works
120    eval { $mbi->config($key => $test->{$key}); };
121    $cfg = $mbi->config();
122    is("$key = $cfg->{$key}", "$key = $test->{$key}", "$key = $test->{$key}");
123    $cfg = $mbf->config();
124
125    # see if setting it in MBI leaves MBF alone
126    ok(($cfg->{$key} || 0) ne $test->{$key},
127       "$key ne \$cfg->{$key}");
128
129    # see if setting in MBF works
130    eval { $mbf->config($key => $test->{$key}); };
131    $cfg = $mbf->config();
132    is("$key = $cfg->{$key}", "$key = $test->{$key}", "$key = $test->{$key}");
133}
134
135##############################################################################
136# test setting illegal keys (should croak)
137
138eval { $mbi->config('some_garbage' => 1); };
139like($@,
140     qr/ ^ Illegal \s+ key\(s\) \s+ 'some_garbage' \s+ passed \s+ to \s+
141         Math::BigInt->config\(\) \s+ at
142       /x,
143     'Passing invalid key to Math::BigInt->config() causes an error.');
144
145eval { $mbf->config('some_garbage' => 1); };
146like($@,
147     qr/ ^ Illegal \s+ key\(s\) \s+ 'some_garbage' \s+ passed \s+ to \s+
148         Math::BigFloat->config\(\) \s+ at
149       /x,
150     'Passing invalid key to Math::BigFloat->config() causes an error.');
151