package htsjdk.tribble; import htsjdk.tribble.bed.BEDCodec; import htsjdk.tribble.example.ExampleBinaryCodec; import htsjdk.tribble.readers.LineIterator; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; public class BinaryFeaturesTest { @DataProvider(name = "BinaryFeatureSources") public Object[][] createData1() { return new Object[][] { { new File(TestUtils.DATA_DIR + "test.bed"), new BEDCodec() }, { new File(TestUtils.DATA_DIR + "bed/Unigene.sample.bed"), new BEDCodec() }, { new File(TestUtils.DATA_DIR + "bed/NA12878.deletions.10kbp.het.gq99.hand_curated.hg19_fixed.bed"), new BEDCodec() }, }; } @Test(enabled = true, dataProvider = "BinaryFeatureSources") public void testBinaryCodec(final File source, final FeatureCodec<Feature, LineIterator> codec) throws IOException { final File tmpFile = File.createTempFile("testBinaryCodec", ".binary.bed"); ExampleBinaryCodec.convertToBinaryTest(source, tmpFile, codec); tmpFile.deleteOnExit(); final FeatureReader<Feature> originalReader = AbstractFeatureReader.getFeatureReader(source.getAbsolutePath(), codec, false); final FeatureReader<Feature> binaryReader = AbstractFeatureReader.getFeatureReader(tmpFile.getAbsolutePath(), new ExampleBinaryCodec(), false); // make sure the header is what we expect final List<String> header = (List<String>) binaryReader.getHeader(); Assert.assertEquals(header.size(), 1, "We expect exactly one header line"); Assert.assertEquals(header.get(0), ExampleBinaryCodec.HEADER_LINE, "Failed to read binary header line"); final Iterator<Feature> oit = originalReader.iterator(); final Iterator<Feature> bit = binaryReader.iterator(); while ( oit.hasNext() ) { final Feature of = oit.next(); Assert.assertTrue(bit.hasNext(), "Original iterator has items, but there's no items left in binary iterator"); final Feature bf = bit.next(); Assert.assertEquals(bf.getChr(), of.getChr(), "Chr not equal between original and binary encoding"); Assert.assertEquals(bf.getStart(), of.getStart(), "Start not equal between original and binary encoding"); Assert.assertEquals(bf.getEnd(), of.getEnd(), "End not equal between original and binary encoding"); } Assert.assertTrue(! bit.hasNext(), "Original iterator is done, but there's still some data in binary iterator"); originalReader.close(); binaryReader.close(); } }