package picard.vcf;
import htsjdk.samtools.util.CloseableIterator;
import htsjdk.variant.variantcontext.VariantContext;
import htsjdk.variant.variantcontext.VariantContextComparator;
import htsjdk.variant.vcf.VCFFileReader;
import org.testng.Assert;
import org.testng.annotations.Test;
import picard.cmdline.CommandLineProgram;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Test class for SortVCF. Several tests also conducted by AbstractVcfMergingClpTester
*
* Created by bradt on 9/3/14.
*/
public class SortVcfsTest extends AbstractVcfMergingClpTester {
@Override
protected CommandLineProgram getProgram() {
return new SortVcf();
}
@Test
public void testPresortedFile() throws IOException {
final File snpInputFile = new File(TEST_DATA_PATH, "CEUTrio-snps.vcf");
final File output = File.createTempFile("sort-presorted-test-output.", ".vcf");
final List<String> indexing = Arrays.asList("CREATE_INDEX=false");
output.deleteOnExit();
final int numberOfVariantContexts = loadContigPositions(snpInputFile).size();
runClp(Arrays.asList(snpInputFile), output, indexing, 0);
validateSortingResults(output, numberOfVariantContexts);
}
@Test
public void testSingleScrambledFile() throws IOException {
final File snpInputFile = new File(TEST_DATA_PATH, "CEUTrio-snps-scrambled.1.vcf");
final File output = File.createTempFile("sort-single-scrambled-test-output.", ".vcf");
final List<String> indexing = Arrays.asList("CREATE_INDEX=false");
output.deleteOnExit();
final int numberOfVariantContexts = loadContigPositions(snpInputFile).size();
runClp(Arrays.asList(snpInputFile), output, indexing, 0);
validateSortingResults(output, numberOfVariantContexts);
}
@Test
public void testTwoScrambledSnpFiles() throws IOException {
final File inputFile1 = new File(TEST_DATA_PATH, "CEUTrio-snps-scrambled.1.vcf");
final File inputFile2 = new File(TEST_DATA_PATH, "vcfFormatTest.scrambled.vcf");
final File output = File.createTempFile("sort-multiple-scrambled-test-output.", ".vcf");
final List<String> indexing = Arrays.asList("CREATE_INDEX=false");
output.deleteOnExit();
final int numberOfVariantContexts = loadContigPositions(inputFile1).size() + loadContigPositions(inputFile2).size();
runClp(Arrays.asList(inputFile1, inputFile2), output, indexing, 0);
validateSortingResults(output, numberOfVariantContexts);
}
@Test
public void testScrambledSnpsAndOrderedIndels() throws IOException {
final File indelInputFile = new File(TEST_DATA_PATH, "CEUTrio-indels.vcf");
final File snpInputFile = new File(TEST_DATA_PATH, "CEUTrio-snps-scrambled.1.vcf");
final File output = File.createTempFile("sort-scrambled-indels-snps-test-output.", ".vcf");
final List<String> indexing = Arrays.asList("CREATE_INDEX=false");
output.deleteOnExit();
final int numberOfVariantContexts = loadContigPositions(indelInputFile).size() + loadContigPositions(snpInputFile).size();
runClp(Arrays.asList(indelInputFile, snpInputFile), output, indexing, 0);
validateSortingResults(output, numberOfVariantContexts);
}
@Test
public void testScrambledSnpsAndScrambledIndels() throws IOException {
final File indelInputFile = new File(TEST_DATA_PATH, "CEUTrio-indels-scrambled.1.vcf");
final File snpInputFile = new File(TEST_DATA_PATH, "CEUTrio-snps-scrambled.1.vcf");
final File output = File.createTempFile("merge-indels-snps-test-output.", ".vcf");
final List<String> indexing = Arrays.asList("CREATE_INDEX=false");
output.deleteOnExit();
final int numberOfVariantContexts = loadContigPositions(indelInputFile).size() + loadContigPositions(snpInputFile).size();
runClp(Arrays.asList(indelInputFile, snpInputFile), output, indexing, 0);
validateSortingResults(output, numberOfVariantContexts);
}
/**
* Checks the ordering and total number of variant context entries in the specified output VCF file.
* Does NOT check explicitly that the VC genomic positions match exactly those from the inputs. We assume this behavior from other tests.
*
* @param output VCF file representing the output of SortVCF
* @param expectedVariantContextCount the total number of variant context entries from all input files that were merged/sorted
*/
private void validateSortingResults(final File output, final int expectedVariantContextCount) {
final VCFFileReader outputReader = new VCFFileReader(output, false);
final VariantContextComparator outputComparator = outputReader.getFileHeader().getVCFRecordComparator();
VariantContext last = null;
int variantContextCount = 0;
final CloseableIterator<VariantContext> iterator = outputReader.iterator();
while (iterator.hasNext()) {
final VariantContext outputContext = iterator.next();
if (last != null) Assert.assertTrue(outputComparator.compare(last, outputContext) <= 0);
last = outputContext;
variantContextCount++;
}
iterator.close();
Assert.assertEquals(variantContextCount, expectedVariantContextCount);
}
}