use super::*;
impl<E: Environment> Equal<Self> for IdentifierLiteral<E> {
type Output = Boolean<E>;
fn is_equal(&self, other: &Self) -> Self::Output {
self.to_field().is_equal(&other.to_field())
}
fn is_not_equal(&self, other: &Self) -> Self::Output {
self.to_field().is_not_equal(&other.to_field())
}
}
#[cfg(test)]
mod tests {
use super::*;
use snarkvm_circuit_environment::Circuit;
use snarkvm_utilities::{TestRng, Uniform};
type CurrentEnvironment = Circuit;
const ITERATIONS: usize = 10;
fn check_equal(
mode: Mode,
num_constants: u64,
num_public: u64,
num_private: u64,
num_constraints: u64,
) -> Result<()> {
let mut rng = TestRng::default();
for _ in 0..ITERATIONS {
let value_a = console::IdentifierLiteral::<<CurrentEnvironment as Environment>::Network>::rand(&mut rng);
let value_b = console::IdentifierLiteral::<<CurrentEnvironment as Environment>::Network>::rand(&mut rng);
let circuit_a = IdentifierLiteral::<CurrentEnvironment>::new(mode, value_a);
let circuit_a2 = IdentifierLiteral::<CurrentEnvironment>::new(mode, value_a);
let circuit_b = IdentifierLiteral::<CurrentEnvironment>::new(mode, value_b);
Circuit::scope(format!("is_equal {mode} (same)"), || {
let candidate = circuit_a.is_equal(&circuit_a2);
assert!(candidate.eject_value());
assert_scope!(num_constants, num_public, num_private, num_constraints);
});
Circuit::scope(format!("is_equal {mode} (different)"), || {
let candidate = circuit_a.is_equal(&circuit_b);
assert_eq!(value_a == value_b, candidate.eject_value());
assert_scope!(num_constants, num_public, num_private, num_constraints);
});
Circuit::scope(format!("is_not_equal {mode} (different)"), || {
let candidate = circuit_a.is_not_equal(&circuit_b);
assert_eq!(value_a != value_b, candidate.eject_value());
assert_scope!(num_constants, num_public, num_private, num_constraints);
});
Circuit::scope(format!("is_not_equal {mode} (same)"), || {
let candidate = circuit_a.is_not_equal(&circuit_a2);
assert!(!candidate.eject_value());
assert_scope!(num_constants, num_public, num_private, num_constraints);
});
Circuit::reset();
}
Ok(())
}
#[test]
fn test_equal() -> Result<()> {
check_equal(Mode::Constant, 1, 0, 0, 0)?;
check_equal(Mode::Public, 0, 0, 2, 2)?;
check_equal(Mode::Private, 0, 0, 2, 2)
}
}