pub fn complement_base(base: u8) -> u8 {
match base {
b'A' => b'T',
b'T' => b'A',
b'C' => b'G',
b'G' => b'C',
other => other,
}
}
pub fn reverse_complement(seq: &[u8]) -> Vec<u8> {
seq.iter()
.rev()
.map(|&b| complement_base(b.to_ascii_uppercase()))
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_complement_base() {
assert_eq!(complement_base(b'A'), b'T');
assert_eq!(complement_base(b'T'), b'A');
assert_eq!(complement_base(b'C'), b'G');
assert_eq!(complement_base(b'G'), b'C');
assert_eq!(complement_base(b'N'), b'N');
}
#[test]
fn test_reverse_complement_basic() {
assert_eq!(reverse_complement(b"ACGT"), b"ACGT");
assert_eq!(reverse_complement(b"AAAA"), b"TTTT");
assert_eq!(reverse_complement(b"CCCC"), b"GGGG");
assert_eq!(reverse_complement(b"ATCG"), b"CGAT");
}
#[test]
fn test_reverse_complement_with_n() {
assert_eq!(reverse_complement(b"ANCG"), b"CGNT");
}
#[test]
fn test_reverse_complement_empty() {
assert_eq!(reverse_complement(b""), b"");
}
#[test]
fn test_reverse_complement_single() {
assert_eq!(reverse_complement(b"A"), b"T");
assert_eq!(reverse_complement(b"N"), b"N");
}
}