xref: /aosp_15_r20/external/double-conversion/test/cctest/test-bignum.cc (revision a6021da3bd53a1cb979b0905bbb837249345d1b1)
1*a6021da3SAndroid Build Coastguard Worker // Copyright 2010 the V8 project authors. All rights reserved.
2*a6021da3SAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
3*a6021da3SAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
4*a6021da3SAndroid Build Coastguard Worker // met:
5*a6021da3SAndroid Build Coastguard Worker //
6*a6021da3SAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
7*a6021da3SAndroid Build Coastguard Worker //       notice, this list of conditions and the following disclaimer.
8*a6021da3SAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
9*a6021da3SAndroid Build Coastguard Worker //       copyright notice, this list of conditions and the following
10*a6021da3SAndroid Build Coastguard Worker //       disclaimer in the documentation and/or other materials provided
11*a6021da3SAndroid Build Coastguard Worker //       with the distribution.
12*a6021da3SAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
13*a6021da3SAndroid Build Coastguard Worker //       contributors may be used to endorse or promote products derived
14*a6021da3SAndroid Build Coastguard Worker //       from this software without specific prior written permission.
15*a6021da3SAndroid Build Coastguard Worker //
16*a6021da3SAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17*a6021da3SAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18*a6021da3SAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19*a6021da3SAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20*a6021da3SAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21*a6021da3SAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22*a6021da3SAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23*a6021da3SAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24*a6021da3SAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25*a6021da3SAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26*a6021da3SAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*a6021da3SAndroid Build Coastguard Worker 
28*a6021da3SAndroid Build Coastguard Worker #include <stdlib.h>
29*a6021da3SAndroid Build Coastguard Worker #include <string.h>
30*a6021da3SAndroid Build Coastguard Worker 
31*a6021da3SAndroid Build Coastguard Worker 
32*a6021da3SAndroid Build Coastguard Worker #include "double-conversion/bignum.h"
33*a6021da3SAndroid Build Coastguard Worker #include "cctest.h"
34*a6021da3SAndroid Build Coastguard Worker #include "double-conversion/utils.h"
35*a6021da3SAndroid Build Coastguard Worker 
36*a6021da3SAndroid Build Coastguard Worker using namespace double_conversion;
37*a6021da3SAndroid Build Coastguard Worker 
38*a6021da3SAndroid Build Coastguard Worker 
39*a6021da3SAndroid Build Coastguard Worker static const int kBufferSize = 1024;
40*a6021da3SAndroid Build Coastguard Worker 
AssignHexString(Bignum * bignum,const char * str)41*a6021da3SAndroid Build Coastguard Worker static void AssignHexString(Bignum* bignum, const char* str) {
42*a6021da3SAndroid Build Coastguard Worker   int len = static_cast<int>(strlen(str));
43*a6021da3SAndroid Build Coastguard Worker   bignum->AssignHexString(Vector<const char>(str, len));
44*a6021da3SAndroid Build Coastguard Worker }
45*a6021da3SAndroid Build Coastguard Worker 
46*a6021da3SAndroid Build Coastguard Worker 
AssignDecimalString(Bignum * bignum,const char * str)47*a6021da3SAndroid Build Coastguard Worker static void AssignDecimalString(Bignum* bignum, const char* str) {
48*a6021da3SAndroid Build Coastguard Worker   int len = static_cast<int>(strlen(str));
49*a6021da3SAndroid Build Coastguard Worker   bignum->AssignDecimalString(Vector<const char>(str, len));
50*a6021da3SAndroid Build Coastguard Worker }
51*a6021da3SAndroid Build Coastguard Worker 
52*a6021da3SAndroid Build Coastguard Worker 
TEST(Assign)53*a6021da3SAndroid Build Coastguard Worker TEST(Assign) {
54*a6021da3SAndroid Build Coastguard Worker   char buffer[kBufferSize];
55*a6021da3SAndroid Build Coastguard Worker   Bignum bignum;
56*a6021da3SAndroid Build Coastguard Worker   Bignum bignum2;
57*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0);
58*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
59*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("0", buffer);
60*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0xA);
61*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
62*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("A", buffer);
63*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x20);
64*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
65*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("20", buffer);
66*a6021da3SAndroid Build Coastguard Worker 
67*a6021da3SAndroid Build Coastguard Worker 
68*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt64(0);
69*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
70*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("0", buffer);
71*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt64(0xA);
72*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
73*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("A", buffer);
74*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt64(0x20);
75*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
76*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("20", buffer);
77*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt64(0x100);
78*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
79*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("100", buffer);
80*a6021da3SAndroid Build Coastguard Worker 
81*a6021da3SAndroid Build Coastguard Worker   // The first real test, since this will not fit into one bigit.
82*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt64(0x12345678);
83*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
84*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("12345678", buffer);
85*a6021da3SAndroid Build Coastguard Worker 
86*a6021da3SAndroid Build Coastguard Worker   uint64_t big = DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF);
87*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt64(big);
88*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
89*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFFFFFFFFFFF", buffer);
90*a6021da3SAndroid Build Coastguard Worker 
91*a6021da3SAndroid Build Coastguard Worker   big = DOUBLE_CONVERSION_UINT64_2PART_C(0x12345678, 9ABCDEF0);
92*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt64(big);
93*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
94*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("123456789ABCDEF0", buffer);
95*a6021da3SAndroid Build Coastguard Worker 
96*a6021da3SAndroid Build Coastguard Worker   bignum2.AssignBignum(bignum);
97*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum2.ToHexString(buffer, kBufferSize));
98*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("123456789ABCDEF0", buffer);
99*a6021da3SAndroid Build Coastguard Worker 
100*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "0");
101*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
102*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("0", buffer);
103*a6021da3SAndroid Build Coastguard Worker 
104*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1");
105*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
106*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
107*a6021da3SAndroid Build Coastguard Worker 
108*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234567890");
109*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
110*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("499602D2", buffer);
111*a6021da3SAndroid Build Coastguard Worker 
112*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "0");
113*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
114*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("0", buffer);
115*a6021da3SAndroid Build Coastguard Worker 
116*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "123456789ABCDEF0");
117*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
118*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("123456789ABCDEF0", buffer);
119*a6021da3SAndroid Build Coastguard Worker }
120*a6021da3SAndroid Build Coastguard Worker 
121*a6021da3SAndroid Build Coastguard Worker 
TEST(ShiftLeft)122*a6021da3SAndroid Build Coastguard Worker TEST(ShiftLeft) {
123*a6021da3SAndroid Build Coastguard Worker   char buffer[kBufferSize];
124*a6021da3SAndroid Build Coastguard Worker   Bignum bignum;
125*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "0");
126*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
127*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
128*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("0", buffer);
129*a6021da3SAndroid Build Coastguard Worker 
130*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
131*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(1);
132*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
133*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("2", buffer);
134*a6021da3SAndroid Build Coastguard Worker 
135*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
136*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(4);
137*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
138*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10", buffer);
139*a6021da3SAndroid Build Coastguard Worker 
140*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
141*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(32);
142*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
143*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("100000000", buffer);
144*a6021da3SAndroid Build Coastguard Worker 
145*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
146*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(64);
147*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
148*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000000", buffer);
149*a6021da3SAndroid Build Coastguard Worker 
150*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "123456789ABCDEF");
151*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(64);
152*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
153*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("123456789ABCDEF0000000000000000", buffer);
154*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(1);
155*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
156*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("2468ACF13579BDE0000000000000000", buffer);
157*a6021da3SAndroid Build Coastguard Worker }
158*a6021da3SAndroid Build Coastguard Worker 
159*a6021da3SAndroid Build Coastguard Worker 
TEST(AddUInt64)160*a6021da3SAndroid Build Coastguard Worker TEST(AddUInt64) {
161*a6021da3SAndroid Build Coastguard Worker   char buffer[kBufferSize];
162*a6021da3SAndroid Build Coastguard Worker   Bignum bignum;
163*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "0");
164*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(0xA);
165*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
166*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("A", buffer);
167*a6021da3SAndroid Build Coastguard Worker 
168*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
169*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(0xA);
170*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
171*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("B", buffer);
172*a6021da3SAndroid Build Coastguard Worker 
173*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
174*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(0x100);
175*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
176*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("101", buffer);
177*a6021da3SAndroid Build Coastguard Worker 
178*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
179*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(0xFFFF);
180*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
181*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000", buffer);
182*a6021da3SAndroid Build Coastguard Worker 
183*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFF");
184*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(0x1);
185*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
186*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000", buffer);
187*a6021da3SAndroid Build Coastguard Worker 
188*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "10000000000000000000000000000000000000000000");
189*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(0xFFFF);
190*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
191*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1000000000000000000000000000000000000000FFFF", buffer);
192*a6021da3SAndroid Build Coastguard Worker 
193*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
194*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(0x1);
195*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
196*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("100000000000000000000000000000000000000000000", buffer);
197*a6021da3SAndroid Build Coastguard Worker 
198*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
199*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
200*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(1);
201*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
202*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000000000000001", buffer);
203*a6021da3SAndroid Build Coastguard Worker 
204*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
205*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
206*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(0xFFFF);
207*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
208*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1000000000000000000000FFFF", buffer);
209*a6021da3SAndroid Build Coastguard Worker 
210*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "0");
211*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xA, 00000000));
212*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
213*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("A00000000", buffer);
214*a6021da3SAndroid Build Coastguard Worker 
215*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
216*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xA, 00000000));
217*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
218*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("A00000001", buffer);
219*a6021da3SAndroid Build Coastguard Worker 
220*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
221*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0x100, 00000000));
222*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
223*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000001", buffer);
224*a6021da3SAndroid Build Coastguard Worker 
225*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
226*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFF, 00000000));
227*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
228*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFF00000001", buffer);
229*a6021da3SAndroid Build Coastguard Worker 
230*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFF");
231*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0x1, 00000000));
232*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
233*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10FFFFFFF", buffer);
234*a6021da3SAndroid Build Coastguard Worker 
235*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "10000000000000000000000000000000000000000000");
236*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFF, 00000000));
237*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
238*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000000000000000000000FFFF00000000", buffer);
239*a6021da3SAndroid Build Coastguard Worker 
240*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
241*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0x1, 00000000));
242*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
243*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1000000000000000000000000000000000000FFFFFFFF", buffer);
244*a6021da3SAndroid Build Coastguard Worker 
245*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
246*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
247*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0x1, 00000000));
248*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
249*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000000100000000", buffer);
250*a6021da3SAndroid Build Coastguard Worker 
251*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
252*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
253*a6021da3SAndroid Build Coastguard Worker   bignum.AddUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFF, 00000000));
254*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
255*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000FFFF00000000", buffer);
256*a6021da3SAndroid Build Coastguard Worker }
257*a6021da3SAndroid Build Coastguard Worker 
258*a6021da3SAndroid Build Coastguard Worker 
TEST(AddBignum)259*a6021da3SAndroid Build Coastguard Worker TEST(AddBignum) {
260*a6021da3SAndroid Build Coastguard Worker   char buffer[kBufferSize];
261*a6021da3SAndroid Build Coastguard Worker   Bignum bignum;
262*a6021da3SAndroid Build Coastguard Worker   Bignum other;
263*a6021da3SAndroid Build Coastguard Worker 
264*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1");
265*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "0");
266*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
267*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
268*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
269*a6021da3SAndroid Build Coastguard Worker 
270*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
271*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
272*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
273*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("2", buffer);
274*a6021da3SAndroid Build Coastguard Worker 
275*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFF");
276*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
277*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
278*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000", buffer);
279*a6021da3SAndroid Build Coastguard Worker 
280*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFF");
281*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
282*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
283*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("100000000000000", buffer);
284*a6021da3SAndroid Build Coastguard Worker 
285*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "10000000000000000000000000000000000000000000");
286*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
287*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
288*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000000000000000000000000000000001", buffer);
289*a6021da3SAndroid Build Coastguard Worker 
290*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1000000000000");
291*a6021da3SAndroid Build Coastguard Worker 
292*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
293*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
294*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
295*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1000000000001", buffer);
296*a6021da3SAndroid Build Coastguard Worker 
297*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFF");
298*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
299*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
300*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("100000FFFFFFF", buffer);
301*a6021da3SAndroid Build Coastguard Worker 
302*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "10000000000000000000000000000000000000000000");
303*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
304*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
305*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000000000000000000001000000000000", buffer);
306*a6021da3SAndroid Build Coastguard Worker 
307*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
308*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
309*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
310*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1000000000000000000000000000000FFFFFFFFFFFF", buffer);
311*a6021da3SAndroid Build Coastguard Worker 
312*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
313*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
314*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
315*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
316*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000001000000000000", buffer);
317*a6021da3SAndroid Build Coastguard Worker 
318*a6021da3SAndroid Build Coastguard Worker   other.ShiftLeft(64);
319*a6021da3SAndroid Build Coastguard Worker   CHECK(other.ToHexString(buffer, kBufferSize));
320*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000000000000000000", buffer);
321*a6021da3SAndroid Build Coastguard Worker 
322*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
323*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
324*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
325*a6021da3SAndroid Build Coastguard Worker 
326*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
327*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
328*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000000000000000001", buffer);
329*a6021da3SAndroid Build Coastguard Worker 
330*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFF");
331*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
332*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
333*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1000000000000000000000FFFFFFF", buffer);
334*a6021da3SAndroid Build Coastguard Worker 
335*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "10000000000000000000000000000000000000000000");
336*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
337*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
338*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000010000000000000000000000000000", buffer);
339*a6021da3SAndroid Build Coastguard Worker 
340*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
341*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
342*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
343*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("100000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFF", buffer);
344*a6021da3SAndroid Build Coastguard Worker 
345*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
346*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
347*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
348*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
349*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10010000000000000000000000000", buffer);
350*a6021da3SAndroid Build Coastguard Worker }
351*a6021da3SAndroid Build Coastguard Worker 
352*a6021da3SAndroid Build Coastguard Worker 
TEST(SubtractBignum)353*a6021da3SAndroid Build Coastguard Worker TEST(SubtractBignum) {
354*a6021da3SAndroid Build Coastguard Worker   char buffer[kBufferSize];
355*a6021da3SAndroid Build Coastguard Worker   Bignum bignum;
356*a6021da3SAndroid Build Coastguard Worker   Bignum other;
357*a6021da3SAndroid Build Coastguard Worker 
358*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1");
359*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "0");
360*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
361*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
362*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
363*a6021da3SAndroid Build Coastguard Worker 
364*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "2");
365*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "0");
366*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
367*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
368*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("2", buffer);
369*a6021da3SAndroid Build Coastguard Worker 
370*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "10000000");
371*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1");
372*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
373*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
374*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFF", buffer);
375*a6021da3SAndroid Build Coastguard Worker 
376*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "100000000000000");
377*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1");
378*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
379*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
380*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFFFFFFFFF", buffer);
381*a6021da3SAndroid Build Coastguard Worker 
382*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "10000000000000000000000000000000000000000001");
383*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1");
384*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
385*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
386*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000000000000000000000000000000000", buffer);
387*a6021da3SAndroid Build Coastguard Worker 
388*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1000000000001");
389*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1000000000000");
390*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
391*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
392*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
393*a6021da3SAndroid Build Coastguard Worker 
394*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "100000FFFFFFF");
395*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1000000000000");
396*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
397*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
398*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFF", buffer);
399*a6021da3SAndroid Build Coastguard Worker 
400*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "10000000000000000000000000000001000000000000");
401*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1000000000000");
402*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
403*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
404*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000000000000000000000000000000000", buffer);
405*a6021da3SAndroid Build Coastguard Worker 
406*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1000000000000000000000000000000FFFFFFFFFFFF");
407*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1000000000000");
408*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
409*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
410*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", buffer);
411*a6021da3SAndroid Build Coastguard Worker 
412*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
413*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
414*a6021da3SAndroid Build Coastguard Worker   // "10 0000 0000 0000 0000 0000 0000"
415*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1000000000000");
416*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
417*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
418*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFFFFFFFF000000000000", buffer);
419*a6021da3SAndroid Build Coastguard Worker 
420*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1000000000000");
421*a6021da3SAndroid Build Coastguard Worker   other.ShiftLeft(48);
422*a6021da3SAndroid Build Coastguard Worker   // other == "1000000000000000000000000"
423*a6021da3SAndroid Build Coastguard Worker 
424*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
425*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
426*a6021da3SAndroid Build Coastguard Worker   // bignum == "10000000000000000000000000"
427*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
428*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
429*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("F000000000000000000000000", buffer);
430*a6021da3SAndroid Build Coastguard Worker 
431*a6021da3SAndroid Build Coastguard Worker   other.AssignUInt16(0x1);
432*a6021da3SAndroid Build Coastguard Worker   other.ShiftLeft(35);
433*a6021da3SAndroid Build Coastguard Worker   // other == "800000000"
434*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFF");
435*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(60);
436*a6021da3SAndroid Build Coastguard Worker   // bignum = FFFFFFF000000000000000
437*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
438*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
439*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFEFFFFFF800000000", buffer);
440*a6021da3SAndroid Build Coastguard Worker 
441*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "10000000000000000000000000000000000000000000");
442*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
443*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
444*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800000000", buffer);
445*a6021da3SAndroid Build Coastguard Worker 
446*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
447*a6021da3SAndroid Build Coastguard Worker   bignum.SubtractBignum(other);
448*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
449*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFF", buffer);
450*a6021da3SAndroid Build Coastguard Worker }
451*a6021da3SAndroid Build Coastguard Worker 
452*a6021da3SAndroid Build Coastguard Worker 
TEST(MultiplyUInt32)453*a6021da3SAndroid Build Coastguard Worker TEST(MultiplyUInt32) {
454*a6021da3SAndroid Build Coastguard Worker   char buffer[kBufferSize];
455*a6021da3SAndroid Build Coastguard Worker   Bignum bignum;
456*a6021da3SAndroid Build Coastguard Worker 
457*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "0");
458*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0x25);
459*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
460*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("0", buffer);
461*a6021da3SAndroid Build Coastguard Worker 
462*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "2");
463*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0x5);
464*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
465*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("A", buffer);
466*a6021da3SAndroid Build Coastguard Worker 
467*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "10000000");
468*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0x9);
469*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
470*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("90000000", buffer);
471*a6021da3SAndroid Build Coastguard Worker 
472*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "100000000000000");
473*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0xFFFF);
474*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
475*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFF00000000000000", buffer);
476*a6021da3SAndroid Build Coastguard Worker 
477*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "100000000000000");
478*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0xFFFFFFFF);
479*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
480*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFFF00000000000000", buffer);
481*a6021da3SAndroid Build Coastguard Worker 
482*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1234567ABCD");
483*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0xFFF);
484*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
485*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("12333335552433", buffer);
486*a6021da3SAndroid Build Coastguard Worker 
487*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1234567ABCD");
488*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0xFFFFFFF);
489*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
490*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("12345679998A985433", buffer);
491*a6021da3SAndroid Build Coastguard Worker 
492*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
493*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0x2);
494*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
495*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1FFFFFFFFFFFFFFFE", buffer);
496*a6021da3SAndroid Build Coastguard Worker 
497*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
498*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0x4);
499*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
500*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("3FFFFFFFFFFFFFFFC", buffer);
501*a6021da3SAndroid Build Coastguard Worker 
502*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
503*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0xF);
504*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
505*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("EFFFFFFFFFFFFFFF1", buffer);
506*a6021da3SAndroid Build Coastguard Worker 
507*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
508*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0xFFFFFF);
509*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
510*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFEFFFFFFFFFF000001", buffer);
511*a6021da3SAndroid Build Coastguard Worker 
512*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
513*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
514*a6021da3SAndroid Build Coastguard Worker   // "10 0000 0000 0000 0000 0000 0000"
515*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(2);
516*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
517*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("20000000000000000000000000", buffer);
518*a6021da3SAndroid Build Coastguard Worker 
519*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
520*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
521*a6021da3SAndroid Build Coastguard Worker   // "10 0000 0000 0000 0000 0000 0000"
522*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0xF);
523*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
524*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("F0000000000000000000000000", buffer);
525*a6021da3SAndroid Build Coastguard Worker 
526*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0xFFFF);
527*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
528*a6021da3SAndroid Build Coastguard Worker   // "FFFF0 0000 0000 0000 0000 0000 0000"
529*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0xFFFF);
530*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
531*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFE00010000000000000000000000000", buffer);
532*a6021da3SAndroid Build Coastguard Worker 
533*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0xFFFF);
534*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
535*a6021da3SAndroid Build Coastguard Worker   // "FFFF0 0000 0000 0000 0000 0000 0000"
536*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0xFFFFFFFF);
537*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
538*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFEFFFF00010000000000000000000000000", buffer);
539*a6021da3SAndroid Build Coastguard Worker 
540*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0xFFFF);
541*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
542*a6021da3SAndroid Build Coastguard Worker   // "FFFF0 0000 0000 0000 0000 0000 0000"
543*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0xFFFFFFFF);
544*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
545*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFEFFFF00010000000000000000000000000", buffer);
546*a6021da3SAndroid Build Coastguard Worker 
547*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "15611230384529777");
548*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(10000000);
549*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
550*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("210EDD6D4CDD2580EE80", buffer);
551*a6021da3SAndroid Build Coastguard Worker }
552*a6021da3SAndroid Build Coastguard Worker 
553*a6021da3SAndroid Build Coastguard Worker 
TEST(MultiplyUInt64)554*a6021da3SAndroid Build Coastguard Worker TEST(MultiplyUInt64) {
555*a6021da3SAndroid Build Coastguard Worker   char buffer[kBufferSize];
556*a6021da3SAndroid Build Coastguard Worker   Bignum bignum;
557*a6021da3SAndroid Build Coastguard Worker 
558*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "0");
559*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(0x25);
560*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
561*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("0", buffer);
562*a6021da3SAndroid Build Coastguard Worker 
563*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "2");
564*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(0x5);
565*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
566*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("A", buffer);
567*a6021da3SAndroid Build Coastguard Worker 
568*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "10000000");
569*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(0x9);
570*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
571*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("90000000", buffer);
572*a6021da3SAndroid Build Coastguard Worker 
573*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "100000000000000");
574*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(0xFFFF);
575*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
576*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFF00000000000000", buffer);
577*a6021da3SAndroid Build Coastguard Worker 
578*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "100000000000000");
579*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF));
580*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
581*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFFFFFFFFFFF00000000000000", buffer);
582*a6021da3SAndroid Build Coastguard Worker 
583*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1234567ABCD");
584*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(0xFFF);
585*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
586*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("12333335552433", buffer);
587*a6021da3SAndroid Build Coastguard Worker 
588*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "1234567ABCD");
589*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFF, FFFFFFFF));
590*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
591*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1234567ABCBDCBA985433", buffer);
592*a6021da3SAndroid Build Coastguard Worker 
593*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
594*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(0x2);
595*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
596*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1FFFFFFFFFFFFFFFE", buffer);
597*a6021da3SAndroid Build Coastguard Worker 
598*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
599*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(0x4);
600*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
601*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("3FFFFFFFFFFFFFFFC", buffer);
602*a6021da3SAndroid Build Coastguard Worker 
603*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
604*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(0xF);
605*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
606*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("EFFFFFFFFFFFFFFF1", buffer);
607*a6021da3SAndroid Build Coastguard Worker 
608*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFFFF");
609*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF));
610*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
611*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFFFFFFFFFFE0000000000000001", buffer);
612*a6021da3SAndroid Build Coastguard Worker 
613*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
614*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
615*a6021da3SAndroid Build Coastguard Worker   // "10 0000 0000 0000 0000 0000 0000"
616*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(2);
617*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
618*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("20000000000000000000000000", buffer);
619*a6021da3SAndroid Build Coastguard Worker 
620*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0x1);
621*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
622*a6021da3SAndroid Build Coastguard Worker   // "10 0000 0000 0000 0000 0000 0000"
623*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(0xF);
624*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
625*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("F0000000000000000000000000", buffer);
626*a6021da3SAndroid Build Coastguard Worker 
627*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0xFFFF);
628*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
629*a6021da3SAndroid Build Coastguard Worker   // "FFFF0 0000 0000 0000 0000 0000 0000"
630*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(0xFFFF);
631*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
632*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFE00010000000000000000000000000", buffer);
633*a6021da3SAndroid Build Coastguard Worker 
634*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0xFFFF);
635*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
636*a6021da3SAndroid Build Coastguard Worker   // "FFFF0 0000 0000 0000 0000 0000 0000"
637*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(0xFFFFFFFF);
638*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
639*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFEFFFF00010000000000000000000000000", buffer);
640*a6021da3SAndroid Build Coastguard Worker 
641*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(0xFFFF);
642*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(100);
643*a6021da3SAndroid Build Coastguard Worker   // "FFFF0 0000 0000 0000 0000 0000 0000"
644*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF));
645*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
646*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFEFFFFFFFFFFFF00010000000000000000000000000", buffer);
647*a6021da3SAndroid Build Coastguard Worker 
648*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "15611230384529777");
649*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt64(DOUBLE_CONVERSION_UINT64_2PART_C(0x8ac72304, 89e80000));
650*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
651*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1E10EE4B11D15A7F3DE7F3C7680000", buffer);
652*a6021da3SAndroid Build Coastguard Worker }
653*a6021da3SAndroid Build Coastguard Worker 
654*a6021da3SAndroid Build Coastguard Worker 
TEST(MultiplyPowerOfTen)655*a6021da3SAndroid Build Coastguard Worker TEST(MultiplyPowerOfTen) {
656*a6021da3SAndroid Build Coastguard Worker   char buffer[kBufferSize];
657*a6021da3SAndroid Build Coastguard Worker   Bignum bignum;
658*a6021da3SAndroid Build Coastguard Worker 
659*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
660*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(1);
661*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
662*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("3034", buffer);
663*a6021da3SAndroid Build Coastguard Worker 
664*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
665*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(2);
666*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
667*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1E208", buffer);
668*a6021da3SAndroid Build Coastguard Worker 
669*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
670*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(3);
671*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
672*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("12D450", buffer);
673*a6021da3SAndroid Build Coastguard Worker 
674*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
675*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(4);
676*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
677*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("BC4B20", buffer);
678*a6021da3SAndroid Build Coastguard Worker 
679*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
680*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(5);
681*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
682*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("75AEF40", buffer);
683*a6021da3SAndroid Build Coastguard Worker 
684*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
685*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(6);
686*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
687*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("498D5880", buffer);
688*a6021da3SAndroid Build Coastguard Worker 
689*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
690*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(7);
691*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
692*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("2DF857500", buffer);
693*a6021da3SAndroid Build Coastguard Worker 
694*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
695*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(8);
696*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
697*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1CBB369200", buffer);
698*a6021da3SAndroid Build Coastguard Worker 
699*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
700*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(9);
701*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
702*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("11F5021B400", buffer);
703*a6021da3SAndroid Build Coastguard Worker 
704*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
705*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(10);
706*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
707*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("B3921510800", buffer);
708*a6021da3SAndroid Build Coastguard Worker 
709*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
710*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(11);
711*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
712*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("703B4D2A5000", buffer);
713*a6021da3SAndroid Build Coastguard Worker 
714*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
715*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(12);
716*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
717*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("4625103A72000", buffer);
718*a6021da3SAndroid Build Coastguard Worker 
719*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
720*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(13);
721*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
722*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("2BD72A24874000", buffer);
723*a6021da3SAndroid Build Coastguard Worker 
724*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
725*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(14);
726*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
727*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1B667A56D488000", buffer);
728*a6021da3SAndroid Build Coastguard Worker 
729*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
730*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(15);
731*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
732*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("11200C7644D50000", buffer);
733*a6021da3SAndroid Build Coastguard Worker 
734*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
735*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(16);
736*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
737*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("AB407C9EB0520000", buffer);
738*a6021da3SAndroid Build Coastguard Worker 
739*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
740*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(17);
741*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
742*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("6B084DE32E3340000", buffer);
743*a6021da3SAndroid Build Coastguard Worker 
744*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
745*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(18);
746*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
747*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("42E530ADFCE0080000", buffer);
748*a6021da3SAndroid Build Coastguard Worker 
749*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
750*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(19);
751*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
752*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("29CF3E6CBE0C0500000", buffer);
753*a6021da3SAndroid Build Coastguard Worker 
754*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
755*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(20);
756*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
757*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1A218703F6C783200000", buffer);
758*a6021da3SAndroid Build Coastguard Worker 
759*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
760*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(21);
761*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
762*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1054F4627A3CB1F400000", buffer);
763*a6021da3SAndroid Build Coastguard Worker 
764*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
765*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(22);
766*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
767*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("A3518BD8C65EF38800000", buffer);
768*a6021da3SAndroid Build Coastguard Worker 
769*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
770*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(23);
771*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
772*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("6612F7677BFB5835000000", buffer);
773*a6021da3SAndroid Build Coastguard Worker 
774*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
775*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(24);
776*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
777*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("3FCBDAA0AD7D17212000000", buffer);
778*a6021da3SAndroid Build Coastguard Worker 
779*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
780*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(25);
781*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
782*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("27DF68A46C6E2E74B4000000", buffer);
783*a6021da3SAndroid Build Coastguard Worker 
784*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
785*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(26);
786*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
787*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("18EBA166C3C4DD08F08000000", buffer);
788*a6021da3SAndroid Build Coastguard Worker 
789*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
790*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(27);
791*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
792*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("F9344E03A5B0A259650000000", buffer);
793*a6021da3SAndroid Build Coastguard Worker 
794*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
795*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(28);
796*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
797*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("9BC0B0C2478E6577DF20000000", buffer);
798*a6021da3SAndroid Build Coastguard Worker 
799*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
800*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(29);
801*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
802*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("61586E796CB8FF6AEB740000000", buffer);
803*a6021da3SAndroid Build Coastguard Worker 
804*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
805*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(30);
806*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
807*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("3CD7450BE3F39FA2D32880000000", buffer);
808*a6021da3SAndroid Build Coastguard Worker 
809*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
810*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(31);
811*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
812*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("26068B276E7843C5C3F9500000000", buffer);
813*a6021da3SAndroid Build Coastguard Worker 
814*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
815*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(50);
816*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
817*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("149D1B4CFED03B23AB5F4E1196EF45C08000000000000", buffer);
818*a6021da3SAndroid Build Coastguard Worker 
819*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
820*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(100);
821*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
822*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("5827249F27165024FBC47DFCA9359BF316332D1B91ACEECF471FBAB06D9B2"
823*a6021da3SAndroid Build Coastguard Worker            "0000000000000000000000000", buffer);
824*a6021da3SAndroid Build Coastguard Worker 
825*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
826*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(200);
827*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
828*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("64C1F5C06C3816AFBF8DAFD5A3D756365BB0FD020E6F084E759C1F7C99E4F"
829*a6021da3SAndroid Build Coastguard Worker            "55B9ACC667CEC477EB958C2AEEB3C6C19BA35A1AD30B35C51EB72040920000"
830*a6021da3SAndroid Build Coastguard Worker            "0000000000000000000000000000000000000000000000", buffer);
831*a6021da3SAndroid Build Coastguard Worker 
832*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
833*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(500);
834*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
835*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("96741A625EB5D7C91039FEB5C5ACD6D9831EDA5B083D800E6019442C8C8223"
836*a6021da3SAndroid Build Coastguard Worker            "3EAFB3501FE2058062221E15121334928880827DEE1EC337A8B26489F3A40A"
837*a6021da3SAndroid Build Coastguard Worker            "CB440A2423734472D10BFCE886F41B3AF9F9503013D86D088929CA86EEB4D8"
838*a6021da3SAndroid Build Coastguard Worker            "B9C831D0BD53327B994A0326227CFD0ECBF2EB48B02387AAE2D4CCCDF1F1A1"
839*a6021da3SAndroid Build Coastguard Worker            "B8CC4F1FA2C56AD40D0E4DAA9C28CDBF0A549098EA13200000000000000000"
840*a6021da3SAndroid Build Coastguard Worker            "00000000000000000000000000000000000000000000000000000000000000"
841*a6021da3SAndroid Build Coastguard Worker            "0000000000000000000000000000000000000000000000", buffer);
842*a6021da3SAndroid Build Coastguard Worker 
843*a6021da3SAndroid Build Coastguard Worker   AssignDecimalString(&bignum, "1234");
844*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(1000);
845*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
846*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1258040F99B1CD1CC9819C676D413EA50E4A6A8F114BB0C65418C62D399B81"
847*a6021da3SAndroid Build Coastguard Worker            "6361466CA8E095193E1EE97173553597C96673AF67FAFE27A66E7EF2E5EF2E"
848*a6021da3SAndroid Build Coastguard Worker            "E3F5F5070CC17FE83BA53D40A66A666A02F9E00B0E11328D2224B8694C7372"
849*a6021da3SAndroid Build Coastguard Worker            "F3D536A0AD1985911BD361496F268E8B23112500EAF9B88A9BC67B2AB04D38"
850*a6021da3SAndroid Build Coastguard Worker            "7FEFACD00F5AF4F764F9ABC3ABCDE54612DE38CD90CB6647CA389EA0E86B16"
851*a6021da3SAndroid Build Coastguard Worker            "BF7A1F34086E05ADBE00BD1673BE00FAC4B34AF1091E8AD50BA675E0381440"
852*a6021da3SAndroid Build Coastguard Worker            "EA8E9D93E75D816BAB37C9844B1441C38FC65CF30ABB71B36433AF26DD97BD"
853*a6021da3SAndroid Build Coastguard Worker            "ABBA96C03B4919B8F3515B92826B85462833380DC193D79F69D20DD6038C99"
854*a6021da3SAndroid Build Coastguard Worker            "6114EF6C446F0BA28CC772ACBA58B81C04F8FFDE7B18C4E5A3ABC51E637FDF"
855*a6021da3SAndroid Build Coastguard Worker            "6E37FDFF04C940919390F4FF92000000000000000000000000000000000000"
856*a6021da3SAndroid Build Coastguard Worker            "00000000000000000000000000000000000000000000000000000000000000"
857*a6021da3SAndroid Build Coastguard Worker            "00000000000000000000000000000000000000000000000000000000000000"
858*a6021da3SAndroid Build Coastguard Worker            "00000000000000000000000000000000000000000000000000000000000000"
859*a6021da3SAndroid Build Coastguard Worker            "0000000000000000000000000000", buffer);
860*a6021da3SAndroid Build Coastguard Worker 
861*a6021da3SAndroid Build Coastguard Worker   Bignum bignum2;
862*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum2, "3DA774C07FB5DF54284D09C675A492165B830D5DAAEB2A7501"
863*a6021da3SAndroid Build Coastguard Worker                             "DA17CF9DFA1CA2282269F92A25A97314296B717E3DCBB9FE17"
864*a6021da3SAndroid Build Coastguard Worker                             "41A842FE2913F540F40796F2381155763502C58B15AF7A7F88"
865*a6021da3SAndroid Build Coastguard Worker                             "6F744C9164FF409A28F7FA0C41F89ED79C1BE9F322C8578B97"
866*a6021da3SAndroid Build Coastguard Worker                             "841F1CBAA17D901BE1230E3C00E1C643AF32638B5674E01FEA"
867*a6021da3SAndroid Build Coastguard Worker                             "96FC90864E621B856A9E1CE56E6EB545B9C2F8F0CC10DDA88D"
868*a6021da3SAndroid Build Coastguard Worker                             "CC6D282605F8DB67044F2DFD3695E7BA63877AE16701536AE6"
869*a6021da3SAndroid Build Coastguard Worker                             "567C794D0BFE338DFBB42D92D4215AF3BB22BF0A8B283FDDC2"
870*a6021da3SAndroid Build Coastguard Worker                             "C667A10958EA6D2");
871*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum2.ToHexString(buffer, kBufferSize));
872*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("3DA774C07FB5DF54284D09C675A492165B830D5DAAEB2A7501"
873*a6021da3SAndroid Build Coastguard Worker            "DA17CF9DFA1CA2282269F92A25A97314296B717E3DCBB9FE17"
874*a6021da3SAndroid Build Coastguard Worker            "41A842FE2913F540F40796F2381155763502C58B15AF7A7F88"
875*a6021da3SAndroid Build Coastguard Worker            "6F744C9164FF409A28F7FA0C41F89ED79C1BE9F322C8578B97"
876*a6021da3SAndroid Build Coastguard Worker            "841F1CBAA17D901BE1230E3C00E1C643AF32638B5674E01FEA"
877*a6021da3SAndroid Build Coastguard Worker            "96FC90864E621B856A9E1CE56E6EB545B9C2F8F0CC10DDA88D"
878*a6021da3SAndroid Build Coastguard Worker            "CC6D282605F8DB67044F2DFD3695E7BA63877AE16701536AE6"
879*a6021da3SAndroid Build Coastguard Worker            "567C794D0BFE338DFBB42D92D4215AF3BB22BF0A8B283FDDC2"
880*a6021da3SAndroid Build Coastguard Worker            "C667A10958EA6D2", buffer);
881*a6021da3SAndroid Build Coastguard Worker 
882*a6021da3SAndroid Build Coastguard Worker   bignum.AssignBignum(bignum2);
883*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(1);
884*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
885*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("2688A8F84FD1AB949930261C0986DB4DF931E85A8AD2FA8921284EE1C2BC51"
886*a6021da3SAndroid Build Coastguard Worker            "E55915823BBA5789E7EC99E326EEE69F543ECE890929DED9AC79489884BE57"
887*a6021da3SAndroid Build Coastguard Worker            "630AD569E121BB76ED8DAC8FB545A8AFDADF1F8860599AFC47A93B6346C191"
888*a6021da3SAndroid Build Coastguard Worker            "7237F5BD36B73EB29371F4A4EE7A116CB5E8E5808D1BEA4D7F7E3716090C13"
889*a6021da3SAndroid Build Coastguard Worker            "F29E5DDA53F0FD513362A2D20F6505314B9419DB967F8A8A89589FC43917C3"
890*a6021da3SAndroid Build Coastguard Worker            "BB892062B17CBE421DB0D47E34ACCCE060D422CFF60DCBD0277EE038BD509C"
891*a6021da3SAndroid Build Coastguard Worker            "7BC494D8D854F5B76696F927EA99BC00C4A5D7928434", buffer);
892*a6021da3SAndroid Build Coastguard Worker 
893*a6021da3SAndroid Build Coastguard Worker   bignum.AssignBignum(bignum2);
894*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(2);
895*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
896*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1815699B31E30B3CDFBE17D185F44910BBBF313896C3DC95B4B9314D19B5B32"
897*a6021da3SAndroid Build Coastguard Worker            "F57AD71655476B630F3E02DF855502394A74115A5BA2B480BCBCD5F52F6F69D"
898*a6021da3SAndroid Build Coastguard Worker            "E6C5622CB5152A54788BD9D14B896DE8CB73B53C3800DDACC9C51E0C38FAE76"
899*a6021da3SAndroid Build Coastguard Worker            "2F9964232872F9C2738E7150C4AE3F1B18F70583172706FAEE26DC5A78C77A2"
900*a6021da3SAndroid Build Coastguard Worker            "FAA874769E52C01DA5C3499F233ECF3C90293E0FB69695D763DAA3AEDA5535B"
901*a6021da3SAndroid Build Coastguard Worker            "43DAEEDF6E9528E84CEE0EC000C3C8495C1F9C89F6218AF4C23765261CD5ADD"
902*a6021da3SAndroid Build Coastguard Worker            "0787351992A01E5BB8F2A015807AE7A6BB92A08", buffer);
903*a6021da3SAndroid Build Coastguard Worker 
904*a6021da3SAndroid Build Coastguard Worker   bignum.AssignBignum(bignum2);
905*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(5);
906*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
907*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("5E13A4863ADEE3E5C9FE8D0A73423D695D62D8450CED15A8C9F368952C6DC3"
908*a6021da3SAndroid Build Coastguard Worker            "F0EE7D82F3D1EFB7AF38A3B3920D410AFCAD563C8F5F39116E141A3C5C14B3"
909*a6021da3SAndroid Build Coastguard Worker            "58CD73077EA35AAD59F6E24AD98F10D5555ABBFBF33AC361EAF429FD5FBE94"
910*a6021da3SAndroid Build Coastguard Worker            "17DA9EF2F2956011F9F93646AA38048A681D984ED88127073443247CCC167C"
911*a6021da3SAndroid Build Coastguard Worker            "B354A32206EF5A733E73CF82D795A1AD598493211A6D613C39515E0E0F6304"
912*a6021da3SAndroid Build Coastguard Worker            "DCD9C810F3518C7F6A7CB6C81E99E02FCC65E8FDB7B7AE97306CC16A8631CE"
913*a6021da3SAndroid Build Coastguard Worker            "0A2AEF6568276BE4C176964A73C153FDE018E34CB4C2F40", buffer);
914*a6021da3SAndroid Build Coastguard Worker 
915*a6021da3SAndroid Build Coastguard Worker   bignum.AssignBignum(bignum2);
916*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(10);
917*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
918*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("8F8CB8EB51945A7E815809F6121EF2F4E61EF3405CD9432CAD2709749EEAFD"
919*a6021da3SAndroid Build Coastguard Worker            "1B81E843F14A3667A7BDCCC9E0BB795F63CDFDB62844AC7438976C885A0116"
920*a6021da3SAndroid Build Coastguard Worker            "29607DA54F9C023CC366570B7637ED0F855D931752038A614922D0923E382C"
921*a6021da3SAndroid Build Coastguard Worker            "B8E5F6C975672DB76E0DE471937BB9EDB11E28874F1C122D5E1EF38CECE9D0"
922*a6021da3SAndroid Build Coastguard Worker            "0723056BCBD4F964192B76830634B1D322B7EB0062F3267E84F5C824343A77"
923*a6021da3SAndroid Build Coastguard Worker            "4B7DCEE6DD464F01EBDC8C671BB18BB4EF4300A42474A6C77243F2A12B03BF"
924*a6021da3SAndroid Build Coastguard Worker            "0443C38A1C0D2701EDB393135AE0DEC94211F9D4EB51F990800", buffer);
925*a6021da3SAndroid Build Coastguard Worker 
926*a6021da3SAndroid Build Coastguard Worker   bignum.AssignBignum(bignum2);
927*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(50);
928*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
929*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("107A8BE345E24407372FC1DE442CBA696BC23C4FFD5B4BDFD9E5C39559815"
930*a6021da3SAndroid Build Coastguard Worker            "86628CF8472D2D589F2FC2BAD6E0816EC72CBF85CCA663D8A1EC6C51076D8"
931*a6021da3SAndroid Build Coastguard Worker            "2D247E6C26811B7EC4D4300FB1F91028DCB7B2C4E7A60C151161AA7E65E79"
932*a6021da3SAndroid Build Coastguard Worker            "B40917B12B2B5FBE7745984D4E8EFA31F9AE6062427B068B144A9CB155873"
933*a6021da3SAndroid Build Coastguard Worker            "E7C0C9F0115E5AC72DC5A73C4796DB970BF9205AB8C77A6996EB1B417F9D1"
934*a6021da3SAndroid Build Coastguard Worker            "6232431E6313C392203601B9C22CC10DDA88DCC6D282605F8DB67044F2DFD"
935*a6021da3SAndroid Build Coastguard Worker            "3695E7BA63877AE16701536AE6567C794D0BFE338DFBB42D924CF964BD2C0"
936*a6021da3SAndroid Build Coastguard Worker            "F586E03A2FCD35A408000000000000", buffer);
937*a6021da3SAndroid Build Coastguard Worker 
938*a6021da3SAndroid Build Coastguard Worker   bignum.AssignBignum(bignum2);
939*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(100);
940*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
941*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("46784A90ACD0ED3E7759CC585FB32D36EB6034A6F78D92604E3BAA5ED3D8B"
942*a6021da3SAndroid Build Coastguard Worker            "6E60E854439BE448897FB4B7EA5A3D873AA0FCB3CFFD80D0530880E45F511"
943*a6021da3SAndroid Build Coastguard Worker            "722A50CE7E058B5A6F5464DB7500E34984EE3202A9441F44FA1554C0CEA96"
944*a6021da3SAndroid Build Coastguard Worker            "B438A36F25E7C9D56D71AE2CD313EC37534DA299AC0854FC48591A7CF3171"
945*a6021da3SAndroid Build Coastguard Worker            "31265AA4AE62DE32344CE7BEEEF894AE686A2DAAFE5D6D9A10971FFD9C064"
946*a6021da3SAndroid Build Coastguard Worker            "5079B209E1048F58B5192D41D84336AC4C8C489EEF00939CFC9D55C122036"
947*a6021da3SAndroid Build Coastguard Worker            "01B9C22CC10DDA88DCC6D282605F8DB67044F2DFD3695E7BA3F67B96D3A32"
948*a6021da3SAndroid Build Coastguard Worker            "E11FB5561B68744C4035B0800DC166D49D98E3FD1D5BB2000000000000000"
949*a6021da3SAndroid Build Coastguard Worker            "0000000000", buffer);
950*a6021da3SAndroid Build Coastguard Worker 
951*a6021da3SAndroid Build Coastguard Worker   bignum.AssignBignum(bignum2);
952*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(200);
953*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
954*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("508BD351221DF139D72D88CDC0416845A53EE2D0E6B98352509A9AC312F8C"
955*a6021da3SAndroid Build Coastguard Worker            "6CB1A144889416201E0B6CE66EA3EBE259B5FD79ECFC1FD77963CE516CC7E"
956*a6021da3SAndroid Build Coastguard Worker            "2FE73D4B5B710C19F6BCB092C7A2FD76286543B8DBD2C596DFF2C896720BA"
957*a6021da3SAndroid Build Coastguard Worker            "DFF7BC9C366ACEA3A880AEC287C5E6207DF2739B5326FC19D773BD830B109"
958*a6021da3SAndroid Build Coastguard Worker            "ED36C7086544BF8FDB9D4B73719C2B5BC2F571A5937EC46876CD428281F6B"
959*a6021da3SAndroid Build Coastguard Worker            "F287E1E07F25C1B1D46BC37324FF657A8B2E0071DB83B86123CA34004F406"
960*a6021da3SAndroid Build Coastguard Worker            "001082D7945E90C6E8C9A9FEC2B44BE0DDA46E9F52B152E4D1336D2FCFBC9"
961*a6021da3SAndroid Build Coastguard Worker            "96E30CA0082256737365158FE36482AA7EB9DAF2AB128F10E7551A3CD5BE6"
962*a6021da3SAndroid Build Coastguard Worker            "0A922F3A7D5EED38B634A7EC95BCF7021BA6820A292000000000000000000"
963*a6021da3SAndroid Build Coastguard Worker            "00000000000000000000000000000000", buffer);
964*a6021da3SAndroid Build Coastguard Worker 
965*a6021da3SAndroid Build Coastguard Worker   bignum.AssignBignum(bignum2);
966*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByPowerOfTen(500);
967*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
968*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("7845F900E475B5086885BAAAE67C8E85185ACFE4633727F82A4B06B5582AC"
969*a6021da3SAndroid Build Coastguard Worker            "BE933C53357DA0C98C20C5AC900C4D76A97247DF52B79F48F9E35840FB715"
970*a6021da3SAndroid Build Coastguard Worker            "D392CE303E22622B0CF82D9471B398457DD3196F639CEE8BBD2C146873841"
971*a6021da3SAndroid Build Coastguard Worker            "F0699E6C41F04FC7A54B48CEB995BEB6F50FE81DE9D87A8D7F849CC523553"
972*a6021da3SAndroid Build Coastguard Worker            "7B7BBBC1C7CAAFF6E9650BE03B308C6D31012AEF9580F70D3EE2083ADE126"
973*a6021da3SAndroid Build Coastguard Worker            "8940FA7D6308E239775DFD2F8C97FF7EBD525DAFA6512216F7047A62A93DC"
974*a6021da3SAndroid Build Coastguard Worker            "38A0165BDC67E250DCC96A0181DE935A70B38704DC71819F02FC5261FF7E1"
975*a6021da3SAndroid Build Coastguard Worker            "E5F11907678B0A3E519FF4C10A867B0C26CE02BE6960BA8621A87303C101C"
976*a6021da3SAndroid Build Coastguard Worker            "3F88798BB9F7739655946F8B5744E6B1EAF10B0C5621330F0079209033C69"
977*a6021da3SAndroid Build Coastguard Worker            "20DE2E2C8D324F0624463735D482BF291926C22A910F5B80FA25170B6B57D"
978*a6021da3SAndroid Build Coastguard Worker            "8D5928C7BCA3FE87461275F69BD5A1B83181DAAF43E05FC3C72C4E93111B6"
979*a6021da3SAndroid Build Coastguard Worker            "6205EBF49B28FEDFB7E7526CBDA658A332000000000000000000000000000"
980*a6021da3SAndroid Build Coastguard Worker            "0000000000000000000000000000000000000000000000000000000000000"
981*a6021da3SAndroid Build Coastguard Worker            "0000000000000000000000000000000000000", buffer);
982*a6021da3SAndroid Build Coastguard Worker }
983*a6021da3SAndroid Build Coastguard Worker 
984*a6021da3SAndroid Build Coastguard Worker 
TEST(DivideModuloIntBignum)985*a6021da3SAndroid Build Coastguard Worker TEST(DivideModuloIntBignum) {
986*a6021da3SAndroid Build Coastguard Worker   char buffer[kBufferSize];
987*a6021da3SAndroid Build Coastguard Worker   Bignum bignum;
988*a6021da3SAndroid Build Coastguard Worker   Bignum other;
989*a6021da3SAndroid Build Coastguard Worker   Bignum third;
990*a6021da3SAndroid Build Coastguard Worker 
991*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(10);
992*a6021da3SAndroid Build Coastguard Worker   other.AssignUInt16(2);
993*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(5, bignum.DivideModuloIntBignum(other));
994*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
995*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("0", buffer);
996*a6021da3SAndroid Build Coastguard Worker 
997*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(10);
998*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(500);
999*a6021da3SAndroid Build Coastguard Worker   other.AssignUInt16(2);
1000*a6021da3SAndroid Build Coastguard Worker   other.ShiftLeft(500);
1001*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(5, bignum.DivideModuloIntBignum(other));
1002*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1003*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("0", buffer);
1004*a6021da3SAndroid Build Coastguard Worker 
1005*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(11);
1006*a6021da3SAndroid Build Coastguard Worker   other.AssignUInt16(2);
1007*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(5, bignum.DivideModuloIntBignum(other));
1008*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1009*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
1010*a6021da3SAndroid Build Coastguard Worker 
1011*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(10);
1012*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(500);
1013*a6021da3SAndroid Build Coastguard Worker   other.AssignUInt16(1);
1014*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(other);
1015*a6021da3SAndroid Build Coastguard Worker   other.AssignUInt16(2);
1016*a6021da3SAndroid Build Coastguard Worker   other.ShiftLeft(500);
1017*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(5, bignum.DivideModuloIntBignum(other));
1018*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1019*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
1020*a6021da3SAndroid Build Coastguard Worker 
1021*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(10);
1022*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(500);
1023*a6021da3SAndroid Build Coastguard Worker   other.AssignBignum(bignum);
1024*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0x1234);
1025*a6021da3SAndroid Build Coastguard Worker   third.AssignUInt16(0xFFF);
1026*a6021da3SAndroid Build Coastguard Worker   bignum.AddBignum(third);
1027*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0x1234, bignum.DivideModuloIntBignum(other));
1028*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1029*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFF", buffer);
1030*a6021da3SAndroid Build Coastguard Worker 
1031*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(10);
1032*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1234567890");
1033*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, bignum.DivideModuloIntBignum(other));
1034*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1035*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("A", buffer);
1036*a6021da3SAndroid Build Coastguard Worker 
1037*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "12345678");
1038*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "3789012");
1039*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(5, bignum.DivideModuloIntBignum(other));
1040*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1041*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("D9861E", buffer);
1042*a6021da3SAndroid Build Coastguard Worker 
1043*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "70000001");
1044*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "1FFFFFFF");
1045*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(3, bignum.DivideModuloIntBignum(other));
1046*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1047*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000004", buffer);
1048*a6021da3SAndroid Build Coastguard Worker 
1049*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "28000000");
1050*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&other, "12A05F20");
1051*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(2, bignum.DivideModuloIntBignum(other));
1052*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1053*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("2BF41C0", buffer);
1054*a6021da3SAndroid Build Coastguard Worker 
1055*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(10);
1056*a6021da3SAndroid Build Coastguard Worker   bignum.ShiftLeft(500);
1057*a6021da3SAndroid Build Coastguard Worker   other.AssignBignum(bignum);
1058*a6021da3SAndroid Build Coastguard Worker   bignum.MultiplyByUInt32(0x1234);
1059*a6021da3SAndroid Build Coastguard Worker   third.AssignUInt16(0xFFF);
1060*a6021da3SAndroid Build Coastguard Worker   other.SubtractBignum(third);
1061*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0x1234, bignum.DivideModuloIntBignum(other));
1062*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1063*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1232DCC", buffer);
1064*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, bignum.DivideModuloIntBignum(other));
1065*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1066*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1232DCC", buffer);
1067*a6021da3SAndroid Build Coastguard Worker }
1068*a6021da3SAndroid Build Coastguard Worker 
1069*a6021da3SAndroid Build Coastguard Worker 
TEST(Compare)1070*a6021da3SAndroid Build Coastguard Worker TEST(Compare) {
1071*a6021da3SAndroid Build Coastguard Worker   Bignum bignum1;
1072*a6021da3SAndroid Build Coastguard Worker   Bignum bignum2;
1073*a6021da3SAndroid Build Coastguard Worker   bignum1.AssignUInt16(1);
1074*a6021da3SAndroid Build Coastguard Worker   bignum2.AssignUInt16(1);
1075*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::Compare(bignum1, bignum2));
1076*a6021da3SAndroid Build Coastguard Worker   CHECK(Bignum::Equal(bignum1, bignum2));
1077*a6021da3SAndroid Build Coastguard Worker   CHECK(Bignum::LessEqual(bignum1, bignum2));
1078*a6021da3SAndroid Build Coastguard Worker   CHECK(!Bignum::Less(bignum1, bignum2));
1079*a6021da3SAndroid Build Coastguard Worker 
1080*a6021da3SAndroid Build Coastguard Worker   bignum1.AssignUInt16(0);
1081*a6021da3SAndroid Build Coastguard Worker   bignum2.AssignUInt16(1);
1082*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
1083*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
1084*a6021da3SAndroid Build Coastguard Worker   CHECK(!Bignum::Equal(bignum1, bignum2));
1085*a6021da3SAndroid Build Coastguard Worker   CHECK(!Bignum::Equal(bignum2, bignum1));
1086*a6021da3SAndroid Build Coastguard Worker   CHECK(Bignum::LessEqual(bignum1, bignum2));
1087*a6021da3SAndroid Build Coastguard Worker   CHECK(!Bignum::LessEqual(bignum2, bignum1));
1088*a6021da3SAndroid Build Coastguard Worker   CHECK(Bignum::Less(bignum1, bignum2));
1089*a6021da3SAndroid Build Coastguard Worker   CHECK(!Bignum::Less(bignum2, bignum1));
1090*a6021da3SAndroid Build Coastguard Worker 
1091*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum1, "1234567890ABCDEF12345");
1092*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum2, "1234567890ABCDEF12345");
1093*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::Compare(bignum1, bignum2));
1094*a6021da3SAndroid Build Coastguard Worker 
1095*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum1, "1234567890ABCDEF12345");
1096*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum2, "1234567890ABCDEF12346");
1097*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
1098*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
1099*a6021da3SAndroid Build Coastguard Worker 
1100*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum1, "1234567890ABCDEF12345");
1101*a6021da3SAndroid Build Coastguard Worker   bignum1.ShiftLeft(500);
1102*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum2, "1234567890ABCDEF12345");
1103*a6021da3SAndroid Build Coastguard Worker   bignum2.ShiftLeft(500);
1104*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::Compare(bignum1, bignum2));
1105*a6021da3SAndroid Build Coastguard Worker 
1106*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum1, "1234567890ABCDEF12345");
1107*a6021da3SAndroid Build Coastguard Worker   bignum1.ShiftLeft(500);
1108*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum2, "1234567890ABCDEF12346");
1109*a6021da3SAndroid Build Coastguard Worker   bignum2.ShiftLeft(500);
1110*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
1111*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
1112*a6021da3SAndroid Build Coastguard Worker 
1113*a6021da3SAndroid Build Coastguard Worker   bignum1.AssignUInt16(1);
1114*a6021da3SAndroid Build Coastguard Worker   bignum1.ShiftLeft(64);
1115*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum2, "10000000000000000");
1116*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::Compare(bignum1, bignum2));
1117*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::Compare(bignum2, bignum1));
1118*a6021da3SAndroid Build Coastguard Worker 
1119*a6021da3SAndroid Build Coastguard Worker   bignum1.AssignUInt16(1);
1120*a6021da3SAndroid Build Coastguard Worker   bignum1.ShiftLeft(64);
1121*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum2, "10000000000000001");
1122*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
1123*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
1124*a6021da3SAndroid Build Coastguard Worker 
1125*a6021da3SAndroid Build Coastguard Worker   bignum1.AssignUInt16(1);
1126*a6021da3SAndroid Build Coastguard Worker   bignum1.ShiftLeft(96);
1127*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum2, "10000000000000001");
1128*a6021da3SAndroid Build Coastguard Worker   bignum2.ShiftLeft(32);
1129*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
1130*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
1131*a6021da3SAndroid Build Coastguard Worker 
1132*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum1, "FFFFFFFFFFFFFFFF");
1133*a6021da3SAndroid Build Coastguard Worker   bignum2.AssignUInt16(1);
1134*a6021da3SAndroid Build Coastguard Worker   bignum2.ShiftLeft(64);
1135*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
1136*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
1137*a6021da3SAndroid Build Coastguard Worker 
1138*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum1, "FFFFFFFFFFFFFFFF");
1139*a6021da3SAndroid Build Coastguard Worker   bignum1.ShiftLeft(32);
1140*a6021da3SAndroid Build Coastguard Worker   bignum2.AssignUInt16(1);
1141*a6021da3SAndroid Build Coastguard Worker   bignum2.ShiftLeft(96);
1142*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
1143*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
1144*a6021da3SAndroid Build Coastguard Worker 
1145*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum1, "FFFFFFFFFFFFFFFF");
1146*a6021da3SAndroid Build Coastguard Worker   bignum1.ShiftLeft(32);
1147*a6021da3SAndroid Build Coastguard Worker   bignum2.AssignUInt16(1);
1148*a6021da3SAndroid Build Coastguard Worker   bignum2.ShiftLeft(95);
1149*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::Compare(bignum1, bignum2));
1150*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::Compare(bignum2, bignum1));
1151*a6021da3SAndroid Build Coastguard Worker 
1152*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum1, "FFFFFFFFFFFFFFFF");
1153*a6021da3SAndroid Build Coastguard Worker   bignum1.ShiftLeft(32);
1154*a6021da3SAndroid Build Coastguard Worker   bignum2.AssignUInt16(1);
1155*a6021da3SAndroid Build Coastguard Worker   bignum2.ShiftLeft(100);
1156*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
1157*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
1158*a6021da3SAndroid Build Coastguard Worker 
1159*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum1, "100000000000000");
1160*a6021da3SAndroid Build Coastguard Worker   bignum2.AssignUInt16(1);
1161*a6021da3SAndroid Build Coastguard Worker   bignum2.ShiftLeft(14*4);
1162*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::Compare(bignum1, bignum2));
1163*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::Compare(bignum2, bignum1));
1164*a6021da3SAndroid Build Coastguard Worker 
1165*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum1, "100000000000001");
1166*a6021da3SAndroid Build Coastguard Worker   bignum2.AssignUInt16(1);
1167*a6021da3SAndroid Build Coastguard Worker   bignum2.ShiftLeft(14*4);
1168*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::Compare(bignum1, bignum2));
1169*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::Compare(bignum2, bignum1));
1170*a6021da3SAndroid Build Coastguard Worker 
1171*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum1, "200000000000000");
1172*a6021da3SAndroid Build Coastguard Worker   bignum2.AssignUInt16(3);
1173*a6021da3SAndroid Build Coastguard Worker   bignum2.ShiftLeft(14*4);
1174*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::Compare(bignum1, bignum2));
1175*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::Compare(bignum2, bignum1));
1176*a6021da3SAndroid Build Coastguard Worker }
1177*a6021da3SAndroid Build Coastguard Worker 
1178*a6021da3SAndroid Build Coastguard Worker 
TEST(PlusCompare)1179*a6021da3SAndroid Build Coastguard Worker TEST(PlusCompare) {
1180*a6021da3SAndroid Build Coastguard Worker   Bignum a;
1181*a6021da3SAndroid Build Coastguard Worker   Bignum b;
1182*a6021da3SAndroid Build Coastguard Worker   Bignum c;
1183*a6021da3SAndroid Build Coastguard Worker   a.AssignUInt16(1);
1184*a6021da3SAndroid Build Coastguard Worker   b.AssignUInt16(0);
1185*a6021da3SAndroid Build Coastguard Worker   c.AssignUInt16(1);
1186*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
1187*a6021da3SAndroid Build Coastguard Worker   CHECK(Bignum::PlusEqual(a, b, c));
1188*a6021da3SAndroid Build Coastguard Worker   CHECK(Bignum::PlusLessEqual(a, b, c));
1189*a6021da3SAndroid Build Coastguard Worker   CHECK(!Bignum::PlusLess(a, b, c));
1190*a6021da3SAndroid Build Coastguard Worker 
1191*a6021da3SAndroid Build Coastguard Worker   a.AssignUInt16(0);
1192*a6021da3SAndroid Build Coastguard Worker   b.AssignUInt16(0);
1193*a6021da3SAndroid Build Coastguard Worker   c.AssignUInt16(1);
1194*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
1195*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::PlusCompare(c, b, a));
1196*a6021da3SAndroid Build Coastguard Worker   CHECK(!Bignum::PlusEqual(a, b, c));
1197*a6021da3SAndroid Build Coastguard Worker   CHECK(!Bignum::PlusEqual(c, b, a));
1198*a6021da3SAndroid Build Coastguard Worker   CHECK(Bignum::PlusLessEqual(a, b, c));
1199*a6021da3SAndroid Build Coastguard Worker   CHECK(!Bignum::PlusLessEqual(c, b, a));
1200*a6021da3SAndroid Build Coastguard Worker   CHECK(Bignum::PlusLess(a, b, c));
1201*a6021da3SAndroid Build Coastguard Worker   CHECK(!Bignum::PlusLess(c, b, a));
1202*a6021da3SAndroid Build Coastguard Worker 
1203*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890ABCDEF12345");
1204*a6021da3SAndroid Build Coastguard Worker   b.AssignUInt16(1);
1205*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF12345");
1206*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::PlusCompare(a, b, c));
1207*a6021da3SAndroid Build Coastguard Worker 
1208*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890ABCDEF12344");
1209*a6021da3SAndroid Build Coastguard Worker   b.AssignUInt16(1);
1210*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF12345");
1211*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
1212*a6021da3SAndroid Build Coastguard Worker 
1213*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1214*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4);
1215*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12345");
1216*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF12345");
1217*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
1218*a6021da3SAndroid Build Coastguard Worker 
1219*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1220*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4);
1221*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12344");
1222*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF12345");
1223*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
1224*a6021da3SAndroid Build Coastguard Worker 
1225*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1226*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4);
1227*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12346");
1228*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF12345");
1229*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
1230*a6021da3SAndroid Build Coastguard Worker 
1231*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567891");
1232*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4);
1233*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12345");
1234*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF12345");
1235*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
1236*a6021da3SAndroid Build Coastguard Worker 
1237*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567889");
1238*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4);
1239*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12345");
1240*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF12345");
1241*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
1242*a6021da3SAndroid Build Coastguard Worker 
1243*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1244*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1245*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12345");
1246*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(32);
1247*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF12345");
1248*a6021da3SAndroid Build Coastguard Worker   c.ShiftLeft(32);
1249*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
1250*a6021da3SAndroid Build Coastguard Worker 
1251*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1252*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1253*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12344");
1254*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(32);
1255*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF12345");
1256*a6021da3SAndroid Build Coastguard Worker   c.ShiftLeft(32);
1257*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
1258*a6021da3SAndroid Build Coastguard Worker 
1259*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1260*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1261*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12346");
1262*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(32);
1263*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF12345");
1264*a6021da3SAndroid Build Coastguard Worker   c.ShiftLeft(32);
1265*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
1266*a6021da3SAndroid Build Coastguard Worker 
1267*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567891");
1268*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1269*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12345");
1270*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(32);
1271*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF12345");
1272*a6021da3SAndroid Build Coastguard Worker   c.ShiftLeft(32);
1273*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
1274*a6021da3SAndroid Build Coastguard Worker 
1275*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567889");
1276*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1277*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12345");
1278*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(32);
1279*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF12345");
1280*a6021da3SAndroid Build Coastguard Worker   c.ShiftLeft(32);
1281*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
1282*a6021da3SAndroid Build Coastguard Worker 
1283*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1284*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1285*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12345");
1286*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(32);
1287*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF1234500000000");
1288*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
1289*a6021da3SAndroid Build Coastguard Worker 
1290*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1291*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1292*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12344");
1293*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(32);
1294*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF1234500000000");
1295*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
1296*a6021da3SAndroid Build Coastguard Worker 
1297*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1298*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1299*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12346");
1300*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(32);
1301*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF1234500000000");
1302*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
1303*a6021da3SAndroid Build Coastguard Worker 
1304*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567891");
1305*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1306*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12345");
1307*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(32);
1308*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF1234500000000");
1309*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
1310*a6021da3SAndroid Build Coastguard Worker 
1311*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567889");
1312*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1313*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12345");
1314*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(32);
1315*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "1234567890ABCDEF1234500000000");
1316*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
1317*a6021da3SAndroid Build Coastguard Worker 
1318*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1319*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1320*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12345");
1321*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "123456789000000000ABCDEF12345");
1322*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
1323*a6021da3SAndroid Build Coastguard Worker 
1324*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1325*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1326*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12346");
1327*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "123456789000000000ABCDEF12345");
1328*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(1, Bignum::PlusCompare(a, b, c));
1329*a6021da3SAndroid Build Coastguard Worker 
1330*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1331*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1332*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12344");
1333*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "123456789000000000ABCDEF12345");
1334*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
1335*a6021da3SAndroid Build Coastguard Worker 
1336*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1337*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1338*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12345");
1339*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(16);
1340*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "12345678900000ABCDEF123450000");
1341*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(0, Bignum::PlusCompare(a, b, c));
1342*a6021da3SAndroid Build Coastguard Worker 
1343*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1344*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1345*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12344");
1346*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(16);
1347*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "12345678900000ABCDEF123450000");
1348*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
1349*a6021da3SAndroid Build Coastguard Worker 
1350*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1351*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1352*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12345");
1353*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(16);
1354*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "12345678900000ABCDEF123450001");
1355*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(-1, Bignum::PlusCompare(a, b, c));
1356*a6021da3SAndroid Build Coastguard Worker 
1357*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&a, "1234567890");
1358*a6021da3SAndroid Build Coastguard Worker   a.ShiftLeft(11*4 + 32);
1359*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&b, "ABCDEF12346");
1360*a6021da3SAndroid Build Coastguard Worker   b.ShiftLeft(16);
1361*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&c, "12345678900000ABCDEF123450000");
1362*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ(+1, Bignum::PlusCompare(a, b, c));
1363*a6021da3SAndroid Build Coastguard Worker }
1364*a6021da3SAndroid Build Coastguard Worker 
1365*a6021da3SAndroid Build Coastguard Worker 
TEST(Square)1366*a6021da3SAndroid Build Coastguard Worker TEST(Square) {
1367*a6021da3SAndroid Build Coastguard Worker   Bignum bignum;
1368*a6021da3SAndroid Build Coastguard Worker   char buffer[kBufferSize];
1369*a6021da3SAndroid Build Coastguard Worker 
1370*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(1);
1371*a6021da3SAndroid Build Coastguard Worker   bignum.Square();
1372*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1373*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
1374*a6021da3SAndroid Build Coastguard Worker 
1375*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(2);
1376*a6021da3SAndroid Build Coastguard Worker   bignum.Square();
1377*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1378*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("4", buffer);
1379*a6021da3SAndroid Build Coastguard Worker 
1380*a6021da3SAndroid Build Coastguard Worker   bignum.AssignUInt16(10);
1381*a6021da3SAndroid Build Coastguard Worker   bignum.Square();
1382*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1383*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("64", buffer);
1384*a6021da3SAndroid Build Coastguard Worker 
1385*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFF");
1386*a6021da3SAndroid Build Coastguard Worker   bignum.Square();
1387*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1388*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFE0000001", buffer);
1389*a6021da3SAndroid Build Coastguard Worker 
1390*a6021da3SAndroid Build Coastguard Worker   AssignHexString(&bignum, "FFFFFFFFFFFFFF");
1391*a6021da3SAndroid Build Coastguard Worker   bignum.Square();
1392*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1393*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FFFFFFFFFFFFFE00000000000001", buffer);
1394*a6021da3SAndroid Build Coastguard Worker }
1395*a6021da3SAndroid Build Coastguard Worker 
1396*a6021da3SAndroid Build Coastguard Worker 
TEST(AssignPowerUInt16)1397*a6021da3SAndroid Build Coastguard Worker TEST(AssignPowerUInt16) {
1398*a6021da3SAndroid Build Coastguard Worker   Bignum bignum;
1399*a6021da3SAndroid Build Coastguard Worker   char buffer[kBufferSize];
1400*a6021da3SAndroid Build Coastguard Worker 
1401*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(1, 0);
1402*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1403*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
1404*a6021da3SAndroid Build Coastguard Worker 
1405*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(1, 1);
1406*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1407*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
1408*a6021da3SAndroid Build Coastguard Worker 
1409*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(1, 2);
1410*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1411*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
1412*a6021da3SAndroid Build Coastguard Worker 
1413*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(2, 0);
1414*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1415*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
1416*a6021da3SAndroid Build Coastguard Worker 
1417*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(2, 1);
1418*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1419*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("2", buffer);
1420*a6021da3SAndroid Build Coastguard Worker 
1421*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(2, 2);
1422*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1423*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("4", buffer);
1424*a6021da3SAndroid Build Coastguard Worker 
1425*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(16, 1);
1426*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1427*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10", buffer);
1428*a6021da3SAndroid Build Coastguard Worker 
1429*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(16, 2);
1430*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1431*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("100", buffer);
1432*a6021da3SAndroid Build Coastguard Worker 
1433*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(16, 5);
1434*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1435*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("100000", buffer);
1436*a6021da3SAndroid Build Coastguard Worker 
1437*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(16, 8);
1438*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1439*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("100000000", buffer);
1440*a6021da3SAndroid Build Coastguard Worker 
1441*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(16, 16);
1442*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1443*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000000", buffer);
1444*a6021da3SAndroid Build Coastguard Worker 
1445*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(16, 30);
1446*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1447*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1000000000000000000000000000000", buffer);
1448*a6021da3SAndroid Build Coastguard Worker 
1449*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(10, 0);
1450*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1451*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
1452*a6021da3SAndroid Build Coastguard Worker 
1453*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(10, 1);
1454*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1455*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("A", buffer);
1456*a6021da3SAndroid Build Coastguard Worker 
1457*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(10, 2);
1458*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1459*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("64", buffer);
1460*a6021da3SAndroid Build Coastguard Worker 
1461*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(10, 5);
1462*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1463*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("186A0", buffer);
1464*a6021da3SAndroid Build Coastguard Worker 
1465*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(10, 8);
1466*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1467*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("5F5E100", buffer);
1468*a6021da3SAndroid Build Coastguard Worker 
1469*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(10, 16);
1470*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1471*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("2386F26FC10000", buffer);
1472*a6021da3SAndroid Build Coastguard Worker 
1473*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(10, 30);
1474*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1475*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("C9F2C9CD04674EDEA40000000", buffer);
1476*a6021da3SAndroid Build Coastguard Worker 
1477*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(10, 31);
1478*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1479*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("7E37BE2022C0914B2680000000", buffer);
1480*a6021da3SAndroid Build Coastguard Worker 
1481*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(2, 0);
1482*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1483*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
1484*a6021da3SAndroid Build Coastguard Worker 
1485*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(2, 100);
1486*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1487*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("10000000000000000000000000", buffer);
1488*a6021da3SAndroid Build Coastguard Worker 
1489*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(17, 0);
1490*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1491*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1", buffer);
1492*a6021da3SAndroid Build Coastguard Worker 
1493*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(17, 99);
1494*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1495*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("1942BB9853FAD924A3D4DD92B89B940E0207BEF05DB9C26BC1B757"
1496*a6021da3SAndroid Build Coastguard Worker            "80BE0C5A2C2990E02A681224F34ED68558CE4C6E33760931",
1497*a6021da3SAndroid Build Coastguard Worker            buffer);
1498*a6021da3SAndroid Build Coastguard Worker 
1499*a6021da3SAndroid Build Coastguard Worker   bignum.AssignPowerUInt16(0xFFFF, 99);
1500*a6021da3SAndroid Build Coastguard Worker   CHECK(bignum.ToHexString(buffer, kBufferSize));
1501*a6021da3SAndroid Build Coastguard Worker   CHECK_EQ("FF9D12F09B886C54E77E7439C7D2DED2D34F669654C0C2B6B8C288250"
1502*a6021da3SAndroid Build Coastguard Worker            "5A2211D0E3DC9A61831349EAE674B11D56E3049D7BD79DAAD6C9FA2BA"
1503*a6021da3SAndroid Build Coastguard Worker            "528E3A794299F2EE9146A324DAFE3E88967A0358233B543E233E575B9"
1504*a6021da3SAndroid Build Coastguard Worker            "DD4E3AA7942146426C328FF55BFD5C45E0901B1629260AF9AE2F310C5"
1505*a6021da3SAndroid Build Coastguard Worker            "50959FAF305C30116D537D80CF6EBDBC15C5694062AF1AC3D956D0A41"
1506*a6021da3SAndroid Build Coastguard Worker            "B7E1B79FF11E21D83387A1CE1F5882B31E4B5D8DE415BDBE6854466DF"
1507*a6021da3SAndroid Build Coastguard Worker            "343362267A7E8833119D31D02E18DB5B0E8F6A64B0ED0D0062FFFF",
1508*a6021da3SAndroid Build Coastguard Worker            buffer);
1509*a6021da3SAndroid Build Coastguard Worker }
1510