package picard.util;
import htsjdk.samtools.SAMException;
import htsjdk.samtools.util.IOUtil;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import picard.PicardException;
import java.io.File;
import java.io.IOException;
/**
* @author nhomer
*/
public class BedToIntervalListTest {
private static final String TEST_DATA_DIR = "testdata/picard/util/BedToIntervalListTest";
private void doTest(final String inputBed, final String header) throws IOException, SAMException {
final File outputFile = File.createTempFile("bed_to_interval_list_test.", ".interval_list");
outputFile.deleteOnExit();
final BedToIntervalList program = new BedToIntervalList();
final File inputBedFile = new File(TEST_DATA_DIR, inputBed);
program.INPUT = inputBedFile;
program.SEQUENCE_DICTIONARY = new File(TEST_DATA_DIR, header);
program.OUTPUT = outputFile;
program.UNIQUE = true;
program.doWork();
// Assert they are equal
IOUtil.assertFilesEqual(new File(inputBedFile.getAbsolutePath() + ".interval_list"), outputFile);
}
@Test(dataProvider = "testBedToIntervalListDataProvider")
public void testBedToIntervalList(final String inputBed) throws IOException {
doTest(inputBed, "header.sam");
}
// test a fixed bed file using different dictionaries
@Test(dataProvider = "testBedToIntervalListSequenceDictionaryDataProvider")
public void testBedToIntervalListSequenceDictionary(final String dictionary) throws IOException {
doTest("seq_dict_test.bed", dictionary);
}
// test for back dictionaries - we expect these to throw exceptions
@Test(dataProvider = "testBedToIntervalListSequenceDictionaryBadDataProvider",
expectedExceptions = {SAMException.class, PicardException.class})
public void testBedToIntervalListBadSequenceDictionary(final String dictionary) throws IOException {
doTest("seq_dict_test.bed", dictionary);
}
@Test(dataProvider = "testBedToIntervalListOutOfBoundsDataProvider", expectedExceptions = PicardException.class)
public void testBedToIntervalListOutOfBounds(final String inputBed) throws IOException {
doTest(inputBed, "header.sam");
}
@DataProvider
public Object[][] testBedToIntervalListDataProvider() {
return new Object[][]{
{"simple.bed"},
{"overlapping.bed"},
{"extended.bed"},
{"one_base_interval.bed"},
{"zero_base_interval.bed"}
};
}
// test for each of the file categories supported by SAMSequenceDictionaryExtractor
@DataProvider
public Object[][] testBedToIntervalListSequenceDictionaryDataProvider() {
return new Object[][]{
{"seq_dict_test.dictionary.interval_list"},
{"seq_dict_test.dictionary.fasta"},
{"seq_dict_test.dictionary.dict"},
{"seq_dict_test.dictionary.sam"},
{"seq_dict_test.dictionary.vcf"}
};
}
@DataProvider
public Object[][] testBedToIntervalListSequenceDictionaryBadDataProvider() {
return new Object[][]{
// a file that does not represent a dictionary
{"seq_dict_test.dictionary.bad"},
// a file that is a valid dictionary, but missing contigs in the dictionary
{"seq_dict_test.dictionary.bad.vcf"}
};
}
@DataProvider
public Object[][] testBedToIntervalListOutOfBoundsDataProvider() {
return new Object[][]{
{"end_after_chr.bed"},
{"end_before_chr.bed"},
{"missing_chr.bed"},
{"start_after_chr.bed"},
{"start_before_chr.bed"},
{"off_by_one_interval.bed"}
};
}
}