#![cfg(test)]
use super::bytes_eq_no_early_exit as bytes_eq;
#[test]
fn it_agrees_with_slice_equality_on_every_case_and_both_outcomes_occur() {
let cases: &[(&[u8], &[u8])] = &[
(b"", b""),
(b"", b"a"),
(b"a", b""),
(b"a", b"a"),
(b"a", b"b"),
(b"abc", b"abc"),
(b"abc", b"abd"), (b"abc", b"zbc"), (b"abc", b"abcd"), (b"abcd", b"abc"),
(&[0x00], &[0x00]),
(&[0x00], &[0xff]),
(&[0xff; 32], &[0xff; 32]),
(&[0xff; 32], &[0xfe; 32]),
];
let mut accepted = 0usize;
let mut rejected = 0usize;
for (left, right) in cases {
let expected = left == right;
assert_eq!(
bytes_eq(left, right),
expected,
"disagreed with slice equality on {left:?} vs {right:?}"
);
if expected {
accepted += 1;
} else {
rejected += 1;
}
}
assert_eq!(cases.len(), 14, "the case table changed size unnoticed");
assert_eq!(
accepted, 5,
"not enough ACCEPTING cases to prove it can accept"
);
assert_eq!(rejected, 9, "not enough rejecting cases");
}
#[test]
fn a_difference_in_the_final_byte_is_still_a_difference() {
let mut a = [7u8; 32];
let mut b = [7u8; 32];
assert!(bytes_eq(&a, &b));
b[31] ^= 0x01;
assert!(!bytes_eq(&a, &b));
a[31] ^= 0x01;
assert!(bytes_eq(&a, &b), "flipping both back must agree again");
}
#[test]
fn every_byte_position_is_actually_examined() {
let base = [0x5au8; 32];
let mut flipped_positions = 0usize;
for position in 0..base.len() {
let mut other = base;
other[position] ^= 0xff;
assert!(
!bytes_eq(&base, &other),
"a flip at position {position} was not detected"
);
flipped_positions += 1;
}
assert_eq!(flipped_positions, 32, "not every position was tried");
}