JAL-1264 fix broken applet build dependencies
[jalview.git] / test / jalview / analysis / AlignmentUtilsTests.java
index 59a265f..71b1bcb 100644 (file)
@@ -24,9 +24,21 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+
 import jalview.datamodel.AlignedCodonFrame;
 import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Annotation;
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.Mapping;
 import jalview.datamodel.Sequence;
@@ -35,15 +47,6 @@ import jalview.io.AppletFormatAdapter;
 import jalview.io.FormatAdapter;
 import jalview.util.MapList;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.junit.Test;
-
 public class AlignmentUtilsTests 
 {
   // @formatter:off
@@ -698,4 +701,172 @@ public class AlignmentUtilsTests
     assertEquals(cdna.getSequenceAt(0).getDatasetSequence(),
             acf.getdnaSeqs()[0]);
   }
+
+  /**
+   * Test the method that shows or hides sequence annotations by type(s) and
+   * selection group.
+   */
+  @Test
+  public void testShowOrHideSequenceAnnotations()
+  {
+    SequenceI seq1 = new Sequence("Seq1", "AAA");
+    SequenceI seq2 = new Sequence("Seq2", "BBB");
+    SequenceI seq3 = new Sequence("Seq3", "CCC");
+    Annotation[] anns = new Annotation[]
+    { new Annotation(2f) };
+    AlignmentAnnotation ann1 = new AlignmentAnnotation("Structure", "ann1",
+            anns);
+    ann1.setSequenceRef(seq1);
+    AlignmentAnnotation ann2 = new AlignmentAnnotation("Structure", "ann2",
+            anns);
+    ann2.setSequenceRef(seq2);
+    AlignmentAnnotation ann3 = new AlignmentAnnotation("Structure", "ann3",
+            anns);
+    AlignmentAnnotation ann4 = new AlignmentAnnotation("Temp", "ann4", anns);
+    ann4.setSequenceRef(seq1);
+    AlignmentAnnotation ann5 = new AlignmentAnnotation("Temp", "ann5", anns);
+    ann5.setSequenceRef(seq2);
+    AlignmentAnnotation ann6 = new AlignmentAnnotation("Temp", "ann6", anns);
+    AlignmentI al = new Alignment(new SequenceI[] {seq1, seq2, seq3});
+    al.addAnnotation(ann1); // Structure for Seq1
+    al.addAnnotation(ann2); // Structure for Seq2
+    al.addAnnotation(ann3); // Structure for no sequence
+    al.addAnnotation(ann4); // Temp for seq1
+    al.addAnnotation(ann5); // Temp for seq2
+    al.addAnnotation(ann6); // Temp for no sequence
+    List<String> types = new ArrayList<String>();
+    List<SequenceI> scope = new ArrayList<SequenceI>();
+
+    /*
+     * Set all sequence related Structure to hidden (ann1, ann2)
+     */
+    types.add("Structure");
+    AlignmentUtils.showOrHideSequenceAnnotations(al, types, null, false,
+            false);
+    assertFalse(ann1.visible);
+    assertFalse(ann2.visible);
+    assertTrue(ann3.visible); // not sequence-related, not affected
+    assertTrue(ann4.visible); // not Structure, not affected
+    assertTrue(ann5.visible); // "
+    assertTrue(ann6.visible); // not sequence-related, not affected
+
+    /*
+     * Set Temp in {seq1, seq3} to hidden
+     */
+    types.clear();
+    types.add("Temp");
+    scope.add(seq1);
+    scope.add(seq3);
+    AlignmentUtils.showOrHideSequenceAnnotations(al, types, scope, false,
+            false);
+    assertFalse(ann1.visible); // unchanged
+    assertFalse(ann2.visible); // unchanged
+    assertTrue(ann3.visible); // not sequence-related, not affected
+    assertFalse(ann4.visible); // Temp for seq1 hidden
+    assertTrue(ann5.visible); // not in scope, not affected
+    assertTrue(ann6.visible); // not sequence-related, not affected
+
+    /*
+     * Set Temp in all sequences to hidden
+     */
+    types.clear();
+    types.add("Temp");
+    scope.add(seq1);
+    scope.add(seq3);
+    AlignmentUtils.showOrHideSequenceAnnotations(al, types, null, false,
+            false);
+    assertFalse(ann1.visible); // unchanged
+    assertFalse(ann2.visible); // unchanged
+    assertTrue(ann3.visible); // not sequence-related, not affected
+    assertFalse(ann4.visible); // Temp for seq1 hidden
+    assertFalse(ann5.visible); // Temp for seq2 hidden
+    assertTrue(ann6.visible); // not sequence-related, not affected
+
+    /*
+     * Set all types in {seq1, seq3} to visible
+     */
+    types.clear();
+    scope.clear();
+    scope.add(seq1);
+    scope.add(seq3);
+    AlignmentUtils.showOrHideSequenceAnnotations(al, types, scope, true,
+            true);
+    assertTrue(ann1.visible); // Structure for seq1 set visible
+    assertFalse(ann2.visible); // not in scope, unchanged
+    assertTrue(ann3.visible); // not sequence-related, not affected
+    assertTrue(ann4.visible); // Temp for seq1 set visible
+    assertFalse(ann5.visible); // not in scope, unchanged
+    assertTrue(ann6.visible); // not sequence-related, not affected
+
+    /*
+     * Set all types in all scope to hidden
+     */
+    AlignmentUtils.showOrHideSequenceAnnotations(al, types, null, true,
+            false);
+    assertFalse(ann1.visible);
+    assertFalse(ann2.visible);
+    assertTrue(ann3.visible); // not sequence-related, not affected
+    assertFalse(ann4.visible);
+    assertFalse(ann5.visible);
+    assertTrue(ann6.visible); // not sequence-related, not affected
+  }
+
+  /**
+   * Tests for the method that checks if one sequence cross-references another
+   */
+  @Test
+  public void testHasCrossRef()
+  {
+    assertFalse(AlignmentUtils.hasCrossRef(null, null));
+    SequenceI seq1 = new Sequence("EMBL|A12345", "ABCDEF");
+    assertFalse(AlignmentUtils.hasCrossRef(seq1, null));
+    assertFalse(AlignmentUtils.hasCrossRef(null, seq1));
+    SequenceI seq2 = new Sequence("UNIPROT|V20192", "ABCDEF");
+    assertFalse(AlignmentUtils.hasCrossRef(seq1, seq2));
+  
+    // different ref
+    seq1.addDBRef(new DBRefEntry("UNIPROT", "1", "v20193"));
+    assertFalse(AlignmentUtils.hasCrossRef(seq1, seq2));
+  
+    // case-insensitive; version number is ignored
+    seq1.addDBRef(new DBRefEntry("UNIPROT", "1", "v20192"));
+    assertTrue(AlignmentUtils.hasCrossRef(seq1, seq2));
+  
+    // right case!
+    seq1.addDBRef(new DBRefEntry("UNIPROT", "1", "V20192"));
+    assertTrue(AlignmentUtils.hasCrossRef(seq1, seq2));
+    // test is one-way only
+    assertFalse(AlignmentUtils.hasCrossRef(seq2, seq1));
+  }
+
+  /**
+   * Tests for the method that checks if either sequence cross-references the
+   * other
+   */
+  @Test
+  public void testHaveCrossRef()
+  {
+    assertFalse(AlignmentUtils.hasCrossRef(null, null));
+    SequenceI seq1 = new Sequence("EMBL|A12345", "ABCDEF");
+    assertFalse(AlignmentUtils.haveCrossRef(seq1, null));
+    assertFalse(AlignmentUtils.haveCrossRef(null, seq1));
+    SequenceI seq2 = new Sequence("UNIPROT|V20192", "ABCDEF");
+    assertFalse(AlignmentUtils.haveCrossRef(seq1, seq2));
+  
+    seq1.addDBRef(new DBRefEntry("UNIPROT", "1", "V20192"));
+    assertTrue(AlignmentUtils.haveCrossRef(seq1, seq2));
+    // next is true for haveCrossRef, false for hasCrossRef
+    assertTrue(AlignmentUtils.haveCrossRef(seq2, seq1));
+  
+    // now the other way round
+    seq1.setDBRef(null);
+    seq2.addDBRef(new DBRefEntry("EMBL", "1", "A12345"));
+    assertTrue(AlignmentUtils.haveCrossRef(seq1, seq2));
+    assertTrue(AlignmentUtils.haveCrossRef(seq2, seq1));
+  
+    // now both ways
+    seq1.addDBRef(new DBRefEntry("UNIPROT", "1", "V20192"));
+    assertTrue(AlignmentUtils.haveCrossRef(seq1, seq2));
+    assertTrue(AlignmentUtils.haveCrossRef(seq2, seq1));
+  }
 }