diff --git a/test/data/test.embl.gz b/test/data/test.embl.gz new file mode 100644 index 0000000000000000000000000000000000000000..6ae4470b05268e5a8d70d47550db2563488fc707 Binary files /dev/null and b/test/data/test.embl.gz differ diff --git a/test/data/test.vcf.gz b/test/data/test.vcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..a6a9eddb3729449f6b123fa48b6bdf9488f2f1b3 Binary files /dev/null and b/test/data/test.vcf.gz differ diff --git a/test/data/test.vcf.gz.tbi b/test/data/test.vcf.gz.tbi new file mode 100644 index 0000000000000000000000000000000000000000..7efad1a14a39a5c91602f80900d5a0d760187125 Binary files /dev/null and b/test/data/test.vcf.gz.tbi differ diff --git a/test/uk/ac/sanger/artemis/components/variant/WriteVCFTest.java b/test/uk/ac/sanger/artemis/components/variant/WriteVCFTest.java new file mode 100644 index 0000000000000000000000000000000000000000..785b3664b8a8aa90805091d7a779f49b1891208d --- /dev/null +++ b/test/uk/ac/sanger/artemis/components/variant/WriteVCFTest.java @@ -0,0 +1,234 @@ + +package uk.ac.sanger.artemis.components.variant; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.io.InputStream; +import java.io.StringWriter; +import java.net.URL; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.List; +import java.util.Vector; + +import javax.swing.JFrame; +import javax.swing.JPanel; + + +import junit.framework.Assert; + +import org.junit.Before; +import org.junit.Test; + +import uk.ac.sanger.artemis.Entry; +import uk.ac.sanger.artemis.EntryGroup; +import uk.ac.sanger.artemis.FeatureVector; +import uk.ac.sanger.artemis.Feature; +import uk.ac.sanger.artemis.Options; +import uk.ac.sanger.artemis.Selection; +import uk.ac.sanger.artemis.SimpleEntryGroup; +import uk.ac.sanger.artemis.components.EntryFileDialog; +import uk.ac.sanger.artemis.components.variant.VCFview; +import uk.ac.sanger.artemis.io.EntryInformation; +import uk.ac.sanger.artemis.sequence.MarkerRange; +import uk.ac.sanger.artemis.sequence.Strand; +import uk.ac.sanger.artemis.util.Document; +import uk.ac.sanger.artemis.util.DocumentFactory; + +/** + * Tests for writing out sequences based on VCF data. + */ +public class WriteVCFTest +{ + private VCFview vcfView; + + /** + * Write FASTA, from a range selection on the forward strand. + * Variation is a SNP. + * VCF line : test 120768 . C T + */ + @Test + public void testWriteFwdFastaSNP() + { + StringWriter writer = getWriter(true, 120768, 120777); + + StringBuffer buff = new StringBuffer("> test.embl.gz 120768:120777\n"); + buff.append("cttgtcaagg\n"); + buff.append(">test.vcf.gz test.embl.gz 120768:120777\n"); + buff.append("tttgtcaagg\n"); + assertEquals("Export FASTA range ", writer.toString(), buff.toString()); + } + + /** + * Write FASTA, from a range selection on the reverse strand. + * Variation is a SNP. + * VCF line : test 120768 . C T + */ + @Test + public void testWriteRevFastaSNP() + { + StringWriter writer = getWriter(false, 120768, 120777); + + StringBuffer buff = new StringBuffer("> test.embl.gz 120768:120777 reverse\n"); + buff.append("ccttgacaag\n"); + buff.append(">test.vcf.gz test.embl.gz 120768:120777 reverse\n"); + buff.append("ccttgacaaa\n"); + assertEquals("Export FASTA range ", writer.toString(), buff.toString()); + } + + /** + * Write FASTA, from a range selection on the forward strand. + * Variation is a deletion. + * test 396838 . tt t + */ + @Test + public void testWriteFwdFastaDeletion() + { + StringWriter writer = getWriter(true, 396835, 396845); + + StringBuffer buff = new StringBuffer("> test.embl.gz 396835:396845\n"); + buff.append("tttttaggtat\n"); + buff.append(">test.vcf.gz test.embl.gz 396835:396845\n"); + buff.append("tttt-aggtat\n"); + assertEquals("Export FASTA range ", writer.toString(), buff.toString()); + } + + /** + * Write FASTA, from a range selection on the reverse strand. + * Variation is a deletion. + * test 396838 . tt t + */ + @Test + public void testWriteRevFastaDeletion() + { + StringWriter writer = getWriter(false, 396835, 396845); + + StringBuffer buff = new StringBuffer("> test.embl.gz 396835:396845 reverse\n"); + buff.append("atacctaaaaa\n"); + buff.append(">test.vcf.gz test.embl.gz 396835:396845 reverse\n"); + buff.append("ataccta-aaa\n"); + assertEquals("Export FASTA range ", writer.toString(), buff.toString()); + } + + /** + * Write FASTA, from a range selection on the forward strand. + * Variation is a insertion. + * test 366787 . t tT + */ + @Test + public void testWriteFwdFastaInsertion() + { + StringWriter writer = getWriter(true, 366785, 366795); + + StringBuffer buff = new StringBuffer("> test.embl.gz 366785:366795\n"); + buff.append("tttcgcttttt\n"); + buff.append(">test.vcf.gz test.embl.gz 366785:366795\n"); + buff.append("tttTcgcttttt\n"); + assertEquals("Export FASTA range ", writer.toString(), buff.toString()); + } + + /** + * Write FASTA, from a range selection on the reverse strand. + * Variation is a insertion. + * test 366787 . t tT + */ + @Test + public void testWriteRevFastaInsertion() + { + StringWriter writer = getWriter(false, 366785, 366795); + + StringBuffer buff = new StringBuffer("> test.embl.gz 366785:366795 reverse\n"); + buff.append("aaaaagcgaaa\n"); + buff.append(">test.vcf.gz test.embl.gz 366785:366795 reverse\n"); + buff.append("aaaaagcgaaaa\n"); + assertEquals("Export FASTA range ", writer.toString(), buff.toString()); + } + + + /** + * Write FASTA, from a range selection on the forward strand. + * Variation is a multiple allele, (PL number indicates either G or T): + * test 361978 . G T 77.76842 . DP=11;AF1=0.95;CI95=0.5,1;DP4=1,0,10,0;MQ=58;PV4=1,9.6e-06,0.37,1 PL:DP:SP:GT:GQ 106,0,0:11:0:1/1:10 + */ + @Test + public void testWriteFwdFastaMultipleAllele() + { + StringWriter writer = getWriter(true, 361975, 361985); + + StringBuffer buff = new StringBuffer("> test.embl.gz 361975:361985\n"); + buff.append("actgaaaaatt\n"); + buff.append(">test.vcf.gz test.embl.gz 361975:361985\n"); + buff.append("actkaaaaatt\n"); + assertEquals("Export FASTA range ", writer.toString(), buff.toString()); + } + + + /** + * G + * @param isFwd + * @param start + * @param end + * @return + */ + private StringWriter getWriter(boolean isFwd, int start, int end) + { + StringWriter writer = new StringWriter(); + Selection selection = new Selection(null); + + FeatureVector features = vcfView.getEntryGroup().getAllFeatures(); + Feature feature = null; + for(int i=0; i<features.size(); i++) + { + if(features.elementAt(i).isForwardFeature() && isFwd) + { + feature = features.elementAt(i); + break; + } + else if(!features.elementAt(i).isForwardFeature() && !isFwd) + { + feature = features.elementAt(i); + + int length = vcfView.getEntryGroup().getSequenceEntry().getBases().getLength(); + int tmp = start; + start = length - end + 1; + end = length - tmp + 1; + + break; + } + } + + try + { + selection.setMarkerRange(new MarkerRange(feature.getStrand(), start, end)); + } + catch(uk.ac.sanger.artemis.util.OutOfRangeException e) + { + e.printStackTrace(); + } + IOUtils.exportFastaByRange(vcfView, selection, false, writer); + return writer; + } + + + /** + * Open a flat file and create the components in the TransferAnnotaionTool + * used to control the transfer of annotation. + */ + @Before + public void setup() + { + final URL ref = WriteVCFTest.class.getResource("/data/test.embl.gz"); + final URL vcf = WriteVCFTest.class.getResource("/data/test.vcf.gz"); + + List<String> vcfFileList = new Vector<String>(); + vcfFileList.add(vcf.getFile()); + JFrame f = new JFrame(); + vcfView = new VCFview(f, (JPanel) f.getContentPane(), + vcfFileList, + 5000, 100000000, null, + ref.getFile(), null); + f.setVisible(false); + } + +} \ No newline at end of file