JAL-1645 licencing for new files in test and utils
[jalview.git] / test / jalview / analysis / AlignmentAnnotationUtilsTest.java
index 1da1939..c3191e8 100644 (file)
@@ -1,10 +1,32 @@
+/*
+ * 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.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertTrue;
+
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Annotation;
 import jalview.datamodel.SequenceI;
 import jalview.io.AppletFormatAdapter;
 
@@ -16,8 +38,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.junit.Before;
-import org.junit.Test;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 public class AlignmentAnnotationUtilsTest
 {
@@ -36,21 +58,21 @@ public class AlignmentAnnotationUtilsTest
           "TIETHKEEELTA-" + EOL;
   // @formatter:on
 
-  private static final int SEQ_ANN_COUNT = 10;
+  private static final int SEQ_ANN_COUNT = 12;
 
   private AlignmentI alignment;
 
   /**
    * Test method that converts a (possibly null) array to a list.
    */
-  @Test
+  @Test(groups = { "Functional" })
   public void testAsList()
   {
     // null array
     Collection<AlignmentAnnotation> c1 = AlignmentAnnotationUtils
             .asList(null);
     assertTrue(c1.isEmpty());
-    
+
     // empty array
     AlignmentAnnotation[] anns = new AlignmentAnnotation[0];
     c1 = AlignmentAnnotationUtils.asList(anns);
@@ -111,16 +133,26 @@ public class AlignmentAnnotationUtilsTest
     return result;
   }
 
-  @Before
+  /**
+   * Load the test alignment and generate annotations on it
+   * 
+   * @throws IOException
+   */
+  @BeforeMethod(alwaysRun = true)
   public void setUp() throws IOException
   {
     alignment = new jalview.io.FormatAdapter().readFile(TEST_DATA,
             AppletFormatAdapter.PASTE, "FASTA");
-  
+
     AlignmentAnnotation[] anns = new AlignmentAnnotation[SEQ_ANN_COUNT];
     for (int i = 0; i < anns.length; i++)
     {
-      anns[i] = new AlignmentAnnotation("Label" + i, null, 0d);
+      /*
+       * Use the constructor for a positional annotation (with an Annotation
+       * array)
+       */
+      anns[i] = new AlignmentAnnotation("Label" + i, "Desc " + i,
+              new Annotation[] {});
       anns[i].setCalcId("CalcId" + i);
       anns[i].visible = true;
       alignment.addAnnotation(anns[i]);
@@ -130,14 +162,14 @@ public class AlignmentAnnotationUtilsTest
   /**
    * Test a mixture of show/hidden annotations in/outside selection group.
    */
-  @Test
+  @Test(groups = { "Functional" })
   public void testGetShownHiddenTypes_forSelectionGroup()
   {
     Map<String, List<List<String>>> shownTypes = new HashMap<String, List<List<String>>>();
     Map<String, List<List<String>>> hiddenTypes = new HashMap<String, List<List<String>>>();
     AlignmentAnnotation[] anns = alignment.getAlignmentAnnotation();
     SequenceI[] seqs = alignment.getSequencesArray();
-  
+
     /*
      * Configure annotation properties for test
      */
@@ -147,7 +179,7 @@ public class AlignmentAnnotationUtilsTest
     anns[4].visible = false;
     anns[7].sequenceRef = seqs[1];
     anns[7].visible = true;
-  
+
     /*
      * in selection group, hidden:
      */
@@ -171,12 +203,11 @@ public class AlignmentAnnotationUtilsTest
     anns[6].visible = true;
     anns[9].sequenceRef = seqs[3]; // CalcId9/Label9
     anns[9].visible = true;
-  
+
     List<SequenceI> selected = selectSequences(0, 3);
     AlignmentAnnotationUtils.getShownHiddenTypes(shownTypes, hiddenTypes,
-            AlignmentAnnotationUtils.asList(anns),
-            selected);
-  
+            AlignmentAnnotationUtils.asList(anns), selected);
+
     // check results; note CalcId9/Label9 is both hidden and shown (for
     // different sequences) so should be in both
     // shown: CalcId6/Label6 and CalcId9/Label9
@@ -187,7 +218,7 @@ public class AlignmentAnnotationUtilsTest
     assertEquals(1, shownTypes.get("CalcId9").size());
     assertEquals(1, shownTypes.get("CalcId9").get(0).size());
     assertEquals("Label9", shownTypes.get("CalcId9").get(0).get(0));
-  
+
     // hidden: CalcId2/Label2, CalcId2/Label3, CalcId3/Label2, CalcId9/Label9
     assertEquals(3, hiddenTypes.size());
     assertEquals(2, hiddenTypes.get("CalcId2").size());
@@ -201,7 +232,7 @@ public class AlignmentAnnotationUtilsTest
     assertEquals(1, hiddenTypes.get("CalcId9").size());
     assertEquals(1, hiddenTypes.get("CalcId9").get(0).size());
     assertEquals("Label9", hiddenTypes.get("CalcId9").get(0).get(0));
-  
+
     consoleDebug(shownTypes, hiddenTypes);
   }
 
@@ -209,23 +240,24 @@ public class AlignmentAnnotationUtilsTest
    * Test case where there are 'grouped' annotations, visible and hidden, within
    * and without the selection group.
    */
-  @Test
+  @Test(groups = { "Functional" })
   public void testGetShownHiddenTypes_withGraphGroups()
   {
+    final int GROUP_3 = 3;
     final int GROUP_4 = 4;
     final int GROUP_5 = 5;
     final int GROUP_6 = 6;
-  
+
     Map<String, List<List<String>>> shownTypes = new HashMap<String, List<List<String>>>();
     Map<String, List<List<String>>> hiddenTypes = new HashMap<String, List<List<String>>>();
     AlignmentAnnotation[] anns = alignment.getAlignmentAnnotation();
     SequenceI[] seqs = alignment.getSequencesArray();
-  
+
     /*
-     * Configure annotation properties for test
+     * Annotations for selection group and graph group
+     * 
+     * Hidden annotations Label2, Label3, in (hidden) group 5
      */
-    // annotations for selection group and graph group
-    // hidden annotations Label2, Label3, in (hidden) group 5
     anns[2].sequenceRef = seqs[3];
     anns[2].visible = false;
     anns[2].graph = AlignmentAnnotation.LINE_GRAPH;
@@ -236,7 +268,20 @@ public class AlignmentAnnotationUtilsTest
     anns[3].graphGroup = GROUP_5;
     // need to ensure annotations have the same calcId as well
     anns[3].setCalcId("CalcId2");
-  
+    // annotations for a different hidden group generating the same group label
+    anns[10].sequenceRef = seqs[0];
+    anns[10].visible = false;
+    anns[10].graph = AlignmentAnnotation.LINE_GRAPH;
+    anns[10].graphGroup = GROUP_3;
+    anns[10].label = "Label3";
+    anns[10].setCalcId("CalcId2");
+    anns[11].sequenceRef = seqs[3];
+    anns[11].visible = false;
+    anns[11].graph = AlignmentAnnotation.LINE_GRAPH;
+    anns[11].graphGroup = GROUP_3;
+    anns[11].label = "Label2";
+    anns[11].setCalcId("CalcId2");
+
     // annotations Label1 (hidden), Label5 (visible) in group 6 (visible)
     anns[1].sequenceRef = seqs[3];
     // being in a visible group should take precedence over this visibility
@@ -248,9 +293,29 @@ public class AlignmentAnnotationUtilsTest
     anns[5].graph = AlignmentAnnotation.LINE_GRAPH;
     anns[5].graphGroup = GROUP_6;
     anns[5].setCalcId("CalcId1");
-  
-    // annotations outwith selection group - should be ignored
-    // hidden grouped annotations
+    /*
+     * Annotations 0 and 4 are visible, for a different CalcId and graph group.
+     * They produce the same label as annotations 1 and 5, which should not be
+     * duplicated in the results. This case corresponds to (e.g.) many
+     * occurrences of an IUPred Short/Long annotation group, one per sequence.
+     */
+    anns[4].sequenceRef = seqs[0];
+    anns[4].visible = false;
+    anns[4].graph = AlignmentAnnotation.LINE_GRAPH;
+    anns[4].graphGroup = GROUP_4;
+    anns[4].label = "Label1";
+    anns[4].setCalcId("CalcId1");
+    anns[0].sequenceRef = seqs[0];
+    anns[0].visible = true;
+    anns[0].graph = AlignmentAnnotation.LINE_GRAPH;
+    anns[0].graphGroup = GROUP_4;
+    anns[0].label = "Label5";
+    anns[0].setCalcId("CalcId1");
+
+    /*
+     * Annotations outwith selection group - should be ignored.
+     */
+    // Hidden grouped annotations
     anns[6].sequenceRef = seqs[2];
     anns[6].visible = false;
     anns[6].graph = AlignmentAnnotation.LINE_GRAPH;
@@ -259,6 +324,7 @@ public class AlignmentAnnotationUtilsTest
     anns[8].visible = false;
     anns[8].graph = AlignmentAnnotation.LINE_GRAPH;
     anns[8].graphGroup = GROUP_4;
+
     // visible grouped annotations Label7, Label9
     anns[7].sequenceRef = seqs[2];
     anns[7].visible = true;
@@ -268,21 +334,28 @@ public class AlignmentAnnotationUtilsTest
     anns[9].visible = true;
     anns[9].graph = AlignmentAnnotation.LINE_GRAPH;
     anns[9].graphGroup = GROUP_4;
-  
+
+    /*
+     * Generate annotations[] arrays to match aligned columns
+     */
+    // adjustForAlignment(anns);
+
     List<SequenceI> selected = selectSequences(0, 3);
     AlignmentAnnotationUtils.getShownHiddenTypes(shownTypes, hiddenTypes,
-            AlignmentAnnotationUtils.asList(anns),
-            selected);
-  
+            AlignmentAnnotationUtils.asList(anns), selected);
+
     consoleDebug(shownTypes, hiddenTypes);
-  
-    // CalcId1 / Label1, Label5 (only) should be 'shown', as a compound type
+
+    // CalcId1 / Label1, Label5 (only) should be 'shown', once, as a compound
+    // type
+    assertEquals(1, shownTypes.size());
     assertEquals(1, shownTypes.get("CalcId1").size());
     assertEquals(2, shownTypes.get("CalcId1").get(0).size());
     assertEquals("Label1", shownTypes.get("CalcId1").get(0).get(0));
     assertEquals("Label5", shownTypes.get("CalcId1").get(0).get(1));
-  
+
     // CalcId2 / Label2, Label3 (only) should be 'hidden'
+    assertEquals(1, hiddenTypes.size());
     assertEquals(1, hiddenTypes.get("CalcId2").size());
     assertEquals(2, hiddenTypes.get("CalcId2").get(0).size());
     assertEquals("Label2", hiddenTypes.get("CalcId2").get(0).get(0));
@@ -292,7 +365,7 @@ public class AlignmentAnnotationUtilsTest
   /**
    * Test method that determines visible graph groups.
    */
-  @Test
+  @Test(groups = { "Functional" })
   public void testGetVisibleGraphGroups()
   {
     AlignmentAnnotation[] anns = alignment.getAlignmentAnnotation();
@@ -302,7 +375,7 @@ public class AlignmentAnnotationUtilsTest
     anns[0].graph = AlignmentAnnotation.BAR_GRAPH;
     anns[0].graphGroup = 1;
     anns[0].visible = true;
-  
+
     /*
      * a line graph group is included as long as one of its members is visible
      */
@@ -312,19 +385,19 @@ public class AlignmentAnnotationUtilsTest
     anns[2].graph = AlignmentAnnotation.LINE_GRAPH;
     anns[2].graphGroup = 5;
     anns[2].visible = true;
-  
+
     /*
      * a line graph group with no visible rows is not included
      */
     anns[3].graph = AlignmentAnnotation.LINE_GRAPH;
     anns[3].graphGroup = 3;
     anns[3].visible = false;
-  
+
     // a visible line graph with no graph group is not included
     anns[4].graph = AlignmentAnnotation.LINE_GRAPH;
     anns[4].graphGroup = -1;
     anns[4].visible = true;
-  
+
     BitSet result = AlignmentAnnotationUtils
             .getVisibleLineGraphGroups(AlignmentAnnotationUtils
                     .asList(anns));
@@ -339,7 +412,7 @@ public class AlignmentAnnotationUtilsTest
    * Test for case where no sequence is selected. Shouldn't normally arise but
    * check it handles it gracefully.
    */
-  @Test
+  @Test(groups = { "Functional" })
   public void testGetShownHiddenTypes_noSequenceSelected()
   {
     Map<String, List<List<String>>> shownTypes = new HashMap<String, List<List<String>>>();