Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
field_gt.test.cpp
Go to the documentation of this file.
5
6#include <gmock/gmock.h>
7#include <gtest/gtest.h>
8
9namespace bb::avm2::simulation {
10
11using ::testing::_;
12using ::testing::ElementsAre;
13using ::testing::NiceMock;
14using ::testing::SizeIs;
15
16namespace {
17
18TEST(AvmSimulationFieldGreaterThanTest, BasicGt)
19{
20 NiceMock<MockRangeCheck> range_check;
21
22 EventEmitter<FieldGreaterThanEvent> event_emitter;
23 FieldGreaterThan field_gt(range_check, event_emitter);
24
25 auto p_limbs = decompose(FF::modulus);
26 std::vector<uint128_t> range_checks;
27 ON_CALL(range_check, assert_range(_, 128)).WillByDefault([&range_checks](uint128_t x, uint64_t) {
28 range_checks.push_back(x);
29 });
30 FF a = 1;
31 FF b = 0;
32 EXPECT_TRUE(field_gt.ff_gt(a, b));
33
34 uint128_t a_lo = 1;
35 uint128_t a_hi = 0;
36
37 uint128_t p_sub_a_witness_lo = p_limbs.lo - a_lo - 1;
38 uint128_t p_sub_a_witness_hi = p_limbs.hi - a_hi - 0;
39
40 uint128_t b_lo = 0;
41 uint128_t b_hi = 0;
42
43 uint128_t p_sub_b_witness_lo = p_limbs.lo - b_lo - 1;
44 uint128_t p_sub_b_witness_hi = p_limbs.hi - b_hi - 0;
45
46 uint128_t res_witness_lo = a_lo - b_lo - 1;
47 uint128_t res_witness_hi = a_hi - b_hi - 0;
48
49 EXPECT_THAT(range_checks,
50 ElementsAre(a_lo,
51 a_hi,
52 p_sub_a_witness_lo,
53 p_sub_a_witness_hi,
54 b_lo,
55 b_hi,
56 p_sub_b_witness_lo,
57 p_sub_b_witness_hi,
58 res_witness_lo,
59 res_witness_hi));
60
61 EXPECT_THAT(event_emitter.dump_events(),
62 ElementsAre(FieldGreaterThanEvent{
64 .a = a,
65 .b = b,
66 .a_limbs = U256Decomposition{ a_lo, a_hi },
67 .p_sub_a_witness = LimbsComparisonWitness{ p_sub_a_witness_lo, p_sub_a_witness_hi, false },
68 .b_limbs = U256Decomposition{ b_lo, b_hi },
69 .p_sub_b_witness = LimbsComparisonWitness{ p_sub_b_witness_lo, p_sub_b_witness_hi, false },
70 .res_witness = LimbsComparisonWitness{ res_witness_lo, res_witness_hi, false },
71 .gt_result = true,
72 }));
73}
74
75TEST(AvmSimulationFieldGreaterThanTest, BasicDec)
76{
77 NiceMock<MockRangeCheck> range_check;
78 EventEmitter<FieldGreaterThanEvent> event_emitter;
79 FieldGreaterThan field_gt(range_check, event_emitter);
80
81 auto p_limbs = decompose(FF::modulus);
82 std::vector<uint128_t> range_checks;
83 ON_CALL(range_check, assert_range(_, 128)).WillByDefault([&range_checks](uint128_t x, uint64_t) {
84 range_checks.push_back(x);
85 });
86
87 U256Decomposition expected_result = { .lo = 123456789, .hi = 987654321 };
88 FF a = uint256_t(123456789) + uint256_t(987654321) * (uint256_t(1) << 128);
89
90 EXPECT_EQ(field_gt.canon_dec(a), expected_result);
91
92 uint128_t a_lo = 123456789;
93 uint128_t a_hi = 987654321;
94
95 uint128_t p_sub_a_witness_lo = p_limbs.lo - a_lo - 1;
96 uint128_t p_sub_a_witness_hi = p_limbs.hi - a_hi - 0;
97
98 EXPECT_THAT(range_checks, ElementsAre(a_lo, a_hi, p_sub_a_witness_lo, p_sub_a_witness_hi));
99
100 EXPECT_THAT(event_emitter.dump_events(),
101 ElementsAre(FieldGreaterThanEvent{
103 .a = a,
104 .a_limbs = U256Decomposition{ a_lo, a_hi },
105 .p_sub_a_witness = LimbsComparisonWitness{ p_sub_a_witness_lo, p_sub_a_witness_hi, false },
106 .b_limbs = U256Decomposition{ 0, 0 },
107 .p_sub_b_witness = LimbsComparisonWitness{ 0, 0, false },
108 .res_witness = LimbsComparisonWitness{ 0, 0, false },
109 .gt_result = false,
110 }));
111}
112
113TEST(AvmSimulationFieldGreaterThanTest, ResultsGt)
114{
115 NiceMock<MockRangeCheck> range_check;
116
117 EventEmitter<FieldGreaterThanEvent> event_emitter;
118 FieldGreaterThan field_gt(range_check, event_emitter);
119
120 EXPECT_TRUE(field_gt.ff_gt(1, 0));
121 EXPECT_TRUE(field_gt.ff_gt(-1, 0));
122
123 EXPECT_FALSE(field_gt.ff_gt(0, 0));
124 EXPECT_FALSE(field_gt.ff_gt(-1, -1));
125 EXPECT_FALSE(field_gt.ff_gt(0, 1));
126 EXPECT_FALSE(field_gt.ff_gt(0, -1));
127
128 EXPECT_THAT(event_emitter.dump_events(), SizeIs(6));
129}
130
131TEST(AvmSimulationFieldGreaterThanTest, ResultsDec)
132{
133 NiceMock<MockRangeCheck> range_check;
134
135 EventEmitter<FieldGreaterThanEvent> event_emitter;
136 FieldGreaterThan field_gt(range_check, event_emitter);
137
138 U256Decomposition expected_result = { .lo = 8765, .hi = 0 };
139
140 EXPECT_EQ(field_gt.canon_dec(8765), expected_result);
141
142 uint256_t input = uint256_t(12345) + uint256_t(6789) * (uint256_t(1) << 128);
143 expected_result = { .lo = 12345, .hi = 6789 };
144
145 EXPECT_EQ(field_gt.canon_dec(input), expected_result);
146
147 input = FF::modulus + 1;
148 expected_result = { .lo = 1, .hi = 0 };
149 EXPECT_EQ(field_gt.canon_dec(input), expected_result);
150}
151
152} // namespace
153} // namespace bb::avm2::simulation
EventEmitter< DataCopyEvent > event_emitter
RangeCheck range_check
FF a
FF b
bool expected_result
TEST(EmitUnencryptedLogTest, Basic)
U256Decomposition decompose(const uint256_t &x)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
unsigned __int128 uint128_t
Definition serialize.hpp:44
static constexpr uint256_t modulus
NiceMock< MockFieldGreaterThan > field_gt