package htsjdk.samtools.cram.encoding.reader; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import htsjdk.samtools.BAMRecordCodec; import htsjdk.samtools.Cigar; import htsjdk.samtools.SAMFileHeader; import htsjdk.samtools.SAMRecord; import htsjdk.samtools.SAMTagUtil; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.junit.Test; public class BAMRecordViewTest { private int translate(SAMRecord record, BAMRecordView view) { view.setReadName(record.getReadName()); view.setFlags(record.getFlags()); view.setRefID(record.getReferenceIndex()); view.setAlignmentStart(record.getAlignmentStart()); view.setMappingScore(record.getMappingQuality()); view.setCigar(record.getCigar()); view.setMateRefID(record.getMateReferenceIndex()); view.setMateAlStart(record.getMateAlignmentStart()); view.setInsertSize(record.getInferredInsertSize()); view.setBases(record.getReadBases()); view.setQualityScores(record.getBaseQualities()); view.setTagData(new byte[0], 0, 0); return view.finish(); } private void compare(SAMRecord r1, SAMRecord r2) { assertThat(r1.getReadName(), equalTo(r2.getReadName())); assertThat(r1.getFlags(), equalTo(r2.getFlags())); assertThat(r1.getReferenceIndex(), equalTo(r2.getReferenceIndex())); assertThat(r1.getAlignmentStart(), equalTo(r2.getAlignmentStart())); assertThat(r1.getMappingQuality(), equalTo(r2.getMappingQuality())); assertThat(r1.getCigarString(), equalTo(r2.getCigarString())); assertThat(r1.getMateReferenceIndex(), equalTo(r2.getMateReferenceIndex())); assertThat(r1.getMateAlignmentStart(), equalTo(r2.getMateAlignmentStart())); assertThat(r1.getInferredInsertSize(), equalTo(r2.getInferredInsertSize())); assertArrayEquals(r1.getReadBases(), r2.getReadBases()); assertArrayEquals(r1.getBaseQualities(), r2.getBaseQualities()); } private List<SAMRecord> toSAMRecord(BAMRecordView view, SAMFileHeader samHeader) { BAMRecordCodec bc = new BAMRecordCodec(samHeader); bc.setInputStream(new ByteArrayInputStream(view.buf, 0, view.start)); List<SAMRecord> records = new ArrayList<SAMRecord>(); SAMRecord record; while ((record = bc.decode()) != null) { records.add(record); } return records; } @Test public void test() { SAMFileHeader header = new SAMFileHeader(); SAMRecord r1 = new SAMRecord(header); r1.setReadName("readName"); r1.setFlags(4); r1.setReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX); r1.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START); r1.setMappingQuality(SAMRecord.NO_MAPPING_QUALITY); r1.setCigar(new Cigar()); r1.setMateReferenceIndex(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX); r1.setMateAlignmentStart(SAMRecord.NO_ALIGNMENT_START); r1.setReadBases("A".getBytes()); r1.setBaseQualityString("!"); BAMRecordView view = new BAMRecordView(new byte[1024]); translate(r1, view); r1.setReadName("2"); translate(r1, view); List<SAMRecord> list = toSAMRecord(view, header); assertEquals(2, list.size()); Iterator<SAMRecord> iterator = list.iterator(); SAMRecord r2 = iterator.next(); r1.setReadName("readName"); compare(r1, r2); r1.setReadName("2"); r2 = iterator.next(); compare(r1, r2); } @Test public void test1() { BAMRecordView view = new BAMRecordView(new byte[1024]); view.setReadName("readName"); view.setFlags(4); view.setRefID(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX); view.setAlignmentStart(SAMRecord.NO_ALIGNMENT_START); view.setMappingScore(SAMRecord.NO_MAPPING_QUALITY); view.setCigar(new Cigar()); view.setMateRefID(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX); view.setMateAlStart(SAMRecord.NO_ALIGNMENT_START); view.setInsertSize(0); view.setBases("A".getBytes()); view.setQualityScores(new byte[] { 0 }); view.addTag(SAMTagUtil.getSingleton().AM, new byte[] { 'c', 0 }, 0, 1); view.finish(); SAMFileHeader samHeader = new SAMFileHeader(); BAMRecordCodec bc = new BAMRecordCodec(samHeader); bc.setInputStream(new ByteArrayInputStream(view.buf)); SAMRecord record = bc.decode(); assertThat(record.getReadName(), is("readName")); assertThat(record.getFlags(), is(4)); assertThat(record.getReferenceIndex(), is(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)); assertThat(record.getAlignmentStart(), is(SAMRecord.NO_ALIGNMENT_START)); assertThat(record.getMappingQuality(), is(SAMRecord.NO_MAPPING_QUALITY)); assertThat(record.getCigar().getCigarElements().size(), is(0)); assertThat(record.getMateReferenceIndex(), is(SAMRecord.NO_ALIGNMENT_REFERENCE_INDEX)); assertThat(record.getMateAlignmentStart(), is(SAMRecord.NO_ALIGNMENT_START)); assertThat(record.getInferredInsertSize(), is(0)); assertThat(record.getReadString(), is("A")); assertThat(record.getBaseQualityString(), is("!")); Object amTag = record.getAttribute("AM"); assertTrue(amTag instanceof Byte); Byte amValue = (Byte) amTag; assertThat(amValue, equalTo((byte) 0)); } }