JAL-653 GFF new/refactored helper classes
[jalview.git] / test / jalview / io / gff / GffTests.java
diff --git a/test/jalview/io/gff/GffTests.java b/test/jalview/io/gff/GffTests.java
new file mode 100644 (file)
index 0000000..77da8fa
--- /dev/null
@@ -0,0 +1,88 @@
+package jalview.io.gff;
+
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertSame;
+import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
+
+import jalview.datamodel.AlignedCodonFrame;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Mapping;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceDummy;
+import jalview.datamodel.SequenceI;
+import jalview.gui.AlignFrame;
+import jalview.io.FileLoader;
+import jalview.io.FormatAdapter;
+
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+/**
+ * Tests of use cases that include parsing GFF (version 2 or 3) features that
+ * describe mappings between protein and cDNA. The format of the GFF varies
+ * depending on which tool generated it.
+ */
+public class GffTests
+{
+  /**
+   * Test the case where we load a protein ('query') sequence, then exonerateGff
+   * describing its mapping to cDNA, and then a DNA sequence including the
+   * mapped region
+   */
+  @Test(groups = "Functional")
+  public void testResolveExonerateGff()
+  {
+    String proteinSeq = ">prot1/10-16\nYCWRSGA";
+    AlignFrame af = new FileLoader(false).LoadFileWaitTillLoaded(
+            proteinSeq, FormatAdapter.PASTE);
+
+    /*
+     * exonerate GFF output mapping residues 11-15 (CWRSG) 
+     * to bases 24-10 in sequence 'dna1' (reverse strand)
+     */
+    String exonerateGff = "##gff-version 2\n"
+            + "prot1\tprotein2genome\tsimilarity\t11\t15\t99\t-\t.\talignment_id 0 ; Target dna1 ; Align 11 24 5";
+    af.loadJalviewDataFile(exonerateGff, FormatAdapter.PASTE, null, null);
+
+    /*
+     * check we have a mapping from prot1 to SequenceDummy 'dna1'
+     */
+    AlignmentI dataset = af.getViewport().getAlignment().getDataset();
+    assertEquals(1, dataset.getSequences().size());
+    assertEquals("prot1", dataset.getSequenceAt(0).getName());
+    assertEquals("YCWRSGA", dataset.getSequenceAt(0).getSequenceAsString());
+    List<AlignedCodonFrame> mappings = dataset.getCodonFrames();
+    assertEquals(1, mappings.size());
+    AlignedCodonFrame mapping = mappings.iterator().next();
+    SequenceI mappedDna = mapping.getDnaForAaSeq(dataset.getSequenceAt(0));
+    assertTrue(mappedDna instanceof SequenceDummy);
+    assertEquals("dna1", mappedDna.getName());
+    Mapping[] mapList = mapping.getProtMappings();
+    assertEquals(1, mapList.length);
+    // 11 in protein should map to codon [24, 23, 22] in dna
+    int[] mappedRegion = mapList[0].getMap().locateInFrom(11, 11);
+    assertArrayEquals(new int[] { 24, 22 }, mappedRegion);
+    // 15 in protein should map to codon [12, 11, 10] in dna
+    mappedRegion = mapList[0].getMap().locateInFrom(15, 15);
+    assertArrayEquals(new int[] { 12, 10 }, mappedRegion);
+
+    // so far so good; TODO: programmatically add mapped sequences
+    // and verify the mappings are 'realised'
+    SequenceI dna1 = new Sequence("dna1", "AAACCCGGGTTTAAACCCGGGTTT");
+    AlignmentI al = new Alignment(new SequenceI[] { dna1 });
+    al.setDataset(null);
+
+    /*
+     * Now 'realise' the virtual mapping to the real DNA sequence;
+     * interactively this could be by a drag or fetch of the sequence data
+     * on to the alignment
+     */
+    mapping.realiseWith(dna1);
+    // verify the mapping is now from the real, not the dummy sequence
+    assertSame(dna1.getDatasetSequence(),
+            mapping.getDnaForAaSeq(dataset.getSequenceAt(0)));
+  }
+}