1# -*- mode: perl; -*-
2
3use strict;
4use warnings;
5use lib 't';
6
7use Test::More tests => 50;
8
9# testing of Math::BigInt:Scalar (used by the testsuite),
10# primarily for interface/api and not for the math functionality
11
12use Math::BigInt::Scalar;
13
14my $class = 'Math::BigInt::Scalar'; # pass classname to sub's
15
16# _new and _str
17
18my $x = $class->_new("123");
19my $y = $class->_new("321");
20is(ref($x), 'SCALAR', 'ref($x)');
21is($class->_str($x), 123, "$class->_str(\$x)");
22is($class->_str($y), 321, "$class->_str(\$y)");
23
24# _add, _sub, _mul, _div
25
26is($class->_str($class->_add($x, $y)), 444,
27   "$class->_str($class->_add(\$x, \$y)");
28is($class->_str($class->_sub($x, $y)), 123,
29   "$class->_str($class->_sub(\$x, \$y)");
30is($class->_str($class->_mul($x, $y)), 39483,
31   "$class->_str($class->_mul(\$x, \$y))");
32is($class->_str($class->_div($x, $y)), 123,
33   "$class->_str($class->_div(\$x, \$y)");
34
35$class->_mul($x, $y);
36is($class->_str($x), 39483, "$class->_str(\$x)");
37is($class->_str($y),   321, "$class->_str(\$y)");
38
39my $z = $class->_new("2");
40is($class->_str($class->_add($x, $z)), 39485,
41   "$class->_str($class->_add(\$x, \$z)");
42
43my ($re, $rr) = $class->_div($x, $y);
44is($class->_str($re), 123, "$class->_str(\$re)");
45is($class->_str($rr),   2, "$class->_str(\$rr)");
46
47# is_zero, _is_one, _one, _zero
48
49is($class->_is_zero($x), 0, "$class->_is_zero($x)");
50is($class->_is_one($x),  0, "$class->_is_one($x)");
51
52is($class->_is_one($class->_one()), 1,
53   "$class->_is_one($class->_one())");
54is($class->_is_one($class->_zero()), 0,
55   "$class->_is_one($class->_zero())");
56is($class->_is_zero($class->_zero()), 1,
57   "$class->_is_zero($class->_zero())");
58is($class->_is_zero($class->_one()), 0,
59   "$class->_is_zero($class->_one())");
60
61# is_odd, is_even
62
63is($class->_is_odd($class->_one()), 1,
64   "$class->_is_odd($class->_one())");
65is($class->_is_odd($class->_zero()), 0,
66   "$class->_is_odd($class->_zero())");
67is($class->_is_even($class->_one()), 0,
68   "$class->_is_even($class->_one())");
69is($class->_is_even($class->_zero()), 1,
70   "$class->_is_even($class->_zero())");
71
72# _digit
73
74$x = $class->_new("123456789");
75is($class->_digit($x,  0), 9, "$class->_digit(\$x, 0)");
76is($class->_digit($x,  1), 8, "$class->_digit(\$x, 1)");
77is($class->_digit($x,  2), 7, "$class->_digit(\$x, 2)");
78is($class->_digit($x, -1), 1, "$class->_digit(\$x, -1)");
79is($class->_digit($x, -2), 2, "$class->_digit(\$x, -2)");
80is($class->_digit($x, -3), 3, "$class->_digit(\$x, -3)");
81
82# _copy
83
84$x = $class->_new("12356");
85is($class->_str($class->_copy($x)), 12356,
86   "$class->_str($class->_copy(\$x))");
87
88# _acmp
89
90$x = $class->_new("123456789");
91$y = $class->_new("987654321");
92is($class->_acmp($x, $y), -1, "$class->_acmp(\$x, \$y)");
93is($class->_acmp($y, $x),  1, "$class->_acmp(\$y, \$x)");
94is($class->_acmp($x, $x),  0, "$class->_acmp(\$x, \$x)");
95is($class->_acmp($y, $y),  0, "$class->_acmp(\$y, \$y)");
96
97# _div
98
99$x = $class->_new("3333");
100$y = $class->_new("1111");
101is($class->_str(scalar $class->_div($x, $y)), 3,
102   "$class->_str(scalar $class->_div(\$x, \$y))");
103
104$x = $class->_new("33333");
105$y = $class->_new("1111");
106($x, $y) = $class->_div($x, $y);
107is($class->_str($x), 30, "$class->_str(\$x)");
108is($class->_str($y),  3, "$class->_str(\$y)");
109
110$x = $class->_new("123");
111$y = $class->_new("1111");
112($x, $y) = $class->_div($x, $y);
113is($class->_str($x),   0, "$class->_str(\$x)");
114is($class->_str($y), 123, "$class->_str(\$y)");
115
116# _num
117
118$x = $class->_new("12345");
119$x = $class->_num($x);
120is(ref($x) || '', '', 'ref($x) || ""');
121is($x, 12345, '$x');
122
123# _len
124
125$x = $class->_new("12345");
126$x = $class->_len($x);
127is(ref($x) || '', '', 'ref($x) || ""');
128is($x, 5, '$x');
129
130# _and, _or, _xor
131
132$x = $class->_new("3");
133$y = $class->_new("4");
134is($class->_str($class->_or($x, $y)), 7,
135   "$class->_str($class->_or($x, $y))");
136
137$x = $class->_new("1");
138$y = $class->_new("4");
139is($class->_str($class->_xor($x, $y)), 5,
140   "$class->_str($class->_xor($x, $y))");
141
142$x = $class->_new("7");
143$y = $class->_new("3");
144is($class->_str($class->_and($x, $y)), 3,
145   "$class->_str($class->_and($x, $y))");
146
147# _pow
148
149$x = $class->_new("2");
150$y = $class->_new("4");
151is($class->_str($class->_pow($x, $y)), 16,
152   "$class->_str($class->_pow($x, $y))");
153
154$x = $class->_new("2");
155$y = $class->_new("5");
156is($class->_str($class->_pow($x, $y)), 32,
157   "$class->_str($class->_pow($x, $y))");
158
159$x = $class->_new("3");
160$y = $class->_new("3");
161is($class->_str($class->_pow($x, $y)), 27,
162   "$class->_str($class->_pow($x, $y))");
163
164# _check
165
166$x = $class->_new("123456789");
167is($class->_check($x), 0,
168   "$class->_check(\$x)");
169is($class->_check(123), '123 is not a reference',
170   "$class->_check(123)");
171