JAL-3700 mapped sequence group includes short (or all gapped) sequences
[jalview.git] / test / jalview / datamodel / SeqCigarTest.java
index 705c773..761835d 100644 (file)
  */
 package jalview.datamodel;
 
+import static org.testng.Assert.assertTrue;
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertFalse;
 
+import jalview.gui.JvOptionPane;
+import jalview.util.Comparison;
+
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 /**
@@ -30,6 +35,61 @@ import org.testng.annotations.Test;
  */
 public class SeqCigarTest
 {
+
+  @BeforeClass(alwaysRun = true)
+  public void setUpJvOptionPane()
+  {
+    JvOptionPane.setInteractiveMode(false);
+    JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
+  }
+
+  @Test(groups = { "Functional" })
+  public void testFindPosition()
+  {
+    SequenceI oseq = new Sequence("MySeq", "ASD---ASD---ASD", 37, 45);
+    oseq.createDatasetSequence();
+    SeqCigar cs = new SeqCigar(oseq);
+    assertEquals(oseq.getSequenceAsString(), cs.getSequenceString('-'));
+    for (int c = 0, cLen = oseq.getLength(); c < cLen; c++)
+    {
+      int os_p = oseq.findPosition(c);
+      int cigar_p = cs.findPosition(c);
+      if (Comparison.isGap(oseq.getCharAt(c)))
+      {
+        assertEquals("Expected gap at position " + os_p + " column " + c,
+                -1, cigar_p);
+      }
+      else
+      {
+        assertEquals("Positions don't match for at column " + c, os_p,
+                cigar_p);
+      }
+    }
+  }
+
+  @Test(groups= {"Functional"})
+  public void testReconstructSeq()
+  {
+    String o_seq = "asdfktryasdtqwrtsaslldddptyipqqwaslchvhttt";
+    SequenceI s = new Sequence("MySeq", o_seq, 39, 80);
+    String orig_gapped = "----asdf------ktryas---dtqwrtsasll----dddptyipqqwa----slchvhttt";
+    // name of sequence in a particular alignment should be recovered
+    SequenceI s_gapped = new Sequence("MySeqAlign", orig_gapped, 39, 80);
+    s_gapped.setDatasetSequence(s);
+    SeqCigar cg_sgapped = new SeqCigar(s_gapped);
+    assertTrue(testSeqRecovery(cg_sgapped,s_gapped,true));
+    SequenceI subseq_gapped = s_gapped.getSubSequence(44, 60);
+    SeqCigar subseq_cg_range=new SeqCigar(s_gapped,44,59);
+    assertTrue(testSeqRecovery(subseq_cg_range, subseq_gapped, true),"SeqCigar created on range of sequence failed");
+
+    // test another way of reconstructing a sequence from seqCigar
+    SequenceI[] sqs=SeqCigar.createAlignmentSequences(new SeqCigar[] {subseq_cg_range}, '-', new HiddenColumns(), null);
+    assertTrue(testSeqRecovery(subseq_cg_range, sqs[0], true),"createAlignmentSequences didn't reconstruct same sequence as for SeqCigar created on range of sequence failed (used by AlignmentView for selections)");
+
+    subseq_gapped.setName("SubSeqMySeqAlign"); // name of sequence in a particular alignment should be recovered
+    SeqCigar subseq_cg = new SeqCigar(subseq_gapped);
+    assertTrue(testSeqRecovery(subseq_cg,subseq_gapped,true));
+  }
   /*
    * refactored 'as is' from main method
    * 
@@ -58,13 +118,13 @@ public class SeqCigarTest
     assertEquals("Failed parseCigar", ex_cs_gapped,
             gen_sgapped.getCigarstring());
 
-    testSeqRecovery(gen_sgapped, s_gapped);
+    assertTrue(testSeqRecovery(gen_sgapped, s_gapped,true));
 
     /*
      * Test dataset resolution
      */
     SeqCigar sub_gapped = new SeqCigar(s_subsequence_gapped);
-    testSeqRecovery(sub_gapped, s_subsequence_gapped);
+    assertTrue(testSeqRecovery(sub_gapped, s_subsequence_gapped,true));
 
     /*
      * Test width functions
@@ -85,7 +145,7 @@ public class SeqCigarTest
     /*
      * TODO: can we add assertions to the sysouts that follow?
      */
-    System.out.println("Original sequence align:\n" + sub_gapped_s
+    System.out.println("\nOriginal sequence align:\n" + sub_gapped_s
             + "\nReconstructed window from 8 to 48\n" + "XXXXXXXX"
             + sub_se_gp.getSequenceString('-') + "..." + "\nCigar String:"
             + sub_se_gp.getCigarstring() + "\n");
@@ -151,20 +211,28 @@ public class SeqCigarTest
     assertEquals("Failed getCigarstring", ex_cs_gapped, cs_gapped);
   }
 
-  protected void testSeqRecovery(SeqCigar gen_sgapped, SequenceI s_gapped)
+  protected boolean testSeqRecovery(SeqCigar gen_sgapped, SequenceI s_gapped,boolean startEndCheck)
   {
     // this is non-rigorous - start and end recovery is not tested.
     SequenceI gen_sgapped_s = gen_sgapped.getSeq('-');
     // assertEquals("Couldn't reconstruct sequence", s_gapped.getSequence(),
     // gen_sgapped_s);
-    if (!gen_sgapped_s.getSequence().equals(s_gapped.getSequence()))
+    if (!gen_sgapped_s.getSequenceAsString().equals(
+            s_gapped.getSequenceAsString()))
     {
       // TODO: investigate errors reported here, to allow full conversion to
       // passing JUnit assertion form
       System.err.println("Couldn't reconstruct sequence.\n"
               + gen_sgapped_s.getSequenceAsString() + "\n"
               + s_gapped.getSequenceAsString());
+      return false;
+    }
+    if (startEndCheck)
+    {
+      assertEquals("Start not conserved in reconstructed sequence",s_gapped.getStart(),gen_sgapped_s.getStart());
+      assertEquals("End not conserved in reconstructed sequence",s_gapped.getEnd(),gen_sgapped_s.getEnd());
     }
+    return true;
   }
 
 }