1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
26using tracegen::ExecutionTraceBuilder;
27using tracegen::GreaterThanTraceBuilder;
28using tracegen::L1ToL2MessageTreeCheckTraceBuilder;
29using tracegen::TestTraceContainer;
31using simulation::EventEmitter;
32using simulation::GreaterThan;
33using simulation::GreaterThanEvent;
34using simulation::L1ToL2MessageTreeCheck;
35using simulation::L1ToL2MessageTreeCheckEvent;
36using simulation::MockFieldGreaterThan;
37using simulation::MockMerkleCheck;
38using simulation::MockRangeCheck;
40using testing::NiceMock;
46TEST(L1ToL2MessageExistsConstrainingTest, PositiveExists)
48 TestTraceContainer
trace({
49 { { C::execution_sel_execute_l1_to_l2_message_exists, 1 },
50 { C::execution_register_0_, 42 },
51 { C::execution_register_1_, 27 },
52 { C::execution_register_2_, 1 },
53 { C::execution_mem_tag_reg_0_,
static_cast<uint8_t
>(
MemoryTag::FF) },
54 { C::execution_mem_tag_reg_1_,
static_cast<uint8_t
>(
MemoryTag::U64) },
55 { C::execution_mem_tag_reg_2_,
static_cast<uint8_t
>(
MemoryTag::U1) },
56 { C::execution_l1_to_l2_msg_leaf_in_range, 1 },
60 check_relation<l1_to_l2_message_exists>(
trace);
63TEST(L1ToL2MessageExistsConstrainingTest, OutOfRange)
66 TestTraceContainer
trace({
67 { { C::execution_sel_execute_l1_to_l2_message_exists, 1 },
68 { C::execution_register_0_, 42 },
69 { C::execution_register_1_, leaf_index },
70 { C::execution_register_2_, 0 },
71 { C::execution_mem_tag_reg_0_,
static_cast<uint8_t
>(
MemoryTag::FF) },
72 { C::execution_mem_tag_reg_1_,
static_cast<uint8_t
>(
MemoryTag::U64) },
73 { C::execution_mem_tag_reg_2_,
static_cast<uint8_t
>(
MemoryTag::U1) },
74 { C::execution_l1_to_l2_msg_leaf_in_range, 0 },
79 check_relation<l1_to_l2_message_exists>(
trace);
82 trace.
set(C::execution_register_2_, 0, 1);
86TEST(L1ToL2MessageExistsConstrainingTest, NegativeInvalidOutputTag)
88 TestTraceContainer
trace({ {
89 { C::execution_sel_execute_l1_to_l2_message_exists, 1 },
90 { C::execution_register_0_, 42 },
91 { C::execution_register_1_, 27 },
92 { C::execution_register_2_, 1 },
93 { C::execution_mem_tag_reg_0_,
static_cast<uint8_t
>(
MemoryTag::FF) },
94 { C::execution_mem_tag_reg_1_,
static_cast<uint8_t
>(
MemoryTag::U64) },
95 { C::execution_mem_tag_reg_2_,
static_cast<uint8_t
>(
MemoryTag::U8) },
99 "L1_TO_L2_MSG_EXISTS_U1_OUTPUT_TAG");
102TEST(L1ToL2MessageExistsConstrainingTest, NegativeL1ToL2MessageExistsSuccess)
104 TestTraceContainer
trace({ {
105 { C::execution_sel_execute_l1_to_l2_message_exists, 1 },
106 { C::execution_sel_opcode_error, 1 },
111 "L1_TO_L2_MSG_EXISTS_SUCCESS");
114TEST(L1ToL2MessageExistsConstrainingTest, Interactions)
116 NiceMock<MockMerkleCheck> merkle_check;
117 NiceMock<MockFieldGreaterThan>
field_gt;
122 EventEmitter<L1ToL2MessageTreeCheckEvent> l1_to_l2_message_tree_check_event_emitter;
123 L1ToL2MessageTreeCheck l1_to_l2_message_tree_check(merkle_check, l1_to_l2_message_tree_check_event_emitter);
125 FF requested_msg_hash = 42;
126 FF actual_leaf_value = 43;
128 uint64_t leaf_index = 27;
130 AppendOnlyTreeSnapshot l1_to_l2_message_tree_snapshot = AppendOnlyTreeSnapshot{
132 .nextAvailableLeafIndex = 128,
136 l1_to_l2_message_tree_check.exists(
137 requested_msg_hash, actual_leaf_value, leaf_index, {}, l1_to_l2_message_tree_snapshot);
139 TestTraceContainer
trace({ {
140 { C::execution_sel_execute_l1_to_l2_message_exists, 1 },
141 { C::execution_register_0_, requested_msg_hash },
142 { C::execution_register_1_, leaf_index },
143 { C::execution_register_2_, 0 },
144 { C::execution_mem_tag_reg_0_,
static_cast<uint8_t
>(
MemoryTag::FF) },
145 { C::execution_mem_tag_reg_1_,
static_cast<uint8_t
>(
MemoryTag::U64) },
146 { C::execution_mem_tag_reg_2_,
static_cast<uint8_t
>(
MemoryTag::U1) },
147 { C::execution_l1_to_l2_msg_leaf_in_range, 1 },
148 { C::execution_sel_opcode_error, 0 },
151 { C::execution_l1_l2_tree_root, l1_to_l2_message_tree_snapshot.root },
154 L1ToL2MessageTreeCheckTraceBuilder l1_to_l2_message_tree_check_trace_builder;
155 l1_to_l2_message_tree_check_trace_builder.process(l1_to_l2_message_tree_check_event_emitter.dump_events(),
trace);
157 GreaterThanTraceBuilder greater_than_trace_builder;
160 check_relation<l1_to_l2_message_exists>(
trace);
#define L1_TO_L2_MSG_TREE_LEAF_COUNT
#define AVM_EXEC_OP_ID_L1_TO_L2_MESSAGE_EXISTS
static constexpr size_t SR_L1_TO_L2_MSG_EXISTS_U1_OUTPUT_TAG
static constexpr size_t SR_L1_TO_L2_MSG_EXISTS_SUCCESS
void set(Column col, uint32_t row, const FF &value)
testing::StrictMock< MockGreaterThan > greater_than
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
lookup_settings< lookup_l1_to_l2_message_exists_l1_to_l2_msg_leaf_index_in_range_settings_ > lookup_l1_to_l2_message_exists_l1_to_l2_msg_leaf_index_in_range_settings
lookup_settings< lookup_l1_to_l2_message_exists_l1_to_l2_msg_read_settings_ > lookup_l1_to_l2_message_exists_l1_to_l2_msg_read_settings
FieldGreaterThan field_gt
NoopEventEmitter< GreaterThanEvent > greater_than_event_emitter