Skip to content

Commit 811e6d5

Browse files
committed
Add test and fix for set_cigar
1 parent 49d82ea commit 811e6d5

File tree

2 files changed

+63
-4
lines changed

2 files changed

+63
-4
lines changed

src/bam/mod.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1933,6 +1933,67 @@ CCCCCCCCCCCCCCCCCCC"[..],
19331933
assert_eq!(rec.qname(), b"r0");
19341934
}
19351935

1936+
#[test]
1937+
fn test_set_cigar() {
1938+
let (names, _, seqs, quals, cigars) = gold();
1939+
1940+
assert!(names[0] != names[1]);
1941+
1942+
for i in 0..names.len() {
1943+
let mut rec = record::Record::new();
1944+
rec.set(names[i], Some(&cigars[i]), seqs[i], quals[i]);
1945+
rec.push_aux(b"NM", Aux::I32(15)).unwrap();
1946+
1947+
assert_eq!(rec.qname(), names[i]);
1948+
assert_eq!(*rec.cigar(), cigars[i]);
1949+
assert_eq!(rec.seq().as_bytes(), seqs[i]);
1950+
assert_eq!(rec.qual(), quals[i]);
1951+
assert_eq!(rec.aux(b"NM").unwrap(), Aux::I32(15));
1952+
1953+
// boring cigar
1954+
let new_cigar = CigarString(vec![Cigar::Match(rec.seq_len() as u32)]);
1955+
assert_ne!(*rec.cigar(), new_cigar);
1956+
rec.set_cigar(Some(&new_cigar));
1957+
assert_eq!(*rec.cigar(), new_cigar);
1958+
1959+
assert_eq!(rec.qname(), names[i]);
1960+
assert_eq!(rec.seq().as_bytes(), seqs[i]);
1961+
assert_eq!(rec.qual(), quals[i]);
1962+
assert_eq!(rec.aux(b"NM").unwrap(), Aux::I32(15));
1963+
1964+
// bizarre cigar
1965+
let new_cigar = (0..rec.seq_len())
1966+
.map(|i| {
1967+
if i % 2 == 0 {
1968+
Cigar::Match(1)
1969+
} else {
1970+
Cigar::Ins(1)
1971+
}
1972+
})
1973+
.collect::<Vec<_>>();
1974+
let new_cigar = CigarString(new_cigar);
1975+
assert_ne!(*rec.cigar(), new_cigar);
1976+
rec.set_cigar(Some(&new_cigar));
1977+
assert_eq!(*rec.cigar(), new_cigar);
1978+
1979+
assert_eq!(rec.qname(), names[i]);
1980+
assert_eq!(rec.seq().as_bytes(), seqs[i]);
1981+
assert_eq!(rec.qual(), quals[i]);
1982+
assert_eq!(rec.aux(b"NM").unwrap(), Aux::I32(15));
1983+
1984+
// empty cigar
1985+
let new_cigar = CigarString(Vec::new());
1986+
assert_ne!(*rec.cigar(), new_cigar);
1987+
rec.set_cigar(None);
1988+
assert_eq!(*rec.cigar(), new_cigar);
1989+
1990+
assert_eq!(rec.qname(), names[i]);
1991+
assert_eq!(rec.seq().as_bytes(), seqs[i]);
1992+
assert_eq!(rec.qual(), quals[i]);
1993+
assert_eq!(rec.aux(b"NM").unwrap(), Aux::I32(15));
1994+
}
1995+
}
1996+
19361997
#[test]
19371998
fn test_remove_aux() {
19381999
let mut bam = Reader::from_path(Path::new("test/test.bam")).expect("Error opening file.");

src/bam/record.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -505,11 +505,9 @@ impl Record {
505505
if new_cigar_data_len != old_cigar_data_len {
506506
// Move other data to new location
507507
unsafe {
508-
let data = slice::from_raw_parts_mut(self.inner.data, self.inner().l_data as usize);
509-
510508
::libc::memmove(
511-
data.as_mut_ptr().add(new_cigar_data_len) as *mut ::libc::c_void,
512-
data.as_mut_ptr().add(old_cigar_data_len) as *mut ::libc::c_void,
509+
self.inner.data.add(qname_data_len + new_cigar_data_len) as *mut ::libc::c_void,
510+
self.inner.data.add(qname_data_len + old_cigar_data_len) as *mut ::libc::c_void,
513511
other_data_len as usize,
514512
);
515513
}

0 commit comments

Comments
 (0)