135#ifdef ENABLE_VOIDSTAR
136 GTEST_SKIP() <<
"ENABLE_VOIDSTAR is a debug build, but does not crash on failed asserts.";
138 auto smallConstruct = [] {
142 Blob const tooSmall{1, 2, 3, 4, 5, 6, 7, 8};
143 BaseUInt96
const result = BaseUInt96::fromRaw(tooSmall);
144 auto const resultText =
to_string(result);
145 EXPECT_EQ(resultText,
"010203040506070800000000") << resultText;
147 EXPECT_DEBUG_DEATH(smallConstruct(),
"input size match");
149 auto largeConstruct = [] {
153 Blob const tooBig{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
154 BaseUInt96
const result = BaseUInt96::fromRaw(tooBig);
155 auto const resultText =
to_string(result);
156 EXPECT_EQ(resultText,
"0102030405060708090A0B0C") << resultText;
158 EXPECT_DEBUG_DEATH(largeConstruct(),
"input size match");
160 auto smallCopy = [] {
164 Blob const tooSmall{1, 2, 3, 4, 5, 6, 7, 8};
168 auto const originalText =
to_string(result);
169 EXPECT_EQ(originalText,
"FFFFFFFFFFFFFFFFFFFFFFFF") << originalText;
172 auto const resultText =
to_string(result);
173 EXPECT_EQ(resultText,
"010203040506070800000000") << resultText;
175 EXPECT_DEBUG_DEATH(smallCopy(),
"input size match");
177 auto const largeCopy = [] {
181 Blob const tooBig{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
185 auto const originalText =
to_string(result);
186 EXPECT_EQ(originalText,
"FFFFFFFFFFFFFFFFFFFFFFFF") << originalText;
189 auto const resultText =
to_string(result);
190 EXPECT_EQ(resultText,
"0102030405060708090A0B0C") << resultText;
192 EXPECT_DEBUG_DEATH(largeCopy(),
"input size match");
206 Blob const raw{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
207 EXPECT_EQ(BaseUInt96::kBytes, raw.
size());
209 BaseUInt96 ascending = BaseUInt96::fromRaw(raw);
211 EXPECT_EQ(raw.
size(), ascending.size());
212 EXPECT_EQ(
to_string(ascending),
"0102030405060708090A0B0C");
214 EXPECT_EQ(*ascending.data(), 1);
215 EXPECT_EQ(ascending.signum(), 1);
216 EXPECT_FALSE(!ascending);
217 EXPECT_FALSE(ascending.isZero());
218 EXPECT_TRUE(ascending.isNonZero());
219 unsigned char expectedByte = 0;
220 for (
auto&
byte : ascending)
221 EXPECT_EQ(
byte, ++expectedByte);
228 BaseUInt96
const rehashed =
230 EXPECT_EQ(rehashed, ascending);
232 BaseUInt96 complement{~ascending};
234 EXPECT_EQ(
to_string(complement),
"FEFDFCFBFAF9F8F7F6F5F4F3");
236 EXPECT_EQ(*complement.data(), 0xfe);
237 EXPECT_EQ(complement.signum(), 1);
238 EXPECT_FALSE(!complement);
239 EXPECT_FALSE(complement.isZero());
240 EXPECT_TRUE(complement.isNonZero());
243 for (
auto&
byte : complement)
244 EXPECT_EQ(
byte, --expectedByte);
246 EXPECT_LT(ascending, complement);
247 EXPECT_GT(complement, ascending);
249 complement = ascending;
250 EXPECT_EQ(complement, ascending);
254 EXPECT_EQ(
to_string(zero),
"000000000000000000000000");
256 EXPECT_EQ(*zero.data(), 0);
257 EXPECT_EQ(*zero.begin(), 0);
259 EXPECT_EQ(zero.signum(), 0);
261 EXPECT_TRUE(zero.isZero());
262 EXPECT_FALSE(zero.isNonZero());
263 for (
auto&
byte : zero)
269 BaseUInt96
const defaultZero;
270 EXPECT_EQ(defaultZero, zero) <<
to_string(defaultZero);
272 BaseUInt96
const bracedZero{};
273 EXPECT_EQ(bracedZero, zero) <<
to_string(bracedZero);
275 BaseUInt96
const zeroFromUInt{0u};
276 EXPECT_EQ(zeroFromUInt, zero) <<
to_string(zeroFromUInt);
279 BaseUInt96 counter{zero};
281 EXPECT_EQ(counter, BaseUInt96(1));
284 EXPECT_EQ(counter, zero);
286 EXPECT_EQ(
to_string(counter),
"FFFFFFFFFFFFFFFFFFFFFFFF");
289 EXPECT_EQ(counter, zero);
291 BaseUInt96 zeroPlusOne{zero};
293 BaseUInt96 zeroMinusOne{zero};
295 BaseUInt96
const xored{zeroMinusOne ^ zeroPlusOne};
300 EXPECT_EQ(uset.
size(), 4);
303 EXPECT_TRUE(parsed.parseHex(
to_string(ascending)));
304 EXPECT_EQ(parsed, ascending);
308 EXPECT_FALSE(parsed.parseHex(
"A" +
to_string(ascending)));
312 EXPECT_FALSE(parsed.parseHex(
to_string(ascending) +
"A"));
320 xored[i] = (
'G' + (i % 10));
321 EXPECT_FALSE(parsed.parseHex(xored));
330 EXPECT_TRUE(parsed.parseHex(s1));
340 EXPECT_TRUE(parsed.parseHex(s1));
346 static_assert(BaseUInt96{}.signum() == 0);
347 static_assert(BaseUInt96(
"0").signum() == 0);
348 static_assert(BaseUInt96(
"000000000000000000000000").signum() == 0);
349 static_assert(BaseUInt96(
"000000000000000000000001").signum() == 1);
350 static_assert(BaseUInt96(
"800000000000000000000000").signum() == 1);
360 [[maybe_unused]] BaseUInt96
const t96(sView);
364 ::testing::ThrowsMessage<std::invalid_argument>(
"invalid length for hex string"));
368 auto badCharacter = [] {
372 [[maybe_unused]] BaseUInt96
const t96(sView);
375 badCharacter, ::testing::ThrowsMessage<std::range_error>(
"invalid hex character"));
382 char const*
const str;
385 constexpr StrBaseUInt(
char const* s) : str(s), tst(s)
389 constexpr auto kTestCases = std::to_array<StrBaseUInt>({
390 "000000000000000000000000",
391 "000000000000000000000001",
392 "fedcba9876543210ABCDEF91",
393 "19FEDCBA0123456789abcdef",
394 "800000000000000000000000",
395 "fFfFfFfFfFfFfFfFfFfFfFfF",
398 for (StrBaseUInt
const& expectedByte : kTestCases)
401 EXPECT_TRUE(t96.parseHex(expectedByte.str));
402 EXPECT_EQ(t96, expectedByte.tst);