use distances::strings::{ Edit, _x_to_y, aligned_x_to_y, aligned_x_to_y_no_sub, apply_edits, unaligned_x_to_y, x_to_y_alignment, }; #[test] fn tiny_aligned() { let x = "A-C"; let y = "AAC"; let actual = _x_to_y(x, y); let expected = vec![Edit::Sub(1, 'A')]; assert_eq!(actual, expected); } #[test] fn medium_aligned() { let x = "NAJIB-PEPPERSEATS"; let y = "NAJIBEATSPEPPE-RS"; let actual = _x_to_y(x, y); let expected = vec![ Edit::Sub(5, 'E'), Edit::Sub(6, 'A'), Edit::Sub(7, 'T'), Edit::Sub(8, 'S'), Edit::Sub(11, 'P'), Edit::Sub(12, 'P'), Edit::Sub(14, '-'), Edit::Sub(15, 'R'), ]; assert_eq!(actual, expected); } #[test] fn tiny_unaligned() { let x = "A-C"; let y = "AAC"; let actual = unaligned_x_to_y(x, y); let expected = vec![Edit::Ins(1, 'A')]; assert_eq!(actual, expected); } #[test] fn small_unaligned() { let x = "A-CBAAB"; let y = "AACA-AC"; let actual = unaligned_x_to_y(x, y); let expected = vec![Edit::Ins(1, 'A'), Edit::Sub(3, 'A'), Edit::Del(4), Edit::Sub(5, 'C')]; assert_eq!(actual, expected); } #[test] fn test_apply_edits() { let x = "ACBAAB"; let edits: Vec = vec![Edit::Ins(1, 'A'), Edit::Sub(3, 'A'), Edit::Del(4), Edit::Sub(5, 'C')]; let actual = apply_edits(x, &edits); let expected = "AACAAC"; assert_eq!(actual, expected); } #[test] fn test_alignment() { let seq_1_10 = "CAGAATATTA"; let seq_2_10 = "TTGCTTTGAT"; let seq_1_20 = "GAAAGCCTATCGTCTGAGCG"; let seq_2_20 = "AAGGGACGCGTTGGAGTTAC"; let edits_10_10 = aligned_x_to_y(seq_1_10, seq_2_10); let mut deletes: Vec = vec![3]; let mut inserts: Vec<(usize, char)> = vec![(9, 'T')]; let mut substitutions: Vec<(usize, char)> = vec![(0, 'T'), (1, 'T'), (3, 'C'), (5, 'T'), (7, 'G')]; assert_eq!(edits_10_10.len(), 7); for edit in edits_10_10 { match edit { Edit::Del(x) => { assert_eq!(deletes[0], x); deletes.remove(0); } Edit::Ins(x, c) => { assert!(inserts[0].0 == x && inserts[0].1 == c); inserts.remove(0); } Edit::Sub(x, c) => { assert!(substitutions[0].0 == x && substitutions[0].1 == c); substitutions.remove(0); } } } assert_eq!(deletes.len(), 0); assert_eq!(inserts.len(), 0); assert_eq!(substitutions.len(), 0); let edits_10_20 = aligned_x_to_y(seq_1_10, seq_2_20); let mut deletes: Vec = vec![]; let mut inserts: Vec<(usize, char)> = vec![ (2, 'G'), (3, 'G'), (6, 'C'), (7, 'G'), (8, 'C'), (9, 'G'), (12, 'G'), (13, 'G'), (15, 'G'), (19, 'C'), ]; let mut substitutions: Vec<(usize, char)> = vec![(0, 'A'), (10, 'T')]; assert_eq!(edits_10_20.len(), 12); for edit in edits_10_20 { match edit { Edit::Del(x) => { assert_eq!(deletes[0], x); deletes.remove(0); } Edit::Ins(x, c) => { assert!(inserts[0].0 == x && inserts[0].1 == c); inserts.remove(0); } Edit::Sub(x, c) => { assert!(substitutions[0].0 == x && substitutions[0].1 == c); substitutions.remove(0); } } } assert_eq!(deletes.len(), 0); assert_eq!(inserts.len(), 0); assert_eq!(substitutions.len(), 0); let mut deletes: Vec = vec![0, 0, 3, 4, 4, 5, 5, 6, 9, 9]; let mut substitutions: Vec<(usize, char)> = vec![(0, 'T'), (1, 'T'), (9, 'T')]; let edits_20_10 = aligned_x_to_y(seq_1_20, seq_2_10); assert_eq!(edits_20_10.len(), 13); for edit in edits_20_10 { match edit { Edit::Del(x) => { assert_eq!(deletes[0], x); deletes.remove(0); } Edit::Ins(x, c) => { assert!(inserts[0].0 == x && inserts[0].1 == c); inserts.remove(0); } Edit::Sub(x, c) => { assert!(substitutions[0].0 == x && substitutions[0].1 == c); substitutions.remove(0); } } } assert_eq!(deletes.len(), 0); assert_eq!(inserts.len(), 0); assert_eq!(substitutions.len(), 0); let edits_20_20 = aligned_x_to_y(seq_1_20, seq_2_20); let mut deletes: Vec = vec![0, 0]; let mut inserts: Vec<(usize, char)> = vec![(16, 'T'), (17, 'T')]; let mut substitutions: Vec<(usize, char)> = vec![ (3, 'G'), (4, 'G'), (5, 'A'), (6, 'C'), (7, 'G'), (11, 'T'), (12, 'G'), (18, 'A'), (19, 'C'), ]; assert_eq!(edits_20_20.len(), 13); for edit in edits_20_20 { match edit { Edit::Del(x) => { assert_eq!(deletes[0], x); deletes.remove(0); } Edit::Ins(x, c) => { assert!(inserts[0].0 == x && inserts[0].1 == c); inserts.remove(0); } Edit::Sub(x, c) => { assert!(substitutions[0].0 == x && substitutions[0].1 == c); substitutions.remove(0); } } } assert_eq!(deletes.len(), 0); assert_eq!(inserts.len(), 0); assert_eq!(substitutions.len(), 0); } #[test] fn test_alignment_no_sub() { let seq_1_10 = "CAGAATATTA"; let seq_2_10 = "TTGCTTTGAT"; let seq_1_20 = "GAAAGCCTATCGTCTGAGCG"; let seq_2_20 = "AAGGGACGCGTTGGAGTTAC"; let edits_10_10 = aligned_x_to_y_no_sub(seq_1_10, seq_2_10); let mut deletes: Vec = vec![3]; let mut inserts: Vec<(usize, char)> = vec![(9, 'T')]; assert_eq!(edits_10_10.len(), 2); for edit in edits_10_10 { match edit { Edit::Del(x) => { assert_eq!(deletes[0], x); deletes.remove(0); } Edit::Ins(x, c) => { assert!(inserts[0].0 == x && inserts[0].1 == c); inserts.remove(0); } _ => assert_eq!(0, 1), } } assert_eq!(deletes.len(), 0); assert_eq!(inserts.len(), 0); let edits_10_20 = aligned_x_to_y_no_sub(seq_1_10, seq_2_20); let mut deletes: Vec = vec![]; let mut inserts: Vec<(usize, char)> = vec![ (2, 'G'), (3, 'G'), (6, 'C'), (7, 'G'), (8, 'C'), (9, 'G'), (12, 'G'), (13, 'G'), (15, 'G'), (19, 'C'), ]; assert_eq!(edits_10_20.len(), 10); for edit in edits_10_20 { match edit { Edit::Del(x) => { assert_eq!(deletes[0], x); deletes.remove(0); } Edit::Ins(x, c) => { assert!(inserts[0].0 == x && inserts[0].1 == c); inserts.remove(0); } _ => assert_eq!(0, 1), } } let mut deletes: Vec = vec![0, 0, 3, 4, 4, 5, 5, 6, 9, 9]; let edits_20_10 = aligned_x_to_y_no_sub(seq_1_20, seq_2_10); assert_eq!(edits_20_10.len(), 10); for edit in edits_20_10 { match edit { Edit::Del(x) => { assert_eq!(deletes[0], x); deletes.remove(0); } _ => assert_eq!(0, 1), } } let edits_20_20 = aligned_x_to_y_no_sub(seq_1_20, seq_2_20); let mut deletes: Vec = vec![0, 0]; let mut inserts: Vec<(usize, char)> = vec![(16, 'T'), (17, 'T')]; assert_eq!(edits_20_20.len(), 4); for edit in edits_20_20 { match edit { Edit::Del(x) => { assert_eq!(deletes[0], x); deletes.remove(0); } Edit::Ins(x, c) => { assert!(inserts[0].0 == x && inserts[0].1 == c); inserts.remove(0); } _ => assert_eq!(0, 1), } } } #[test] fn test_alignment_gaps() { let seq_1_10 = "CAGAATATTA"; let seq_2_10 = "TTGCTTTGAT"; let seq_1_20 = "GAAAGCCTATCGTCTGAGCG"; let seq_2_20 = "AAGGGACGCGTTGGAGTTAC"; let align_10_10 = x_to_y_alignment(seq_1_10, seq_2_10); let gaps_10_10: [Vec; 2] = [vec![10], vec![3]]; for (i, g) in align_10_10[0].iter().enumerate() { assert_eq!(&gaps_10_10[0][i], g); } for (i, g) in align_10_10[1].iter().enumerate() { assert_eq!(&gaps_10_10[1][i], g); } let align_10_20 = x_to_y_alignment(seq_1_10, seq_2_20); let gaps_10_20: [Vec; 2] = [vec![2, 3, 6, 7, 8, 9, 12, 13, 15, 19], vec![]]; assert_eq!(align_10_20[1].len(), 0); for (i, g) in align_10_20[0].iter().enumerate() { assert_eq!(&gaps_10_20[0][i], g); } let align_20_10 = x_to_y_alignment(seq_1_20, seq_2_10); let gaps_20_10: [Vec; 2] = [vec![], vec![0, 0, 3, 4, 4, 5, 5, 6, 9, 9]]; for (i, g) in align_20_10[1].iter().enumerate() { assert_eq!(&gaps_20_10[1][i], g); } assert_eq!(align_20_10[0].len(), 0); let align_20_20 = x_to_y_alignment(seq_1_20, seq_2_20); let gaps_20_20: [Vec; 2] = [vec![18, 19], vec![0, 0]]; for (i, g) in align_20_20[0].iter().enumerate() { assert_eq!(&gaps_20_20[0][i], g); } for (i, g) in align_20_20[1].iter().enumerate() { assert_eq!(&gaps_20_20[1][i], g); } }