1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
18using tracegen::RangeCheckTraceBuilder;
19using tracegen::TestTraceContainer;
24TEST(RangeCheckConstrainingTest, EmptyRow)
29TEST(RangeCheckConstrainingTest, IsLteMutuallyExclusive)
31 TestTraceContainer
trace({
32 { { C::range_check_sel, 1 }, { C::range_check_is_lte_u32, 1 } },
38TEST(RangeCheckConstrainingTest, NegativeIsLteMutuallyExclusive)
40 TestTraceContainer
trace({
42 { { C::range_check_sel, 1 }, { C::range_check_is_lte_u32, 1 }, { C::range_check_is_lte_u112, 1 } },
46 "IS_LTE_MUTUALLY_EXCLUSIVE");
49TEST(RangeCheckConstrainingTest, CheckRecomposition)
54 uint16_t u16_r0 = 0xFFFD;
55 uint16_t u16_r1 = 0xFFFF;
56 uint16_t dynamic_slice_register = 0x0003;
58 TestTraceContainer
trace({ {
59 { C::range_check_sel, 1 },
60 { C::range_check_value, value_u256 },
61 { C::range_check_is_lte_u48, 1 },
62 { C::range_check_u16_r0, u16_r0 },
63 { C::range_check_u16_r1, u16_r1 },
64 { C::range_check_u16_r7, dynamic_slice_register },
70TEST(RangeCheckConstrainingTest, NegativeCheckRecomposition)
76 uint16_t u16_r0 =
value & 0xFFFF;
77 uint16_t u16_r1 = (
value >> 16) & 0xFFFF;
78 uint16_t dynamic_slice_register = (
value >> 32) & 0xFFFF;
80 TestTraceContainer
trace({ {
81 { C::range_check_sel, 1 },
82 { C::range_check_value, bad_value },
83 { C::range_check_is_lte_u48, 1 },
84 { C::range_check_u16_r0, u16_r0 },
85 { C::range_check_u16_r1, u16_r1 },
86 { C::range_check_u16_r7, dynamic_slice_register },
90 "CHECK_RECOMPOSITION");
93TEST(RangeCheckConstrainingTest, Full)
95 uint8_t num_bits = 34;
96 uint8_t non_dynamic_bits = 32;
97 uint8_t dynamic_bits = num_bits - non_dynamic_bits;
103 uint16_t u16_r0 =
value & 0xFFFF;
104 uint16_t u16_r1 = (
value >> 16) & 0xFFFF;
105 uint16_t dynamic_slice_register = (
value >> 32) & 0xFFFF;
107 uint16_t dynamic_bits_pow_2 =
static_cast<uint16_t
>(1 << dynamic_bits);
108 uint16_t dynamic_diff =
static_cast<uint16_t
>(dynamic_bits_pow_2 - dynamic_slice_register - 1);
110 TestTraceContainer
trace({ {
111 { C::range_check_sel, 1 },
112 { C::range_check_value, value_u256 },
113 { C::range_check_rng_chk_bits, num_bits },
114 { C::range_check_is_lte_u48, 1 },
115 { C::range_check_u16_r0, u16_r0 },
116 { C::range_check_u16_r1, u16_r1 },
117 { C::range_check_u16_r7, dynamic_slice_register },
118 { C::range_check_dyn_rng_chk_bits, dynamic_bits },
119 { C::range_check_dyn_rng_chk_pow_2, dynamic_bits_pow_2 },
120 { C::range_check_dyn_diff, dynamic_diff },
122 { C::range_check_sel_r0_16_bit_rng_lookup, 1 },
123 { C::range_check_sel_r1_16_bit_rng_lookup, 1 },
126 check_relation<range_check>(
trace);
129TEST(RangeCheckConstrainingTest, NegativeMissingLookup)
131 uint8_t num_bits = 34;
132 uint8_t non_dynamic_bits = 32;
133 uint8_t dynamic_bits = num_bits - non_dynamic_bits;
139 uint16_t u16_r0 =
value & 0xFFFF;
140 uint16_t u16_r1 = (
value >> 16) & 0xFFFF;
141 uint16_t dynamic_slice_register = (
value >> 32) & 0xFFFF;
143 uint16_t dynamic_bits_pow_2 =
static_cast<uint16_t
>(1 << dynamic_bits);
144 uint16_t dynamic_diff =
static_cast<uint16_t
>(dynamic_bits_pow_2 - dynamic_slice_register - 1);
146 TestTraceContainer
trace({ {
147 { C::range_check_sel, 1 },
148 { C::range_check_value, value_u256 },
149 { C::range_check_rng_chk_bits, num_bits },
150 { C::range_check_is_lte_u48, 1 },
151 { C::range_check_u16_r0, u16_r0 },
152 { C::range_check_u16_r1, u16_r1 },
153 { C::range_check_u16_r7, dynamic_slice_register },
154 { C::range_check_dyn_rng_chk_bits, dynamic_bits },
155 { C::range_check_dyn_rng_chk_pow_2, dynamic_bits_pow_2 },
156 { C::range_check_dyn_diff, dynamic_diff },
158 { C::range_check_sel_r0_16_bit_rng_lookup, 1 },
159 { C::range_check_sel_r1_16_bit_rng_lookup, 0 },
165TEST(RangeCheckConstrainingTest, WithTracegen)
167 TestTraceContainer
trace;
168 RangeCheckTraceBuilder
builder;
172 { .value = 0, .num_bits = 0 },
173 { .value = 0, .num_bits = 1 },
174 { .value = 0, .num_bits = 16 },
175 { .value = 2, .num_bits = 2 },
176 { .value = 255, .num_bits = 8 },
177 { .value = 1 << 16, .num_bits = 17 },
178 { .value = 1 << 18, .num_bits = 32 },
179 { .value =
static_cast<uint128_t>(1) << 66, .num_bits = 67 },
180 { .value = 1024, .num_bits = 109 },
181 { .value = 1, .num_bits = 128 },
182 { .value = 0xFFFFFFFFFFFFFFFF, .num_bits = 128 },
183 { .value = 0x1FFF, .num_bits = 13 },
187 check_relation<range_check>(
trace);
190TEST(RangeCheckConstrainingTest, NegativeWithTracegen)
192 TestTraceContainer
trace;
193 RangeCheckTraceBuilder
builder;
197 { .value = 1, .num_bits = 0 },
198 { .value = 2, .num_bits = 1 },
199 { .value = 255, .num_bits = 7 },
200 { .value = 1 << 16, .num_bits = 16 },
201 { .value = 1 << 18, .num_bits = 18 },
202 { .value =
static_cast<uint128_t>(1) << 66, .num_bits = 66 },
203 { .value = 1024, .num_bits = 9 },
204 { .value = 1, .num_bits = 0 },
205 { .value = 0xFFFFFFFFFFFFFFFF, .num_bits = 127 },
206 { .value = 0x1FFF, .num_bits = 12 },
static constexpr size_t SR_IS_LTE_MUTUALLY_EXCLUSIVE
static constexpr size_t SR_CHECK_RECOMPOSITION
static constexpr uint256_t from_uint128(const uint128_t a) noexcept
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
TestTraceContainer empty_trace()
unsigned __int128 uint128_t