JAL-2759 Moved propagateInsertions out of HiddenColumns
[jalview.git] / test / jalview / datamodel / HiddenColumnsTest.java
index ba2c1ea..07a4810 100644 (file)
@@ -26,12 +26,10 @@ import static org.testng.AssertJUnit.assertFalse;
 import static org.testng.AssertJUnit.assertTrue;
 
 import jalview.analysis.AlignmentGenerator;
-import jalview.util.Comparison;
 
 import java.util.Arrays;
 import java.util.BitSet;
 import java.util.Iterator;
-import java.util.Random;
 
 import org.testng.annotations.Test;
 
@@ -420,7 +418,7 @@ public class HiddenColumnsTest
             new SequenceI[]
     { new Sequence("refseqGaptest", "KTDVTI----------NFI-----G----L") });
     HiddenColumns cs = new HiddenColumns();
-    cs.hideInsertionsFor(al.getSequenceAt(0));
+    cs.hideList(al.getSequenceAt(0).getInsertions());
     assertEquals("G", ""
             + al.getSequenceAt(0).getCharAt(cs.visibleToAbsoluteColumn(9)));
 
@@ -680,7 +678,7 @@ public class HiddenColumnsTest
   }
 
   @Test(groups = { "Functional" })
-  public void testHideBitset()
+  public void testHideColumns_BitSet()
   {
     HiddenColumns cs;
 
@@ -726,32 +724,43 @@ public class HiddenColumnsTest
   }
 
   @Test(groups = { "Functional" })
-  public void testMarkHiddenRegions()
+  public void hideColumns_BitSetAndRange()
   {
-    BitSet toMark, fromMark;
-    long seed = -3241532;
-    Random number = new Random(seed);
-    for (int n = 0; n < 1000; n++)
-    {
-      // create a random bitfield
-      toMark = BitSet
-              .valueOf(new long[]
-      { number.nextLong(), number.nextLong(), number.nextLong() });
-      toMark.set(n * number.nextInt(10), n * (25 + number.nextInt(25)));
-      HiddenColumns hc = new HiddenColumns();
-
-      if (n == 0)
-      {
-        hc.markHiddenRegions(fromMark = new BitSet());
-        assertTrue(fromMark.isEmpty());
-      }
-
-      hc.hideColumns(toMark);
-
-      // see if we can recover bitfield
-      hc.markHiddenRegions(fromMark = new BitSet());
-      assertEquals(toMark, fromMark);
-    }
+    HiddenColumns hc = new HiddenColumns();
+    hc.hideColumns(3, 5);
+    hc.hideColumns(15, 20);
+    hc.hideColumns(45, 60);
+
+    BitSet tohide = new BitSet();
+
+    // all unhidden if tohide is empty and range covers hidden
+    hc.hideColumns(tohide, 1, 70);
+    assertTrue(!hc.hasHiddenColumns());
+
+    hc.hideColumns(3, 5);
+    hc.hideColumns(15, 20);
+    hc.hideColumns(45, 60);
+
+    // but not if range does not cover hidden
+    hc.hideColumns(tohide, 23, 40);
+    assertTrue(hc.hasHiddenColumns());
+
+    // and partial unhide if range partially covers
+    hc.hideColumns(tohide, 1, 17);
+    Iterator<int[]> it = hc.iterator();
+    assertTrue(it.hasNext());
+    int[] region = it.next();
+
+    assertEquals(18, region[0]);
+    assertEquals(20, region[1]);
+
+    assertTrue(it.hasNext());
+    region = it.next();
+
+    assertEquals(45, region[0]);
+    assertEquals(60, region[1]);
+
+    assertFalse(it.hasNext());
   }
 
   @Test(groups = { "Functional" })
@@ -849,123 +858,6 @@ public class HiddenColumnsTest
   }
 
   @Test(groups = "Functional")
-  public void testPropagateInsertions()
-  {
-    // create an alignment with no gaps - this will be the profile seq and other
-    // JPRED seqs
-    AlignmentGenerator gen = new AlignmentGenerator(false);
-    AlignmentI al = gen.generate(25, 10, 1234, 0, 0);
-
-    // get the profileseq
-    SequenceI profileseq = al.getSequenceAt(0);
-    SequenceI gappedseq = new Sequence(profileseq);
-    gappedseq.insertCharAt(5, al.getGapCharacter());
-    gappedseq.insertCharAt(6, al.getGapCharacter());
-    gappedseq.insertCharAt(7, al.getGapCharacter());
-    gappedseq.insertCharAt(8, al.getGapCharacter());
-
-    // force different kinds of padding
-    al.getSequenceAt(3).deleteChars(2, 23);
-    al.getSequenceAt(4).deleteChars(2, 27);
-    al.getSequenceAt(5).deleteChars(10, 27);
-
-    // create an alignment view with the gapped sequence
-    SequenceI[] seqs = new SequenceI[1];
-    seqs[0] = gappedseq;
-    AlignmentI newal = new Alignment(seqs);
-    HiddenColumns hidden = new HiddenColumns();
-    hidden.hideColumns(15, 17);
-
-    AlignmentView view = new AlignmentView(newal, hidden, null, true, false,
-            false);
-
-    // confirm that original contigs are as expected
-    Iterator<int[]> visible = hidden.getVisContigsIterator(0, 25, false);
-    int[] region = visible.next();
-    assertEquals("[0, 14]", Arrays.toString(region));
-    region = visible.next();
-    assertEquals("[18, 24]", Arrays.toString(region));
-
-    // propagate insertions
-    HiddenColumns result = HiddenColumns.propagateInsertions(profileseq, al,
-            view);
-
-    // confirm that the contigs have changed to account for the gaps
-    visible = result.getVisContigsIterator(0, 25, false);
-    region = visible.next();
-    assertEquals("[0, 10]", Arrays.toString(region));
-    region = visible.next();
-    assertEquals("[14, 24]", Arrays.toString(region));
-
-    // confirm the alignment has been changed so that the other sequences have
-    // gaps inserted where the columns are hidden
-    assertFalse(Comparison.isGap(al.getSequenceAt(1).getSequence()[10]));
-    assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[11]));
-    assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[12]));
-    assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[13]));
-    assertFalse(Comparison.isGap(al.getSequenceAt(1).getSequence()[14]));
-
-  }
-
-  @Test(groups = "Functional")
-  public void testPropagateInsertionsOverlap()
-  {
-    // test propagateInsertions where gaps and hiddenColumns overlap
-
-    // create an alignment with no gaps - this will be the profile seq and other
-    // JPRED seqs
-    AlignmentGenerator gen = new AlignmentGenerator(false);
-    AlignmentI al = gen.generate(20, 10, 1234, 0, 0);
-
-    // get the profileseq
-    SequenceI profileseq = al.getSequenceAt(0);
-    SequenceI gappedseq = new Sequence(profileseq);
-    gappedseq.insertCharAt(5, al.getGapCharacter());
-    gappedseq.insertCharAt(6, al.getGapCharacter());
-    gappedseq.insertCharAt(7, al.getGapCharacter());
-    gappedseq.insertCharAt(8, al.getGapCharacter());
-
-    // create an alignment view with the gapped sequence
-    SequenceI[] seqs = new SequenceI[1];
-    seqs[0] = gappedseq;
-    AlignmentI newal = new Alignment(seqs);
-
-    // hide columns so that some overlap with the gaps
-    HiddenColumns hidden = new HiddenColumns();
-    hidden.hideColumns(7, 10);
-
-    AlignmentView view = new AlignmentView(newal, hidden, null, true, false,
-            false);
-
-    // confirm that original contigs are as expected
-    Iterator<int[]> visible = hidden.getVisContigsIterator(0, 20, false);
-    int[] region = visible.next();
-    assertEquals("[0, 6]", Arrays.toString(region));
-    region = visible.next();
-    assertEquals("[11, 19]", Arrays.toString(region));
-    assertFalse(visible.hasNext());
-
-    // propagate insertions
-    HiddenColumns result = HiddenColumns.propagateInsertions(profileseq, al,
-            view);
-
-    // confirm that the contigs have changed to account for the gaps
-    visible = result.getVisContigsIterator(0, 20, false);
-    region = visible.next();
-    assertEquals("[0, 4]", Arrays.toString(region));
-    region = visible.next();
-    assertEquals("[7, 19]", Arrays.toString(region));
-    assertFalse(visible.hasNext());
-
-    // confirm the alignment has been changed so that the other sequences have
-    // gaps inserted where the columns are hidden
-    assertFalse(Comparison.isGap(al.getSequenceAt(1).getSequence()[4]));
-    assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[5]));
-    assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[6]));
-    assertFalse(Comparison.isGap(al.getSequenceAt(1).getSequence()[7]));
-  }
-
-  @Test(groups = "Functional")
   public void testHasHiddenColumns()
   {
     HiddenColumns h = new HiddenColumns();
@@ -1139,10 +1031,10 @@ public class HiddenColumnsTest
     SequenceI seq1 = new Sequence("TEST1", "GAL---MFW-KQESPVICY--HRNDT");
     SequenceI seq2 = new Sequence("TEST1", "GALMFWKQESPVICYHRNDT");
 
-    h.hideInsertionsFor(seq2);
+    h.hideList(seq2.getInsertions());
     assertTrue(h.equals(h2));
 
-    h.hideInsertionsFor(seq1);
+    h.hideList(seq1.getInsertions());
     h2.hideColumns(3, 5);
     h2.hideColumns(9, 9);
     h2.hideColumns(19, 20);
@@ -1150,7 +1042,7 @@ public class HiddenColumnsTest
   }
 
   @Test(groups = "Functional")
-  public void testHideMarkedBits()
+  public void testHideColumns_BitSet_range()
   {
     HiddenColumns h = new HiddenColumns();
     HiddenColumns h2 = new HiddenColumns();
@@ -1159,159 +1051,82 @@ public class HiddenColumnsTest
     h.hideColumns(tohide);
     assertTrue(h.equals(h2));
 
-    // NB in hideMarkedBits, the last bit is not set to hidden
+    // when setting bitset, first param is invlusive, second exclusive
     tohide.set(3, 6);
     tohide.set(9);
-    tohide.set(19, 21);
-    h.hideColumns(tohide);
+    tohide.set(15, 21);
+    h.hideColumns(tohide, 5, 23);
 
-    h2.hideColumns(3, 5);
+    h2.hideColumns(5, 5);
     h2.hideColumns(9, 9);
-    h2.hideColumns(19, 20);
+    h2.hideColumns(15, 20);
     assertTrue(h.equals(h2));
-  }
 
-  @Test(groups = "Functional")
-  public void testMakeVisibleAnnotation()
-  {
-    HiddenColumns h = new HiddenColumns();
-    Annotation[] anns = new Annotation[] { null, null, new Annotation(1),
-        new Annotation(2), new Annotation(3), null, null, new Annotation(4),
-        new Annotation(5), new Annotation(6), new Annotation(7),
-        new Annotation(8) };
-    AlignmentAnnotation ann = new AlignmentAnnotation("an", "some an",
-            anns);
-
-    // null annotation
-    AlignmentAnnotation nullann = null;
-    h.makeVisibleAnnotation(nullann);
-    assertNull(nullann);
-    
-    h.makeVisibleAnnotation(1, 2, nullann);
-    assertNull(nullann);
-
-    // null annotations
-    AlignmentAnnotation emptyann = new AlignmentAnnotation("an", "some ann", null);
-    h.makeVisibleAnnotation(emptyann);
-    assertNull(emptyann.annotations);
-    
-    h.makeVisibleAnnotation(3, 4, emptyann);
-    assertNull(emptyann.annotations);
-
-    // without bounds, does everything
-    h.makeVisibleAnnotation(ann);
-    assertEquals(12, ann.annotations.length);
-    assertNull(ann.annotations[0]);
-    assertNull(ann.annotations[1]);
-    assertEquals(1.0f, ann.annotations[2].value);
-    assertEquals(2.0f, ann.annotations[3].value);
-    assertEquals(3.0f, ann.annotations[4].value);
-    assertNull(ann.annotations[5]);
-    assertNull(ann.annotations[6]);
-    assertEquals(4.0f, ann.annotations[7].value);
-    assertEquals(5.0f, ann.annotations[8].value);
-    assertEquals(6.0f, ann.annotations[9].value);
-    assertEquals(7.0f, ann.annotations[10].value);
-    assertEquals(8.0f, ann.annotations[11].value);
-
-    // without hidden cols, just truncates
-    h.makeVisibleAnnotation(3, 5, ann);
-    assertEquals(3, ann.annotations.length);
-    assertEquals(2.0f, ann.annotations[0].value);
-    assertEquals(3.0f, ann.annotations[1].value);
-    assertNull(ann.annotations[2]);
-
-    anns = new Annotation[] { null, null, new Annotation(1),
-        new Annotation(2), new Annotation(3), null, null, new Annotation(4),
-        new Annotation(5), new Annotation(6), new Annotation(7),
-        new Annotation(8) };
-    ann = new AlignmentAnnotation("an", "some an", anns);
-    h.hideColumns(4, 7);
-    h.makeVisibleAnnotation(1, 9, ann);
-    assertEquals(5, ann.annotations.length);
-    assertNull(ann.annotations[0]);
-    assertEquals(1.0f, ann.annotations[1].value);
-    assertEquals(2.0f, ann.annotations[2].value);
-    assertEquals(5.0f, ann.annotations[3].value);
-    assertEquals(6.0f, ann.annotations[4].value);
-
-    anns = new Annotation[] { null, null, new Annotation(1),
-        new Annotation(2), new Annotation(3), null, null, new Annotation(4),
-        new Annotation(5), new Annotation(6), new Annotation(7),
-        new Annotation(8) };
-    ann = new AlignmentAnnotation("an", "some an", anns);
-    h.hideColumns(1, 2);
-    h.makeVisibleAnnotation(1, 9, ann);
-    assertEquals(3, ann.annotations.length);
-    assertEquals(2.0f, ann.annotations[0].value);
-    assertEquals(5.0f, ann.annotations[1].value);
-    assertEquals(6.0f, ann.annotations[2].value);
-
-    anns = new Annotation[] { null, null, new Annotation(1),
-        new Annotation(2), new Annotation(3), null, null, new Annotation(4),
-        new Annotation(5), new Annotation(6), new Annotation(7),
-        new Annotation(8), new Annotation(9), new Annotation(10),
-        new Annotation(11), new Annotation(12), new Annotation(13),
-        new Annotation(14), new Annotation(15) };
-    ann = new AlignmentAnnotation("an", "some an", anns);
-    h = new HiddenColumns();
-    h.hideColumns(5, 18);
-    h.hideColumns(20, 21);
-    h.makeVisibleAnnotation(1, 21, ann);
-    assertEquals(5, ann.annotations.length);
-    assertEquals(1.0f, ann.annotations[1].value);
-    assertEquals(2.0f, ann.annotations[2].value);
-    assertEquals(3.0f, ann.annotations[3].value);
-    assertNull(ann.annotations[0]);
-    assertNull(ann.annotations[4]);
+    tohide.clear();
+    tohide.set(41);
+    h.hideColumns(tohide, 23, 30);
+    assertTrue(h.equals(h2));
+
+    tohide.set(41);
+    h.hideColumns(tohide, 30, 45);
+    h2.hideColumns(41, 41);
+    assertTrue(h.equals(h2));
+
+    tohide.clear();
+    tohide.set(25, 28);
+    h.hideColumns(tohide, 17, 50);
+    h2 = new HiddenColumns();
+    h2.hideColumns(17, 20);
+    h2.hideColumns(25, 27);
+    h2.hideColumns(41, 41);
   }
 
   @Test(groups = "Functional")
-  public void testSubtractVisibleColumns()
+  public void testOffsetByVisibleColumns()
   {
     HiddenColumns h = new HiddenColumns();
-    int result = h.subtractVisibleColumns(1, 10);
+    int result = h.offsetByVisibleColumns(-1, 10);
     assertEquals(9, result);
 
     h.hideColumns(7, 9);
-    result = h.subtractVisibleColumns(4, 10);
+    result = h.offsetByVisibleColumns(-4, 10);
     assertEquals(3, result);
 
     h.hideColumns(14, 15);
-    result = h.subtractVisibleColumns(4, 10);
+    result = h.offsetByVisibleColumns(-4, 10);
     assertEquals(3, result);
 
-    result = h.subtractVisibleColumns(10, 17);
+    result = h.offsetByVisibleColumns(-10, 17);
     assertEquals(2, result);
 
-    result = h.subtractVisibleColumns(1, 7);
+    result = h.offsetByVisibleColumns(-1, 7);
     assertEquals(5, result);
 
-    result = h.subtractVisibleColumns(1, 8);
+    result = h.offsetByVisibleColumns(-1, 8);
     assertEquals(5, result);
 
-    result = h.subtractVisibleColumns(3, 15);
+    result = h.offsetByVisibleColumns(-3, 15);
     assertEquals(10, result);
 
     ColumnSelection sel = new ColumnSelection();
     h.revealAllHiddenColumns(sel);
     h.hideColumns(0, 30);
-    result = h.subtractVisibleColumns(31, 0);
+    result = h.offsetByVisibleColumns(-31, 0);
     assertEquals(-31, result);
 
     HiddenColumns cs = new HiddenColumns();
 
-    // test that without hidden columns, findColumnNToLeft returns
+    // test that without hidden columns, offsetByVisibleColumns returns
     // position n to left of provided position
-    long pos = cs.subtractVisibleColumns(3, 10);
+    long pos = cs.offsetByVisibleColumns(-3, 10);
     assertEquals(7, pos);
 
     // 0 returns same position
-    pos = cs.subtractVisibleColumns(0, 10);
+    pos = cs.offsetByVisibleColumns(0, 10);
     assertEquals(10, pos);
 
     // overflow to left returns negative number
-    pos = cs.subtractVisibleColumns(3, 0);
+    pos = cs.offsetByVisibleColumns(-3, 0);
     assertEquals(-3, pos);
 
     // test that with hidden columns to left of result column
@@ -1319,21 +1134,21 @@ public class HiddenColumnsTest
     cs.hideColumns(1, 3);
 
     // position n to left of provided position
-    pos = cs.subtractVisibleColumns(3, 10);
+    pos = cs.offsetByVisibleColumns(-3, 10);
     assertEquals(7, pos);
 
     // 0 returns same position
-    pos = cs.subtractVisibleColumns(0, 10);
+    pos = cs.offsetByVisibleColumns(0, 10);
     assertEquals(10, pos);
 
     // test with one set of hidden columns between start and required position
     cs.hideColumns(12, 15);
-    pos = cs.subtractVisibleColumns(8, 17);
+    pos = cs.offsetByVisibleColumns(-8, 17);
     assertEquals(5, pos);
 
     // test with two sets of hidden columns between start and required position
     cs.hideColumns(20, 21);
-    pos = cs.subtractVisibleColumns(8, 23);
+    pos = cs.offsetByVisibleColumns(-8, 23);
     assertEquals(9, pos);
 
     // repeat last 2 tests with no hidden columns to left of required position
@@ -1342,16 +1157,49 @@ public class HiddenColumnsTest
 
     // test with one set of hidden columns between start and required position
     cs.hideColumns(12, 15);
-    pos = cs.subtractVisibleColumns(8, 17);
+    pos = cs.offsetByVisibleColumns(-8, 17);
     assertEquals(5, pos);
 
     // test with two sets of hidden columns between start and required position
     cs.hideColumns(20, 21);
-    pos = cs.subtractVisibleColumns(8, 23);
+    pos = cs.offsetByVisibleColumns(-8, 23);
     assertEquals(9, pos);
 
-  }
+    // test with right (positive) offsets
+
+    // test that without hidden columns, offsetByVisibleColumns returns
+    // position n to right of provided position
+    pos = cs.offsetByVisibleColumns(3, 7);
+    assertEquals(10, pos);
 
+    // test that with hidden columns to left of result column
+    // behaviour is the same as above
+    cs.hideColumns(1, 3);
+
+    // test with one set of hidden columns between start and required position
+    cs.hideColumns(12, 15);
+    pos = cs.offsetByVisibleColumns(8, 5);
+    assertEquals(17, pos);
+
+    // test with two sets of hidden columns between start and required position
+    cs.hideColumns(20, 21);
+    pos = cs.offsetByVisibleColumns(8, 9);
+    assertEquals(23, pos);
+
+    // repeat last 2 tests with no hidden columns to left of required position
+    colsel = new ColumnSelection();
+    cs.revealAllHiddenColumns(colsel);
+
+    // test with one set of hidden columns between start and required position
+    cs.hideColumns(12, 15);
+    pos = cs.offsetByVisibleColumns(8, 5);
+    assertEquals(17, pos);
+
+    // test with two sets of hidden columns between start and required position
+    cs.hideColumns(20, 21);
+    pos = cs.offsetByVisibleColumns(8, 9);
+    assertEquals(23, pos);
+  }
 
   @Test(groups = "Functional")
   public void testBoundedIterator()