1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
24using ::testing::NiceMock;
25using ::testing::TestWithParam;
27using tracegen::FieldGreaterThanTraceBuilder;
28using tracegen::RangeCheckTraceBuilder;
29using tracegen::TestTraceContainer;
31using simulation::DeduplicatingEventEmitter;
32using simulation::EventEmitter;
33using simulation::FieldGreaterThan;
34using simulation::FieldGreaterThanEvent;
35using simulation::MockRangeCheck;
36using simulation::RangeCheck;
37using simulation::RangeCheckEvent;
38using simulation::U256Decomposition;
46TEST(FieldGreaterThanConstrainingTest, EmptyRow)
63 GtTestParams{ 27, 0,
true },
64 GtTestParams{ TWO_POW_128, 0,
true },
65 GtTestParams{ -1, 0,
true },
67 GtTestParams{ 27, 27,
false },
68 GtTestParams{ TWO_POW_128, TWO_POW_128,
false },
69 GtTestParams{ -1, -1,
false },
71 GtTestParams{ 0, 1,
false },
72 GtTestParams{ 0, TWO_POW_128,
false },
73 GtTestParams{ 0, -1,
false }
77 DecTestParams{ 0, { .lo = 0, .hi = 0 } },
78 DecTestParams{ 1, { .lo = 1, .hi = 0 } },
79 DecTestParams{
uint256_t(1) << 128, { .lo = 0, .hi = 1 } },
84class GtBasicTest :
public TestWithParam<GtTestParams> {};
86TEST_P(GtBasicTest, BasicComparison)
88 const auto& param = GetParam();
91 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
92 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
94 EXPECT_EQ(field_gt_simulator.ff_gt(param.a, param.b), param.expected_result);
96 TestTraceContainer
trace({
97 { { C::precomputed_first_row, 1 } },
100 FieldGreaterThanTraceBuilder
builder;
103 check_relation<ff_gt>(trace);
108class DecBasicTest :
public TestWithParam<DecTestParams> {};
110TEST_P(DecBasicTest, BasicDecomposition)
112 const auto& param = GetParam();
115 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
116 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
118 EXPECT_EQ(field_gt_simulator.canon_dec(param.a), param.expected_result);
120 TestTraceContainer
trace({
121 { { C::precomputed_first_row, 1 } },
124 FieldGreaterThanTraceBuilder
builder;
127 check_relation<ff_gt>(trace);
132class GtInteractionTests :
public TestWithParam<GtTestParams> {};
134TEST_P(GtInteractionTests, InteractionsWithRangeCheck)
136 const auto& param = GetParam();
140 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
141 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
143 EXPECT_EQ(field_gt_simulator.ff_gt(param.a, param.b), param.expected_result);
145 TestTraceContainer
trace({
146 { { C::precomputed_first_row, 1 } },
149 FieldGreaterThanTraceBuilder
builder;
159 check_relation<ff_gt>(trace);
162INSTANTIATE_TEST_SUITE_P(FieldGreaterThanConstrainingTest, GtInteractionTests, ::testing::ValuesIn(comparison_tests));
164class DecInteractionTests :
public TestWithParam<DecTestParams> {};
166TEST_P(DecInteractionTests, InteractionsWithRangeCheck)
168 const auto& param = GetParam();
172 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
173 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
175 EXPECT_EQ(field_gt_simulator.canon_dec(param.a), param.expected_result);
177 TestTraceContainer
trace({
178 { { C::precomputed_first_row, 1 } },
181 FieldGreaterThanTraceBuilder
builder;
191 check_relation<ff_gt>(trace);
196 ::testing::ValuesIn(decomposition_tests));
198TEST(FieldGreaterThanConstrainingTest, NegativeManipulatedDecompositions)
201 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
202 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
204 field_gt_simulator.ff_gt(0, 0);
206 TestTraceContainer
trace({
207 { { C::precomputed_first_row, 1 } },
210 FieldGreaterThanTraceBuilder
builder;
212 check_relation<ff_gt>(trace);
214 trace.
set(Column::ff_gt_a_lo, 1, 1);
215 trace.
set(Column::ff_gt_b_hi, 1, 1);
221TEST(FieldGreaterThanConstrainingTest, NegativeManipulatedComparisonsWithP)
224 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
225 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
227 field_gt_simulator.ff_gt(0, 0);
229 TestTraceContainer
trace({
230 { { C::precomputed_first_row, 1 } },
233 FieldGreaterThanTraceBuilder
builder;
235 check_relation<ff_gt>(trace);
242 trace.
set(Column::ff_gt_a_lo, 1, p_lo);
243 trace.
set(Column::ff_gt_a_hi, 1, p_hi);
244 trace.
set(Column::ff_gt_b_lo, 1, p_lo);
245 trace.
set(Column::ff_gt_b_hi, 1, p_hi);
247 trace.
set(Column::ff_gt_p_sub_a_hi, 1, p_lo - 1);
248 trace.
set(Column::ff_gt_p_sub_a_lo, 1, p_hi - 1);
249 trace.
set(Column::ff_gt_p_sub_b_hi, 1, p_lo - 1);
250 trace.
set(Column::ff_gt_p_sub_b_lo, 1, p_hi - 1);
258TEST(FieldGreaterThanConstrainingTest, NegativeLessRangeChecks)
261 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
262 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
264 field_gt_simulator.ff_gt(0, 0);
266 TestTraceContainer
trace({
267 { { C::precomputed_first_row, 1 } },
270 FieldGreaterThanTraceBuilder
builder;
272 check_relation<ff_gt>(trace);
274 trace.
set(Column::ff_gt_cmp_rng_ctr, 1, 3);
275 trace.
set(Column::ff_gt_cmp_rng_ctr, 2, 0);
281TEST(FieldGreaterThanConstrainingTest, NegativeRangeCheckCtrInitInDec)
284 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
285 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
287 field_gt_simulator.canon_dec(0);
289 TestTraceContainer
trace({
290 { { C::precomputed_first_row, 1 } },
293 FieldGreaterThanTraceBuilder
builder;
295 check_relation<ff_gt>(trace);
297 trace.
set(Column::ff_gt_cmp_rng_ctr, 1, 4);
298 trace.
set(Column::ff_gt_cmp_rng_ctr, 2, 2);
304TEST(FieldGreaterThanConstrainingTest, NegativeSelectorConsistency)
307 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
308 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
310 field_gt_simulator.ff_gt(0, 0);
312 TestTraceContainer
trace({
313 { { C::precomputed_first_row, 1 } },
316 FieldGreaterThanTraceBuilder
builder;
318 check_relation<ff_gt>(trace);
326TEST(FieldGreaterThanConstrainingTest, NegativeEraseShift)
329 DeduplicatingEventEmitter<FieldGreaterThanEvent>
event_emitter;
330 FieldGreaterThan field_gt_simulator(range_check,
event_emitter);
332 field_gt_simulator.ff_gt(42, 27);
334 TestTraceContainer
trace({
335 { { C::precomputed_first_row, 1 } },
338 FieldGreaterThanTraceBuilder
builder;
340 check_relation<ff_gt>(trace);
342 trace.
set(Column::ff_gt_a_lo, 2, 0);
343 trace.
set(Column::ff_gt_a_hi, 2, 0);
344 trace.
set(Column::ff_gt_p_sub_a_lo, 2, 0);
345 trace.
set(Column::ff_gt_p_sub_a_hi, 2, 0);
346 trace.
set(Column::ff_gt_b_lo, 2, 0);
347 trace.
set(Column::ff_gt_b_hi, 2, 0);
348 trace.
set(Column::ff_gt_p_sub_b_lo, 2, 0);
349 trace.
set(Column::ff_gt_p_sub_b_hi, 2, 0);
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
static constexpr size_t SR_P_SUB_B_LO
static constexpr size_t SR_RNG_CTR_GT_INIT
static constexpr size_t SR_SEL_CONSISTENCY
static constexpr size_t SR_RNG_CTR_DECREMENT
static constexpr size_t SR_P_SUB_A_LO
static constexpr size_t SR_SHIFT_2
static constexpr size_t SR_B_DECOMPOSITION
static constexpr size_t SR_P_SUB_B_HI
static constexpr size_t SR_SHIFT_1
static constexpr size_t SR_SHIFT_3
static constexpr size_t SR_SHIFT_0
static constexpr size_t SR_P_SUB_A_HI
static constexpr size_t SR_A_DECOMPOSITION
static constexpr size_t SR_RNG_CTR_DEC_INIT
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
Process the ALU events and populate the ALU relevant columns in the trace.
void process(const simulation::EventEmitterInterface< simulation::RangeCheckEvent >::Container &events, TraceContainer &trace)
uint32_t get_num_rows() const
void set(Column col, uint32_t row, const FF &value)
static constexpr uint256_t from_uint128(const uint128_t a) noexcept
RangeCheckTraceBuilder range_check_builder
EventEmitter< RangeCheckEvent > range_check_event_emitter
EventEmitter< DataCopyEvent > event_emitter
INSTANTIATE_TEST_SUITE_P(PaddingVariants, AvmRecursiveTestsParameterized, ::testing::Values(false, true), [](const auto &info) { return info.param ? "Padded" :"Unpadded";})
void check_interaction(tracegen::TestTraceContainer &trace)
TEST_P(AvmRecursiveTestsParameterized, GoblinRecursion)
A test of the Goblinized AVM recursive verifier.
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
U256Decomposition decompose_256(const uint256_t &x)
TestTraceContainer empty_trace()
lookup_settings< lookup_ff_gt_a_lo_range_settings_ > lookup_ff_gt_a_lo_range_settings
lookup_settings< lookup_ff_gt_a_hi_range_settings_ > lookup_ff_gt_a_hi_range_settings
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
unsigned __int128 uint128_t
static constexpr uint256_t modulus