/*
* Copyright (c) 2013 The Broad Institute
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package picard.vcf;
import htsjdk.tribble.Tribble;
import org.testng.Assert;
import org.testng.annotations.Test;
import picard.cmdline.CommandLineProgramTest;
import picard.PicardException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class VcfFormatConverterTest extends CommandLineProgramTest {
private static final String TEST_DATA_PATH = "testdata/picard/vcf/";
private static final String TEST_FILE_BASE = "vcfFormatTest";
private static final String VCF = ".vcf";
private static final String VCF_GZ = ".vcf.gz";
private static final String BCF = ".bcf";
private static final File TEST_VCF = new File(TEST_DATA_PATH, TEST_FILE_BASE + VCF);
private static final File TEST_BCF = new File(TEST_DATA_PATH, TEST_FILE_BASE + BCF);
public String getCommandLineProgramName() {
return VcfFormatConverter.class.getSimpleName();
}
@Test
public void testVcfToVcf() {
runLikeTest(TEST_VCF, VCF);
}
@Test
public void testVcfToBcf() {
runBackAndForthTest(TEST_VCF, BCF, VCF);
}
@Test
public void testVcfToVcfGz() {
runBackAndForthTest(TEST_VCF, VCF_GZ, VCF);
}
@Test
public void testBcfToBcf() {
runLikeTest(TEST_BCF, BCF);
}
@Test
public void testBcfToVcf() {
runBackAndForthTest(TEST_BCF, VCF, BCF);
}
private void runLikeTest(final File input, final String format) {
final File outputFile = convertFile(input, "likeTest", format);
compareFiles(input, outputFile);
}
private void runBackAndForthTest(final File input, final String format, final String originalFormat) {
final String tempPrefix = "backAndForth";
final File backAndForth = convertFile(input, tempPrefix, format);
final File backAndForthSeries2 = convertFile(backAndForth, tempPrefix, originalFormat);
compareFiles(input, backAndForthSeries2);
}
private File convertFile(final File input, final String prefix, final String format) {
final File outputFile;
try {
outputFile = File.createTempFile(prefix, format);
} catch (final IOException ioe) {
throw new PicardException("Unable to create temp file!");
}
outputFile.deleteOnExit();
new File(outputFile.getAbsolutePath() + Tribble.STANDARD_INDEX_EXTENSION).deleteOnExit();
final List<String> args = new ArrayList<String>(Arrays.asList(
"INPUT=" + input.getAbsolutePath(),
"OUTPUT=" + outputFile.getAbsolutePath()
));
if (VCF_GZ.equals(format)) {
args.add("CREATE_INDEX=false");
}
if (input.getName().endsWith(VCF_GZ)) {
args.add("REQUIRE_INDEX=false");
}
Assert.assertEquals(runPicardCommandLine(args), 0);
return outputFile;
}
private void compareFiles(final File file1, final File file2) {
// Ok, so this isn't exactly comparing md5 checksums or anything, but it should be good enough
// for our purposes.
Assert.assertTrue(file1.exists());
Assert.assertTrue(file2.exists());
Assert.assertEquals(file1.length(), file2.length());
}
}