Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
uint1.test.cpp
Go to the documentation of this file.
1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
3
5
6namespace bb::avm2 {
7namespace {
8
9// Test constructors
10TEST(Uint1Test, Constructors)
11{
12 // Default constructor should initialize to 0
13 uint1_t default_val;
14 EXPECT_EQ(default_val.value(), 0);
15
16 // Constructor from bool
17 uint1_t true_val(true);
18 EXPECT_EQ(true_val.value(), 1);
19
20 uint1_t false_val(false);
21 EXPECT_EQ(false_val.value(), 0);
22
23 // Constructor from integers
24 uint1_t from_int_zero(0);
25 EXPECT_EQ(from_int_zero.value(), 0);
26
27 uint1_t from_int_one(1);
28 EXPECT_EQ(from_int_one.value(), 1);
29
30 uint1_t from_int_two(2);
31 EXPECT_EQ(from_int_two.value(), 1); // Any non-zero value becomes 1
32
33 uint1_t from_int_negative(-1);
34 EXPECT_EQ(from_int_negative.value(), 1); // Any non-zero value becomes 1
35}
36
37// Test arithmetic operators
38TEST(Uint1Test, ArithmeticOperators)
39{
40 uint1_t zero(0);
41 uint1_t one(1);
42
43 // Addition
44 EXPECT_EQ((zero + zero).value(), 0);
45 EXPECT_EQ((zero + one).value(), 1);
46 EXPECT_EQ((one + zero).value(), 1);
47 EXPECT_EQ((one + one).value(), 0); // 1+1=0 with overflow (XOR behavior)
48
49 // Subtraction
50 EXPECT_EQ((zero - zero).value(), 0);
51 EXPECT_EQ((zero - one).value(), 1); // 0-1=1 with underflow
52 EXPECT_EQ((one - zero).value(), 1);
53 EXPECT_EQ((one - one).value(), 0);
54
55 // Multiplication
56 EXPECT_EQ((zero * zero).value(), 0);
57 EXPECT_EQ((zero * one).value(), 0);
58 EXPECT_EQ((one * zero).value(), 0);
59 EXPECT_EQ((one * one).value(), 1);
60
61 // Division
62 EXPECT_EQ((zero / one).value(), 0);
63 EXPECT_EQ((one / one).value(), 1);
64 // Division by zero isn't tested as it's undefined behavior
65
66 // Unary negation
67 EXPECT_EQ((-zero).value(), 1);
68 EXPECT_EQ((-one).value(), 0);
69}
70
71// Test bitwise operators
72TEST(Uint1Test, BitwiseOperators)
73{
74 uint1_t zero(0);
75 uint1_t one(1);
76
77 // Bitwise AND
78 EXPECT_EQ((zero & zero).value(), 0);
79 EXPECT_EQ((zero & one).value(), 0);
80 EXPECT_EQ((one & zero).value(), 0);
81 EXPECT_EQ((one & one).value(), 1);
82
83 // Bitwise OR
84 EXPECT_EQ((zero | zero).value(), 0);
85 EXPECT_EQ((zero | one).value(), 1);
86 EXPECT_EQ((one | zero).value(), 1);
87 EXPECT_EQ((one | one).value(), 1);
88
89 // Bitwise XOR
90 EXPECT_EQ((zero ^ zero).value(), 0);
91 EXPECT_EQ((zero ^ one).value(), 1);
92 EXPECT_EQ((one ^ zero).value(), 1);
93 EXPECT_EQ((one ^ one).value(), 0);
94
95 // Bitwise NOT
96 EXPECT_EQ((~zero).value(), 1);
97 EXPECT_EQ((~one).value(), 0);
98}
99
100// Test shift operators
101TEST(Uint1Test, ShiftOperators)
102{
103 uint1_t zero(0);
104 uint1_t one(1);
105
106 // Left shift
107 EXPECT_EQ((zero << zero).value(), 0);
108 EXPECT_EQ((zero << one).value(), 0);
109 EXPECT_EQ((one << zero).value(), 1);
110 EXPECT_EQ((one << one).value(), 0); // 1<<1=2, which becomes 0 in uint1_t
111
112 // Right shift
113 EXPECT_EQ((zero >> zero).value(), 0);
114 EXPECT_EQ((zero >> one).value(), 0);
115 EXPECT_EQ((one >> zero).value(), 1);
116 EXPECT_EQ((one >> one).value(), 0);
117}
118
119// Test comparison operators
120TEST(Uint1Test, ComparisonOperators)
121{
122 uint1_t zero(0);
123 uint1_t one(1);
124 uint1_t also_one(1);
125
126 // Equality
127 EXPECT_TRUE(zero == zero);
128 EXPECT_FALSE(zero == one);
129 EXPECT_FALSE(one == zero);
130 EXPECT_TRUE(one == also_one);
131
132 // Inequality
133 EXPECT_FALSE(zero != zero);
134 EXPECT_TRUE(zero != one);
135 EXPECT_TRUE(one != zero);
136 EXPECT_FALSE(one != also_one);
137
138 // Less than
139 EXPECT_FALSE(zero < zero);
140 EXPECT_TRUE(zero < one);
141 EXPECT_FALSE(one < zero);
142 EXPECT_FALSE(one < also_one);
143
144 // Less than or equal
145 EXPECT_TRUE(zero <= zero);
146 EXPECT_TRUE(zero <= one);
147 EXPECT_FALSE(one <= zero);
148 EXPECT_TRUE(one <= also_one);
149
150 // Greater than
151 EXPECT_FALSE(zero > zero);
152 EXPECT_FALSE(zero > one);
153 EXPECT_TRUE(one > zero);
154 EXPECT_FALSE(one > also_one);
155
156 // Greater than or equal
157 EXPECT_TRUE(zero >= zero);
158 EXPECT_FALSE(zero >= one);
159 EXPECT_TRUE(one >= zero);
160 EXPECT_TRUE(one >= also_one);
161}
162
163// Test uint8_t conversion
164TEST(Uint1Test, Conversion)
165{
166 uint1_t zero(0);
167 uint1_t one(1);
168
169 // Test explicit conversion through value()
170 EXPECT_EQ(zero.value(), 0);
171 EXPECT_EQ(one.value(), 1);
172
173 // Test implicit conversion to uint8_t
174 uint8_t zero_u8 = zero;
175 uint8_t one_u8 = one;
176 EXPECT_EQ(zero_u8, 0);
177 EXPECT_EQ(one_u8, 1);
178}
179
180// Test behavior in complex expressions
181TEST(Uint1Test, ComplexExpressions)
182{
183 uint1_t zero(0);
184 uint1_t one(1);
185
186 // Test compound expressions
187 EXPECT_EQ(((zero | one) & ~zero).value(), 1);
188 EXPECT_EQ(((zero & one) | zero).value(), 0);
189 EXPECT_EQ(((zero ^ one) ^ zero).value(), 1);
190
191 // Test with arithmetic and bitwise operations mixed
192 EXPECT_EQ((zero + one * zero).value(), 0);
193 EXPECT_EQ((zero | (one & zero)).value(), 0);
194 EXPECT_EQ((zero + (one | zero)).value(), 1);
195
196 // Test more complex expressions
197 EXPECT_EQ(((zero | one) + (zero & zero)).value(), 1);
198 EXPECT_EQ(((zero ^ one) - (one & zero)).value(), 1);
199 EXPECT_EQ(((~zero & one) * (zero | zero)).value(), 0);
200}
201
202} // namespace
203} // namespace bb::avm2
TEST(EmitUnencryptedLogTest, Basic)