JAL-1270 tweaks to AlignmentGenerator / client class
[jalview.git] / test / jalview / analysis / DnaTest.java
index aeff465..2e21d9c 100644 (file)
@@ -1,3 +1,23 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.analysis;
 
 import static org.testng.AssertJUnit.assertEquals;
@@ -9,16 +29,28 @@ import jalview.datamodel.AlignedCodon;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
 import jalview.gui.AlignViewport;
+import jalview.gui.JvOptionPane;
+import jalview.io.DataSourceType;
+import jalview.io.FileFormat;
 import jalview.io.FormatAdapter;
 
 import java.io.IOException;
 
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 public class DnaTest
 {
+  @BeforeClass(alwaysRun = true)
+  public void setUpJvOptionPane()
+  {
+    JvOptionPane.setInteractiveMode(false);
+    JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
+  }
+
   // @formatter:off
   // AA encoding codons as ordered on the Jalview help page Amino Acid Table
   private static String fasta = ">B\n" + "GCT" + "GCC" + "GCA" + "GCG"
@@ -99,8 +131,8 @@ public class DnaTest
           throws IOException
   {
     AlignmentI alf = new FormatAdapter().readFile(
-            JAL_1312_example_align_fasta, jalview.io.FormatAdapter.PASTE,
-            "FASTA");
+            JAL_1312_example_align_fasta, DataSourceType.PASTE,
+            FileFormat.Fasta);
     ColumnSelection cs = new ColumnSelection();
     AlignViewportI av = new AlignViewport(alf, cs);
     Dna dna = new Dna(av, new int[] { 0, alf.getWidth() - 1 });
@@ -120,8 +152,8 @@ public class DnaTest
           throws IOException
   {
     AlignmentI alf = new FormatAdapter().readFile(
-            JAL_1312_example_align_fasta, jalview.io.FormatAdapter.PASTE,
-            "FASTA");
+            JAL_1312_example_align_fasta, DataSourceType.PASTE,
+            FileFormat.Fasta);
     int vwidth = 15;
     for (int ipos = 0; ipos + vwidth < alf.getWidth(); ipos += vwidth)
     {
@@ -155,7 +187,7 @@ public class DnaTest
   public void testTranslateCdna_simple() throws IOException
   {
     AlignmentI alf = new FormatAdapter().readFile(fasta,
-            FormatAdapter.PASTE, "FASTA");
+            DataSourceType.PASTE, FileFormat.Fasta);
     ColumnSelection cs = new ColumnSelection();
     AlignViewportI av = new AlignViewport(alf, cs);
     Dna dna = new Dna(av, new int[] { 0, alf.getWidth() - 1 });
@@ -175,8 +207,8 @@ public class DnaTest
   public void testTranslateCdna_hiddenColumns() throws IOException
   {
     AlignmentI alf = new FormatAdapter().readFile(fasta,
-            FormatAdapter.PASTE, "FASTA");
-    ColumnSelection cs = new jalview.datamodel.ColumnSelection();
+            DataSourceType.PASTE, FileFormat.Fasta);
+    ColumnSelection cs = new ColumnSelection();
     cs.hideColumns(6, 14); // hide codons 3/4/5
     cs.hideColumns(24, 35); // hide codons 9-12
     cs.hideColumns(177, 191); // hide codons 60-64
@@ -262,7 +294,8 @@ public class DnaTest
     /*
      * Generate cDNA - 8 sequences of 12 bases each.
      */
-    AlignmentI cdna = new DnaAlignmentGenerator().generate(12, 8, 97, 5, 5);
+    AlignmentI cdna = new AlignmentGenerator(true)
+            .generate(12, 8, 97, 5, 5);
     ColumnSelection cs = new ColumnSelection();
     AlignViewportI av = new AlignViewport(cdna, cs);
     Dna dna = new Dna(av, new int[] { 0, cdna.getWidth() - 1 });
@@ -437,4 +470,85 @@ public class DnaTest
     assertEquals("[0, 2, 5]", convertCodon("A-A--A").toString());
     assertEquals("[1, 3, 4]", convertCodon("-A-AA-").toString());
   }
+
+  /**
+   * Test dna complementing
+   */
+  @Test(groups = "Functional")
+  public void testGetComplement()
+  {
+    assertEquals('t', Dna.getComplement('a'));
+    assertEquals('T', Dna.getComplement('A'));
+    assertEquals('a', Dna.getComplement('t'));
+    assertEquals('A', Dna.getComplement('T'));
+    assertEquals('c', Dna.getComplement('g'));
+    assertEquals('C', Dna.getComplement('G'));
+    assertEquals('g', Dna.getComplement('c'));
+    assertEquals('G', Dna.getComplement('C'));
+    // note uU --> aA but not vice versa
+    assertEquals('a', Dna.getComplement('u'));
+    assertEquals('A', Dna.getComplement('U'));
+    // ambiguity codes, see http://www.bioinformatics.org/sms/iupac.html
+    assertEquals('r', Dna.getComplement('y'));
+    assertEquals('R', Dna.getComplement('Y'));
+    assertEquals('y', Dna.getComplement('r'));
+    assertEquals('Y', Dna.getComplement('R'));
+    assertEquals('k', Dna.getComplement('m'));
+    assertEquals('K', Dna.getComplement('M'));
+    assertEquals('m', Dna.getComplement('k'));
+    assertEquals('M', Dna.getComplement('K'));
+    assertEquals('b', Dna.getComplement('v'));
+    assertEquals('B', Dna.getComplement('V'));
+    assertEquals('v', Dna.getComplement('b'));
+    assertEquals('V', Dna.getComplement('B'));
+    assertEquals('d', Dna.getComplement('h'));
+    assertEquals('D', Dna.getComplement('H'));
+    assertEquals('h', Dna.getComplement('d'));
+    assertEquals('H', Dna.getComplement('D'));
+    assertEquals('Q', Dna.getComplement('Q'));
+  }
+
+  @Test(groups = "Functional")
+  public void testReverseSequence()
+  {
+    String seq = "-Ac-GtU--rYkMbVdHNX-";
+    String seqRev = new StringBuilder(seq).reverse().toString();
+
+    // reverse:
+    SequenceI reversed = Dna.reverseSequence("Seq1", seq, false);
+    assertEquals(1, reversed.getStart());
+    assertEquals(15, reversed.getEnd());
+    assertEquals(20, reversed.getLength());
+    assertEquals(seqRev, reversed.getSequenceAsString());
+    assertEquals("Seq1|rev", reversed.getName());
+
+    // reverse complement:
+    SequenceI revcomp = Dna.reverseSequence("Seq1", seq, true);
+    assertEquals("-XNDhBvKmRy--AaC-gT-", revcomp.getSequenceAsString());
+    assertEquals("Seq1|revcomp", revcomp.getName());
+  }
+
+  @Test(groups = "Functional")
+  public void testReverseCdna()
+  {
+    String seq = "-Ac-GtU--rYkMbVdHNX-";
+    String seqRev = new StringBuilder(seq).reverse().toString();
+    String seqDs = seq.replaceAll("-", "");
+    String seqDsRev = new StringBuilder(seqDs).reverse().toString();
+
+    SequenceI dna = new Sequence("Seq1", seq);
+    Alignment al = new Alignment(new SequenceI[] { dna });
+    al.createDatasetAlignment();
+    assertEquals(seqDs, al.getSequenceAt(0).getDatasetSequence()
+            .getSequenceAsString());
+
+    ColumnSelection cs = new ColumnSelection();
+    AlignViewportI av = new AlignViewport(al, cs);
+    Dna testee = new Dna(av, new int[] { 0, al.getWidth() - 1 });
+    AlignmentI reversed = testee.reverseCdna(false);
+    assertEquals(1, reversed.getHeight());
+    assertEquals(seqRev, reversed.getSequenceAt(0).getSequenceAsString());
+    assertEquals(seqDsRev, reversed.getSequenceAt(0).getDatasetSequence()
+            .getSequenceAsString());
+  }
 }