File: constructors-a-p-r.t

package info (click to toggle)
libmath-bigint-perl 1.999838-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 9,424 kB
  • sloc: perl: 10,236; pascal: 5,387; makefile: 2
file content (284 lines) | stat: -rw-r--r-- 14,440 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
# -*- mode: perl; -*-

# Test how accuracy and precision are set in the constructors. All of the
# constructors need to be tested:
#
#     new(), bzero(), bone(), binf(), bnan(), bpi(), and the from_*() methods.

use strict;
use warnings;

use Test::More tests => 160;

use Math::BigInt;
use Math::BigFloat;

my $classes =
  [
   'Math::BigInt',
   'Math::BigFloat',
  ];

# Each line in the table constains three elements. One with the class
# variables, one with the arguments to the constructor, and one with the
# resulting instance variables.

my $table1 =
  [

   [
    'new',
    [
     [{a =>  4, r => 'even'}, [                           ], [     0,     4, undef, 'even']],

     [{a =>  4, r => 'even'}, [     5,                    ], [     5,     4, undef, 'even']],
#     [{a =>  4, r => 'even'}, [     5, undef              ], [     5, undef, undef, 'even']],
     [{a =>  4, r => 'even'}, [     5, undef,    -3       ], [     5, undef,    -3, 'even']],
     [{a =>  4, r => 'even'}, [     5, undef,    -3, 'odd'], [     5, undef,    -3,  'odd']],
     [{a =>  4, r => 'even'}, [     5, undef, undef       ], [     5, undef, undef, 'even']],
     [{a =>  4, r => 'even'}, [     5, undef, undef, 'odd'], [     5, undef, undef,  'odd']],

     [{p => -3, r => 'even'}, [     5,                    ], [     5, undef,    -3, 'even']],
     [{p => -3, r => 'even'}, [     5,     4,             ], [     5,     4, undef, 'even']],
     [{p => -3, r => 'even'}, [     5,     4, undef       ], [     5,     4, undef, 'even']],
     [{p => -3, r => 'even'}, [     5,     4, undef, 'odd'], [     5,     4, undef,  'odd']],
     [{p => -3, r => 'even'}, [     5, undef, undef       ], [     5, undef, undef, 'even']],
     [{p => -3, r => 'even'}, [     5, undef, undef, 'odd'], [     5, undef, undef,  'odd']],

#     [{a =>  4, r => 'even'}, [ 'NaN',                    ], [ 'NaN',     4, undef, 'even']],
#     [{a =>  4, r => 'even'}, [ 'NaN', undef              ], [ 'NaN', undef, undef,  undef]],
#     [{a =>  4, r => 'even'}, [ 'NaN', undef,    -3       ], [ 'NaN', undef,    -3,  undef]],
#     [{a =>  4, r => 'even'}, [ 'NaN', undef,    -3, 'odd'], [ 'NaN', undef,    -3,  undef]],
#     [{a =>  4, r => 'even'}, [ 'NaN', undef, undef       ], [ 'NaN', undef, undef,  undef]],
#     [{a =>  4, r => 'even'}, [ 'NaN', undef, undef, 'odd'], [ 'NaN', undef, undef,  undef]],

     [{p => -3, r => 'even'}, [ 'NaN',                    ], [ 'NaN', undef,    -3,  undef]],
#     [{p => -3, r => 'even'}, [ 'NaN',     4,             ], [ 'NaN',     4, undef,  undef]],
#     [{p => -3, r => 'even'}, [ 'NaN',     4, undef       ], [ 'NaN',     4, undef,  undef]],
#     [{p => -3, r => 'even'}, [ 'NaN',     4, undef, 'odd'], [ 'NaN',     4, undef,  undef]],
#     [{p => -3, r => 'even'}, [ 'NaN', undef, undef       ], [ 'NaN', undef, undef,  undef]],
#     [{p => -3, r => 'even'}, [ 'NaN', undef, undef, 'odd'], [ 'NaN', undef, undef,  undef]],

#     [{a =>  4, r => 'even'}, [ '+inf',                    ], [ 'inf',     4, undef, 'even']],
#     [{a =>  4, r => 'even'}, [ '+inf', undef              ], [ 'inf', undef, undef,  undef]],
#     [{a =>  4, r => 'even'}, [ '+inf', undef,    -3       ], [ 'inf', undef,    -3,  undef]],
#     [{a =>  4, r => 'even'}, [ '+inf', undef,    -3, 'odd'], [ 'inf', undef,    -3,  undef]],
#     [{a =>  4, r => 'even'}, [ '+inf', undef, undef       ], [ 'inf', undef, undef,  undef]],
#     [{a =>  4, r => 'even'}, [ '+inf', undef, undef, 'odd'], [ 'inf', undef, undef,  undef]],

#     [{p => -3, r => 'even'}, [ '+inf',                    ], [ 'inf', undef,    -3,  undef]],
#     [{p => -3, r => 'even'}, [ '+inf',     4,             ], [ 'inf',     4, undef,  undef]],
#     [{p => -3, r => 'even'}, [ '+inf',     4, undef       ], [ 'inf',     4, undef,  undef]],
#     [{p => -3, r => 'even'}, [ '+inf',     4, undef, 'odd'], [ 'inf',     4, undef,  undef]],
#     [{p => -3, r => 'even'}, [ '+inf', undef, undef       ], [ 'inf', undef, undef,  undef]],
#     [{p => -3, r => 'even'}, [ '+inf', undef, undef, 'odd'], [ 'inf', undef, undef,  undef]],

#     [{a =>  4, r => 'even'}, [ '-inf',                    ], [ '-inf',     4, undef, 'even']],
#     [{a =>  4, r => 'even'}, [ '-inf', undef              ], [ '-inf', undef, undef,  undef]],
#     [{a =>  4, r => 'even'}, [ '-inf', undef,    -3       ], [ '-inf', undef,    -3,  undef]],
#     [{a =>  4, r => 'even'}, [ '-inf', undef,    -3, 'odd'], [ '-inf', undef,    -3,  undef]],
#     [{a =>  4, r => 'even'}, [ '-inf', undef, undef       ], [ '-inf', undef, undef,  undef]],
#     [{a =>  4, r => 'even'}, [ '-inf', undef, undef, 'odd'], [ '-inf', undef, undef,  undef]],

#     [{p => -3, r => 'even'}, [ '-inf',                    ], [ '-inf', undef,    -3,  undef]],
#     [{p => -3, r => 'even'}, [ '-inf',     4,             ], [ '-inf',     4, undef,  undef]],
#     [{p => -3, r => 'even'}, [ '-inf',     4, undef       ], [ '-inf',     4, undef,  undef]],
#     [{p => -3, r => 'even'}, [ '-inf',     4, undef, 'odd'], [ '-inf',     4, undef,  undef]],
#     [{p => -3, r => 'even'}, [ '-inf', undef, undef       ], [ '-inf', undef, undef,  undef]],
#     [{p => -3, r => 'even'}, [ '-inf', undef, undef, 'odd'], [ '-inf', undef, undef,  undef]],

    ]
   ],

   [
    'bzero',
    [

     [{a =>  4, r => 'even'}, [                   ], [0,     4, undef, 'even']],
     [{a =>  4, r => 'even'}, [undef              ], [0, undef, undef, 'even']],
     [{a =>  4, r => 'even'}, [undef,    -3       ], [0, undef,    -3, 'even']],
     [{a =>  4, r => 'even'}, [undef,    -3, 'odd'], [0, undef,    -3,  'odd']],
     [{a =>  4, r => 'even'}, [undef, undef       ], [0, undef, undef, 'even']],
     [{a =>  4, r => 'even'}, [undef, undef, 'odd'], [0, undef, undef,  'odd']],

     [{p => -3, r => 'even'}, [                   ], [0, undef,    -3, 'even']],
     [{p => -3, r => 'even'}, [    4,             ], [0,     4, undef, 'even']],
     [{p => -3, r => 'even'}, [    4, undef       ], [0,     4, undef, 'even']],
     [{p => -3, r => 'even'}, [    4, undef, 'odd'], [0,     4, undef,  'odd']],
     [{p => -3, r => 'even'}, [undef, undef       ], [0, undef, undef, 'even']],
     [{p => -3, r => 'even'}, [undef, undef, 'odd'], [0, undef, undef,  'odd']],

    ],
   ],

   [
    'bone',
    [

     [{a =>  4, r => 'even'}, [                        ], [ 1,     4, undef, 'even']],
     [{a =>  4, r => 'even'}, ['+',                    ], [ 1,     4, undef, 'even']],
     [{a =>  4, r => 'even'}, ['+', undef              ], [ 1, undef, undef, 'even']],
     [{a =>  4, r => 'even'}, ['+', undef,    -3       ], [ 1, undef,    -3, 'even']],
     [{a =>  4, r => 'even'}, ['+', undef,    -3, 'odd'], [ 1, undef,    -3,  'odd']],
     [{a =>  4, r => 'even'}, ['+', undef, undef       ], [ 1, undef, undef, 'even']],
     [{a =>  4, r => 'even'}, ['+', undef, undef, 'odd'], [ 1, undef, undef,  'odd']],

     [{p => -3, r => 'even'}, [                        ], [ 1, undef,    -3, 'even']],
     [{p => -3, r => 'even'}, ['+',                    ], [ 1, undef,    -3, 'even']],
     [{p => -3, r => 'even'}, ['+',     4,             ], [ 1,     4, undef, 'even']],
     [{p => -3, r => 'even'}, ['+',     4, undef       ], [ 1,     4, undef, 'even']],
     [{p => -3, r => 'even'}, ['+',     4, undef, 'odd'], [ 1,     4, undef,  'odd']],
     [{p => -3, r => 'even'}, ['+', undef, undef       ], [ 1, undef, undef, 'even']],
     [{p => -3, r => 'even'}, ['+', undef, undef, 'odd'], [ 1, undef, undef,  'odd']],

     [{a =>  4, r => 'even'}, ['-',                    ], [-1,     4, undef, 'even']],
     [{a =>  4, r => 'even'}, ['-', undef              ], [-1, undef, undef, 'even']],
     [{a =>  4, r => 'even'}, ['-', undef,    -3       ], [-1, undef,    -3, 'even']],
     [{a =>  4, r => 'even'}, ['-', undef,    -3, 'odd'], [-1, undef,    -3,  'odd']],
     [{a =>  4, r => 'even'}, ['-', undef, undef       ], [-1, undef, undef, 'even']],
     [{a =>  4, r => 'even'}, ['-', undef, undef, 'odd'], [-1, undef, undef,  'odd']],

     [{p => -3, r => 'even'}, ['-',                    ], [-1, undef,    -3, 'even']],
     [{p => -3, r => 'even'}, ['-',     4,             ], [-1,     4, undef, 'even']],
     [{p => -3, r => 'even'}, ['-',     4, undef       ], [-1,     4, undef, 'even']],
     [{p => -3, r => 'even'}, ['-',     4, undef, 'odd'], [-1,     4, undef,  'odd']],
     [{p => -3, r => 'even'}, ['-', undef, undef       ], [-1, undef, undef, 'even']],
     [{p => -3, r => 'even'}, ['-', undef, undef, 'odd'], [-1, undef, undef,  'odd']],

    ],
   ],

   [
    'binf',
    [

     [{a =>  4, r => 'even'}, [                        ], [ 'inf',     4, undef, 'even']],
     [{a =>  4, r => 'even'}, ['+',                    ], [ 'inf',     4, undef, 'even']],
     [{a =>  4, r => 'even'}, ['+', undef              ], [ 'inf', undef, undef, 'even']],
     [{a =>  4, r => 'even'}, ['+', undef,    -3       ], [ 'inf', undef,    -3, 'even']],
     [{a =>  4, r => 'even'}, ['+', undef,    -3, 'odd'], [ 'inf', undef,    -3,  'odd']],
     [{a =>  4, r => 'even'}, ['+', undef, undef       ], [ 'inf', undef, undef, 'even']],
     [{a =>  4, r => 'even'}, ['+', undef, undef, 'odd'], [ 'inf', undef, undef,  'odd']],

     [{p => -3, r => 'even'}, [                        ], [ 'inf', undef,    -3, 'even']],
     [{p => -3, r => 'even'}, ['+',                    ], [ 'inf', undef,    -3, 'even']],
     [{p => -3, r => 'even'}, ['+',     4,             ], [ 'inf',     4, undef, 'even']],
     [{p => -3, r => 'even'}, ['+',     4, undef       ], [ 'inf',     4, undef, 'even']],
     [{p => -3, r => 'even'}, ['+',     4, undef, 'odd'], [ 'inf',     4, undef,  'odd']],
     [{p => -3, r => 'even'}, ['+', undef, undef       ], [ 'inf', undef, undef, 'even']],
     [{p => -3, r => 'even'}, ['+', undef, undef, 'odd'], [ 'inf', undef, undef,  'odd']],

     [{a =>  4, r => 'even'}, ['-',                    ], ['-inf',     4, undef, 'even']],
     [{a =>  4, r => 'even'}, ['-', undef              ], ['-inf', undef, undef, 'even']],
     [{a =>  4, r => 'even'}, ['-', undef,    -3       ], ['-inf', undef,    -3, 'even']],
     [{a =>  4, r => 'even'}, ['-', undef,    -3, 'odd'], ['-inf', undef,    -3,  'odd']],
     [{a =>  4, r => 'even'}, ['-', undef, undef       ], ['-inf', undef, undef, 'even']],
     [{a =>  4, r => 'even'}, ['-', undef, undef, 'odd'], ['-inf', undef, undef,  'odd']],

     [{p => -3, r => 'even'}, ['-',                    ], ['-inf', undef,    -3, 'even']],
     [{p => -3, r => 'even'}, ['-',     4,             ], ['-inf',     4, undef, 'even']],
     [{p => -3, r => 'even'}, ['-',     4, undef       ], ['-inf',     4, undef, 'even']],
     [{p => -3, r => 'even'}, ['-',     4, undef, 'odd'], ['-inf',     4, undef,  'odd']],
     [{p => -3, r => 'even'}, ['-', undef, undef       ], ['-inf', undef, undef, 'even']],
     [{p => -3, r => 'even'}, ['-', undef, undef, 'odd'], ['-inf', undef, undef,  'odd']],

    ],
   ],

   #   [
   #    'bnan',
   #    [
   #
   #     [{a =>  4, r => 'even'}, [                   ], ['NaN',     4, undef, 'even']],
   #     [{a =>  4, r => 'even'}, [undef              ], ['NaN', undef, undef, 'even']],
   #     [{a =>  4, r => 'even'}, [undef,    -3       ], ['NaN', undef,    -3, 'even']],
   #     [{a =>  4, r => 'even'}, [undef,    -3, 'odd'], ['NaN', undef,    -3,  'odd']],
   #     [{a =>  4, r => 'even'}, [undef, undef       ], ['NaN', undef, undef, 'even']],
   #     [{a =>  4, r => 'even'}, [undef, undef, 'odd'], ['NaN', undef, undef,  'odd']],
   #
   #     [{p => -3, r => 'even'}, [                   ], ['NaN', undef,    -3, 'even']],
   #     [{p => -3, r => 'even'}, [    4,             ], ['NaN',     4, undef, 'even']],
   #     [{p => -3, r => 'even'}, [    4, undef       ], ['NaN',     4, undef, 'even']],
   #     [{p => -3, r => 'even'}, [    4, undef, 'odd'], ['NaN',     4, undef,  'odd']],
   #     [{p => -3, r => 'even'}, [undef, undef       ], ['NaN', undef, undef, 'even']],
   #     [{p => -3, r => 'even'}, [undef, undef, 'odd'], ['NaN', undef, undef,  'odd']],
   #
   #    ],
   #   ],

  ];

my $table2 =
  [
#   qq|new(0, 4, -3);|,
#   qq|new(5, 4, -3);|,
#   qq|new("+inf", 4, -3);|,
#   qq|new("-inf", 4, -3);|,
#   qq|new("NaN", 4, -3);|,

   qq|bzero(4, -3);|,

   qq|bone("+", 4, -3);|,
   qq|bone("-", 4, -3);|,

#   qq|binf("+", 4, -3);|,
#   qq|binf("-", 4, -3);|,

#   qq|bnan(4, -3);|,
  ];

sub arg2str {
    my $arg = shift;
    return "undef" unless defined $arg; # undefined
    return $arg if $arg =~ /\d/;        # number
    return qq|"$arg"|;                  # string
}

for my $class (@$classes) {

    for my $entry (@$table1) {
        my $method = $entry -> [0];
        my $table  = $entry -> [1];
        for my $line (@$table) {

            # class variables, constructor arguments, and instance variables
            my ($cvars, $cargs, $ivars) = @$line;

            my $test = '';
            $test .= "$class -> accuracy("    . arg2str($cvars -> {a}) . ");"
              if exists $cvars -> {a};
            $test .= " $class -> precision("  . arg2str($cvars -> {p}) . ");"
              if exists $cvars -> {p};
            #$test .= " $class -> round_mode(" . arg2str($cvars -> {r}) . ");"
            #  if exists $cvars -> {r};
            $test .= " \$x = $class->$method(";
            $test .= join ", ", map arg2str($_), @$cargs;
            $test .= ");";

            my $x;
            eval $test;
            die $@ if $@;       # this should never happen

            subtest $test => sub {
                plan tests => 3;

                is($x -> bdstr(),      $ivars -> [0], '$x -> bdstr()');
                #is($x -> accuracy(),   $ivars -> [1], '$x -> accuracy()');
                is($x -> {_a},         $ivars -> [1], '$x -> {_a}');
                #is($x -> precision(),  $ivars -> [2], '$x -> precision()');
                is($x -> {_p},         $ivars -> [2], '$x -> {_p}');
                #is($x -> round_mode(), $ivars -> [3], '$x -> round_mode()');
                #is($x -> {_r},         $ivars -> [3], '$x -> {_r}');
            };
        }
    }

    # Setting both the accuracy and the precision to defined values is an
    # error.

    for my $entry (@$table2) {
        my $test = $class . " -> " . $entry;
        eval $test;
        like($@, qr/specify both accuracy and precision/, $test);
    }
}