JAL-3081 unit tests for 'custom' (no) sort, sort autocalc only
[jalview.git] / test / jalview / analysis / AnnotationSorterTest.java
index 39b10fb..3277a16 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;
@@ -7,16 +27,26 @@ import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
+import jalview.gui.JvOptionPane;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 public class AnnotationSorterTest
 {
+
+  @BeforeClass(alwaysRun = true)
+  public void setUpJvOptionPane()
+  {
+    JvOptionPane.setInteractiveMode(false);
+    JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
+  }
+
   private static final int NUM_SEQS = 6;
 
   private static final int NUM_ANNS = 7;
@@ -46,7 +76,7 @@ public class AnnotationSorterTest
    */
   protected AlignmentAnnotation[] buildAnnotations(int numAnns)
   {
-    List<AlignmentAnnotation> annlist = new ArrayList<AlignmentAnnotation>();
+    List<AlignmentAnnotation> annlist = new ArrayList<>();
     for (int i = 0; i < numAnns; i++)
     {
       AlignmentAnnotation ann = new AlignmentAnnotation(SS + i, "", 0);
@@ -85,7 +115,7 @@ public class AnnotationSorterTest
    * </ul>
    */
   @Test(groups = { "Functional" })
-  public void testSortBySequenceAndType_autocalcLast()
+  public void testSortBySequenceAndLabel_autocalcLast()
   {
     // @formatter:off
     anns[0].sequenceRef = al.getSequenceAt(1); anns[0].label = "label0";
@@ -97,7 +127,7 @@ public class AnnotationSorterTest
     anns[6].sequenceRef = al.getSequenceAt(3); anns[6].label = "IRP";
     // @formatter:on
 
-    AnnotationSorter testee = new AnnotationSorter(al, false);
+    AnnotationSorter testee = new AnnotationSorter(al, false, false);
     testee.sort(anns, SequenceAnnotationOrder.SEQUENCE_AND_LABEL);
     assertEquals("label5", anns[0].label); // for sequence 0
     assertEquals("label0", anns[1].label); // for sequence 1
@@ -112,7 +142,7 @@ public class AnnotationSorterTest
    * Variant with autocalculated annotations sorting to front
    */
   @Test(groups = { "Functional" })
-  public void testSortBySequenceAndType_autocalcFirst()
+  public void testSortBySequenceAndLabel_autocalcFirst()
   {
     // @formatter:off
     anns[0].sequenceRef = al.getSequenceAt(1); anns[0].label = "label0";
@@ -124,7 +154,7 @@ public class AnnotationSorterTest
     anns[6].sequenceRef = al.getSequenceAt(3); anns[6].label = "IRP";
     // @formatter:on
 
-    AnnotationSorter testee = new AnnotationSorter(al, true);
+    AnnotationSorter testee = new AnnotationSorter(al, true, false);
     testee.sort(anns, SequenceAnnotationOrder.SEQUENCE_AND_LABEL);
     assertEquals("Quality", anns[0].label); // autocalc annotations
     assertEquals("Consensus", anns[1].label); // retain ordering
@@ -148,7 +178,7 @@ public class AnnotationSorterTest
    * </ul>
    */
   @Test(groups = { "Functional" })
-  public void testSortByTypeAndSequence_autocalcLast()
+  public void testSortByLabelAndSequence_autocalcLast()
   {
     // @formatter:off
     anns[0].sequenceRef = al.getSequenceAt(1); anns[0].label = "label0";
@@ -160,7 +190,7 @@ public class AnnotationSorterTest
     anns[6].sequenceRef = al.getSequenceAt(2); anns[6].label = "Structure";
     // @formatter:on
 
-    AnnotationSorter testee = new AnnotationSorter(al, false);
+    AnnotationSorter testee = new AnnotationSorter(al, false, false);
     testee.sort(anns, SequenceAnnotationOrder.LABEL_AND_SEQUENCE);
     assertEquals("IRON", anns[0].label); // IRON / sequence 0
     assertEquals("iron", anns[1].label); // iron / sequence 3
@@ -175,7 +205,7 @@ public class AnnotationSorterTest
    * Variant of test with autocalculated annotations sorted to front
    */
   @Test(groups = { "Functional" })
-  public void testSortByTypeAndSequence_autocalcFirst()
+  public void testSortByLabelAndSequence_autocalcFirst()
   {
     // @formatter:off
     anns[0].sequenceRef = al.getSequenceAt(1); anns[0].label = "label0";
@@ -187,7 +217,7 @@ public class AnnotationSorterTest
     anns[6].sequenceRef = al.getSequenceAt(2); anns[6].label = "Structure";
     // @formatter:on
 
-    AnnotationSorter testee = new AnnotationSorter(al, true);
+    AnnotationSorter testee = new AnnotationSorter(al, true, false);
     testee.sort(anns, SequenceAnnotationOrder.LABEL_AND_SEQUENCE);
     assertEquals("Quality", anns[0].label); // autocalc annotations
     assertEquals("Consensus", anns[1].label); // retain ordering
@@ -215,7 +245,7 @@ public class AnnotationSorterTest
     anns[6].sequenceRef = al.getSequenceAt(2); anns[6].label = "Structure";
     // @formatter:on
 
-    AnnotationSorter testee = new AnnotationSorter(al, true);
+    AnnotationSorter testee = new AnnotationSorter(al, true, false);
     testee.sort(anns, SequenceAnnotationOrder.NONE);
     assertEquals("Quality", anns[0].label); // autocalc annotations
     assertEquals("Consensus", anns[1].label); // retain ordering
@@ -257,7 +287,7 @@ public class AnnotationSorterTest
       annotations[i].label = "label" + i;
     }
     long startTime = System.currentTimeMillis();
-    AnnotationSorter testee = new AnnotationSorter(alignment, false);
+    AnnotationSorter testee = new AnnotationSorter(alignment, false, false);
     testee.sort(annotations, SequenceAnnotationOrder.LABEL_AND_SEQUENCE);
     long endTime = System.currentTimeMillis();
     final long elapsed = endTime - startTime;
@@ -301,7 +331,7 @@ public class AnnotationSorterTest
       annotations[i].label = "label" + i;
     }
     long startTime = System.currentTimeMillis();
-    AnnotationSorter testee = new AnnotationSorter(alignment, false);
+    AnnotationSorter testee = new AnnotationSorter(alignment, false, false);
     testee.sort(annotations, SequenceAnnotationOrder.SEQUENCE_AND_LABEL);
     long endTime = System.currentTimeMillis();
     final long elapsed = endTime - startTime;
@@ -354,7 +384,7 @@ public class AnnotationSorterTest
       annotations[i].label = labels[r.nextInt(labels.length)];
     }
     long startTime = System.currentTimeMillis();
-    AnnotationSorter testee = new AnnotationSorter(alignment, false);
+    AnnotationSorter testee = new AnnotationSorter(alignment, false, false);
     testee.sort(annotations, SequenceAnnotationOrder.LABEL_AND_SEQUENCE);
     long endTime = System.currentTimeMillis();
     long elapsed = endTime - startTime;
@@ -380,4 +410,78 @@ public class AnnotationSorterTest
             + " sequences and " + numAnns + " annotations took " + elapsed
             + "ms");
   }
+
+  /**
+   * Test that sort does nothing if sort order is CUSTOM (manually ordered
+   * annotations)
+   */
+  @Test(groups = { "Functional" })
+  public void testSort_custom()
+  {
+    // @formatter:off
+    anns[0].sequenceRef = al.getSequenceAt(1); anns[0].label = "label0";
+    anns[1].sequenceRef = al.getSequenceAt(3); anns[1].label = "structure";
+    anns[2].sequenceRef = al.getSequenceAt(3); anns[2].label = "iron";
+    anns[3].autoCalculated = true;             anns[3].label = "Quality";
+    anns[4].autoCalculated = true;             anns[4].label = "Consensus";
+    anns[5].sequenceRef = al.getSequenceAt(0); anns[5].label = "label5";
+    anns[6].sequenceRef = al.getSequenceAt(3); anns[6].label = "IRP";
+    // @formatter:on
+
+    /*
+     * showAutocalcAbove=true ignored if CUSTOM ordering
+     */
+    AnnotationSorter testee = new AnnotationSorter(al, true, false);
+    testee.sort(anns, SequenceAnnotationOrder.CUSTOM);
+    assertEquals("label0", anns[0].label); // all unchanged
+    assertEquals("structure", anns[1].label);
+    assertEquals("iron", anns[2].label);
+    assertEquals("Quality", anns[3].label);
+    assertEquals("Consensus", anns[4].label);
+    assertEquals("label5", anns[5].label);
+    assertEquals("IRP", anns[6].label);
+  }
+
+  /**
+   * Test of sorting only autocalculated annotations
+   */
+  @Test(groups = { "Functional" })
+  public void testSort_autocalcOnly()
+  {
+    // @formatter:off
+    anns[0].sequenceRef = al.getSequenceAt(1); anns[0].label = "label0";
+    anns[1].sequenceRef = al.getSequenceAt(3); anns[1].label = "structure";
+    anns[2].sequenceRef = al.getSequenceAt(3); anns[2].label = "iron";
+    anns[3].autoCalculated = true;             anns[3].label = "Quality";
+    anns[4].autoCalculated = true;             anns[4].label = "Consensus";
+    anns[5].sequenceRef = al.getSequenceAt(0); anns[5].label = "label5";
+    anns[6].sequenceRef = al.getSequenceAt(3); anns[6].label = "IRP";
+    // @formatter:on
+
+    /*
+     * showAutocalcAbove=true, autocalcOnly=true
+     */
+    AnnotationSorter testee = new AnnotationSorter(al, true, true);
+    testee.sort(anns, SequenceAnnotationOrder.LABEL_AND_SEQUENCE);
+    assertEquals("Quality", anns[0].label); // moved to top
+    assertEquals("Consensus", anns[1].label); // moved to top
+    assertEquals("label0", anns[2].label); // the rest unchanged
+    assertEquals("structure", anns[3].label);
+    assertEquals("iron", anns[4].label);
+    assertEquals("label5", anns[5].label);
+    assertEquals("IRP", anns[6].label);
+
+    /*
+     * showAutocalcAbove=false, autocalcOnly=true
+     */
+    testee = new AnnotationSorter(al, false, true);
+    testee.sort(anns, SequenceAnnotationOrder.LABEL_AND_SEQUENCE);
+    assertEquals("label0", anns[0].label); // unchanged
+    assertEquals("structure", anns[1].label);
+    assertEquals("iron", anns[2].label);
+    assertEquals("label5", anns[3].label);
+    assertEquals("IRP", anns[4].label);
+    assertEquals("Quality", anns[5].label); // moved to bottom
+    assertEquals("Consensus", anns[6].label); // moved to bottom
+  }
 }