Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
to_radix.test.cpp
Go to the documentation of this file.
2
3#include <cstdint>
4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
6
15
16using ::testing::AllOf;
17using ::testing::ElementsAre;
18using ::testing::Field;
19using ::testing::Return;
20using ::testing::SizeIs;
21using ::testing::StrictMock;
22
23namespace bb::avm2::simulation {
24namespace {
25
26TEST(AvmSimulationToRadixTest, BasicBits)
27{
28 EventEmitter<ToRadixEvent> to_radix_event_emitter;
29 NoopEventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
30
31 StrictMock<MockExecutionIdManager> execution_id_manager;
32 StrictMock<MockGreaterThan> gt;
33 ToRadix to_radix(execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
34
35 auto bits = to_radix.to_le_bits(FF::one(), 254);
36
37 std::vector<bool> expected_result(254, false);
38 expected_result[0] = true;
39
40 EXPECT_EQ(bits, expected_result);
41
42 EXPECT_THAT(to_radix_event_emitter.dump_events(),
43 AllOf(SizeIs(1),
44 ElementsAre(AllOf(Field(&ToRadixEvent::value, FF::one()),
45 Field(&ToRadixEvent::radix, 2),
46 Field(&ToRadixEvent::limbs, SizeIs(254))))));
47}
48
49TEST(AvmSimulationToRadixTest, ShortBits)
50{
51 EventEmitter<ToRadixEvent> to_radix_event_emitter;
52 NoopEventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
53
54 StrictMock<MockExecutionIdManager> execution_id_manager;
55 StrictMock<MockGreaterThan> gt;
56 ToRadix to_radix(execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
57
58 auto bits = to_radix.to_le_bits(FF::one(), 1);
59
60 std::vector<bool> expected_result = { true };
61
62 EXPECT_EQ(bits, expected_result);
63
64 EXPECT_THAT(to_radix_event_emitter.dump_events(),
65 AllOf(SizeIs(1), ElementsAre(AllOf(Field(&ToRadixEvent::limbs, SizeIs(1))))));
66}
67
68TEST(AvmSimulationToRadixTest, DecomposeOneBitLargeValue)
69{
70 EventEmitter<ToRadixEvent> to_radix_event_emitter;
71 NoopEventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
72
73 StrictMock<MockExecutionIdManager> execution_id_manager;
74 StrictMock<MockGreaterThan> gt;
75 ToRadix to_radix(execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
76
77 auto bits = to_radix.to_le_bits(FF::neg_one(), 1);
78
79 // first bit of p - 1 is zero
80 std::vector<bool> expected_result = { false };
81
82 EXPECT_EQ(bits, expected_result);
83
84 // 254 limbs are needed to represent p - 1
85 EXPECT_THAT(to_radix_event_emitter.dump_events(),
86 AllOf(SizeIs(1), ElementsAre(AllOf(Field(&ToRadixEvent::limbs, SizeIs(254))))));
87}
88
89TEST(AvmSimulationToRadixTest, BasicRadix)
90{
91 EventEmitter<ToRadixEvent> to_radix_event_emitter;
92 NoopEventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
93
94 StrictMock<MockExecutionIdManager> execution_id_manager;
95 StrictMock<MockGreaterThan> gt;
96 ToRadix to_radix(execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
97
98 auto limbs = to_radix.to_le_radix(FF::one(), 32, 256);
99
100 std::vector<uint8_t> expected_result(32, 0);
101 expected_result[0] = 1;
102
103 EXPECT_EQ(limbs, expected_result);
104
105 EXPECT_THAT(to_radix_event_emitter.dump_events(),
106 AllOf(SizeIs(1),
107 ElementsAre(AllOf(Field(&ToRadixEvent::value, FF::one()),
108 Field(&ToRadixEvent::radix, 256),
109 Field(&ToRadixEvent::limbs, SizeIs(32))))));
110}
111
112TEST(AvmSimulationToRadixTest, ShortRadix)
113{
114 EventEmitter<ToRadixEvent> to_radix_event_emitter;
115 NoopEventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
116
117 StrictMock<MockExecutionIdManager> execution_id_manager;
118 StrictMock<MockGreaterThan> gt;
119 ToRadix to_radix(execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
120
121 auto limbs = to_radix.to_le_radix(FF::one(), 1, 256);
122
123 std::vector<uint8_t> expected_result = { 1 };
124
125 EXPECT_EQ(limbs, expected_result);
126
127 EXPECT_THAT(to_radix_event_emitter.dump_events(),
128 AllOf(SizeIs(1), ElementsAre(Field(&ToRadixEvent::limbs, SizeIs(1)))));
129}
130
131TEST(AvmSimulationToRadixTest, DecomposeOneRadixLargerValue)
132{
133 EventEmitter<ToRadixEvent> to_radix_event_emitter;
134 NoopEventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
135
136 StrictMock<MockExecutionIdManager> execution_id_manager;
137 StrictMock<MockGreaterThan> gt;
138 ToRadix to_radix(execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
139
140 auto limbs = to_radix.to_le_radix(FF::neg_one(), 1, 256);
141
142 // first byte of p - 1 is zero
143 std::vector<uint8_t> expected_result = { 0 };
144
145 EXPECT_EQ(limbs, expected_result);
146
147 // 32 limbs are needed to represent p - 1
148 EXPECT_THAT(to_radix_event_emitter.dump_events(),
149 AllOf(SizeIs(1), ElementsAre(AllOf(Field(&ToRadixEvent::limbs, SizeIs(32))))));
150}
151
152TEST(AvmSimulationToRadixTest, DecomposeInDecimal)
153{
154 EventEmitter<ToRadixEvent> to_radix_event_emitter;
155 NoopEventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
156
157 StrictMock<MockExecutionIdManager> execution_id_manager;
158 StrictMock<MockGreaterThan> gt;
159 ToRadix to_radix(execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
160
161 auto limbs = to_radix.to_le_radix(1337, 4, 10);
162
163 std::vector<uint8_t> expected_result = { 7, 3, 3, 1 };
164
165 EXPECT_EQ(limbs, expected_result);
166}
167
168TEST(AvmSimulationToRadixMemoryTest, BasicTest)
169{
170 EventEmitter<ToRadixEvent> to_radix_event_emitter;
171 EventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
172
173 MemoryStore memory;
174 StrictMock<MockExecutionIdManager> execution_id_manager;
175 EXPECT_CALL(execution_id_manager, get_execution_id()).WillOnce(Return(0));
176 FakeGreaterThan gt;
177 ToRadix to_radix(execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
178
179 const FF value = 1337;
180 const uint32_t radix = 10;
181 const uint32_t num_limbs = 4;
182 bool is_output_bits = false; // Output is U8, not U1
183 MemoryAddress dst_addr = 0xdeadbeef;
184
185 to_radix.to_be_radix(memory, value, radix, num_limbs, is_output_bits, dst_addr);
186
187 std::vector<uint8_t> output;
188 output.reserve(num_limbs);
189
190 for (uint32_t i = 0; i < num_limbs; ++i) {
191 output.emplace_back(memory.get(dst_addr + i).as<uint8_t>());
192 }
193
194 std::vector<uint8_t> expected_result = { 1, 3, 3, 7 };
195 EXPECT_EQ(output, expected_result);
196}
197
198TEST(AvmSimulationToRadixMemoryTest, DstOutOfRange)
199{
200 EventEmitter<ToRadixEvent> to_radix_event_emitter;
201 EventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
202
203 MemoryStore memory;
204 StrictMock<MockExecutionIdManager> execution_id_manager;
205 EXPECT_CALL(execution_id_manager, get_execution_id()).WillOnce(Return(0));
206 FakeGreaterThan gt;
207 ToRadix to_radix(execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
208
209 const FF value = 1337;
210 const uint32_t radix = 10;
211 const uint32_t num_limbs = 4;
212 bool is_output_bits = false; // Output is U8, not U1
213 uint32_t num_writes = num_limbs - 1;
215 AVM_HIGHEST_MEM_ADDRESS - num_writes + 1; // This will cause an out-of-bounds at the last write
216
217 EXPECT_THROW(to_radix.to_be_radix(memory, value, radix, num_limbs, is_output_bits, dst_addr), ToRadixException);
218}
219
220TEST(AvmSimulationToRadixMemoryTest, InvalidRadixValue)
221{
222 EventEmitter<ToRadixEvent> to_radix_event_emitter;
223 EventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
224
225 MemoryStore memory;
226 StrictMock<MockExecutionIdManager> execution_id_manager;
227 EXPECT_CALL(execution_id_manager, get_execution_id()).WillOnce(Return(0));
228 FakeGreaterThan gt;
229 ToRadix to_radix(execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
230
231 const FF value = 1337;
232 const uint32_t radix = 1; // Invalid radix
233 const uint32_t num_limbs = 4;
234 bool is_output_bits = false; // Output is U8, not U1
235 MemoryAddress dst_addr = 0xdeadbeef;
236
237 EXPECT_THROW(to_radix.to_be_radix(memory, value, radix, num_limbs, is_output_bits, dst_addr), ToRadixException);
238}
239
240} // namespace
241} // namespace bb::avm2::simulation
#define AVM_HIGHEST_MEM_ADDRESS
const MemoryValue & get(MemoryAddress index) const override
Definition memory.hpp:92
ExecutionIdManager execution_id_manager
uint32_t dst_addr
GreaterThan gt
bool expected_result
TEST(EmitUnencryptedLogTest, Basic)
uint32_t MemoryAddress
MemoryStore memory
static constexpr field neg_one()
static constexpr field one()