2 // This file is part of the aMule Project.
4 // Copyright (c) 2008 Dévai Tamás ( gonosztopi@amule.org )
5 // Copyright (c) 2008 aMule Team ( admin@amule.org / http://www.amule.org )
7 // Any parts of this program derived from the xMule, lMule or eMule project,
8 // or contributed by third-party developers are copyrighted by their
11 // This program is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation; either version 2 of the License, or
14 // (at your option) any later version.
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
21 // You should have received a copy of the GNU General Public License
22 // along with this program; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #include <muleunit/test.h>
27 #include <kademlia/utils/UInt128.h>
29 using namespace muleunit
;
30 using Kademlia::CUInt128
;
33 // Needed for ASSERT_EQUALS with CUInt128
34 template<> wxString StringFrom
<CUInt128
>(const CUInt128
& value
) {
35 return value
.ToHexString();
38 typedef uint8_t ByteArray
[16];
39 // Needed for ASSERT_EQUALS with uint8_t[16]
40 template<> wxString StringFrom
<ByteArray
>(const ByteArray
& value
) {
42 for (int i
= 0; i
< 16; i
++) {
44 retval
.Append(wxString::Format(wxT(" %02X"), value
[i
]));
46 retval
.Append(wxString::Format(wxT("%02X"), value
[i
]));
53 // Put static test data into a namespace to avoid possible clash with muleunit namespace
55 static uint8_t sequence
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf };
56 static uint8_t zero
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
57 static uint8_t one
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
58 static uint8_t minusOne
[16] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
59 static uint8_t uintValue
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x12, 0x34, 0x56, 0x78 };
60 static uint8_t randomValue
[16] = { 0xef, 0xac, 0xd6, 0x21, 0x99, 0x1b, 0x05, 0xbe, 0xfb, 0x97, 0xdf, 0xdd, 0xab, 0x4b, 0x88, 0xe3 };
63 DECLARE_SIMPLE(CUInt128
);
65 // Each test uses only functionality previously tested.
67 TEST_M(CUInt128
, ConstructorAndToByteArray
, wxT("Reading/writing byte sequences"))
71 CUInt128
test((uint8_t *)&TestData::sequence
);
72 test
.ToByteArray((uint8_t *)&result
);
73 ASSERT_TRUE_M(TestData::sequence
[0] == result
[0] &&
74 TestData::sequence
[1] == result
[1] &&
75 TestData::sequence
[2] == result
[2] &&
76 TestData::sequence
[3] == result
[3] &&
77 TestData::sequence
[4] == result
[4] &&
78 TestData::sequence
[5] == result
[5] &&
79 TestData::sequence
[6] == result
[6] &&
80 TestData::sequence
[7] == result
[7] &&
81 TestData::sequence
[8] == result
[8] &&
82 TestData::sequence
[9] == result
[9] &&
83 TestData::sequence
[10] == result
[10] &&
84 TestData::sequence
[11] == result
[11] &&
85 TestData::sequence
[12] == result
[12] &&
86 TestData::sequence
[13] == result
[13] &&
87 TestData::sequence
[14] == result
[14] &&
88 TestData::sequence
[15] == result
[15],
89 wxString(wxT("Expected '")) + StringFrom(TestData::sequence
) + wxT("' but got '") + StringFrom(result
) + wxT("'"));
92 TEST(CUInt128
, ToHexString
)
94 CUInt128
test((uint8_t *)&TestData::sequence
);
95 ASSERT_EQUALS(wxT("000102030405060708090A0B0C0D0E0F"), test
.ToHexString());
98 TEST(CUInt128
, ToBinaryString
)
100 CUInt128
test((uint8_t *)&TestData::sequence
);
101 ASSERT_EQUALS(wxT("00000000000000010000001000000011000001000000010100000110000001110000100000001001000010100000101100001100000011010000111000001111"), test
.ToBinaryString());
102 ASSERT_EQUALS(wxT("10000001000000011000001000000010100000110000001110000100000001001000010100000101100001100000011010000111000001111"), test
.ToBinaryString(true));
103 CUInt128
testZero((uint8_t *)&TestData::zero
);
104 ASSERT_EQUALS(wxT("0"), testZero
.ToBinaryString(true));
107 TEST(CUInt128
, Get32BitChunk
)
109 CUInt128
test((uint8_t *)&TestData::sequence
);
110 ASSERT_EQUALS(0x00010203u
, test
.Get32BitChunk(0));
111 ASSERT_EQUALS(0x04050607u
, test
.Get32BitChunk(1));
112 ASSERT_EQUALS(0x08090a0bu
, test
.Get32BitChunk(2));
113 ASSERT_EQUALS(0x0c0d0e0fu
, test
.Get32BitChunk(3));
114 ASSERT_EQUALS(0u, test
.Get32BitChunk(4));
117 TEST_M(CUInt128
, OperatorEqualsCUInt128
, wxT("operator==(const CUInt128&)"))
119 CUInt128
a((uint8_t *)&TestData::sequence
);
120 CUInt128
b((uint8_t *)&TestData::one
);
123 ASSERT_FALSE(a
== b
);
126 TEST_M(CUInt128
, OperatorEqualsUint32
, wxT("operator==(uint32_t)"))
128 ASSERT_TRUE(CUInt128((uint8_t *)&TestData::uintValue
) == 0x12345678u
);
129 CUInt128
test((uint8_t *)&TestData::sequence
);
130 ASSERT_FALSE(test
== 0x00010203u
);
131 ASSERT_FALSE(test
== 0x04050607u
);
132 ASSERT_FALSE(test
== 0x08090a0bu
);
133 ASSERT_FALSE(test
== 0x0c0d0e0fu
);
136 TEST_M(CUInt128
, OperatorEqualsUint32CUInt128
, wxT("operator==(uint32_t, const CUInt128&)"))
138 ASSERT_TRUE(0x12345678u
== CUInt128((uint8_t *)&TestData::uintValue
));
139 CUInt128
test((uint8_t *)&TestData::sequence
);
140 ASSERT_FALSE(0x00010203u
== test
);
141 ASSERT_FALSE(0x04050607u
== test
);
142 ASSERT_FALSE(0x08090a0bu
== test
);
143 ASSERT_FALSE(0x0c0d0e0fu
== test
);
146 TEST_M(CUInt128
, EmptyContructor
, wxT("CUInt128()"))
149 CUInt128
ref((uint8_t *)&TestData::zero
);
151 ASSERT_EQUALS(ref
, test
);
154 TEST_M(CUInt128
, CopyConstructor
, wxT("CUInt128(const CUInt128&)"))
156 CUInt128
a((uint8_t *)&TestData::sequence
);
162 TEST_M(CUInt128
, ConstructFromBool
, wxT("CUInt128(bool)"))
164 CUInt128
empty(false);
166 CUInt128
zero((uint8_t *)&TestData::zero
);
167 CUInt128
minusOne((uint8_t *)&TestData::minusOne
);
169 ASSERT_EQUALS(zero
, empty
);
170 ASSERT_EQUALS(minusOne
, full
);
173 TEST_M(CUInt128
, ConstructFromUint32
, wxT("CUInt128(uint32_t)"))
175 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::uintValue
), CUInt128(0x12345678u
));
178 TEST_M(CUInt128
, AssignCUInt128
, wxT("operator=(const CUInt128&)"))
180 CUInt128
a((uint8_t *)&TestData::sequence
);
186 TEST_M(CUInt128
, AssignUint32
, wxT("operator=(uint32_t)"))
188 CUInt128
a((uint8_t *)&TestData::uintValue
);
189 // Note that CUInt128 b = 0x12345678u; won't work,
190 // the compiler only allows assignment between the
191 // same types when constructing the object.
198 TEST(CUInt128
, Set32BitChunk
)
202 test
.Set32BitChunk(3, 0x12345678u
);
203 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::uintValue
), test
);
205 test
.Set32BitChunk(0, 0x00010203u
);
206 test
.Set32BitChunk(1, 0x04050607u
);
207 test
.Set32BitChunk(2, 0x08090a0bu
);
208 test
.Set32BitChunk(3, 0x0c0d0e0fu
);
209 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), test
);
211 ASSERT_RAISES(CAssertFailureException
, test
.Set32BitChunk(4, 0));
212 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), test
);
216 test
.Set32BitChunk(4, 0);
217 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), test
);
220 TEST_M(CUInt128
, SetValueCUInt128
, wxT("SetValue(const CUInt128&)"))
222 CUInt128
a((uint8_t *)&TestData::sequence
);
229 TEST_M(CUInt128
, SetValueUint32
, wxT("SetValue(uint32_t)"))
231 CUInt128
a((uint8_t *)&TestData::uintValue
);
234 b
.SetValue(0x12345678u
);
238 TEST(CUInt128
, SetValueBE
)
240 CUInt128
a((uint8_t *)&TestData::sequence
);
244 a
.ToByteArray((uint8_t *)&buffer
);
245 b
.SetValueBE((uint8_t *)&buffer
);
249 TEST(CUInt128
, StoreCryptValue
)
251 uint8_t ref
[16] = { 0x3, 0x2, 0x1, 0x0, 0x7, 0x6, 0x5, 0x4, 0xb, 0xa, 0x9, 0x8, 0xf, 0xe, 0xd, 0xc };
253 CUInt128
test((uint8_t *)&TestData::sequence
);
255 test
.StoreCryptValue((uint8_t *)&tmp
);
256 ASSERT_EQUALS(CUInt128((uint8_t *)&ref
), CUInt128((uint8_t *)&tmp
));
259 TEST(CUInt128
, ShiftLeft
)
261 CUInt128
test((uint8_t *)&TestData::one
);
262 uint8_t r1
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };
263 uint8_t r2
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0 };
264 uint8_t r3
[16] = { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
265 uint8_t r4
[16] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
268 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::one
), test
);
270 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), test
);
272 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), test
);
274 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), test
);
275 test
.SetValueBE((uint8_t *)&TestData::one
);
277 ASSERT_EQUALS(CUInt128((uint8_t *)&r4
), test
);
278 test
.SetValueBE((uint8_t *)&TestData::one
);
280 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::zero
), test
);
283 TEST_M(CUInt128
, AddCUInt128
, wxT("Add(const CUInt128&)"))
285 uint8_t d0
[16] = { 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
286 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
287 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
288 uint8_t r3
[16] = { 0xfc, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
289 uint8_t r4
[16] = { 0xf8, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
290 CUInt128
a((uint8_t *)&TestData::sequence
);
291 CUInt128
d((uint8_t *)&d0
);
293 a
.Add(CUInt128(0x01234567u
));
294 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
295 a
.Add(CUInt128(0xff000000u
));
296 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
298 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), a
);
299 ASSERT_EQUALS(CUInt128((uint8_t *)&d0
), d
);
301 ASSERT_EQUALS(CUInt128((uint8_t *)&r4
), a
);
302 a
.SetValueBE((uint8_t *)&TestData::minusOne
);
303 a
.Add(CUInt128((uint8_t *)&TestData::one
));
304 ASSERT_EQUALS(CUInt128(), a
);
307 TEST_M(CUInt128
, AddUint32
, wxT("Add(uint32_t)"))
309 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
310 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
311 CUInt128
a((uint8_t *)&TestData::sequence
);
314 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
316 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
317 a
.SetValueBE((uint8_t *)&TestData::minusOne
);
322 TEST_M(CUInt128
, SubtractCUInt128
, wxT("Subtract(const CUInt128&)"))
324 uint8_t d0
[16] = { 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
325 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
326 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
327 uint8_t r3
[16] = { 0xfc, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
328 uint8_t r4
[16] = { 0xf8, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
329 CUInt128
a((uint8_t *)&r4
);
330 CUInt128
d((uint8_t *)&d0
);
333 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), a
);
334 ASSERT_EQUALS(CUInt128((uint8_t *)&d0
), d
);
336 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
337 a
.Subtract(CUInt128(0xff000000u
));
338 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
339 a
.Subtract(CUInt128(0x01234567u
));
340 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), a
);
342 a
.Subtract(CUInt128((uint8_t *)&TestData::one
));
343 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::minusOne
), a
);
346 TEST_M(CUInt128
, SubtractUint32
, wxT("Subtract(uint32_t)"))
348 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
349 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
350 CUInt128
a((uint8_t *)&r2
);
352 a
.Subtract(0xff000000u
);
353 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
354 a
.Subtract(0x01234567u
);
355 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), a
);
358 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::minusOne
), a
);
361 TEST_M(CUInt128
, XorCUInt128
, wxT("XOR(const CUInt128&)"))
363 uint8_t xd
[16] = { 0xff, 0x00, 0xee, 0x11, 0xdd, 0x22, 0xcc, 0x33, 0xbb, 0x44, 0xaa, 0x55, 0x99, 0x66, 0x88, 0x77 };
364 uint8_t xr
[16] = { 0xff, 0x01, 0xec, 0x12, 0xd9, 0x27, 0xca, 0x34, 0xb3, 0x4d, 0xa0, 0x5e, 0x95, 0x6b, 0x86, 0x78 };
365 CUInt128
a((uint8_t *)&TestData::sequence
);
366 CUInt128
x((uint8_t *)&xd
);
369 ASSERT_EQUALS(CUInt128((uint8_t *)&xr
), a
);
370 ASSERT_EQUALS(CUInt128((uint8_t *)&xd
), x
);
373 // Not yet implemented
375 TEST_M(CUInt128
, XorUint32
, wxT("XOR(uint32_t)"))
377 CUInt128
a(0x12345678u
);
380 ASSERT_EQUALS(0x64606468, a
);
384 TEST_M(CUInt128
, OperatorShiftLeftAssign
, wxT("operator<<=(unsigned)"))
386 CUInt128
test((uint8_t *)&TestData::one
);
387 uint8_t r1
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };
388 uint8_t r2
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0 };
389 uint8_t r3
[16] = { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
390 uint8_t r4
[16] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
393 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::one
), test
);
395 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), test
);
397 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), test
);
399 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), test
);
400 test
.SetValueBE((uint8_t *)&TestData::one
);
402 ASSERT_EQUALS(CUInt128((uint8_t *)&r4
), test
);
403 test
.SetValueBE((uint8_t *)&TestData::one
);
405 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::zero
), test
);
408 TEST_M(CUInt128
, OperatorAddAssignCUInt128
, wxT("operator+=(const CUInt128&)"))
410 uint8_t d0
[16] = { 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
411 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
412 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
413 uint8_t r3
[16] = { 0xfc, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
414 uint8_t r4
[16] = { 0xf8, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
415 CUInt128
a((uint8_t *)&TestData::sequence
);
416 CUInt128
d((uint8_t *)&d0
);
418 a
+= CUInt128(0x01234567u
);
419 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
420 a
+= CUInt128(0xff000000u
);
421 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
423 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), a
);
424 ASSERT_EQUALS(CUInt128((uint8_t *)&d0
), d
);
426 ASSERT_EQUALS(CUInt128((uint8_t *)&r4
), a
);
427 a
.SetValueBE((uint8_t *)&TestData::minusOne
);
428 a
+= CUInt128((uint8_t *)&TestData::one
);
429 ASSERT_EQUALS(CUInt128(), a
);
432 TEST_M(CUInt128
, OperatorAddAssignUint32
, wxT("operator+=(uint32_t)"))
434 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
435 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
436 CUInt128
a((uint8_t *)&TestData::sequence
);
439 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
441 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
442 a
.SetValueBE((uint8_t *)&TestData::minusOne
);
447 TEST_M(CUInt128
, OperatorSubtractAssignCUInt128
, wxT("operator-=(const CUInt128&)"))
449 uint8_t d0
[16] = { 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
450 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
451 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
452 uint8_t r3
[16] = { 0xfc, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
453 uint8_t r4
[16] = { 0xf8, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
454 CUInt128
a((uint8_t *)&r4
);
455 CUInt128
d((uint8_t *)&d0
);
458 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), a
);
459 ASSERT_EQUALS(CUInt128((uint8_t *)&d0
), d
);
461 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
462 a
-= CUInt128(0xff000000u
);
463 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
464 a
-= CUInt128(0x01234567u
);
465 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), a
);
467 a
-= CUInt128((uint8_t *)&TestData::one
);
468 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::minusOne
), a
);
471 TEST_M(CUInt128
, OperatorSubtractAssignUint32
, wxT("operator-=(uint32_t)"))
473 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
474 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
475 CUInt128
a((uint8_t *)&r2
);
478 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
480 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), a
);
483 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::minusOne
), a
);
486 TEST_M(CUInt128
, OperatorXorAssignCUInt128
, wxT("operator^=(const CUInt128&)"))
488 uint8_t xd
[16] = { 0xff, 0x00, 0xee, 0x11, 0xdd, 0x22, 0xcc, 0x33, 0xbb, 0x44, 0xaa, 0x55, 0x99, 0x66, 0x88, 0x77 };
489 uint8_t xr
[16] = { 0xff, 0x01, 0xec, 0x12, 0xd9, 0x27, 0xca, 0x34, 0xb3, 0x4d, 0xa0, 0x5e, 0x95, 0x6b, 0x86, 0x78 };
490 CUInt128
a((uint8_t *)&TestData::sequence
);
491 CUInt128
x((uint8_t *)&xd
);
494 ASSERT_EQUALS(CUInt128((uint8_t *)&xr
), a
);
495 ASSERT_EQUALS(CUInt128((uint8_t *)&xd
), x
);
498 TEST_M(CUInt128
, OperatorXorAssignUint32
, wxT("operator^=(uint32_t)"))
500 CUInt128
a(0x12345678u
);
503 ASSERT_EQUALS(0x64606468, a
);
506 TEST(CUInt128
, GetBitNumber
)
511 ASSERT_TRUE(test
.GetBitNumber(0) == 0);
512 ASSERT_TRUE(test
.GetBitNumber(127) == 1);
514 ASSERT_TRUE(test
.GetBitNumber(0) == 1);
515 ASSERT_TRUE(test
.GetBitNumber(127) == 0);
517 CUInt128
test2(true);
518 ASSERT_EQUALS(0u, test2
.GetBitNumber(128));
521 TEST(CUInt128
, SetBitNumber
)
525 test
.SetBitNumber(127, 1);
526 ASSERT_EQUALS(1, test
);
527 test
.SetBitNumber(126, 1);
528 ASSERT_EQUALS(3, test
);
529 test
.SetBitNumber(127, 0);
530 ASSERT_EQUALS(2, test
);
531 test
.SetBitNumber(0, 1);
532 ASSERT_EQUALS(0x80000000u
, test
.Get32BitChunk(0));
534 ASSERT_RAISES(CAssertFailureException
, test
.SetBitNumber(128, 0));
538 test
.SetValueBE((uint8_t *)&TestData::sequence
);
539 test
.SetBitNumber(128, 1);
540 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), test
);
543 TEST_M(CUInt128
, OperatorNotEqualCUInt128
, wxT("operator!=(const CUInt128&)"))
545 CUInt128
a((uint8_t *)&TestData::sequence
);
546 CUInt128
b((uint8_t *)&TestData::one
);
548 ASSERT_FALSE(a
!= a
);
552 TEST_M(CUInt128
, OperatorNotEqualUint32
, wxT("operator!=(uint32_t)"))
554 ASSERT_FALSE(CUInt128((uint8_t *)&TestData::uintValue
) != 0x12345678u
);
555 CUInt128
test((uint8_t *)&TestData::sequence
);
556 ASSERT_TRUE(test
!= 0x00010203u
);
557 ASSERT_TRUE(test
!= 0x04050607u
);
558 ASSERT_TRUE(test
!= 0x08090a0bu
);
559 ASSERT_TRUE(test
!= 0x0c0d0e0fu
);
562 TEST_M(CUInt128
, OperatorNotEqualUint32CUInt128
, wxT("operator!=(uint32_t, const CUInt128&)"))
564 ASSERT_FALSE(0x12345678u
!= CUInt128((uint8_t *)&TestData::uintValue
));
565 CUInt128
test((uint8_t *)&TestData::sequence
);
566 ASSERT_TRUE(0x00010203u
!= test
);
567 ASSERT_TRUE(0x04050607u
!= test
);
568 ASSERT_TRUE(0x08090a0bu
!= test
);
569 ASSERT_TRUE(0x0c0d0e0fu
!= test
);
572 TEST_M(CUInt128
, OperatorLessCUInt128
, wxT("operator<(const CUInt128&)"))
574 for (unsigned i
= 0; i
< 4; i
++) {
577 a
.Set32BitChunk(i
, 0x0d3859feu
);
578 b
.Set32BitChunk(i
, 0xff579ec1u
);
583 TEST_M(CUInt128
, OperatorLessOrEqualCUInt128
, wxT("operator<=(const CUInt128&)"))
585 for (unsigned i
= 0; i
< 4; i
++) {
588 a
.Set32BitChunk(i
, 0x0d3859feu
);
589 b
.Set32BitChunk(i
, 0xff579ec1u
);
591 b
.Set32BitChunk(i
, a
.Get32BitChunk(i
));
596 TEST_M(CUInt128
, OperatorGreaterCUInt128
, wxT("operator>(const CUInt128&)"))
598 for (unsigned i
= 0; i
< 4; i
++) {
601 b
.Set32BitChunk(i
, 0x0d3859feu
);
602 a
.Set32BitChunk(i
, 0xff579ec1u
);
607 TEST_M(CUInt128
, OperatorGreaterOrEqualCUInt128
, wxT("operator>=(const CUInt128&)"))
609 for (unsigned i
= 0; i
< 4; i
++) {
612 b
.Set32BitChunk(i
, 0x0d3859feu
);
613 a
.Set32BitChunk(i
, 0xff579ec1u
);
615 b
.Set32BitChunk(i
, a
.Get32BitChunk(i
));
620 TEST_M(CUInt128
, OperatorLessUint32
, wxT("operator<(uint32_t)"))
622 for (unsigned i
= 0; i
< 4; i
++) {
624 a
.Set32BitChunk(i
, 0x0d3859feu
);
626 ASSERT_TRUE(a
< 0xffed3216u
);
628 ASSERT_FALSE(a
< 0xffed3216u
);
633 TEST_M(CUInt128
, OperatorLessOrEqualUint32
, wxT("operator<=(uint32_t)"))
635 for (unsigned i
= 0; i
< 4; i
++) {
637 a
.Set32BitChunk(i
, 0x0d3859feu
);
639 ASSERT_TRUE(a
<= 0xffed3216u
);
640 ASSERT_TRUE(a
<= 0x0d3859feu
);
642 ASSERT_FALSE(a
<= 0xffed3216u
);
643 ASSERT_FALSE(a
<= 0x0d3859feu
);
648 TEST_M(CUInt128
, OperatorGreaterUint32
, wxT("operator>(uint32_t)"))
650 for (unsigned i
= 0; i
< 4; i
++) {
652 a
.Set32BitChunk(i
, 0xffed3216u
);
653 ASSERT_TRUE(a
> 0x0d3859feu
);
657 TEST_M(CUInt128
, OperatorGreaterOrEqualUint32
, wxT("operator>=(uint32_t)"))
659 for (unsigned i
= 0; i
< 4; i
++) {
661 a
.Set32BitChunk(i
, 0xffed3216u
);
662 ASSERT_TRUE(a
>= 0x0d3859feu
);
663 ASSERT_TRUE(a
>= 0xffed3216u
);
667 TEST_M(CUInt128
, OperatorLessUint32CUInt128
, wxT("operator<(uint32_t, const CUInt128&)"))
669 for (unsigned i
= 0; i
< 4; i
++) {
671 a
.Set32BitChunk(i
, 0xffed3216u
);
672 ASSERT_TRUE(a
> 0x0d3859feu
);
676 TEST_M(CUInt128
, OperatorLessOrEqualUint32CUInt128
, wxT("operator<=(uint32_t, const CUInt128&)"))
678 for (unsigned i
= 0; i
< 4; i
++) {
680 a
.Set32BitChunk(i
, 0xffed3216u
);
681 ASSERT_TRUE(0x0d3859feu
<= a
);
682 ASSERT_TRUE(0xffed3216u
<= a
);
686 TEST_M(CUInt128
, OperatorGreaterUint32CUInt128
, wxT("operator>(uint32_t, const CUInt128&)"))
688 for (unsigned i
= 0; i
< 4; i
++) {
690 a
.Set32BitChunk(i
, 0x0d3859feu
);
692 ASSERT_TRUE(0xffed3216u
> a
);
694 ASSERT_FALSE(0xffed3216u
> a
);
699 TEST_M(CUInt128
, OperatorGreaterOrEqualUint32CUInt128
, wxT("operator>=(uint32_t, const CUInt128&)"))
701 for (unsigned i
= 0; i
< 4; i
++) {
703 a
.Set32BitChunk(i
, 0x0d3859feu
);
705 ASSERT_TRUE(0xffed3216u
>= a
);
706 ASSERT_TRUE(0x0d3859feu
>= a
);
708 ASSERT_FALSE(0xffed3216u
>= a
);
709 ASSERT_FALSE(0x0d3859feu
>= a
);
714 TEST_M(CUInt128
, OperatorAddCUInt128
, wxT("operator+(const CUInt128&)"))
716 CUInt128
a((uint8_t *)&TestData::sequence
);
721 CUInt128
result(a
+ a
);
723 ASSERT_EQUALS(check
, result
);
724 ASSERT_EQUALS(ref
, a
);
727 a
.SetBitNumber(32, 1);
731 ASSERT_EQUALS(check
, result
);
734 TEST_M(CUInt128
, OperatorSubtractCUInt128
, wxT("operator-(const CUInt128&)"))
736 CUInt128
a((uint8_t *)&TestData::randomValue
);
737 CUInt128
b((uint8_t *)&TestData::sequence
);
743 CUInt128
result(a
- b
);
744 ASSERT_EQUALS(refa
, a
);
745 ASSERT_EQUALS(refb
, b
);
747 ASSERT_EQUALS(check
, result
);
752 ASSERT_EQUALS(check
, result
);
755 TEST_M(CUInt128
, OperatorXorCUInt128
, wxT("operator^(const CUInt128&)"))
757 CUInt128
a((uint8_t *)&TestData::randomValue
);
758 CUInt128
b((uint8_t *)&TestData::sequence
);
763 CUInt128
result(a
^ b
);
764 CUInt128
check(refa
);
767 ASSERT_EQUALS(refa
, a
);
768 ASSERT_EQUALS(refb
, b
);
769 ASSERT_EQUALS(check
, result
);
772 TEST_M(CUInt128
, OperatorAddUint32
, wxT("operator+(uint32_t)"))
774 CUInt128
a((uint8_t *)&TestData::randomValue
);
775 uint32_t b
= a
.Get32BitChunk(0);
780 CUInt128
result(a
+ b
);
782 ASSERT_EQUALS(check
, result
);
783 ASSERT_EQUALS(ref
, a
);
786 a
.SetBitNumber(96, 1);
787 b
= a
.Get32BitChunk(3);
791 ASSERT_EQUALS(check
, result
);
794 TEST_M(CUInt128
, OperatorSubtractUint32
, wxT("operator-(uint32_t)"))
796 CUInt128
a((uint8_t *)&TestData::randomValue
);
797 uint32_t b
= a
.Get32BitChunk(0);
802 CUInt128
result(a
- b
);
803 ASSERT_EQUALS(ref
, a
);
805 ASSERT_EQUALS(check
, result
);
810 ASSERT_EQUALS(check
, result
);
813 TEST_M(CUInt128
, OperatorXorUint32
, wxT("operator^(uint32_t)"))
815 CUInt128
a((uint8_t *)&TestData::randomValue
);
816 uint32_t b
= a
.Get32BitChunk(0);
820 CUInt128
result(a
^ b
);
824 ASSERT_EQUALS(ref
, a
);
825 ASSERT_EQUALS(check
, result
);
828 TEST_M(CUInt128
, OperatorAddUint32CUInt128
, wxT("operator+(uint32_t, const CUInt128&)"))
830 CUInt128
a((uint8_t *)&TestData::randomValue
);
831 uint32_t b
= a
.Get32BitChunk(0);
836 CUInt128
result(b
+ a
);
838 ASSERT_EQUALS(check
, result
);
839 ASSERT_EQUALS(ref
, a
);
842 a
.SetBitNumber(96, 1);
843 b
= a
.Get32BitChunk(3);
847 ASSERT_EQUALS(check
, result
);
850 TEST_M(CUInt128
, OperatorSubtractUint32CUInt128
, wxT("operator-(uint32_t, const CUInt128&)"))
852 CUInt128
a((uint8_t *)&TestData::randomValue
);
853 uint32_t b
= a
.Get32BitChunk(0);
858 CUInt128
result(b
- a
);
859 ASSERT_EQUALS(ref
, a
);
861 ASSERT_EQUALS(check
, result
);
864 TEST_M(CUInt128
, OperatorXorUint32CUInt128
, wxT("operator^(uint32_t, const CUInt128&)"))
866 CUInt128
a((uint8_t *)&TestData::randomValue
);
867 uint32_t b
= a
.Get32BitChunk(0);
872 CUInt128
result(b
^ a
);
875 ASSERT_EQUALS(ref
, a
);
876 ASSERT_EQUALS(check
, result
);