1use super::*;
17
18impl<E: Environment> Equal<Self> for Boolean<E> {
19 type Output = Boolean<E>;
20
21 fn is_equal(&self, other: &Self) -> Self::Output {
23 !self.is_not_equal(other)
24 }
25
26 fn is_not_equal(&self, other: &Self) -> Self::Output {
28 self ^ other
29 }
30}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35 use snarkvm_circuit_environment::Circuit;
36
37 fn check_is_equal(
38 name: &str,
39 expected: bool,
40 a: Boolean<Circuit>,
41 b: Boolean<Circuit>,
42 num_constants: u64,
43 num_public: u64,
44 num_private: u64,
45 num_constraints: u64,
46 ) {
47 Circuit::scope(name, || {
48 let candidate = a.is_equal(&b);
49 assert_eq!(expected, candidate.eject_value(), "({} == {})", a.eject_value(), b.eject_value());
50 assert_scope!(num_constants, num_public, num_private, num_constraints);
51 });
52 }
53
54 #[test]
55 fn test_constant_equals_constant() {
56 let expected = true;
58 let a = Boolean::<Circuit>::new(Mode::Constant, false);
59 let b = Boolean::<Circuit>::new(Mode::Constant, false);
60 check_is_equal("false == false", expected, a, b, 0, 0, 0, 0);
61
62 let expected = false;
64 let a = Boolean::<Circuit>::new(Mode::Constant, false);
65 let b = Boolean::<Circuit>::new(Mode::Constant, true);
66 check_is_equal("false == true", expected, a, b, 0, 0, 0, 0);
67
68 let expected = false;
70 let a = Boolean::<Circuit>::new(Mode::Constant, true);
71 let b = Boolean::<Circuit>::new(Mode::Constant, false);
72 check_is_equal("true == false", expected, a, b, 0, 0, 0, 0);
73
74 let expected = true;
76 let a = Boolean::<Circuit>::new(Mode::Constant, true);
77 let b = Boolean::<Circuit>::new(Mode::Constant, true);
78 check_is_equal("true == true", expected, a, b, 0, 0, 0, 0);
79 }
80
81 #[test]
82 fn test_constant_equals_public() {
83 let expected = true;
85 let a = Boolean::<Circuit>::new(Mode::Constant, false);
86 let b = Boolean::<Circuit>::new(Mode::Public, false);
87 check_is_equal("false == false", expected, a, b, 0, 0, 0, 0);
88
89 let expected = false;
91 let a = Boolean::<Circuit>::new(Mode::Constant, false);
92 let b = Boolean::<Circuit>::new(Mode::Public, true);
93 check_is_equal("false == true", expected, a, b, 0, 0, 0, 0);
94
95 let expected = false;
97 let a = Boolean::<Circuit>::new(Mode::Constant, true);
98 let b = Boolean::<Circuit>::new(Mode::Public, false);
99 check_is_equal("true == false", expected, a, b, 0, 0, 0, 0);
100
101 let expected = true;
103 let a = Boolean::<Circuit>::new(Mode::Constant, true);
104 let b = Boolean::<Circuit>::new(Mode::Public, true);
105 check_is_equal("true == true", expected, a, b, 0, 0, 0, 0);
106 }
107
108 #[test]
109 fn test_constant_equal_private() {
110 let expected = true;
112 let a = Boolean::<Circuit>::new(Mode::Constant, false);
113 let b = Boolean::<Circuit>::new(Mode::Private, false);
114 check_is_equal("false == false", expected, a, b, 0, 0, 0, 0);
115
116 let expected = false;
118 let a = Boolean::<Circuit>::new(Mode::Constant, false);
119 let b = Boolean::<Circuit>::new(Mode::Private, true);
120 check_is_equal("false == true", expected, a, b, 0, 0, 0, 0);
121
122 let expected = false;
124 let a = Boolean::<Circuit>::new(Mode::Constant, true);
125 let b = Boolean::<Circuit>::new(Mode::Private, false);
126 check_is_equal("true == false", expected, a, b, 0, 0, 0, 0);
127
128 let expected = true;
130 let a = Boolean::<Circuit>::new(Mode::Constant, true);
131 let b = Boolean::<Circuit>::new(Mode::Private, true);
132 check_is_equal("true == true", expected, a, b, 0, 0, 0, 0);
133 }
134
135 #[test]
136 fn test_public_equals_constant() {
137 let expected = true;
139 let a = Boolean::<Circuit>::new(Mode::Public, false);
140 let b = Boolean::<Circuit>::new(Mode::Constant, false);
141 check_is_equal("false == false", expected, a, b, 0, 0, 0, 0);
142
143 let expected = false;
145 let a = Boolean::<Circuit>::new(Mode::Public, false);
146 let b = Boolean::<Circuit>::new(Mode::Constant, true);
147 check_is_equal("false == true", expected, a, b, 0, 0, 0, 0);
148
149 let expected = false;
151 let a = Boolean::<Circuit>::new(Mode::Public, true);
152 let b = Boolean::<Circuit>::new(Mode::Constant, false);
153 check_is_equal("true == false", expected, a, b, 0, 0, 0, 0);
154
155 let expected = true;
157 let a = Boolean::<Circuit>::new(Mode::Public, true);
158 let b = Boolean::<Circuit>::new(Mode::Constant, true);
159 check_is_equal("true == true", expected, a, b, 0, 0, 0, 0);
160 }
161
162 #[test]
163 fn test_public_equals_public() {
164 let expected = true;
166 let a = Boolean::<Circuit>::new(Mode::Public, false);
167 let b = Boolean::<Circuit>::new(Mode::Public, false);
168 check_is_equal("false == false", expected, a, b, 0, 0, 1, 1);
169
170 let expected = false;
172 let a = Boolean::<Circuit>::new(Mode::Public, false);
173 let b = Boolean::<Circuit>::new(Mode::Public, true);
174 check_is_equal("false == true", expected, a, b, 0, 0, 1, 1);
175
176 let expected = false;
178 let a = Boolean::<Circuit>::new(Mode::Public, true);
179 let b = Boolean::<Circuit>::new(Mode::Public, false);
180 check_is_equal("true == false", expected, a, b, 0, 0, 1, 1);
181
182 let expected = true;
184 let a = Boolean::<Circuit>::new(Mode::Public, true);
185 let b = Boolean::<Circuit>::new(Mode::Public, true);
186 check_is_equal("true == true", expected, a, b, 0, 0, 1, 1);
187 }
188
189 #[test]
190 fn test_public_equals_private() {
191 let expected = true;
193 let a = Boolean::<Circuit>::new(Mode::Public, false);
194 let b = Boolean::<Circuit>::new(Mode::Private, false);
195 check_is_equal("false == false", expected, a, b, 0, 0, 1, 1);
196
197 let expected = false;
199 let a = Boolean::<Circuit>::new(Mode::Public, false);
200 let b = Boolean::<Circuit>::new(Mode::Private, true);
201 check_is_equal("false == true", expected, a, b, 0, 0, 1, 1);
202
203 let expected = false;
205 let a = Boolean::<Circuit>::new(Mode::Public, true);
206 let b = Boolean::<Circuit>::new(Mode::Private, false);
207 check_is_equal("true == false", expected, a, b, 0, 0, 1, 1);
208
209 let expected = true;
211 let a = Boolean::<Circuit>::new(Mode::Public, true);
212 let b = Boolean::<Circuit>::new(Mode::Private, true);
213 check_is_equal("true == true", expected, a, b, 0, 0, 1, 1);
214 }
215
216 #[test]
217 fn test_private_equals_constant() {
218 let expected = true;
220 let a = Boolean::<Circuit>::new(Mode::Private, false);
221 let b = Boolean::<Circuit>::new(Mode::Constant, false);
222 check_is_equal("false == false", expected, a, b, 0, 0, 0, 0);
223
224 let expected = false;
226 let a = Boolean::<Circuit>::new(Mode::Private, false);
227 let b = Boolean::<Circuit>::new(Mode::Constant, true);
228 check_is_equal("false == true", expected, a, b, 0, 0, 0, 0);
229
230 let expected = false;
232 let a = Boolean::<Circuit>::new(Mode::Private, true);
233 let b = Boolean::<Circuit>::new(Mode::Constant, false);
234 check_is_equal("true == false", expected, a, b, 0, 0, 0, 0);
235
236 let expected = true;
238 let a = Boolean::<Circuit>::new(Mode::Private, true);
239 let b = Boolean::<Circuit>::new(Mode::Constant, true);
240 check_is_equal("true == true", expected, a, b, 0, 0, 0, 0);
241 }
242
243 #[test]
244 fn test_private_equal_public() {
245 let expected = true;
247 let a = Boolean::<Circuit>::new(Mode::Private, false);
248 let b = Boolean::<Circuit>::new(Mode::Public, false);
249 check_is_equal("false == false", expected, a, b, 0, 0, 1, 1);
250
251 let expected = false;
253 let a = Boolean::<Circuit>::new(Mode::Private, false);
254 let b = Boolean::<Circuit>::new(Mode::Public, true);
255 check_is_equal("false == true", expected, a, b, 0, 0, 1, 1);
256
257 let expected = false;
259 let a = Boolean::<Circuit>::new(Mode::Private, true);
260 let b = Boolean::<Circuit>::new(Mode::Public, false);
261 check_is_equal("true == false", expected, a, b, 0, 0, 1, 1);
262
263 let expected = true;
265 let a = Boolean::<Circuit>::new(Mode::Private, true);
266 let b = Boolean::<Circuit>::new(Mode::Public, true);
267 check_is_equal("true == true", expected, a, b, 0, 0, 1, 1);
268 }
269
270 #[test]
271 fn test_private_equals_private() {
272 let expected = true;
274 let a = Boolean::<Circuit>::new(Mode::Private, false);
275 let b = Boolean::<Circuit>::new(Mode::Private, false);
276 check_is_equal("false == false", expected, a, b, 0, 0, 1, 1);
277
278 let expected = false;
280 let a = Boolean::<Circuit>::new(Mode::Private, false);
281 let b = Boolean::<Circuit>::new(Mode::Private, true);
282 check_is_equal("false == true", expected, a, b, 0, 0, 1, 1);
283
284 let expected = false;
286 let a = Boolean::<Circuit>::new(Mode::Private, true);
287 let b = Boolean::<Circuit>::new(Mode::Private, false);
288 check_is_equal("true == false", expected, a, b, 0, 0, 1, 1);
289
290 let expected = true;
292 let a = Boolean::<Circuit>::new(Mode::Private, true);
293 let b = Boolean::<Circuit>::new(Mode::Private, true);
294 check_is_equal("true == true", expected, a, b, 0, 0, 1, 1);
295 }
296}