use super::DistanceError;
pub fn hamming(s: &str, t: &str) -> Result<usize, DistanceError> {
if s.chars().count() != t.chars().count() {
return Err(DistanceError::InvalidArgs);
}
let mut distance = 0;
for (s_char, t_char) in s.chars().zip(t.chars()) {
if s_char != t_char {
distance += 1
}
}
return Ok(distance);
}
#[cfg(test)]
mod tests {
use super::hamming;
use ::DistanceError;
#[test]
fn basic() {
assert_eq!(0, hamming("sitting", "sitting").unwrap());
assert_eq!(7, hamming("abcdefg", "hijklmn").unwrap());
assert_eq!(3, hamming("karolin", "kathrin").unwrap());
assert_eq!(4, hamming("hello", "world").unwrap());
assert_eq!(1, hamming("Rust", "rust").unwrap());
}
#[test]
#[allow(unused_variables)]
fn matching() {
match hamming("karolin", "kathrin") {
Ok(distance) => assert_eq!(3, distance),
Err(err) => panic!("This should not happen"),
};
match hamming("abra", "kadabra") {
Ok(distance) => panic!("These are not valid inputs"),
Err(err) => assert_eq!(err, DistanceError::InvalidArgs),
};
}
#[test]
#[should_panic]
fn different_len() {
hamming("abra", "kadabra").unwrap();
}
#[test]
fn empty() {
assert_eq!(0, hamming("", "").unwrap());
}
#[test]
fn unicode() {
assert_eq!(1, hamming("さようなら", "さようなは").unwrap());
assert_eq!(1, hamming("säge", "sage").unwrap());
assert_eq!(4, hamming("ßäöüé", "ößäüè").unwrap());
}
#[test]
#[should_panic]
fn unicode_different_len() {
hamming("さようならa", "さようなら").unwrap();
}
}