/ circuit / types / boolean / src / equal.rs
equal.rs
  1  // Copyright (c) 2019-2025 Alpha-Delta Network Inc.
  2  // This file is part of the alphavm library.
  3  
  4  // Licensed under the Apache License, Version 2.0 (the "License");
  5  // you may not use this file except in compliance with the License.
  6  // You may obtain a copy of the License at:
  7  
  8  // http://www.apache.org/licenses/LICENSE-2.0
  9  
 10  // Unless required by applicable law or agreed to in writing, software
 11  // distributed under the License is distributed on an "AS IS" BASIS,
 12  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13  // See the License for the specific language governing permissions and
 14  // limitations under the License.
 15  
 16  use super::*;
 17  
 18  impl<E: Environment> Equal<Self> for Boolean<E> {
 19      type Output = Boolean<E>;
 20  
 21      /// Returns `true` if `self` and `other` are equal.
 22      fn is_equal(&self, other: &Self) -> Self::Output {
 23          !self.is_not_equal(other)
 24      }
 25  
 26      /// Returns `true` if `self` and `other` are *not* equal.
 27      fn is_not_equal(&self, other: &Self) -> Self::Output {
 28          self ^ other
 29      }
 30  }
 31  
 32  #[cfg(test)]
 33  mod tests {
 34      use super::*;
 35      use alphavm_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          // false == false
 57          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          // false == true
 63          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          // true == false
 69          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          // true == true
 75          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          // false == false
 84          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          // false == true
 90          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          // true == false
 96          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          // true == true
102          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          // false == false
111          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          // false == true
117          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          // true == false
123          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          // true == true
129          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          // false == false
138          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          // false == true
144          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          // true == false
150          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          // true == true
156          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          // false == false
165          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          // false == true
171          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          // true == false
177          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          // true == true
183          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          // false == false
192          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          // false == true
198          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          // true == false
204          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          // true == true
210          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          // false == false
219          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          // false == true
225          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          // true == false
231          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          // true == true
237          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          // false == false
246          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          // false == true
252          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          // true == false
258          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          // true == true
264          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          // false == false
273          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          // false == true
279          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          // true == false
285          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          // true == true
291          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  }