package htsjdk.samtools.util; import htsjdk.samtools.SAMException; import htsjdk.samtools.SAMFileReader; import htsjdk.samtools.SAMRecordSetBuilder; import htsjdk.samtools.fastq.FastqReader; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.File; import java.util.Arrays; import java.util.List; public class QualityEncodingDetectorTest { private static class Testcase { private final File f; private final FastqQualityFormat q; Testcase(final File file, final FastqQualityFormat qualityFormat) { this.f = file; this.q = qualityFormat; } } final static List<Testcase> FASTQ_TESTCASES = Arrays.asList( // Need to use full-range quality here, as Solexa and Illumina are near indistinguishable new Testcase(new File("./testdata/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa_full_range_as_solexa.fastq"), FastqQualityFormat.Solexa), new Testcase(new File("./testdata/htsjdk/samtools/util/QualityEncodingDetectorTest/s_1_sequence.txt"), FastqQualityFormat.Illumina), new Testcase(new File("./testdata/htsjdk/samtools/util/QualityEncodingDetectorTest/5k-30BB2AAXX.3.aligned.sam.fastq"), FastqQualityFormat.Standard) ); final static List<Testcase> BAM_TESTCASES = Arrays.asList( new Testcase(new File("./testdata/htsjdk/samtools/util/QualityEncodingDetectorTest/unmapped.sam"), FastqQualityFormat.Standard), new Testcase(new File("./testdata/htsjdk/samtools/BAMFileIndexTest/index_test.bam"), FastqQualityFormat.Standard), new Testcase(new File("./testdata/htsjdk/samtools/util/QualityEncodingDetectorTest/solexa-as-standard.bam"), FastqQualityFormat.Solexa), new Testcase(new File("./testdata/htsjdk/samtools/util/QualityEncodingDetectorTest/illumina-as-standard.bam"), FastqQualityFormat.Illumina) ); Object[][] renderObjectArrayArray(final List<Testcase> testcaseList) { final Object[][] data = new Object[testcaseList.size()][]; for (int i = 0; i < data.length; i++) { final Testcase testcase = testcaseList.get(i); data[i] = new Object[]{testcase.f, testcase.q}; } return data; } @DataProvider(name = "BAM_TESTCASES") Object[][] bamTestcases() { return renderObjectArrayArray(BAM_TESTCASES); } @DataProvider(name = "FASTQ_TESTCASES") Object[][] fastqTestcases() { return renderObjectArrayArray(FASTQ_TESTCASES); } @Test(dataProvider = "FASTQ_TESTCASES", groups = {"unix"}) public void testFastqQualityInference(final File input, final FastqQualityFormat expectedQualityFormat) { final FastqReader reader = new FastqReader(input); Assert.assertEquals(QualityEncodingDetector.detect(reader), expectedQualityFormat); reader.close(); } @Test(dataProvider = "BAM_TESTCASES", groups = {"unix"}) public void testBamQualityInference(final File input, final FastqQualityFormat expectedQualityFormat) { final SAMFileReader reader = new SAMFileReader(input); Assert.assertEquals(QualityEncodingDetector.detect(reader), expectedQualityFormat); reader.close(); } @Test public void testSmallBamForDetectorFailure() { final SAMRecordSetBuilder samRecordSetBuilder = createSmallUnmappedSam(); Assert.assertNotSame(QualityEncodingDetector.detect(samRecordSetBuilder.getSamReader(), null), FastqQualityFormat.Standard); } @Test public void testSmallBamWithExpectedQuality() { final SAMRecordSetBuilder samRecordSetBuilder = createSmallUnmappedSam(); Assert.assertEquals(QualityEncodingDetector.detect(samRecordSetBuilder.getSamReader(), FastqQualityFormat.Standard), FastqQualityFormat.Standard); } @Test (expectedExceptions = SAMException.class) public void testQualitySanity() { final SAMRecordSetBuilder samRecordSetBuilder = createSmallUnmappedSam(); QualityEncodingDetector.detect(samRecordSetBuilder.getSamReader(), FastqQualityFormat.Illumina); } private SAMRecordSetBuilder createSmallUnmappedSam() { final SAMRecordSetBuilder samRecordSetBuilder = new SAMRecordSetBuilder(); samRecordSetBuilder.setReadLength(25); samRecordSetBuilder.addFrag("READ0", -1, -1, false, true, null, "@@@FFFFFHHHHHJIJIIJIIJJJJ", -1); samRecordSetBuilder.addFrag("READ1", -1, -1, false, true, null, "@@@FFFFFHHHHHJIJIIJIIJJJJ", -1); samRecordSetBuilder.addFrag("READ2", -1, -1, false, true, null, "@CCFDFEDHHHFFHIIII@GH<FFH", -1); samRecordSetBuilder.addFrag("READ3", -1, -1, false, true, null, "@@?DFFDFHFFHDHIIHIIEIIJGG", -1); samRecordSetBuilder.addFrag("READ4", -1, -1, false, true, null, "@CCFFDDFHHHHHIIJJHFJJJJJH", -1); samRecordSetBuilder.addFrag("READ5", -1, -1, false, true, null, "BCCFFFFFHHHHHJJJJJIJJJJJJ", -1); samRecordSetBuilder.addFrag("READ6", -1, -1, false, true, null, "@@CDFFFFHHHFHHIJJJJJJJIJJ", -1); samRecordSetBuilder.addFrag("READ7", -1, -1, false, true, null, "CCCFFFFFHHHHHJJJJIJJJJHII", -1); samRecordSetBuilder.addFrag("READ8", -1, -1, false, true, null, "CCCFFFFFHHHHHJJJJJJJJJJJJ", -1); return samRecordSetBuilder; } }