Re: [PATCH] 'make clobber' on Cygwin broken
[p5sagit/p5-mst-13.2.git] / lib / Math / BigInt / t / bigintc.t
CommitLineData
0716bf9b 1#!/usr/bin/perl -w
2
3use strict;
4use Test;
5
6BEGIN
7 {
8 $| = 1;
027dc388 9 chdir 't' if -d 't';
0716bf9b 10 unshift @INC, '../lib'; # for running manually
61f5c3f5 11 }
12
13use Math::BigInt::Calc;
14
15BEGIN
16 {
17 my $additional = 0;
18 $additional = 27 if $Math::BigInt::Calc::VERSION > 0.18;
19 plan tests => 71 + $additional;
0716bf9b 20 }
21
027dc388 22# testing of Math::BigInt::Calc, primarily for interface/api and not for the
0716bf9b 23# math functionality
24
574bacfe 25my $C = 'Math::BigInt::Calc'; # pass classname to sub's
26
0716bf9b 27# _new and _str
bd05a461 28my $x = $C->_new(\"123"); my $y = $C->_new(\"321");
29ok (ref($x),'ARRAY'); ok (${$C->_str($x)},123); ok (${$C->_str($y)},321);
0716bf9b 30
61f5c3f5 31###############################################################################
0716bf9b 32# _add, _sub, _mul, _div
bd05a461 33ok (${$C->_str($C->_add($x,$y))},444);
34ok (${$C->_str($C->_sub($x,$y))},123);
35ok (${$C->_str($C->_mul($x,$y))},39483);
36ok (${$C->_str($C->_div($x,$y))},123);
0716bf9b 37
61f5c3f5 38###############################################################################
39# check that mul/div doesn't change $y
40# and returns the same reference, not something new
bd05a461 41ok (${$C->_str($C->_mul($x,$y))},39483);
61f5c3f5 42ok (${$C->_str($x)},39483); ok (${$C->_str($y)},321);
43
44ok (${$C->_str($C->_div($x,$y))},123);
45ok (${$C->_str($x)},123); ok (${$C->_str($y)},321);
46
47$x = $C->_new(\"39483");
48my ($x1,$r1) = $C->_div($x,$y);
49ok ("$x1","$x");
50$C->_inc($x1);
51ok ("$x1","$x");
52ok (${$C->_str($r1)},'0');
53
54$x = $C->_new(\"39483"); # reset
55
56###############################################################################
bd05a461 57my $z = $C->_new(\"2");
58ok (${$C->_str($C->_add($x,$z))},39485);
59my ($re,$rr) = $C->_div($x,$y);
0716bf9b 60
bd05a461 61ok (${$C->_str($re)},123); ok (${$C->_str($rr)},2);
0716bf9b 62
63# is_zero, _is_one, _one, _zero
bd05a461 64ok ($C->_is_zero($x),0);
65ok ($C->_is_one($x),0);
0716bf9b 66
bd05a461 67ok ($C->_is_one($C->_one()),1); ok ($C->_is_one($C->_zero()),0);
68ok ($C->_is_zero($C->_zero()),1); ok ($C->_is_zero($C->_one()),0);
574bacfe 69
70# is_odd, is_even
bd05a461 71ok ($C->_is_odd($C->_one()),1); ok ($C->_is_odd($C->_zero()),0);
72ok ($C->_is_even($C->_one()),0); ok ($C->_is_even($C->_zero()),1);
0716bf9b 73
574bacfe 74# _digit
bd05a461 75$x = $C->_new(\"123456789");
76ok ($C->_digit($x,0),9);
77ok ($C->_digit($x,1),8);
78ok ($C->_digit($x,2),7);
79ok ($C->_digit($x,-1),1);
80ok ($C->_digit($x,-2),2);
81ok ($C->_digit($x,-3),3);
574bacfe 82
83# _copy
bd05a461 84$x = $C->_new(\"12356");
85ok (${$C->_str($C->_copy($x))},12356);
574bacfe 86
87# _zeros
bd05a461 88$x = $C->_new(\"1256000000"); ok ($C->_zeros($x),6);
89$x = $C->_new(\"152"); ok ($C->_zeros($x),0);
90$x = $C->_new(\"123000"); ok ($C->_zeros($x),3);
574bacfe 91
92# _lsft, _rsft
bd05a461 93$x = $C->_new(\"10"); $y = $C->_new(\"3");
94ok (${$C->_str($C->_lsft($x,$y,10))},10000);
95$x = $C->_new(\"20"); $y = $C->_new(\"3");
96ok (${$C->_str($C->_lsft($x,$y,10))},20000);
61f5c3f5 97
bd05a461 98$x = $C->_new(\"128"); $y = $C->_new(\"4");
61f5c3f5 99ok (${$C->_str($C->_lsft($x,$y,2))}, 128 << 4);
100
bd05a461 101$x = $C->_new(\"1000"); $y = $C->_new(\"3");
102ok (${$C->_str($C->_rsft($x,$y,10))},1);
103$x = $C->_new(\"20000"); $y = $C->_new(\"3");
104ok (${$C->_str($C->_rsft($x,$y,10))},20);
105$x = $C->_new(\"256"); $y = $C->_new(\"4");
61f5c3f5 106ok (${$C->_str($C->_rsft($x,$y,2))},256 >> 4);
0716bf9b 107
574bacfe 108# _acmp
bd05a461 109$x = $C->_new(\"123456789");
110$y = $C->_new(\"987654321");
111ok ($C->_acmp($x,$y),-1);
112ok ($C->_acmp($y,$x),1);
113ok ($C->_acmp($x,$x),0);
114ok ($C->_acmp($y,$y),0);
574bacfe 115
116# _div
bd05a461 117$x = $C->_new(\"3333"); $y = $C->_new(\"1111");
118ok (${$C->_str(scalar $C->_div($x,$y))},3);
119$x = $C->_new(\"33333"); $y = $C->_new(\"1111"); ($x,$y) = $C->_div($x,$y);
120ok (${$C->_str($x)},30); ok (${$C->_str($y)},3);
121$x = $C->_new(\"123"); $y = $C->_new(\"1111");
122($x,$y) = $C->_div($x,$y); ok (${$C->_str($x)},0); ok (${$C->_str($y)},123);
574bacfe 123
124# _num
bd05a461 125$x = $C->_new(\"12345"); $x = $C->_num($x); ok (ref($x)||'',''); ok ($x,12345);
574bacfe 126
e745a66c 127# _inc
128$x = $C->_new(\"1000"); $C->_inc($x); ok (${$C->_str($x)},'1001');
129$C->_dec($x); ok (${$C->_str($x)},'1000');
130
131my $BL = Math::BigInt::Calc::_base_len();
132$x = '1' . '0' x $BL;
133$z = '1' . '0' x ($BL-1); $z .= '1';
134$x = $C->_new(\$x); $C->_inc($x); ok (${$C->_str($x)},$z);
135
136$x = '1' . '0' x $BL; $z = '9' x $BL;
137$x = $C->_new(\$x); $C->_dec($x); ok (${$C->_str($x)},$z);
138
574bacfe 139# should not happen:
bd05a461 140# $x = $C->_new(\"-2"); $y = $C->_new(\"4"); ok ($C->_acmp($x,$y),-1);
574bacfe 141
394e6ffb 142# _mod
143$x = $C->_new(\"1000"); $y = $C->_new(\"3");
144ok (${$C->_str(scalar $C->_mod($x,$y))},1);
145$x = $C->_new(\"1000"); $y = $C->_new(\"2");
146ok (${$C->_str(scalar $C->_mod($x,$y))},0);
147
148# _and, _or, _xor
149$x = $C->_new(\"5"); $y = $C->_new(\"2");
150ok (${$C->_str(scalar $C->_xor($x,$y))},7);
151$x = $C->_new(\"5"); $y = $C->_new(\"2");
152ok (${$C->_str(scalar $C->_or($x,$y))},7);
153$x = $C->_new(\"5"); $y = $C->_new(\"3");
154ok (${$C->_str(scalar $C->_and($x,$y))},1);
155
156# _from_hex, _from_bin
157ok (${$C->_str(scalar $C->_from_hex(\"0xFf"))},255);
158ok (${$C->_str(scalar $C->_from_bin(\"0b10101011"))},160+11);
159
61f5c3f5 160# _as_hex, _as_bin
161ok (${$C->_str(scalar $C->_from_hex( $C->_as_hex( $C->_new(\"128"))))}, 128);
162ok (${$C->_str(scalar $C->_from_bin( $C->_as_bin( $C->_new(\"128"))))}, 128);
163
574bacfe 164# _check
bd05a461 165$x = $C->_new(\"123456789");
166ok ($C->_check($x),0);
167ok ($C->_check(123),'123 is not a reference');
0716bf9b 168
61f5c3f5 169###############################################################################
170# _to_large and _to_small (last since they toy with BASE_LEN etc)
171
172exit if $Math::BigInt::Calc::VERSION < 0.19;
173
174$C->_base_len(5,7); $x = [ qw/67890 12345 67890 12345/ ]; $C->_to_large($x);
175ok (@$x,3);
176ok ($x->[0], '4567890'); ok ($x->[1], '7890123'); ok ($x->[2], '123456');
177
178$C->_base_len(5,7); $x = [ qw/54321 54321 54321 54321/ ]; $C->_to_large($x);
179ok (@$x,3);
180ok ($x->[0], '2154321'); ok ($x->[1], '4321543'); ok ($x->[2], '543215');
181
182$C->_base_len(6,7); $x = [ qw/654321 654321 654321 654321/ ];
183$C->_to_large($x); ok (@$x,4);
184ok ($x->[0], '1654321'); ok ($x->[1], '2165432');
185ok ($x->[2], '3216543'); ok ($x->[3], '654');
186
187$C->_base_len(5,7); $C->_to_small($x); ok (@$x,5);
188ok ($x->[0], '54321'); ok ($x->[1], '43216');
189ok ($x->[2], '32165'); ok ($x->[3], '21654');
190ok ($x->[4], '6543');
191
192$C->_base_len(7,10); $x = [ qw/0000000 0000000 9999990 9999999/ ];
193$C->_to_large($x); ok (@$x,3);
194ok ($x->[0], '0000000000'); ok ($x->[1], '9999900000');
195ok ($x->[2], '99999999');
196
197$C->_base_len(7,10); $x = [ qw/0000000 0000000 9999990 9999999 99/ ];
198$C->_to_large($x); ok (@$x,3);
199ok ($x->[0], '0000000000'); ok ($x->[1], '9999900000');
200ok ($x->[2], '9999999999');
201
0716bf9b 202# done
203
2041;
574bacfe 205