2 // This file is part of the aMule Project.
4 // Copyright (c) 2008-2011 Dévai Tamás ( gonosztopi@amule.org )
5 // Copyright (c) 2008-2011 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
, ConstructWithBits
, wxT("CUInt128(const CUInt128&, unsigned)"))
180 CUInt128
a((uint8_t *)&TestData::sequence
);
181 CUInt128
b((uint8_t *)&TestData::minusOne
);
184 CUInt128
testa(a
, 1);
185 ASSERT_EQUALS(0u, testa
.Get32BitChunk(0) & 0x80000000);
187 CUInt128
testb(b
, 1);
188 ASSERT_EQUALS(0x80000000u
, testb
.Get32BitChunk(0) & 0x80000000);
191 CUInt128
testa(a
, 2);
192 ASSERT_EQUALS(0u, testa
.Get32BitChunk(0) & 0xc0000000);
194 CUInt128
testb(b
, 2);
195 ASSERT_EQUALS(0xc0000000u
, testb
.Get32BitChunk(0) & 0xc0000000);
198 CUInt128
testa(a
, 8);
199 ASSERT_EQUALS(0u, testa
.Get32BitChunk(0) & 0xff000000);
201 CUInt128
testb(b
, 8);
202 ASSERT_EQUALS(0xff000000u
, testb
.Get32BitChunk(0) & 0xff000000);
205 CUInt128
testa(a
, 31);
206 ASSERT_EQUALS(0x00010202u
, testa
.Get32BitChunk(0) & 0xfffffffe);
208 CUInt128
testb(b
, 31);
209 ASSERT_EQUALS(0xfffffffeu
, testb
.Get32BitChunk(0) & 0xfffffffe);
212 CUInt128
testa(a
, 32);
213 ASSERT_EQUALS(0x00010203u
, testa
.Get32BitChunk(0));
215 CUInt128
testb(b
, 32);
216 ASSERT_EQUALS(0xffffffffu
, testb
.Get32BitChunk(0));
219 CUInt128
testa(a
, 33);
220 ASSERT_EQUALS(0u, testa
.Get32BitChunk(1) & 0x80000000);
222 CUInt128
testb(b
, 33);
223 ASSERT_EQUALS(0x80000000u
, testb
.Get32BitChunk(1) & 0x80000000);
226 CUInt128
testa(a
, 128);
227 ASSERT_EQUALS(a
, testa
);
229 CUInt128
testb(b
, 128);
230 ASSERT_EQUALS(b
, testb
);
234 TEST_M(CUInt128
, AssignCUInt128
, wxT("operator=(const CUInt128&)"))
236 CUInt128
a((uint8_t *)&TestData::sequence
);
242 TEST_M(CUInt128
, AssignUint32
, wxT("operator=(uint32_t)"))
244 CUInt128
a((uint8_t *)&TestData::uintValue
);
245 // Note that CUInt128 b = 0x12345678u; won't work,
246 // the compiler only allows assignment between the
247 // same types when constructing the object.
254 TEST(CUInt128
, Set32BitChunk
)
258 test
.Set32BitChunk(3, 0x12345678u
);
259 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::uintValue
), test
);
261 test
.Set32BitChunk(0, 0x00010203u
);
262 test
.Set32BitChunk(1, 0x04050607u
);
263 test
.Set32BitChunk(2, 0x08090a0bu
);
264 test
.Set32BitChunk(3, 0x0c0d0e0fu
);
265 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), test
);
267 ASSERT_RAISES(CAssertFailureException
, test
.Set32BitChunk(4, 0));
268 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), test
);
272 test
.Set32BitChunk(4, 0);
273 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), test
);
276 TEST(CUInt128
, SetValueBE
)
278 CUInt128
a((uint8_t *)&TestData::sequence
);
282 a
.ToByteArray((uint8_t *)&buffer
);
283 b
.SetValueBE((uint8_t *)&buffer
);
287 TEST(CUInt128
, StoreCryptValue
)
289 uint8_t ref
[16] = { 0x3, 0x2, 0x1, 0x0, 0x7, 0x6, 0x5, 0x4, 0xb, 0xa, 0x9, 0x8, 0xf, 0xe, 0xd, 0xc };
291 CUInt128
test((uint8_t *)&TestData::sequence
);
293 test
.StoreCryptValue((uint8_t *)&tmp
);
294 ASSERT_EQUALS(CUInt128((uint8_t *)&ref
), CUInt128((uint8_t *)&tmp
));
297 TEST_M(CUInt128
, OperatorShiftLeftAssign
, wxT("operator<<=(unsigned)"))
299 CUInt128
test((uint8_t *)&TestData::one
);
300 uint8_t r1
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };
301 uint8_t r2
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0 };
302 uint8_t r3
[16] = { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
303 uint8_t r4
[16] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
306 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::one
), test
);
308 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), test
);
310 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), test
);
312 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), test
);
313 test
.SetValueBE((uint8_t *)&TestData::one
);
315 ASSERT_EQUALS(CUInt128((uint8_t *)&r4
), test
);
316 test
.SetValueBE((uint8_t *)&TestData::one
);
318 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::zero
), test
);
321 TEST_M(CUInt128
, OperatorAddAssignCUInt128
, wxT("operator+=(const CUInt128&)"))
323 uint8_t d0
[16] = { 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
324 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
325 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
326 uint8_t r3
[16] = { 0xfc, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
327 uint8_t r4
[16] = { 0xf8, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
328 CUInt128
a((uint8_t *)&TestData::sequence
);
329 CUInt128
d((uint8_t *)&d0
);
331 a
+= CUInt128(0x01234567u
);
332 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
333 a
+= CUInt128(0xff000000u
);
334 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
336 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), a
);
337 ASSERT_EQUALS(CUInt128((uint8_t *)&d0
), d
);
339 ASSERT_EQUALS(CUInt128((uint8_t *)&r4
), a
);
340 a
.SetValueBE((uint8_t *)&TestData::minusOne
);
341 a
+= CUInt128((uint8_t *)&TestData::one
);
342 ASSERT_EQUALS(CUInt128(), a
);
345 TEST_M(CUInt128
, OperatorAddAssignUint32
, wxT("operator+=(uint32_t)"))
347 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
348 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
349 CUInt128
a((uint8_t *)&TestData::sequence
);
352 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
354 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
355 a
.SetValueBE((uint8_t *)&TestData::minusOne
);
360 TEST_M(CUInt128
, OperatorSubtractAssignCUInt128
, wxT("operator-=(const CUInt128&)"))
362 uint8_t d0
[16] = { 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
363 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
364 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
365 uint8_t r3
[16] = { 0xfc, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
366 uint8_t r4
[16] = { 0xf8, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
367 CUInt128
a((uint8_t *)&r4
);
368 CUInt128
d((uint8_t *)&d0
);
371 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), a
);
372 ASSERT_EQUALS(CUInt128((uint8_t *)&d0
), d
);
374 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
375 a
-= CUInt128(0xff000000u
);
376 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
377 a
-= CUInt128(0x01234567u
);
378 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), a
);
380 a
-= CUInt128((uint8_t *)&TestData::one
);
381 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::minusOne
), a
);
384 TEST_M(CUInt128
, OperatorSubtractAssignUint32
, wxT("operator-=(uint32_t)"))
386 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
387 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
388 CUInt128
a((uint8_t *)&r2
);
391 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
393 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), a
);
396 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::minusOne
), a
);
399 TEST_M(CUInt128
, OperatorXorAssignCUInt128
, wxT("operator^=(const CUInt128&)"))
401 uint8_t xd
[16] = { 0xff, 0x00, 0xee, 0x11, 0xdd, 0x22, 0xcc, 0x33, 0xbb, 0x44, 0xaa, 0x55, 0x99, 0x66, 0x88, 0x77 };
402 uint8_t xr
[16] = { 0xff, 0x01, 0xec, 0x12, 0xd9, 0x27, 0xca, 0x34, 0xb3, 0x4d, 0xa0, 0x5e, 0x95, 0x6b, 0x86, 0x78 };
403 CUInt128
a((uint8_t *)&TestData::sequence
);
404 CUInt128
x((uint8_t *)&xd
);
407 ASSERT_EQUALS(CUInt128((uint8_t *)&xr
), a
);
408 ASSERT_EQUALS(CUInt128((uint8_t *)&xd
), x
);
411 TEST_M(CUInt128
, OperatorXorAssignUint32
, wxT("operator^=(uint32_t)"))
413 CUInt128
a(0x12345678u
);
416 ASSERT_EQUALS(0x64606468, a
);
419 TEST(CUInt128
, GetBitNumber
)
424 ASSERT_TRUE(test
.GetBitNumber(0) == 0);
425 ASSERT_TRUE(test
.GetBitNumber(127) == 1);
427 ASSERT_TRUE(test
.GetBitNumber(0) == 1);
428 ASSERT_TRUE(test
.GetBitNumber(127) == 0);
430 CUInt128
test2(true);
431 ASSERT_EQUALS(0u, test2
.GetBitNumber(128));
434 TEST(CUInt128
, SetBitNumber
)
438 test
.SetBitNumber(127, 1);
439 ASSERT_EQUALS(1, test
);
440 test
.SetBitNumber(126, 1);
441 ASSERT_EQUALS(3, test
);
442 test
.SetBitNumber(127, 0);
443 ASSERT_EQUALS(2, test
);
444 test
.SetBitNumber(0, 1);
445 ASSERT_EQUALS(0x80000000u
, test
.Get32BitChunk(0));
447 ASSERT_RAISES(CAssertFailureException
, test
.SetBitNumber(128, 0));
451 test
.SetValueBE((uint8_t *)&TestData::sequence
);
452 test
.SetBitNumber(128, 1);
453 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), test
);
456 TEST_M(CUInt128
, OperatorNotEqualCUInt128
, wxT("operator!=(const CUInt128&)"))
458 CUInt128
a((uint8_t *)&TestData::sequence
);
459 CUInt128
b((uint8_t *)&TestData::one
);
461 ASSERT_FALSE(a
!= a
);
465 TEST_M(CUInt128
, OperatorNotEqualUint32
, wxT("operator!=(uint32_t)"))
467 ASSERT_FALSE(CUInt128((uint8_t *)&TestData::uintValue
) != 0x12345678u
);
468 CUInt128
test((uint8_t *)&TestData::sequence
);
469 ASSERT_TRUE(test
!= 0x00010203u
);
470 ASSERT_TRUE(test
!= 0x04050607u
);
471 ASSERT_TRUE(test
!= 0x08090a0bu
);
472 ASSERT_TRUE(test
!= 0x0c0d0e0fu
);
475 TEST_M(CUInt128
, OperatorNotEqualUint32CUInt128
, wxT("operator!=(uint32_t, const CUInt128&)"))
477 ASSERT_FALSE(0x12345678u
!= CUInt128((uint8_t *)&TestData::uintValue
));
478 CUInt128
test((uint8_t *)&TestData::sequence
);
479 ASSERT_TRUE(0x00010203u
!= test
);
480 ASSERT_TRUE(0x04050607u
!= test
);
481 ASSERT_TRUE(0x08090a0bu
!= test
);
482 ASSERT_TRUE(0x0c0d0e0fu
!= test
);
485 TEST_M(CUInt128
, OperatorLessCUInt128
, wxT("operator<(const CUInt128&)"))
487 for (unsigned i
= 0; i
< 4; i
++) {
490 a
.Set32BitChunk(i
, 0x0d3859feu
);
491 b
.Set32BitChunk(i
, 0xff579ec1u
);
496 TEST_M(CUInt128
, OperatorLessOrEqualCUInt128
, wxT("operator<=(const CUInt128&)"))
498 for (unsigned i
= 0; i
< 4; i
++) {
501 a
.Set32BitChunk(i
, 0x0d3859feu
);
502 b
.Set32BitChunk(i
, 0xff579ec1u
);
504 b
.Set32BitChunk(i
, a
.Get32BitChunk(i
));
509 TEST_M(CUInt128
, OperatorGreaterCUInt128
, wxT("operator>(const CUInt128&)"))
511 for (unsigned i
= 0; i
< 4; i
++) {
514 b
.Set32BitChunk(i
, 0x0d3859feu
);
515 a
.Set32BitChunk(i
, 0xff579ec1u
);
520 TEST_M(CUInt128
, OperatorGreaterOrEqualCUInt128
, wxT("operator>=(const CUInt128&)"))
522 for (unsigned i
= 0; i
< 4; i
++) {
525 b
.Set32BitChunk(i
, 0x0d3859feu
);
526 a
.Set32BitChunk(i
, 0xff579ec1u
);
528 b
.Set32BitChunk(i
, a
.Get32BitChunk(i
));
533 TEST_M(CUInt128
, OperatorLessUint32
, wxT("operator<(uint32_t)"))
535 for (unsigned i
= 0; i
< 4; i
++) {
537 a
.Set32BitChunk(i
, 0x0d3859feu
);
539 ASSERT_TRUE(a
< 0xffed3216u
);
541 ASSERT_FALSE(a
< 0xffed3216u
);
546 TEST_M(CUInt128
, OperatorLessOrEqualUint32
, wxT("operator<=(uint32_t)"))
548 for (unsigned i
= 0; i
< 4; i
++) {
550 a
.Set32BitChunk(i
, 0x0d3859feu
);
552 ASSERT_TRUE(a
<= 0xffed3216u
);
553 ASSERT_TRUE(a
<= 0x0d3859feu
);
555 ASSERT_FALSE(a
<= 0xffed3216u
);
556 ASSERT_FALSE(a
<= 0x0d3859feu
);
561 TEST_M(CUInt128
, OperatorGreaterUint32
, wxT("operator>(uint32_t)"))
563 for (unsigned i
= 0; i
< 4; i
++) {
565 a
.Set32BitChunk(i
, 0xffed3216u
);
566 ASSERT_TRUE(a
> 0x0d3859feu
);
570 TEST_M(CUInt128
, OperatorGreaterOrEqualUint32
, wxT("operator>=(uint32_t)"))
572 for (unsigned i
= 0; i
< 4; i
++) {
574 a
.Set32BitChunk(i
, 0xffed3216u
);
575 ASSERT_TRUE(a
>= 0x0d3859feu
);
576 ASSERT_TRUE(a
>= 0xffed3216u
);
580 TEST_M(CUInt128
, OperatorLessUint32CUInt128
, wxT("operator<(uint32_t, const CUInt128&)"))
582 for (unsigned i
= 0; i
< 4; i
++) {
584 a
.Set32BitChunk(i
, 0xffed3216u
);
585 ASSERT_TRUE(a
> 0x0d3859feu
);
589 TEST_M(CUInt128
, OperatorLessOrEqualUint32CUInt128
, wxT("operator<=(uint32_t, const CUInt128&)"))
591 for (unsigned i
= 0; i
< 4; i
++) {
593 a
.Set32BitChunk(i
, 0xffed3216u
);
594 ASSERT_TRUE(0x0d3859feu
<= a
);
595 ASSERT_TRUE(0xffed3216u
<= a
);
599 TEST_M(CUInt128
, OperatorGreaterUint32CUInt128
, wxT("operator>(uint32_t, const CUInt128&)"))
601 for (unsigned i
= 0; i
< 4; i
++) {
603 a
.Set32BitChunk(i
, 0x0d3859feu
);
605 ASSERT_TRUE(0xffed3216u
> a
);
607 ASSERT_FALSE(0xffed3216u
> a
);
612 TEST_M(CUInt128
, OperatorGreaterOrEqualUint32CUInt128
, wxT("operator>=(uint32_t, const CUInt128&)"))
614 for (unsigned i
= 0; i
< 4; i
++) {
616 a
.Set32BitChunk(i
, 0x0d3859feu
);
618 ASSERT_TRUE(0xffed3216u
>= a
);
619 ASSERT_TRUE(0x0d3859feu
>= a
);
621 ASSERT_FALSE(0xffed3216u
>= a
);
622 ASSERT_FALSE(0x0d3859feu
>= a
);
627 TEST_M(CUInt128
, OperatorAddCUInt128
, wxT("operator+(const CUInt128&)"))
629 CUInt128
a((uint8_t *)&TestData::sequence
);
634 CUInt128
result(a
+ a
);
636 ASSERT_EQUALS(check
, result
);
637 ASSERT_EQUALS(ref
, a
);
640 a
.SetBitNumber(32, 1);
644 ASSERT_EQUALS(check
, result
);
647 TEST_M(CUInt128
, OperatorSubtractCUInt128
, wxT("operator-(const CUInt128&)"))
649 CUInt128
a((uint8_t *)&TestData::randomValue
);
650 CUInt128
b((uint8_t *)&TestData::sequence
);
656 CUInt128
result(a
- b
);
657 ASSERT_EQUALS(refa
, a
);
658 ASSERT_EQUALS(refb
, b
);
660 ASSERT_EQUALS(check
, result
);
665 ASSERT_EQUALS(check
, result
);
668 TEST_M(CUInt128
, OperatorXorCUInt128
, wxT("operator^(const CUInt128&)"))
670 CUInt128
a((uint8_t *)&TestData::randomValue
);
671 CUInt128
b((uint8_t *)&TestData::sequence
);
676 CUInt128
result(a
^ b
);
677 CUInt128
check(refa
);
680 ASSERT_EQUALS(refa
, a
);
681 ASSERT_EQUALS(refb
, b
);
682 ASSERT_EQUALS(check
, result
);
685 TEST_M(CUInt128
, OperatorAddUint32
, wxT("operator+(uint32_t)"))
687 CUInt128
a((uint8_t *)&TestData::randomValue
);
688 uint32_t b
= a
.Get32BitChunk(0);
693 CUInt128
result(a
+ b
);
695 ASSERT_EQUALS(check
, result
);
696 ASSERT_EQUALS(ref
, a
);
699 a
.SetBitNumber(96, 1);
700 b
= a
.Get32BitChunk(3);
704 ASSERT_EQUALS(check
, result
);
707 TEST_M(CUInt128
, OperatorSubtractUint32
, wxT("operator-(uint32_t)"))
709 CUInt128
a((uint8_t *)&TestData::randomValue
);
710 uint32_t b
= a
.Get32BitChunk(0);
715 CUInt128
result(a
- b
);
716 ASSERT_EQUALS(ref
, a
);
718 ASSERT_EQUALS(check
, result
);
723 ASSERT_EQUALS(check
, result
);
726 TEST_M(CUInt128
, OperatorXorUint32
, wxT("operator^(uint32_t)"))
728 CUInt128
a((uint8_t *)&TestData::randomValue
);
729 uint32_t b
= a
.Get32BitChunk(0);
733 CUInt128
result(a
^ b
);
737 ASSERT_EQUALS(ref
, a
);
738 ASSERT_EQUALS(check
, result
);
741 TEST_M(CUInt128
, OperatorAddUint32CUInt128
, wxT("operator+(uint32_t, const CUInt128&)"))
743 CUInt128
a((uint8_t *)&TestData::randomValue
);
744 uint32_t b
= a
.Get32BitChunk(0);
749 CUInt128
result(b
+ a
);
751 ASSERT_EQUALS(check
, result
);
752 ASSERT_EQUALS(ref
, a
);
755 a
.SetBitNumber(96, 1);
756 b
= a
.Get32BitChunk(3);
760 ASSERT_EQUALS(check
, result
);
763 TEST_M(CUInt128
, OperatorSubtractUint32CUInt128
, wxT("operator-(uint32_t, const CUInt128&)"))
765 CUInt128
a((uint8_t *)&TestData::randomValue
);
766 uint32_t b
= a
.Get32BitChunk(0);
771 CUInt128
result(b
- a
);
772 ASSERT_EQUALS(ref
, a
);
774 ASSERT_EQUALS(check
, result
);
777 TEST_M(CUInt128
, OperatorXorUint32CUInt128
, wxT("operator^(uint32_t, const CUInt128&)"))
779 CUInt128
a((uint8_t *)&TestData::randomValue
);
780 uint32_t b
= a
.Get32BitChunk(0);
785 CUInt128
result(b
^ a
);
788 ASSERT_EQUALS(ref
, a
);
789 ASSERT_EQUALS(check
, result
);