1# -*- mode: perl; -*-
2
3use strict;
4use warnings;
5
6use Test::More tests => 365;
7
8my $class;
9
10BEGIN { $class = 'Math::BigInt'; }
11BEGIN { use_ok($class); }
12
13# For simplicity, we use the same data in the test programs for to_base_num() and
14# from_base_num().
15
16my @data =
17  (
18   [ 0, 2, [ 0 ] ],
19   [ 1, 2, [ 1 ] ],
20   [ 2, 2, [ 1, 0 ] ],
21   [ 3, 2, [ 1, 1, ] ],
22   [ 4, 2, [ 1, 0, 0 ] ],
23
24   [ 0, 10, [ 0 ] ],
25   [ 1, 10, [ 1 ] ],
26   [ 12, 10, [ 1, 2 ] ],
27   [ 123, 10, [ 1, 2, 3 ] ],
28   [ 1230, 10, [ 1, 2, 3, 0 ] ],
29
30   [ "123456789", 100, [ 1, 23, 45, 67, 89 ] ],
31
32   [ "1234567890" x 3,
33     "987654321",
34     [ "128", "142745769", "763888804", "574845669" ]],
35
36   [ "1234567890" x 5,
37     "987654321" x 3,
38     [ "12499999874843750102814", "447551941015330718793208596" ]],
39  );
40
41for (my $i = 0 ; $i <= $#data ; ++ $i) {
42    my @in = ($data[$i][2], $data[$i][1]);
43    my $out = $data[$i][0];
44
45    # As class method.
46
47    {
48        for my $base_as_scalar (1, 0) {
49            for my $elements_as_scalar (1, 0) {
50
51                my $x;
52                my $test = "\$x = $class -> from_base_num([";
53                if ($elements_as_scalar) {
54                    $test .= join ", ", map qq|"$_"|, @{ $in[0] };
55                } else {
56                    $test .= join ", ", map qq|$class -> new("$_")|, @{ $in[0] };
57                }
58                $test .= "], ";
59                if ($base_as_scalar) {
60                    $test .= qq|"$in[1]"|;
61                } else {
62                    $test .= qq|$class -> new("$in[1]")|;
63                }
64                $test .= ")";
65
66                eval $test;
67                die "\nThe following test died when eval()'ed. This",
68                  "indicates a broken test\n\n    $test\n\nThe error",
69                  " message was\n\n    $@\n" if $@;
70
71                subtest $test, sub {
72                    plan tests => 2,
73
74                    is(ref($x), $class, "output arg is a $class");
75                    is($x, $out, 'output arg has the right value');
76                };
77            }
78        }
79    }
80
81    # As instance method.
82
83    {
84        for my $base_as_scalar (1, 0) {
85            for my $elements_as_scalar (1, 0) {
86                for my $str ("-1", "0", "1", "-inf", "+inf", "NaN") {
87
88                    my $x;
89                    my $test = qq|\$x = $class -> new("$str");|;
90                    $test .= " \$x -> from_base_num([";
91                    if ($elements_as_scalar) {
92                        $test .= join ", ", map qq|"$_"|, @{ $in[0] };
93                    } else {
94                        $test .= join ", ", map qq|$class -> new("$_")|, @{ $in[0] };
95                    }
96                    $test .= "], ";
97                    if ($base_as_scalar) {
98                        $test .= qq|"$in[1]"|;
99                    } else {
100                        $test .= qq|$class -> new("$in[1]")|;
101                    }
102                    $test .= ")";
103
104                    eval $test;
105                    die "\nThe following test died when eval()'ed. This",
106                      "indicates a broken test\n\n    $test\n\nThe error",
107                      " message was\n\n    $@\n" if $@;
108
109                    subtest $test, sub {
110                        plan tests => 2,
111
112                        is(ref($x), $class, "output arg is a $class");
113                        is($x, $out, 'output arg has the right value');
114                    };
115                }
116            }
117        }
118    }
119}
120