1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
13TEST(TaggedValueTest, ConstructorAndTypeProperties)
16 auto val_u1 = TaggedValue::from<uint1_t>(
true);
18 EXPECT_EQ(val_u1.as<uint1_t>().value(), 1);
21 auto val_u8 = TaggedValue::from<uint8_t>(42);
23 EXPECT_EQ(val_u8.as<uint8_t>(), 42);
26 auto val_u16 = TaggedValue::from<uint16_t>(1000);
28 EXPECT_EQ(val_u16.as<uint16_t>(), 1000);
31 auto val_u32 = TaggedValue::from<uint32_t>(100000);
33 EXPECT_EQ(val_u32.as<uint32_t>(), 100000);
36 auto val_u64 = TaggedValue::from<uint64_t>(1ULL << 40);
38 EXPECT_EQ(val_u64.as<uint64_t>(), 1ULL << 40);
41 auto val_u128 = TaggedValue::from<uint128_t>(
uint128_t(1) << 100);
46 auto val_ff = TaggedValue::from<FF>(123);
48 EXPECT_EQ(val_ff.as<
FF>(),
FF(123));
52TEST(TaggedValueTest, FromTag)
58 EXPECT_EQ(val_u1.as<uint1_t>().value(), 1);
62 EXPECT_EQ(val_u1_zero.as<uint1_t>().value(), 0);
66 EXPECT_EQ(val_u8.as<uint8_t>(), 42);
70 EXPECT_EQ(val_u16.as<uint16_t>(), 42);
74 EXPECT_EQ(val_u32.as<uint32_t>(), 42);
78 EXPECT_EQ(val_u64.as<uint64_t>(), 42);
86 EXPECT_EQ(val_ff.as<
FF>(),
value);
90TEST(TaggedValueTest, FromTagTruncating)
95 EXPECT_EQ(val_u1.as<uint1_t>().value(), 1);
99 EXPECT_EQ(val_u1_zero.as<uint1_t>().value(), 0);
104 EXPECT_EQ(val_u8.as<uint8_t>(), 42);
108 EXPECT_EQ(val_u8_truncated.as<uint8_t>(), 44);
113 EXPECT_EQ(val_u16.as<uint16_t>(), 1000);
117 EXPECT_EQ(val_u16_truncated.as<uint16_t>(), 4464);
122 EXPECT_EQ(val_u32.as<uint32_t>(), 100000);
127 EXPECT_EQ(val_u32_truncated.as<uint32_t>(), 42);
132 EXPECT_EQ(val_u64.as<uint64_t>(), 1ULL << 40);
137 EXPECT_EQ(val_u64_truncated.as<uint64_t>(), 123);
147 EXPECT_EQ(val_u128_truncated.as<
uint128_t>(), 456);
153 EXPECT_EQ(val_ff.as<
FF>(), large_ff);
157TEST(TaggedValueTest, FromTagOutOfBounds)
186TEST(TaggedValueTest, AsFF)
189 auto val_u1 = TaggedValue::from<uint1_t>(1);
190 EXPECT_EQ(val_u1.as_ff(),
FF(1));
192 auto val_u8 = TaggedValue::from<uint8_t>(42);
193 EXPECT_EQ(val_u8.as_ff(),
FF(42));
195 auto val_u16 = TaggedValue::from<uint16_t>(1000);
196 EXPECT_EQ(val_u16.as_ff(),
FF(1000));
198 auto val_u32 = TaggedValue::from<uint32_t>(100000);
199 EXPECT_EQ(val_u32.as_ff(),
FF(100000));
201 auto val_u64 = TaggedValue::from<uint64_t>(1ULL << 40);
202 EXPECT_EQ(val_u64.as_ff(),
FF(1ULL << 40));
205 auto val_u128 = TaggedValue::from<uint128_t>(123);
206 EXPECT_EQ(val_u128.as_ff(),
FF(123));
210 auto val_ff = TaggedValue::from<FF>(field_val);
211 EXPECT_EQ(val_ff.as_ff(), field_val);
215TEST(TaggedValueTest, ArithmeticOperations)
218 auto u1_val0 = TaggedValue::from<uint1_t>(0);
219 auto u1_val1 = TaggedValue::from<uint1_t>(1);
221 auto u1_add = u1_val1 + u1_val0;
223 EXPECT_EQ(u1_add.as<uint1_t>().value(), 1);
225 auto u1_sub = u1_val1 - u1_val0;
227 EXPECT_EQ(u1_sub.as<uint1_t>().value(), 1);
229 auto u1_mul = u1_val1 * u1_val0;
231 EXPECT_EQ(u1_mul.as<uint1_t>().value(), 0);
234 auto u1_div = u1_val1 / u1_val1;
236 EXPECT_EQ(u1_div.as<uint1_t>().value(), 1);
239 auto u8_val1 = TaggedValue::from<uint8_t>(40);
240 auto u8_val2 = TaggedValue::from<uint8_t>(2);
242 auto u8_add = u8_val1 + u8_val2;
244 EXPECT_EQ(u8_add.as<uint8_t>(), 42);
246 auto u8_sub = u8_val1 - u8_val2;
248 EXPECT_EQ(u8_sub.as<uint8_t>(), 38);
250 auto u8_mul = u8_val1 * u8_val2;
252 EXPECT_EQ(u8_mul.as<uint8_t>(), 80);
254 auto u8_div = u8_val1 / u8_val2;
256 EXPECT_EQ(u8_div.as<uint8_t>(), 20);
259 auto u16_val1 = TaggedValue::from<uint16_t>(1000);
260 auto u16_val2 = TaggedValue::from<uint16_t>(10);
262 auto u16_add = u16_val1 + u16_val2;
264 EXPECT_EQ(u16_add.as<uint16_t>(), 1010);
266 auto u16_sub = u16_val1 - u16_val2;
268 EXPECT_EQ(u16_sub.as<uint16_t>(), 990);
270 auto u16_mul = u16_val1 * u16_val2;
272 EXPECT_EQ(u16_mul.as<uint16_t>(), 10000);
274 auto u16_div = u16_val1 / u16_val2;
276 EXPECT_EQ(u16_div.as<uint16_t>(), 100);
279 auto u32_val1 = TaggedValue::from<uint32_t>(100000);
280 auto u32_val2 = TaggedValue::from<uint32_t>(25);
282 auto u32_add = u32_val1 + u32_val2;
284 EXPECT_EQ(u32_add.as<uint32_t>(), 100025);
286 auto u32_sub = u32_val1 - u32_val2;
288 EXPECT_EQ(u32_sub.as<uint32_t>(), 99975);
290 auto u32_mul = u32_val1 * u32_val2;
292 EXPECT_EQ(u32_mul.as<uint32_t>(), 2500000);
294 auto u32_div = u32_val1 / u32_val2;
296 EXPECT_EQ(u32_div.as<uint32_t>(), 4000);
299 auto u64_val1 = TaggedValue::from<uint64_t>(1ULL << 32);
300 auto u64_val2 = TaggedValue::from<uint64_t>(5);
302 auto u64_add = u64_val1 + u64_val2;
304 EXPECT_EQ(u64_add.as<uint64_t>(), (1ULL << 32) + 5);
306 auto u64_sub = u64_val1 - u64_val2;
308 EXPECT_EQ(u64_sub.as<uint64_t>(), (1ULL << 32) - 5);
310 auto u64_mul = u64_val1 * u64_val2;
312 EXPECT_EQ(u64_mul.as<uint64_t>(), (1ULL << 32) * 5);
314 auto u64_div = u64_val1 / u64_val2;
316 EXPECT_EQ(u64_div.as<uint64_t>(), (1ULL << 32) / 5);
319 auto u128_val1 = TaggedValue::from<uint128_t>(1000000000000ULL);
320 auto u128_val2 = TaggedValue::from<uint128_t>(7);
322 auto u128_add = u128_val1 + u128_val2;
326 auto u128_sub = u128_val1 - u128_val2;
330 auto u128_mul = u128_val1 * u128_val2;
334 auto u128_div = u128_val1 / u128_val2;
339 auto ff_val1 = TaggedValue::from<FF>(100);
340 auto ff_val2 = TaggedValue::from<FF>(5);
342 auto ff_add = ff_val1 + ff_val2;
344 EXPECT_EQ(ff_add.as<
FF>(),
FF(105));
346 auto ff_sub = ff_val1 - ff_val2;
348 EXPECT_EQ(ff_sub.as<
FF>(),
FF(95));
350 auto ff_mul = ff_val1 * ff_val2;
352 EXPECT_EQ(ff_mul.as<
FF>(),
FF(500));
354 auto ff_div = ff_val1 / ff_val2;
356 EXPECT_EQ(ff_div.as<
FF>(),
FF(20));
360TEST(TaggedValueTest, BitwiseOperations)
363 auto u8_val1 = TaggedValue::from<uint8_t>(0b1010);
364 auto u8_val2 = TaggedValue::from<uint8_t>(0b1100);
365 auto u8_and = u8_val1 & u8_val2;
367 EXPECT_EQ(u8_and.as<uint8_t>(), 0b1000);
370 auto u16_val1 = TaggedValue::from<uint16_t>(0b1010);
371 auto u16_val2 = TaggedValue::from<uint16_t>(0b1100);
372 auto u16_or = u16_val1 | u16_val2;
374 EXPECT_EQ(u16_or.as<uint16_t>(), 0b1110);
377 auto u32_val1 = TaggedValue::from<uint32_t>(0b1010);
378 auto u32_val2 = TaggedValue::from<uint32_t>(0b1100);
379 auto u32_xor = u32_val1 ^ u32_val2;
381 EXPECT_EQ(u32_xor.as<uint32_t>(), 0b0110);
384 auto u64_val = TaggedValue::from<uint64_t>(0xFFFFFFFFFFFFFFF0ULL);
385 auto u64_not = ~u64_val;
387 EXPECT_EQ(u64_not.as<uint64_t>(), 0x000000000000000FULL);
390 auto u8_shift = TaggedValue::from<uint8_t>(0b00000001);
391 auto u8_amount = TaggedValue::from<uint8_t>(2);
393 auto u8_shl = u8_shift << u8_amount;
395 EXPECT_EQ(u8_shl.as<uint8_t>(), 0b00000100);
397 auto u8_shift_high = TaggedValue::from<uint8_t>(0b10000000);
398 auto u8_shr = u8_shift_high >> u8_amount;
400 EXPECT_EQ(u8_shr.as<uint8_t>(), 0b00100000);
404TEST(TaggedValueTest, UnaryOperations)
407 auto u1_val = TaggedValue::from<uint1_t>(1);
408 auto u1_not = ~u1_val;
410 EXPECT_EQ(u1_not.as<uint1_t>().value(), 0);
412 auto u8_val = TaggedValue::from<uint8_t>(0xAA);
413 auto u8_not = ~u8_val;
415 EXPECT_EQ(u8_not.as<uint8_t>(), 0x55);
417 auto u16_val = TaggedValue::from<uint16_t>(0xAAAA);
418 auto u16_not = ~u16_val;
420 EXPECT_EQ(u16_not.as<uint16_t>(), 0x5555);
422 auto u32_val = TaggedValue::from<uint32_t>(0xAAAAAAAA);
423 auto u32_not = ~u32_val;
425 EXPECT_EQ(u32_not.as<uint32_t>(), 0x55555555);
427 auto u64_val = TaggedValue::from<uint64_t>(0xAAAAAAAAAAAAAAAAULL);
428 auto u64_not = ~u64_val;
430 EXPECT_EQ(u64_not.as<uint64_t>(), 0x5555555555555555ULL);
433 auto u128_val = TaggedValue::from<uint128_t>(u128_input);
434 auto u128_not = ~u128_val;
437 EXPECT_EQ(u128_not.as<
uint128_t>(), expected_u128);
440 auto ff_val = TaggedValue::from<FF>(123);
441 EXPECT_THROW(~ff_val, InvalidOperationTag);
445TEST(TaggedValueTest, Uint1EdgeCases)
448 auto u1_val0 = TaggedValue::from<uint1_t>(0);
449 auto u1_val1 = TaggedValue::from<uint1_t>(1);
452 auto u1_and = u1_val1 & u1_val1;
454 EXPECT_EQ(u1_and.as<uint1_t>().value(), 1);
456 auto u1_or = u1_val0 | u1_val1;
458 EXPECT_EQ(u1_or.as<uint1_t>().value(), 1);
460 auto u1_xor = u1_val1 ^ u1_val1;
462 EXPECT_EQ(u1_xor.as<uint1_t>().value(), 0);
464 auto u1_not = ~u1_val1;
466 EXPECT_EQ(u1_not.as<uint1_t>().value(), 0);
470TEST(TaggedValueTest, ErrorCases)
473 auto u8_val = TaggedValue::from<uint8_t>(42);
474 EXPECT_THROW(u8_val.as<uint16_t>(), std::runtime_error);
477 auto ff_val1 = TaggedValue::from<FF>(10);
478 auto ff_val2 = TaggedValue::from<FF>(5);
480 EXPECT_THROW(ff_val1 & ff_val2, InvalidOperationTag);
481 EXPECT_THROW(ff_val1 | ff_val2, InvalidOperationTag);
482 EXPECT_THROW(ff_val1 ^ ff_val2, InvalidOperationTag);
483 EXPECT_THROW(ff_val1 >> ff_val2, InvalidOperationTag);
484 EXPECT_THROW(ff_val1 << ff_val2, InvalidOperationTag);
485 EXPECT_THROW(~ff_val1, InvalidOperationTag);
488 auto u8_val1 = TaggedValue::from<uint8_t>(10);
489 auto u16_val = TaggedValue::from<uint16_t>(5);
492 EXPECT_THROW(u8_val1 + u16_val, TagMismatchException);
493 EXPECT_THROW(u8_val1 - u16_val, TagMismatchException);
494 EXPECT_THROW(u8_val1 * u16_val, TagMismatchException);
495 EXPECT_THROW(u8_val1 / u16_val, TagMismatchException);
496 EXPECT_THROW(u8_val1 & u16_val, TagMismatchException);
497 EXPECT_THROW(u8_val1 | u16_val, TagMismatchException);
498 EXPECT_THROW(u8_val1 ^ u16_val, TagMismatchException);
499 EXPECT_THROW(u8_val1 >> u16_val, TagMismatchException);
500 EXPECT_THROW(u8_val1 << u16_val, TagMismatchException);
503 EXPECT_THROW(TaggedValue::from<uint1_t>(1) / TaggedValue::from<uint1_t>(0), DivisionByZero);
504 EXPECT_THROW(u8_val1 / TaggedValue::from<uint8_t>(0), DivisionByZero);
505 EXPECT_THROW(u16_val / TaggedValue::from<uint16_t>(0), DivisionByZero);
506 EXPECT_THROW(TaggedValue::from<uint32_t>(1) / TaggedValue::from<uint32_t>(0), DivisionByZero);
507 EXPECT_THROW(TaggedValue::from<uint64_t>(1) / TaggedValue::from<uint64_t>(0), DivisionByZero);
508 EXPECT_THROW(TaggedValue::from<uint128_t>(1) / TaggedValue::from<uint128_t>(0), DivisionByZero);
509 EXPECT_THROW(ff_val1 / TaggedValue::from<FF>(0), DivisionByZero);
513TEST(TaggedValueTest, ShiftOperations)
516 auto u1_amount = TaggedValue::from<uint1_t>(1);
517 auto u1_shift = TaggedValue::from<uint1_t>(1);
518 auto result_shl_u1 = u1_amount << u1_shift;
520 EXPECT_EQ(result_shl_u1.as<uint1_t>(),
static_cast<uint1_t
>(0));
523 auto u8_amount = TaggedValue::from<uint8_t>(3);
524 auto u8_shift = TaggedValue::from<uint8_t>(3);
525 auto result_shl_u8 = u8_amount << u8_shift;
527 EXPECT_EQ(result_shl_u8.as<uint8_t>(), 3 << 3);
530 auto u16_amount = TaggedValue::from<uint16_t>(4);
531 auto u16_shift = TaggedValue::from<uint16_t>(3);
532 auto result_shl_u16 = u16_amount << u16_shift;
534 EXPECT_EQ(result_shl_u16.as<uint16_t>(), 4 << 3);
537 auto u32_amount = TaggedValue::from<uint32_t>(4);
538 auto u32_shift = TaggedValue::from<uint32_t>(3);
539 auto result_shl_u32 = u32_amount << u32_shift;
541 EXPECT_EQ(result_shl_u32.as<uint32_t>(), 4 << 3);
544 auto u64_amount = TaggedValue::from<uint64_t>(4);
545 auto u64_shift = TaggedValue::from<uint64_t>(3);
546 auto result_shl_u64 = u64_amount << u64_shift;
548 EXPECT_EQ(result_shl_u64.as<uint64_t>(), 4 << 3);
551 auto u128_amount = TaggedValue::from<uint128_t>(4);
552 auto u128_shift = TaggedValue::from<uint128_t>(3);
553 auto result_shl_u128 = u128_amount << u128_shift;
555 EXPECT_EQ(result_shl_u128.as<
uint128_t>(), 4 << 3);
558 auto u8_shift_overflow = u8_amount << TaggedValue::from<uint8_t>(10);
560 EXPECT_EQ(u8_shift_overflow.as<uint8_t>(), 0);
562 auto u16_shift_overflow = u16_amount << TaggedValue::from<uint16_t>(17);
564 EXPECT_EQ(u16_shift_overflow.as<uint16_t>(), 0);
566 auto u32_shift_overflow = u32_amount << TaggedValue::from<uint32_t>(33);
568 EXPECT_EQ(u32_shift_overflow.as<uint32_t>(), 0);
570 auto u64_shift_overflow = u64_amount << TaggedValue::from<uint64_t>(65);
572 EXPECT_EQ(u64_shift_overflow.as<uint64_t>(), 0);
574 auto u128_shift_overflow = u128_amount << TaggedValue::from<uint128_t>(129);
576 EXPECT_EQ(u128_shift_overflow.as<
uint128_t>(), 0);
578 u8_shift_overflow = u8_amount >> TaggedValue::from<uint8_t>(10);
580 EXPECT_EQ(u8_shift_overflow.as<uint8_t>(), 0);
582 u16_shift_overflow = u16_amount >> TaggedValue::from<uint16_t>(17);
584 EXPECT_EQ(u16_shift_overflow.as<uint16_t>(), 0);
586 u32_shift_overflow = u32_amount >> TaggedValue::from<uint32_t>(33);
588 EXPECT_EQ(u32_shift_overflow.as<uint32_t>(), 0);
590 u64_shift_overflow = u64_amount >> TaggedValue::from<uint64_t>(65);
592 EXPECT_EQ(u64_shift_overflow.as<uint64_t>(), 0);
594 u128_shift_overflow = u128_amount >> TaggedValue::from<uint128_t>(129);
596 EXPECT_EQ(u128_shift_overflow.as<
uint128_t>(), 0);
600TEST(TaggedValueTest, BoundaryCases)
603 auto u1_max = TaggedValue::from<uint1_t>(
true);
604 auto u1_one = TaggedValue::from<uint1_t>(
true);
605 auto u1_overflow = u1_max + u1_one;
607 EXPECT_EQ(u1_overflow.as<uint1_t>().value(), 0);
610 auto u8_max = TaggedValue::from<uint8_t>(255);
611 auto u8_one = TaggedValue::from<uint8_t>(1);
612 auto u8_overflow = u8_max + u8_one;
614 EXPECT_EQ(u8_overflow.as<uint8_t>(), 0);
617 auto u16_max = TaggedValue::from<uint16_t>(65535);
618 auto u16_one = TaggedValue::from<uint16_t>(1);
619 auto u16_overflow = u16_max + u16_one;
621 EXPECT_EQ(u16_overflow.as<uint16_t>(), 0);
624 auto u32_max = TaggedValue::from<uint32_t>(4294967295U);
625 auto u32_one = TaggedValue::from<uint32_t>(1);
626 auto u32_overflow = u32_max + u32_one;
628 EXPECT_EQ(u32_overflow.as<uint32_t>(), 0);
631 auto u64_max = TaggedValue::from<uint64_t>(std::numeric_limits<uint64_t>::max());
632 auto u64_one = TaggedValue::from<uint64_t>(1);
633 auto u64_overflow = u64_max + u64_one;
635 EXPECT_EQ(u64_overflow.as<uint64_t>(), 0);
638 auto u128_max = TaggedValue::from<uint128_t>(~
uint128_t(0));
639 auto u128_one = TaggedValue::from<uint128_t>(1);
640 auto u128_overflow = u128_max + u128_one;
642 EXPECT_EQ(u128_overflow.as<
uint128_t>(), 0);
645 auto u1_zero = TaggedValue::from<uint1_t>(0);
646 auto u1_underflow = u1_zero - u1_one;
648 EXPECT_EQ(u1_underflow.as<uint1_t>().value(), 1);
650 auto u8_zero = TaggedValue::from<uint8_t>(0);
651 auto u8_underflow = u8_zero - u8_one;
653 EXPECT_EQ(u8_underflow.as<uint8_t>(), 255);
655 auto u16_zero = TaggedValue::from<uint16_t>(0);
656 auto u16_underflow = u16_zero - u16_one;
658 EXPECT_EQ(u16_underflow.as<uint16_t>(), 65535);
660 auto u32_zero = TaggedValue::from<uint32_t>(0);
661 auto u32_underflow = u32_zero - u32_one;
663 EXPECT_EQ(u32_underflow.as<uint32_t>(), 4294967295U);
665 auto u64_zero = TaggedValue::from<uint64_t>(0);
666 auto u64_underflow = u64_zero - u64_one;
668 EXPECT_EQ(u64_underflow.as<uint64_t>(), std::numeric_limits<uint64_t>::max());
670 auto u128_zero = TaggedValue::from<uint128_t>(0);
671 auto u128_underflow = u128_zero - u128_one;
676 auto u8_large = TaggedValue::from<uint8_t>(128);
677 auto u8_mul_overflow = u8_large * u8_large;
679 EXPECT_EQ(u8_mul_overflow.as<uint8_t>(), 0);
681 auto u16_large = TaggedValue::from<uint16_t>(256);
682 auto u16_mul_overflow = u16_large * u16_large;
684 EXPECT_EQ(u16_mul_overflow.as<uint16_t>(), 0);
687 auto u8_shift = TaggedValue::from<uint8_t>(1);
688 auto u8_shift_amount = TaggedValue::from<uint8_t>(8);
689 auto u8_shift_overflow = u8_shift << u8_shift_amount;
691 EXPECT_EQ(u8_shift_overflow.as<uint8_t>(), 0);
694 auto ff_one = TaggedValue::from<FF>(1);
695 auto ff_wrap = ff_large + ff_one;
697 EXPECT_EQ(ff_wrap.as<
FF>(),
FF(0));
701TEST(TaggedValueTest, ComparisonOperations)
703 auto u1_val1 = TaggedValue::from<uint1_t>(0);
704 auto u1_val2 = TaggedValue::from<uint1_t>(1);
705 auto u1_val3 = TaggedValue::from<uint1_t>(0);
706 EXPECT_TRUE(u1_val1 < u1_val2);
707 EXPECT_TRUE(u1_val1 == u1_val3);
708 EXPECT_TRUE(u1_val1 <= u1_val3);
709 EXPECT_TRUE(u1_val1 != u1_val2);
711 auto u8_val1 = TaggedValue::from<uint8_t>(42);
712 auto u8_val2 = TaggedValue::from<uint8_t>(100);
713 auto u8_val3 = TaggedValue::from<uint8_t>(42);
714 EXPECT_TRUE(u8_val1 < u8_val2);
715 EXPECT_TRUE(u8_val1 == u8_val3);
716 EXPECT_TRUE(u8_val1 <= u8_val3);
717 EXPECT_TRUE(u8_val1 != u8_val2);
719 auto u16_val1 = TaggedValue::from<uint16_t>(1000);
720 auto u16_val2 = TaggedValue::from<uint16_t>(2000);
721 auto u16_val3 = TaggedValue::from<uint16_t>(1000);
722 EXPECT_TRUE(u16_val1 < u16_val2);
723 EXPECT_TRUE(u16_val1 == u16_val3);
724 EXPECT_TRUE(u16_val1 <= u16_val3);
725 EXPECT_TRUE(u16_val1 != u16_val2);
727 auto u32_val1 = TaggedValue::from<uint32_t>(100000);
728 auto u32_val2 = TaggedValue::from<uint32_t>(200000);
729 auto u32_val3 = TaggedValue::from<uint32_t>(100000);
730 EXPECT_TRUE(u32_val1 < u32_val2);
731 EXPECT_TRUE(u32_val1 == u32_val3);
732 EXPECT_TRUE(u32_val1 <= u32_val3);
733 EXPECT_TRUE(u32_val1 != u32_val2);
735 auto u64_val1 = TaggedValue::from<uint64_t>(1ULL << 40);
736 auto u64_val2 = TaggedValue::from<uint64_t>(1ULL << 41);
737 auto u64_val3 = TaggedValue::from<uint64_t>(1ULL << 40);
738 EXPECT_TRUE(u64_val1 < u64_val2);
739 EXPECT_TRUE(u64_val1 == u64_val3);
740 EXPECT_TRUE(u64_val1 <= u64_val3);
741 EXPECT_TRUE(u64_val1 != u64_val2);
743 auto u128_val1 = TaggedValue::from<uint128_t>(
static_cast<uint128_t>(1) << 100);
744 auto u128_val2 = TaggedValue::from<uint128_t>(
static_cast<uint128_t>(1) << 101);
745 auto u128_val3 = TaggedValue::from<uint128_t>(
static_cast<uint128_t>(1) << 100);
746 EXPECT_TRUE(u128_val1 < u128_val2);
747 EXPECT_TRUE(u128_val1 == u128_val3);
748 EXPECT_TRUE(u128_val1 <= u128_val3);
749 EXPECT_TRUE(u128_val1 != u128_val2);
751 auto ff_val1 = TaggedValue::from<FF>(
FF(42));
752 auto ff_val2 = TaggedValue::from<FF>(
FF(100));
753 auto ff_val3 = TaggedValue::from<FF>(
FF(42));
754 EXPECT_TRUE(ff_val1 < ff_val2);
755 EXPECT_TRUE(ff_val1 == ff_val3);
756 EXPECT_TRUE(ff_val1 <= ff_val3);
757 EXPECT_TRUE(ff_val1 != ff_val2);
760 EXPECT_FALSE(u1_val1 < u8_val1);
761 EXPECT_FALSE(u8_val1 <= u16_val1);
762 EXPECT_FALSE(u16_val1 == u32_val1);
763 EXPECT_FALSE(u32_val1 != u64_val1);
static TaggedValue from_tag_truncating(ValueTag tag, FF value)
static TaggedValue from_tag(ValueTag tag, FF value)
static constexpr uint256_t from_uint128(const uint128_t a) noexcept
TEST(EmitUnencryptedLogTest, Basic)
unsigned __int128 uint128_t
static constexpr uint256_t modulus
static field random_element(numeric::RNG *engine=nullptr) noexcept