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 #if wxCHECK_VERSION(2, 8, 8)
115 ASSERT_RAISES(CAssertFailureException
, test
.Get32BitChunk(4));
119 TEST_M(CUInt128
, OperatorEqualsCUInt128
, wxT("operator==(const CUInt128&)"))
121 CUInt128
a((uint8_t *)&TestData::sequence
);
122 CUInt128
b((uint8_t *)&TestData::one
);
125 ASSERT_FALSE(a
== b
);
128 TEST_M(CUInt128
, OperatorEqualsUint32
, wxT("operator==(uint32_t)"))
130 ASSERT_TRUE(CUInt128((uint8_t *)&TestData::uintValue
) == 0x12345678u
);
131 CUInt128
test((uint8_t *)&TestData::sequence
);
132 ASSERT_FALSE(test
== 0x00010203u
);
133 ASSERT_FALSE(test
== 0x04050607u
);
134 ASSERT_FALSE(test
== 0x08090a0bu
);
135 ASSERT_FALSE(test
== 0x0c0d0e0fu
);
138 TEST_M(CUInt128
, OperatorEqualsUint32CUInt128
, wxT("operator==(uint32_t, const CUInt128&)"))
140 ASSERT_TRUE(0x12345678u
== CUInt128((uint8_t *)&TestData::uintValue
));
141 CUInt128
test((uint8_t *)&TestData::sequence
);
142 ASSERT_FALSE(0x00010203u
== test
);
143 ASSERT_FALSE(0x04050607u
== test
);
144 ASSERT_FALSE(0x08090a0bu
== test
);
145 ASSERT_FALSE(0x0c0d0e0fu
== test
);
148 TEST_M(CUInt128
, EmptyContructor
, wxT("CUInt128()"))
151 CUInt128
ref((uint8_t *)&TestData::zero
);
153 ASSERT_EQUALS(ref
, test
);
156 TEST_M(CUInt128
, CopyConstructor
, wxT("CUInt128(const CUInt128&)"))
158 CUInt128
a((uint8_t *)&TestData::sequence
);
164 TEST_M(CUInt128
, ConstructFromBool
, wxT("CUInt128(bool)"))
166 CUInt128
empty(false);
168 CUInt128
zero((uint8_t *)&TestData::zero
);
169 CUInt128
minusOne((uint8_t *)&TestData::minusOne
);
171 ASSERT_EQUALS(zero
, empty
);
172 ASSERT_EQUALS(minusOne
, full
);
175 TEST_M(CUInt128
, ConstructFromUint32
, wxT("CUInt128(uint32_t)"))
177 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::uintValue
), CUInt128(0x12345678u
));
180 TEST_M(CUInt128
, AssignCUInt128
, wxT("operator=(const CUInt128&)"))
182 CUInt128
a((uint8_t *)&TestData::sequence
);
188 TEST_M(CUInt128
, AssignUint32
, wxT("operator=(uint32_t)"))
190 CUInt128
a((uint8_t *)&TestData::uintValue
);
191 // Note that CUInt128 b = 0x12345678u; won't work,
192 // the compiler only allows assignment between the
193 // same types when constructing the object.
200 TEST(CUInt128
, Set32BitChunk
)
204 test
.Set32BitChunk(3, 0x12345678u
);
205 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::uintValue
), test
);
207 test
.Set32BitChunk(0, 0x00010203u
);
208 test
.Set32BitChunk(1, 0x04050607u
);
209 test
.Set32BitChunk(2, 0x08090a0bu
);
210 test
.Set32BitChunk(3, 0x0c0d0e0fu
);
211 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), test
);
212 #if wxCHECK_VERSION(2, 8, 8)
213 ASSERT_RAISES(CAssertFailureException
, test
.Set32BitChunk(4, 0));
214 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), test
);
218 TEST_M(CUInt128
, SetValueCUInt128
, wxT("SetValue(const CUInt128&)"))
220 CUInt128
a((uint8_t *)&TestData::sequence
);
227 TEST_M(CUInt128
, SetValueUint32
, wxT("SetValue(uint32_t)"))
229 CUInt128
a((uint8_t *)&TestData::uintValue
);
232 b
.SetValue(0x12345678u
);
236 TEST(CUInt128
, SetValueBE
)
238 CUInt128
a((uint8_t *)&TestData::sequence
);
242 a
.ToByteArray((uint8_t *)&buffer
);
243 b
.SetValueBE((uint8_t *)&buffer
);
247 TEST(CUInt128
, StoreCryptValue
)
249 uint8_t ref
[16] = { 0x3, 0x2, 0x1, 0x0, 0x7, 0x6, 0x5, 0x4, 0xb, 0xa, 0x9, 0x8, 0xf, 0xe, 0xd, 0xc };
251 CUInt128
test((uint8_t *)&TestData::sequence
);
253 test
.StoreCryptValue((uint8_t *)&tmp
);
254 ASSERT_EQUALS(CUInt128((uint8_t *)&ref
), CUInt128((uint8_t *)&tmp
));
257 TEST(CUInt128
, ShiftLeft
)
259 CUInt128
test((uint8_t *)&TestData::one
);
260 uint8_t r1
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };
261 uint8_t r2
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0 };
262 uint8_t r3
[16] = { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
263 uint8_t r4
[16] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
266 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::one
), test
);
268 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), test
);
270 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), test
);
272 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), test
);
273 test
.SetValueBE((uint8_t *)&TestData::one
);
275 ASSERT_EQUALS(CUInt128((uint8_t *)&r4
), test
);
276 test
.SetValueBE((uint8_t *)&TestData::one
);
278 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::zero
), test
);
281 TEST_M(CUInt128
, AddCUInt128
, wxT("Add(const CUInt128&)"))
283 uint8_t d0
[16] = { 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
284 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
285 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
286 uint8_t r3
[16] = { 0xfc, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
287 uint8_t r4
[16] = { 0xf8, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
288 CUInt128
a((uint8_t *)&TestData::sequence
);
289 CUInt128
d((uint8_t *)&d0
);
291 a
.Add(CUInt128(0x01234567u
));
292 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
293 a
.Add(CUInt128(0xff000000u
));
294 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
296 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), a
);
297 ASSERT_EQUALS(CUInt128((uint8_t *)&d0
), d
);
299 ASSERT_EQUALS(CUInt128((uint8_t *)&r4
), a
);
300 a
.SetValueBE((uint8_t *)&TestData::minusOne
);
301 a
.Add(CUInt128((uint8_t *)&TestData::one
));
302 ASSERT_EQUALS(CUInt128(), a
);
305 TEST_M(CUInt128
, AddUint32
, wxT("Add(uint32_t)"))
307 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
308 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
309 CUInt128
a((uint8_t *)&TestData::sequence
);
312 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
314 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
315 a
.SetValueBE((uint8_t *)&TestData::minusOne
);
320 TEST_M(CUInt128
, SubtractCUInt128
, wxT("Subtract(const CUInt128&)"))
322 uint8_t d0
[16] = { 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
323 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
324 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
325 uint8_t r3
[16] = { 0xfc, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
326 uint8_t r4
[16] = { 0xf8, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
327 CUInt128
a((uint8_t *)&r4
);
328 CUInt128
d((uint8_t *)&d0
);
331 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), a
);
332 ASSERT_EQUALS(CUInt128((uint8_t *)&d0
), d
);
334 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
335 a
.Subtract(CUInt128(0xff000000u
));
336 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
337 a
.Subtract(CUInt128(0x01234567u
));
338 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), a
);
340 a
.Subtract(CUInt128((uint8_t *)&TestData::one
));
341 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::minusOne
), a
);
344 TEST_M(CUInt128
, SubtractUint32
, wxT("Subtract(uint32_t)"))
346 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
347 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
348 CUInt128
a((uint8_t *)&r2
);
350 a
.Subtract(0xff000000u
);
351 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
352 a
.Subtract(0x01234567u
);
353 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), a
);
356 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::minusOne
), a
);
359 TEST_M(CUInt128
, XorCUInt128
, wxT("XOR(const CUInt128&)"))
361 uint8_t xd
[16] = { 0xff, 0x00, 0xee, 0x11, 0xdd, 0x22, 0xcc, 0x33, 0xbb, 0x44, 0xaa, 0x55, 0x99, 0x66, 0x88, 0x77 };
362 uint8_t xr
[16] = { 0xff, 0x01, 0xec, 0x12, 0xd9, 0x27, 0xca, 0x34, 0xb3, 0x4d, 0xa0, 0x5e, 0x95, 0x6b, 0x86, 0x78 };
363 CUInt128
a((uint8_t *)&TestData::sequence
);
364 CUInt128
x((uint8_t *)&xd
);
367 ASSERT_EQUALS(CUInt128((uint8_t *)&xr
), a
);
368 ASSERT_EQUALS(CUInt128((uint8_t *)&xd
), x
);
371 // Not yet implemented
373 TEST_M(CUInt128
, XorUint32
, wxT("XOR(uint32_t)"))
375 CUInt128
a(0x12345678u
);
378 ASSERT_EQUALS(0x64606468, a
);
382 TEST_M(CUInt128
, OperatorShiftLeftAssign
, wxT("operator<<=(unsigned)"))
384 CUInt128
test((uint8_t *)&TestData::one
);
385 uint8_t r1
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 };
386 uint8_t r2
[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0 };
387 uint8_t r3
[16] = { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
388 uint8_t r4
[16] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
391 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::one
), test
);
393 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), test
);
395 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), test
);
397 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), test
);
398 test
.SetValueBE((uint8_t *)&TestData::one
);
400 ASSERT_EQUALS(CUInt128((uint8_t *)&r4
), test
);
401 test
.SetValueBE((uint8_t *)&TestData::one
);
403 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::zero
), test
);
406 TEST_M(CUInt128
, OperatorAddAssignCUInt128
, wxT("operator+=(const CUInt128&)"))
408 uint8_t d0
[16] = { 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
409 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
410 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
411 uint8_t r3
[16] = { 0xfc, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
412 uint8_t r4
[16] = { 0xf8, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
413 CUInt128
a((uint8_t *)&TestData::sequence
);
414 CUInt128
d((uint8_t *)&d0
);
416 a
+= CUInt128(0x01234567u
);
417 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
418 a
+= CUInt128(0xff000000u
);
419 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
421 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), a
);
422 ASSERT_EQUALS(CUInt128((uint8_t *)&d0
), d
);
424 ASSERT_EQUALS(CUInt128((uint8_t *)&r4
), a
);
425 a
.SetValueBE((uint8_t *)&TestData::minusOne
);
426 a
+= CUInt128((uint8_t *)&TestData::one
);
427 ASSERT_EQUALS(CUInt128(), a
);
430 TEST_M(CUInt128
, OperatorAddAssignUint32
, wxT("operator+=(uint32_t)"))
432 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
433 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
434 CUInt128
a((uint8_t *)&TestData::sequence
);
437 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
439 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
440 a
.SetValueBE((uint8_t *)&TestData::minusOne
);
445 TEST_M(CUInt128
, OperatorSubtractAssignCUInt128
, wxT("operator-=(const CUInt128&)"))
447 uint8_t d0
[16] = { 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
448 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
449 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
450 uint8_t r3
[16] = { 0xfc, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
451 uint8_t r4
[16] = { 0xf8, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
452 CUInt128
a((uint8_t *)&r4
);
453 CUInt128
d((uint8_t *)&d0
);
456 ASSERT_EQUALS(CUInt128((uint8_t *)&r3
), a
);
457 ASSERT_EQUALS(CUInt128((uint8_t *)&d0
), d
);
459 ASSERT_EQUALS(CUInt128((uint8_t *)&r2
), a
);
460 a
-= CUInt128(0xff000000u
);
461 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
462 a
-= CUInt128(0x01234567u
);
463 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), a
);
465 a
-= CUInt128((uint8_t *)&TestData::one
);
466 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::minusOne
), a
);
469 TEST_M(CUInt128
, OperatorSubtractAssignUint32
, wxT("operator-=(uint32_t)"))
471 uint8_t r1
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xd, 0x30, 0x53, 0x76 };
472 uint8_t r2
[16] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xc, 0xc, 0x30, 0x53, 0x76 };
473 CUInt128
a((uint8_t *)&r2
);
476 ASSERT_EQUALS(CUInt128((uint8_t *)&r1
), a
);
478 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::sequence
), a
);
481 ASSERT_EQUALS(CUInt128((uint8_t *)&TestData::minusOne
), a
);
484 TEST_M(CUInt128
, OperatorXorAssignCUInt128
, wxT("operator^=(const CUInt128&)"))
486 uint8_t xd
[16] = { 0xff, 0x00, 0xee, 0x11, 0xdd, 0x22, 0xcc, 0x33, 0xbb, 0x44, 0xaa, 0x55, 0x99, 0x66, 0x88, 0x77 };
487 uint8_t xr
[16] = { 0xff, 0x01, 0xec, 0x12, 0xd9, 0x27, 0xca, 0x34, 0xb3, 0x4d, 0xa0, 0x5e, 0x95, 0x6b, 0x86, 0x78 };
488 CUInt128
a((uint8_t *)&TestData::sequence
);
489 CUInt128
x((uint8_t *)&xd
);
492 ASSERT_EQUALS(CUInt128((uint8_t *)&xr
), a
);
493 ASSERT_EQUALS(CUInt128((uint8_t *)&xd
), x
);
496 TEST_M(CUInt128
, OperatorXorAssignUint32
, wxT("operator^=(uint32_t)"))
498 CUInt128
a(0x12345678u
);
501 ASSERT_EQUALS(0x64606468, a
);
504 TEST(CUInt128
, GetBitNumber
)
509 ASSERT_TRUE(test
.GetBitNumber(0) == 0);
510 ASSERT_TRUE(test
.GetBitNumber(127) == 1);
512 ASSERT_TRUE(test
.GetBitNumber(0) == 1);
513 ASSERT_TRUE(test
.GetBitNumber(127) == 0);
516 TEST(CUInt128
, SetBitNumber
)
520 test
.SetBitNumber(127, 1);
521 ASSERT_EQUALS(1, test
);
522 test
.SetBitNumber(126, 1);
523 ASSERT_EQUALS(3, test
);
524 test
.SetBitNumber(127, 0);
525 ASSERT_EQUALS(2, test
);
526 test
.SetBitNumber(0, 1);
527 ASSERT_EQUALS(0x80000000u
, test
.Get32BitChunk(0));
528 #if wxCHECK_VERSION(2, 8, 8)
529 ASSERT_RAISES(CAssertFailureException
, test
.SetBitNumber(128, 0));
533 TEST_M(CUInt128
, OperatorNotEqualCUInt128
, wxT("operator!=(const CUInt128&)"))
535 CUInt128
a((uint8_t *)&TestData::sequence
);
536 CUInt128
b((uint8_t *)&TestData::one
);
538 ASSERT_FALSE(a
!= a
);
542 TEST_M(CUInt128
, OperatorNotEqualUint32
, wxT("operator!=(uint32_t)"))
544 ASSERT_FALSE(CUInt128((uint8_t *)&TestData::uintValue
) != 0x12345678u
);
545 CUInt128
test((uint8_t *)&TestData::sequence
);
546 ASSERT_TRUE(test
!= 0x00010203u
);
547 ASSERT_TRUE(test
!= 0x04050607u
);
548 ASSERT_TRUE(test
!= 0x08090a0bu
);
549 ASSERT_TRUE(test
!= 0x0c0d0e0fu
);
552 TEST_M(CUInt128
, OperatorNotEqualUint32CUInt128
, wxT("operator!=(uint32_t, const CUInt128&)"))
554 ASSERT_FALSE(0x12345678u
!= CUInt128((uint8_t *)&TestData::uintValue
));
555 CUInt128
test((uint8_t *)&TestData::sequence
);
556 ASSERT_TRUE(0x00010203u
!= test
);
557 ASSERT_TRUE(0x04050607u
!= test
);
558 ASSERT_TRUE(0x08090a0bu
!= test
);
559 ASSERT_TRUE(0x0c0d0e0fu
!= test
);
562 TEST_M(CUInt128
, OperatorLessCUInt128
, wxT("operator<(const CUInt128&)"))
564 for (unsigned i
= 0; i
< 4; i
++) {
567 a
.Set32BitChunk(i
, 0x0d3859feu
);
568 b
.Set32BitChunk(i
, 0xff579ec1u
);
573 TEST_M(CUInt128
, OperatorLessOrEqualCUInt128
, wxT("operator<=(const CUInt128&)"))
575 for (unsigned i
= 0; i
< 4; i
++) {
578 a
.Set32BitChunk(i
, 0x0d3859feu
);
579 b
.Set32BitChunk(i
, 0xff579ec1u
);
581 b
.Set32BitChunk(i
, a
.Get32BitChunk(i
));
586 TEST_M(CUInt128
, OperatorGreaterCUInt128
, wxT("operator>(const CUInt128&)"))
588 for (unsigned i
= 0; i
< 4; i
++) {
591 b
.Set32BitChunk(i
, 0x0d3859feu
);
592 a
.Set32BitChunk(i
, 0xff579ec1u
);
597 TEST_M(CUInt128
, OperatorGreaterOrEqualCUInt128
, wxT("operator>=(const CUInt128&)"))
599 for (unsigned i
= 0; i
< 4; i
++) {
602 b
.Set32BitChunk(i
, 0x0d3859feu
);
603 a
.Set32BitChunk(i
, 0xff579ec1u
);
605 b
.Set32BitChunk(i
, a
.Get32BitChunk(i
));
610 TEST_M(CUInt128
, OperatorLessUint32
, wxT("operator<(uint32_t)"))
612 for (unsigned i
= 0; i
< 4; i
++) {
614 a
.Set32BitChunk(i
, 0x0d3859feu
);
616 ASSERT_TRUE(a
< 0xffed3216u
);
618 ASSERT_FALSE(a
< 0xffed3216u
);
623 TEST_M(CUInt128
, OperatorLessOrEqualUint32
, wxT("operator<=(uint32_t)"))
625 for (unsigned i
= 0; i
< 4; i
++) {
627 a
.Set32BitChunk(i
, 0x0d3859feu
);
629 ASSERT_TRUE(a
<= 0xffed3216u
);
630 ASSERT_TRUE(a
<= 0x0d3859feu
);
632 ASSERT_FALSE(a
<= 0xffed3216u
);
633 ASSERT_FALSE(a
<= 0x0d3859feu
);
638 TEST_M(CUInt128
, OperatorGreaterUint32
, wxT("operator>(uint32_t)"))
640 for (unsigned i
= 0; i
< 4; i
++) {
642 a
.Set32BitChunk(i
, 0xffed3216u
);
643 ASSERT_TRUE(a
> 0x0d3859feu
);
647 TEST_M(CUInt128
, OperatorGreaterOrEqualUint32
, wxT("operator>=(uint32_t)"))
649 for (unsigned i
= 0; i
< 4; i
++) {
651 a
.Set32BitChunk(i
, 0xffed3216u
);
652 ASSERT_TRUE(a
>= 0x0d3859feu
);
653 ASSERT_TRUE(a
>= 0xffed3216u
);
657 TEST_M(CUInt128
, OperatorLessUint32CUInt128
, wxT("operator<(uint32_t, const CUInt128&)"))
659 for (unsigned i
= 0; i
< 4; i
++) {
661 a
.Set32BitChunk(i
, 0xffed3216u
);
662 ASSERT_TRUE(a
> 0x0d3859feu
);
666 TEST_M(CUInt128
, OperatorLessOrEqualUint32CUInt128
, wxT("operator<=(uint32_t, const CUInt128&)"))
668 for (unsigned i
= 0; i
< 4; i
++) {
670 a
.Set32BitChunk(i
, 0xffed3216u
);
671 ASSERT_TRUE(0x0d3859feu
<= a
);
672 ASSERT_TRUE(0xffed3216u
<= a
);
676 TEST_M(CUInt128
, OperatorGreaterUint32CUInt128
, wxT("operator>(uint32_t, const CUInt128&)"))
678 for (unsigned i
= 0; i
< 4; i
++) {
680 a
.Set32BitChunk(i
, 0x0d3859feu
);
682 ASSERT_TRUE(0xffed3216u
> a
);
684 ASSERT_FALSE(0xffed3216u
> a
);
689 TEST_M(CUInt128
, OperatorGreaterOrEqualUint32CUInt128
, wxT("operator>=(uint32_t, const CUInt128&)"))
691 for (unsigned i
= 0; i
< 4; i
++) {
693 a
.Set32BitChunk(i
, 0x0d3859feu
);
695 ASSERT_TRUE(0xffed3216u
>= a
);
696 ASSERT_TRUE(0x0d3859feu
>= a
);
698 ASSERT_FALSE(0xffed3216u
>= a
);
699 ASSERT_FALSE(0x0d3859feu
>= a
);
704 TEST_M(CUInt128
, OperatorAddCUInt128
, wxT("operator+(const CUInt128&)"))
706 CUInt128
a((uint8_t *)&TestData::sequence
);
711 CUInt128
result(a
+ a
);
713 ASSERT_EQUALS(check
, result
);
714 ASSERT_EQUALS(ref
, a
);
717 a
.SetBitNumber(32, 1);
721 ASSERT_EQUALS(check
, result
);
724 TEST_M(CUInt128
, OperatorSubtractCUInt128
, wxT("operator-(const CUInt128&)"))
726 CUInt128
a((uint8_t *)&TestData::randomValue
);
727 CUInt128
b((uint8_t *)&TestData::sequence
);
733 CUInt128
result(a
- b
);
734 ASSERT_EQUALS(refa
, a
);
735 ASSERT_EQUALS(refb
, b
);
737 ASSERT_EQUALS(check
, result
);
742 ASSERT_EQUALS(check
, result
);
745 TEST_M(CUInt128
, OperatorXorCUInt128
, wxT("operator^(const CUInt128&)"))
747 CUInt128
a((uint8_t *)&TestData::randomValue
);
748 CUInt128
b((uint8_t *)&TestData::sequence
);
753 CUInt128
result(a
^ b
);
754 CUInt128
check(refa
);
757 ASSERT_EQUALS(refa
, a
);
758 ASSERT_EQUALS(refb
, b
);
759 ASSERT_EQUALS(check
, result
);
762 TEST_M(CUInt128
, OperatorAddUint32
, wxT("operator+(uint32_t)"))
764 CUInt128
a((uint8_t *)&TestData::randomValue
);
765 uint32_t b
= a
.Get32BitChunk(0);
770 CUInt128
result(a
+ b
);
772 ASSERT_EQUALS(check
, result
);
773 ASSERT_EQUALS(ref
, a
);
776 a
.SetBitNumber(96, 1);
777 b
= a
.Get32BitChunk(3);
781 ASSERT_EQUALS(check
, result
);
784 TEST_M(CUInt128
, OperatorSubtractUint32
, wxT("operator-(uint32_t)"))
786 CUInt128
a((uint8_t *)&TestData::randomValue
);
787 uint32_t b
= a
.Get32BitChunk(0);
792 CUInt128
result(a
- b
);
793 ASSERT_EQUALS(ref
, a
);
795 ASSERT_EQUALS(check
, result
);
800 ASSERT_EQUALS(check
, result
);
803 TEST_M(CUInt128
, OperatorXorUint32
, wxT("operator^(uint32_t)"))
805 CUInt128
a((uint8_t *)&TestData::randomValue
);
806 uint32_t b
= a
.Get32BitChunk(0);
810 CUInt128
result(a
^ b
);
814 ASSERT_EQUALS(ref
, a
);
815 ASSERT_EQUALS(check
, result
);
818 TEST_M(CUInt128
, OperatorAddUint32CUInt128
, wxT("operator+(uint32_t, const CUInt128&)"))
820 CUInt128
a((uint8_t *)&TestData::randomValue
);
821 uint32_t b
= a
.Get32BitChunk(0);
826 CUInt128
result(b
+ a
);
828 ASSERT_EQUALS(check
, result
);
829 ASSERT_EQUALS(ref
, a
);
832 a
.SetBitNumber(96, 1);
833 b
= a
.Get32BitChunk(3);
837 ASSERT_EQUALS(check
, result
);
840 TEST_M(CUInt128
, OperatorSubtractUint32CUInt128
, wxT("operator-(uint32_t, const CUInt128&)"))
842 CUInt128
a((uint8_t *)&TestData::randomValue
);
843 uint32_t b
= a
.Get32BitChunk(0);
848 CUInt128
result(b
- a
);
849 ASSERT_EQUALS(ref
, a
);
851 ASSERT_EQUALS(check
, result
);
854 TEST_M(CUInt128
, OperatorXorUint32CUInt128
, wxT("operator^(uint32_t, const CUInt128&)"))
856 CUInt128
a((uint8_t *)&TestData::randomValue
);
857 uint32_t b
= a
.Get32BitChunk(0);
862 CUInt128
result(b
^ a
);
865 ASSERT_EQUALS(ref
, a
);
866 ASSERT_EQUALS(check
, result
);