use super::*;
impl<N: Network, Private: Visibility<Boolean = Boolean<N>>> Eq for Record<N, Private> {}
impl<N: Network, Private: Visibility<Boolean = Boolean<N>>> PartialEq for Record<N, Private> {
fn eq(&self, other: &Self) -> bool {
*self.is_equal(other)
}
}
impl<N: Network, Private: Visibility<Boolean = Boolean<N>>> Equal<Self> for Record<N, Private> {
type Output = Boolean<N>;
fn is_equal(&self, other: &Self) -> Self::Output {
if self.data.len() != other.data.len() {
return Boolean::new(false);
}
if !(*self.owner.is_equal(&other.owner) && *self.nonce.is_equal(&other.nonce)) {
return Boolean::new(false);
}
if self
.data
.iter()
.zip_eq(other.data.iter())
.all(|((name_a, entry_a), (name_b, entry_b))| *name_a.is_equal(name_b) && *entry_a.is_equal(entry_b))
{
Boolean::new(true)
} else {
Boolean::new(false)
}
}
fn is_not_equal(&self, other: &Self) -> Self::Output {
!self.is_equal(other)
}
}
#[cfg(test)]
mod tests {
use super::*;
use snarkvm_console_network::Testnet3;
type CurrentNetwork = Testnet3;
fn sample_record() -> Record<CurrentNetwork, Plaintext<CurrentNetwork>> {
Record::<CurrentNetwork, Plaintext<CurrentNetwork>>::from_str(
r"{
owner: aleo14tlamssdmg3d0p5zmljma573jghe2q9n6wz29qf36re2glcedcpqfg4add.private,
a: true.private,
b: 123456789field.public,
c: 0group.private,
d: {
e: true.private,
f: 123456789field.private,
g: 0group.private
},
_nonce: 0group.public
}",
)
.unwrap()
}
fn sample_mismatched_record() -> Record<CurrentNetwork, Plaintext<CurrentNetwork>> {
Record::<CurrentNetwork, Plaintext<CurrentNetwork>>::from_str(
r"{
owner: aleo14tlamssdmg3d0p5zmljma573jghe2q9n6wz29qf36re2glcedcpqfg4add.private,
a: true.public,
b: 123456789field.public,
c: 0group.private,
d: {
e: true.private,
f: 123456789field.private,
g: 0group.private
},
_nonce: 0group.public
}",
)
.unwrap()
}
fn check_is_equal() {
let record = sample_record();
let mismatched_record = sample_mismatched_record();
let candidate = record.is_equal(&record);
assert!(*candidate);
let candidate = record.is_equal(&mismatched_record);
assert!(!*candidate);
}
fn check_is_not_equal() {
let record = sample_record();
let mismatched_record = sample_mismatched_record();
let candidate = record.is_not_equal(&mismatched_record);
assert!(*candidate);
let candidate = record.is_not_equal(&record);
assert!(!*candidate);
}
#[test]
fn test_is_equal() {
check_is_equal()
}
#[test]
fn test_is_not_equal() {
check_is_not_equal()
}
}