JAL-2674 add bounds to findHiddenRegionPositions
[jalview.git] / test / jalview / datamodel / HiddenColumnsTest.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.datamodel;
22
23 import static org.testng.Assert.assertNull;
24 import static org.testng.AssertJUnit.assertEquals;
25 import static org.testng.AssertJUnit.assertFalse;
26 import static org.testng.AssertJUnit.assertTrue;
27
28 import jalview.analysis.AlignmentGenerator;
29 import jalview.gui.JvOptionPane;
30 import jalview.util.Comparison;
31
32 import java.util.ArrayList;
33 import java.util.Arrays;
34 import java.util.BitSet;
35 import java.util.List;
36 import java.util.Random;
37
38 import org.testng.annotations.BeforeClass;
39 import org.testng.annotations.Test;
40
41 public class HiddenColumnsTest
42 {
43
44   @BeforeClass(alwaysRun = true)
45   public void setUpJvOptionPane()
46   {
47     JvOptionPane.setInteractiveMode(false);
48     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
49   }
50
51   /**
52    * Test the method which counts the number of hidden columns
53    */
54   @Test(groups = { "Functional" })
55   public void testGetSize()
56   {
57     HiddenColumns hidden = new HiddenColumns();
58     assertEquals(0, hidden.getSize());
59
60     hidden.hideColumns(3, 5);
61     assertEquals(3, hidden.getSize());
62
63     hidden.hideColumns(8, 8);
64     assertEquals(4, hidden.getSize());
65
66     hidden.hideColumns(9, 14);
67     assertEquals(10, hidden.getSize());
68
69     ColumnSelection cs = new ColumnSelection();
70     hidden.revealAllHiddenColumns(cs);
71     assertEquals(0, hidden.getSize());
72   }
73
74   /**
75    * Test the method that finds the visible column position of an alignment
76    * column, allowing for hidden columns.
77    */
78   @Test(groups = { "Functional" })
79   public void testFindColumnPosition()
80   {
81     HiddenColumns cs = new HiddenColumns();
82     assertEquals(5, cs.findColumnPosition(5));
83
84     // hiding column 6 makes no difference
85     cs.hideColumns(6, 6);
86     assertEquals(5, cs.findColumnPosition(5));
87
88     // hiding column 4 moves column 5 to column 4
89     cs.hideColumns(4, 4);
90     assertEquals(4, cs.findColumnPosition(5));
91
92     // hiding column 4 moves column 4 to position 3
93     assertEquals(3, cs.findColumnPosition(4));
94
95     // hiding columns 1 and 2 moves column 5 to column 2
96     cs.hideColumns(1, 2);
97     assertEquals(2, cs.findColumnPosition(5));
98
99     // check with > 1 hidden column regions
100     // where some columns are in the hidden regions
101     HiddenColumns cs2 = new HiddenColumns();
102     cs2.hideColumns(5, 10);
103     cs2.hideColumns(20, 27);
104     cs2.hideColumns(40, 44);
105
106     // hiding columns 5-10 and 20-27 moves column 8 to column 4
107     assertEquals(4, cs2.findColumnPosition(8));
108
109     // and moves column 24 to 13
110     assertEquals(13, cs2.findColumnPosition(24));
111
112     // and moves column 28 to 14
113     assertEquals(14, cs2.findColumnPosition(28));
114
115     // and moves column 40 to 25
116     assertEquals(25, cs2.findColumnPosition(40));
117
118     // check when hidden columns start at 0 that the visible column
119     // is returned as 0
120     HiddenColumns cs3 = new HiddenColumns();
121     cs3.hideColumns(0, 4);
122     assertEquals(0, cs3.findColumnPosition(2));
123
124   }
125
126   /**
127    * Test the method that finds the visible column position a given distance
128    * before another column
129    */
130   @Test(groups = { "Functional" })
131   public void testFindColumnNToLeft()
132   {
133     HiddenColumns cs = new HiddenColumns();
134
135     // test that without hidden columns, findColumnNToLeft returns
136     // position n to left of provided position
137     long pos = cs.subtractVisibleColumns(3, 10);
138     assertEquals(7, pos);
139
140     // 0 returns same position
141     pos = cs.subtractVisibleColumns(0, 10);
142     assertEquals(10, pos);
143
144     // overflow to left returns negative number
145     pos = cs.subtractVisibleColumns(3, 0);
146     assertEquals(-3, pos);
147
148     // test that with hidden columns to left of result column
149     // behaviour is the same as above
150     cs.hideColumns(1, 3);
151
152     // position n to left of provided position
153     pos = cs.subtractVisibleColumns(3, 10);
154     assertEquals(7, pos);
155
156     // 0 returns same position
157     pos = cs.subtractVisibleColumns(0, 10);
158     assertEquals(10, pos);
159
160     // test with one set of hidden columns between start and required position
161     cs.hideColumns(12, 15);
162     pos = cs.subtractVisibleColumns(8, 17);
163     assertEquals(5, pos);
164
165     // test with two sets of hidden columns between start and required position
166     cs.hideColumns(20, 21);
167     pos = cs.subtractVisibleColumns(8, 23);
168     assertEquals(9, pos);
169
170     // repeat last 2 tests with no hidden columns to left of required position
171     ColumnSelection colsel = new ColumnSelection();
172     cs.revealAllHiddenColumns(colsel);
173
174     // test with one set of hidden columns between start and required position
175     cs.hideColumns(12, 15);
176     pos = cs.subtractVisibleColumns(8, 17);
177     assertEquals(5, pos);
178
179     // test with two sets of hidden columns between start and required position
180     cs.hideColumns(20, 21);
181     pos = cs.subtractVisibleColumns(8, 23);
182     assertEquals(9, pos);
183
184   }
185
186   @Test(groups = { "Functional" })
187   public void testGetVisibleContigs()
188   {
189     HiddenColumns cs = new HiddenColumns();
190
191     int[] visible = cs.getVisibleContigs(3, 10);
192     assertEquals("[3, 9]", Arrays.toString(visible));
193
194     cs.hideColumns(3, 6);
195     cs.hideColumns(8, 9);
196     cs.hideColumns(12, 12);
197
198     // Test both ends visible region
199
200     // start position is inclusive, end position exclusive
201     visible = cs.getVisibleContigs(1, 13);
202     assertEquals("[1, 2, 7, 7, 10, 11]", Arrays.toString(visible));
203
204     // Test start hidden, end visible
205     visible = cs.getVisibleContigs(4, 14);
206     assertEquals("[7, 7, 10, 11, 13, 13]", Arrays.toString(visible));
207
208     // Test start hidden, end hidden
209     visible = cs.getVisibleContigs(3, 10);
210     assertEquals("[7, 7]", Arrays.toString(visible));
211
212     // Test start visible, end hidden
213     visible = cs.getVisibleContigs(0, 13);
214     assertEquals("[0, 2, 7, 7, 10, 11]", Arrays.toString(visible));
215
216     // Test empty result
217     visible = cs.getVisibleContigs(4, 6);
218     assertEquals("[]", Arrays.toString(visible));
219   }
220
221   @Test(groups = { "Functional" })
222   public void testEquals()
223   {
224     HiddenColumns cs = new HiddenColumns();
225     cs.hideColumns(5, 9);
226
227     // a different set of hidden columns
228     HiddenColumns cs2 = new HiddenColumns();
229
230     // with no hidden columns
231     assertFalse(cs.equals(cs2));
232     assertFalse(cs2.equals(cs));
233
234     // with hidden columns added in a different order
235     cs2.hideColumns(6, 9);
236     cs2.hideColumns(5, 8);
237
238     assertTrue(cs.equals(cs2));
239     assertTrue(cs.equals(cs));
240     assertTrue(cs2.equals(cs));
241     assertTrue(cs2.equals(cs2));
242   }
243
244   @Test(groups = "Functional")
245   public void testCopyConstructor()
246   {
247     HiddenColumns cs = new HiddenColumns();
248     cs.hideColumns(10, 11);
249     cs.hideColumns(5, 7);
250     assertEquals("[5, 7]",
251             Arrays.toString(cs.getHiddenColumnsCopy().get(0)));
252
253     HiddenColumns cs2 = new HiddenColumns(cs);
254     assertTrue(cs2.hasHiddenColumns());
255     assertEquals(2, cs2.getHiddenColumnsCopy().size());
256     // hidden columns are held in column order
257     assertEquals("[5, 7]",
258             Arrays.toString(cs2.getHiddenColumnsCopy().get(0)));
259     assertEquals("[10, 11]",
260             Arrays.toString(cs2.getHiddenColumnsCopy().get(1)));
261   }
262
263   /**
264    * Test the code used to locate the reference sequence ruler origin
265    */
266   @Test(groups = { "Functional" })
267   public void testLocateVisibleBoundsofSequence()
268   {
269     // create random alignment
270     AlignmentGenerator gen = new AlignmentGenerator(false);
271     AlignmentI al = gen.generate(50, 20, 123, 5, 5);
272
273     HiddenColumns cs = al.getHiddenColumns();
274     ColumnSelection colsel = new ColumnSelection();
275
276     SequenceI seq = new Sequence("RefSeq", "-A-SD-ASD--E---");
277     assertEquals(2, seq.findIndex(seq.getStart()));
278
279     // no hidden columns
280     assertEquals(
281             Arrays.toString(new int[]
282     { seq.findIndex(seq.getStart()) - 1, seq.findIndex(seq.getStart()) - 1,
283         seq.findIndex(seq.getEnd()) - 1 }),
284             Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
285
286     // hidden column on gap after end of sequence - should not affect bounds
287     colsel.hideSelectedColumns(13, al.getHiddenColumns());
288     assertEquals(
289             Arrays.toString(new int[]
290     { seq.findIndex(seq.getStart()) - 1, seq.findIndex(seq.getStart()) - 1,
291         seq.findIndex(seq.getEnd()) - 1 }),
292             Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
293
294     cs.revealAllHiddenColumns(colsel);
295     // hidden column on gap before beginning of sequence - should vis bounds by
296     // one
297     colsel.hideSelectedColumns(0, al.getHiddenColumns());
298     assertEquals(
299             Arrays.toString(new int[]
300     { seq.findIndex(seq.getStart()) - 2, seq.findIndex(seq.getStart()) - 1,
301         seq.findIndex(seq.getEnd()) - 1 }),
302             Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
303
304     cs.revealAllHiddenColumns(colsel);
305     // hide columns around most of sequence - leave one residue remaining
306     cs.hideColumns(1, 3);
307     cs.hideColumns(6, 11);
308     assertEquals("-D",
309             cs.getVisibleSequenceStrings(0, 5, new SequenceI[]
310     { seq })[0]);
311
312     assertEquals(
313             Arrays.toString(
314                     new int[]
315             { 1, seq.findIndex(seq.getStart()) - 1,
316         seq.findIndex(seq.getEnd()) - 1 }),
317             Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
318     cs.revealAllHiddenColumns(colsel);
319
320     // hide whole sequence - should just get location of hidden region
321     // containing sequence
322     cs.hideColumns(1, 11);
323     assertEquals(
324             Arrays.toString(
325                     new int[]
326             { 0, seq.findIndex(seq.getStart()) - 1,
327         seq.findIndex(seq.getEnd()) - 1 }),
328             Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
329
330     cs.revealAllHiddenColumns(colsel);
331     cs.hideColumns(0, 15);
332     assertEquals(Arrays
333             .toString(new int[]
334     { 0, seq.findIndex(seq.getStart()) - 1,
335         seq.findIndex(seq.getEnd()) - 1 }),
336             Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
337
338     SequenceI seq2 = new Sequence("RefSeq2", "-------A-SD-ASD--E---");
339
340     cs.revealAllHiddenColumns(colsel);
341     cs.hideColumns(7, 17);
342     assertEquals(
343             Arrays.toString(
344                     new int[]
345             { 0, seq2.findIndex(seq2.getStart()) - 1,
346         seq2.findIndex(seq2.getEnd()) - 1 }),
347             Arrays.toString(cs.locateVisibleBoundsOfSequence(seq2)));
348
349     cs.revealAllHiddenColumns(colsel);
350     cs.hideColumns(3, 17);
351     assertEquals(
352             Arrays.toString(
353                     new int[]
354             { 0, seq2.findIndex(seq2.getStart()) - 1,
355         seq2.findIndex(seq2.getEnd()) - 1 }),
356             Arrays.toString(cs.locateVisibleBoundsOfSequence(seq2)));
357
358     cs.revealAllHiddenColumns(colsel);
359     cs.hideColumns(3, 19);
360     assertEquals(
361             Arrays.toString(
362                     new int[]
363             { 0, seq2.findIndex(seq2.getStart()) - 1,
364         seq2.findIndex(seq2.getEnd()) - 1 }),
365             Arrays.toString(cs.locateVisibleBoundsOfSequence(seq2)));
366
367     cs.revealAllHiddenColumns(colsel);
368     cs.hideColumns(0, 0);
369     int[] test = cs.locateVisibleBoundsOfSequence(seq);
370     assertEquals(Arrays.toString(new int[] { 0, 1, 11 }),
371             Arrays.toString(test));
372
373     cs.revealAllHiddenColumns(colsel);
374     cs.hideColumns(0, 1);
375     test = cs.locateVisibleBoundsOfSequence(seq);
376     assertEquals(Arrays.toString(new int[] { 1, 1, 11 }),
377             Arrays.toString(test));
378
379     cs.revealAllHiddenColumns(colsel);
380     cs.hideColumns(0, 2);
381     test = cs.locateVisibleBoundsOfSequence(seq);
382     assertEquals(Arrays.toString(new int[] { 0, 1, 11 }),
383             Arrays.toString(test));
384
385     cs.revealAllHiddenColumns(colsel);
386     cs.hideColumns(1, 1);
387     test = cs.locateVisibleBoundsOfSequence(seq);
388     assertEquals(Arrays.toString(new int[] { 2, 1, 11 }),
389             Arrays.toString(test));
390
391     cs.revealAllHiddenColumns(colsel);
392     cs.hideColumns(1, 2);
393     test = cs.locateVisibleBoundsOfSequence(seq);
394     assertEquals(Arrays.toString(new int[] { 1, 1, 11 }),
395             Arrays.toString(test));
396
397     cs.revealAllHiddenColumns(colsel);
398     cs.hideColumns(1, 3);
399     test = cs.locateVisibleBoundsOfSequence(seq);
400     assertEquals(Arrays.toString(new int[] { 1, 1, 11 }),
401             Arrays.toString(test));
402
403     cs.revealAllHiddenColumns(colsel);
404     cs.hideColumns(0, 2);
405     cs.hideColumns(5, 6);
406     test = cs.locateVisibleBoundsOfSequence(seq);
407     assertEquals(Arrays.toString(new int[] { 0, 1, 11 }),
408             Arrays.toString(test));
409
410     cs.revealAllHiddenColumns(colsel);
411     cs.hideColumns(0, 2);
412     cs.hideColumns(5, 6);
413     cs.hideColumns(9, 10);
414     test = cs.locateVisibleBoundsOfSequence(seq);
415     assertEquals(Arrays.toString(new int[] { 0, 1, 11 }),
416             Arrays.toString(test));
417
418     cs.revealAllHiddenColumns(colsel);
419     cs.hideColumns(0, 2);
420     cs.hideColumns(7, 11);
421     test = cs.locateVisibleBoundsOfSequence(seq);
422     assertEquals(Arrays.toString(new int[] { 0, 1, 11 }),
423             Arrays.toString(test));
424
425     cs.revealAllHiddenColumns(colsel);
426     cs.hideColumns(2, 4);
427     cs.hideColumns(7, 11);
428     test = cs.locateVisibleBoundsOfSequence(seq);
429     assertEquals(Arrays.toString(new int[] { 1, 1, 11 }),
430             Arrays.toString(test));
431
432     cs.revealAllHiddenColumns(colsel);
433     cs.hideColumns(2, 4);
434     cs.hideColumns(7, 12);
435     test = cs.locateVisibleBoundsOfSequence(seq);
436     assertEquals(Arrays.toString(new int[] { 1, 1, 11 }),
437             Arrays.toString(test));
438
439     cs.revealAllHiddenColumns(colsel);
440     cs.hideColumns(1, 11);
441     test = cs.locateVisibleBoundsOfSequence(seq);
442     assertEquals(Arrays.toString(new int[] { 0, 1, 11 }),
443             Arrays.toString(test));
444
445     cs.revealAllHiddenColumns(colsel);
446     cs.hideColumns(0, 12);
447     test = cs.locateVisibleBoundsOfSequence(seq);
448     assertEquals(Arrays.toString(new int[] { 0, 1, 11 }),
449             Arrays.toString(test));
450
451     cs.revealAllHiddenColumns(colsel);
452     cs.hideColumns(0, 4);
453     cs.hideColumns(6, 12);
454     test = cs.locateVisibleBoundsOfSequence(seq);
455     assertEquals(Arrays.toString(new int[] { 0, 1, 11 }),
456             Arrays.toString(test));
457
458     cs.revealAllHiddenColumns(colsel);
459     cs.hideColumns(0, 1);
460     cs.hideColumns(3, 12);
461     test = cs.locateVisibleBoundsOfSequence(seq);
462     assertEquals(Arrays.toString(new int[] { 0, 1, 11 }),
463             Arrays.toString(test));
464
465     // These tests cover different behaviour to original
466     // locateVisibleBoundsOfSequence
467     // Previously first values of each were 3,9 and 6 respectively.
468     cs.revealAllHiddenColumns(colsel);
469     cs.hideColumns(3, 14);
470     cs.hideColumns(17, 19);
471     assertEquals(
472             Arrays.toString(
473                     new int[]
474             { 3, seq2.findIndex(seq2.getStart()) - 1,
475         seq2.findIndex(seq2.getEnd()) - 1 }),
476             Arrays.toString(cs.locateVisibleBoundsOfSequence(seq2)));
477
478     cs.revealAllHiddenColumns(colsel);
479     cs.hideColumns(3, 7);
480     cs.hideColumns(9, 14);
481     cs.hideColumns(17, 19);
482     assertEquals(
483             Arrays.toString(
484                     new int[]
485             { 9, seq2.findIndex(seq2.getStart()) - 1,
486         seq2.findIndex(seq2.getEnd()) - 1 }),
487             Arrays.toString(cs.locateVisibleBoundsOfSequence(seq2)));
488
489     cs.revealAllHiddenColumns(colsel);
490     cs.hideColumns(0, 1);
491     cs.hideColumns(3, 4);
492     cs.hideColumns(6, 8);
493     cs.hideColumns(10, 12);
494     test = cs.locateVisibleBoundsOfSequence(seq);
495     assertEquals(Arrays.toString(new int[] { 6, 1, 11 }),
496             Arrays.toString(test));
497
498   }
499
500   @Test(groups = { "Functional" })
501   public void testLocateVisibleBoundsPathologicals()
502   {
503     // test some pathological cases we missed
504     AlignmentI al = new Alignment(
505             new SequenceI[]
506     { new Sequence("refseqGaptest", "KTDVTI----------NFI-----G----L") });
507     HiddenColumns cs = new HiddenColumns();
508     cs.hideInsertionsFor(al.getSequenceAt(0));
509     assertEquals("G", ""
510             + al.getSequenceAt(0).getCharAt(cs.adjustForHiddenColumns(9)));
511
512   }
513
514   @Test(groups = { "Functional" })
515   public void testHideColumns()
516   {
517     // create random alignment
518     AlignmentGenerator gen = new AlignmentGenerator(false);
519     AlignmentI al = gen.generate(50, 20, 123, 5, 5);
520
521     ColumnSelection colsel = new ColumnSelection();
522     HiddenColumns cs = al.getHiddenColumns();
523     colsel.hideSelectedColumns(5, al.getHiddenColumns());
524     List<int[]> hidden = cs.getHiddenColumnsCopy();
525     assertEquals(1, hidden.size());
526     assertEquals("[5, 5]", Arrays.toString(hidden.get(0)));
527
528     colsel.hideSelectedColumns(3, al.getHiddenColumns());
529     hidden = cs.getHiddenColumnsCopy();
530     assertEquals(2, hidden.size());
531     // two hidden ranges, in order:
532     assertEquals(hidden.size(), cs.getHiddenColumnsCopy().size());
533     assertEquals("[3, 3]", Arrays.toString(hidden.get(0)));
534     assertEquals("[5, 5]", Arrays.toString(hidden.get(1)));
535
536     // hiding column 4 expands [3, 3] to [3, 4]
537     // and merges to [5, 5] to make [3, 5]
538     colsel.hideSelectedColumns(4, al.getHiddenColumns());
539     hidden = cs.getHiddenColumnsCopy();
540     assertEquals(1, hidden.size());
541     assertEquals("[3, 5]", Arrays.toString(hidden.get(0)));
542
543     // clear hidden columns (note they are added to selected)
544     cs.revealAllHiddenColumns(colsel);
545     // it is now actually null but getter returns an empty list
546     assertTrue(cs.getHiddenColumnsCopy().isEmpty());
547
548     cs.hideColumns(3, 6);
549     hidden = cs.getHiddenColumnsCopy();
550     int[] firstHiddenRange = hidden.get(0);
551     assertEquals("[3, 6]", Arrays.toString(firstHiddenRange));
552
553     // adding a subrange of already hidden should do nothing
554     cs.hideColumns(4, 5);
555     hidden = cs.getHiddenColumnsCopy();
556     assertEquals(1, hidden.size());
557     assertEquals("[3, 6]",
558             Arrays.toString(cs.getHiddenColumnsCopy().get(0)));
559     cs.hideColumns(3, 5);
560     hidden = cs.getHiddenColumnsCopy();
561     assertEquals(1, hidden.size());
562     assertEquals("[3, 6]",
563             Arrays.toString(cs.getHiddenColumnsCopy().get(0)));
564     cs.hideColumns(4, 6);
565     hidden = cs.getHiddenColumnsCopy();
566     assertEquals(1, hidden.size());
567     assertEquals("[3, 6]",
568             Arrays.toString(cs.getHiddenColumnsCopy().get(0)));
569     cs.hideColumns(3, 6);
570     hidden = cs.getHiddenColumnsCopy();
571     assertEquals(1, hidden.size());
572     assertEquals("[3, 6]",
573             Arrays.toString(cs.getHiddenColumnsCopy().get(0)));
574
575     cs.revealAllHiddenColumns(colsel);
576     cs.hideColumns(2, 4);
577     hidden = cs.getHiddenColumnsCopy();
578     assertEquals(1, hidden.size());
579     assertEquals("[2, 4]", Arrays.toString(hidden.get(0)));
580
581     // extend contiguous with 2 positions overlap
582     cs.hideColumns(3, 5);
583     hidden = cs.getHiddenColumnsCopy();
584     assertEquals(1, hidden.size());
585     assertEquals("[2, 5]", Arrays.toString(hidden.get(0)));
586
587     // extend contiguous with 1 position overlap
588     cs.hideColumns(5, 6);
589     hidden = cs.getHiddenColumnsCopy();
590     assertEquals(1, hidden.size());
591     assertEquals("[2, 6]", Arrays.toString(hidden.get(0)));
592
593     // extend contiguous with overlap both ends:
594     cs.hideColumns(1, 7);
595     hidden = cs.getHiddenColumnsCopy();
596     assertEquals(1, hidden.size());
597     assertEquals("[1, 7]", Arrays.toString(hidden.get(0)));
598   }
599
600   /**
601    * Test the method that reveals a range of hidden columns given the start
602    * column of the range
603    */
604   @Test(groups = { "Functional" })
605   public void testRevealHiddenColumns()
606   {
607     ColumnSelection colsel = new ColumnSelection();
608     HiddenColumns cs = new HiddenColumns();
609     cs.hideColumns(5, 8);
610     colsel.addElement(10);
611     cs.revealHiddenColumns(5, colsel);
612
613     // hiddenColumns now empty
614     assertEquals(0, cs.getSize());
615
616     // revealed columns are marked as selected (added to selection):
617     assertEquals("[10, 5, 6, 7, 8]", colsel.getSelected().toString());
618
619     // calling with a column other than the range start does nothing:
620     colsel = new ColumnSelection();
621     cs = new HiddenColumns();
622     cs.hideColumns(5, 8);
623
624     int prevSize = cs.getSize();
625     cs.revealHiddenColumns(6, colsel);
626     assertEquals(prevSize, cs.getSize());
627     assertTrue(colsel.getSelected().isEmpty());
628   }
629
630   @Test(groups = { "Functional" })
631   public void testRevealAllHiddenColumns()
632   {
633     HiddenColumns hidden = new HiddenColumns();
634     ColumnSelection colsel = new ColumnSelection();
635     hidden.hideColumns(5, 8);
636     hidden.hideColumns(2, 3);
637     colsel.addElement(11);
638     colsel.addElement(1);
639     hidden.revealAllHiddenColumns(colsel);
640
641     /*
642      * revealing hidden columns adds them (in order) to the (unordered)
643      * selection list
644      */
645
646     // hiddenColumns now empty
647     assertEquals(0, hidden.getSize());
648
649     assertEquals("[11, 1, 2, 3, 5, 6, 7, 8]",
650             colsel.getSelected().toString());
651   }
652
653   @Test(groups = { "Functional" })
654   public void testIsVisible()
655   {
656     HiddenColumns cs = new HiddenColumns();
657     cs.hideColumns(2, 4);
658     cs.hideColumns(6, 7);
659     assertTrue(cs.isVisible(0));
660     assertTrue(cs.isVisible(-99));
661     assertTrue(cs.isVisible(1));
662     assertFalse(cs.isVisible(2));
663     assertFalse(cs.isVisible(3));
664     assertFalse(cs.isVisible(4));
665     assertTrue(cs.isVisible(5));
666     assertFalse(cs.isVisible(6));
667     assertFalse(cs.isVisible(7));
668   }
669
670   /**
671    * Test for the case when a hidden range encloses more one already hidden
672    * range
673    */
674   @Test(groups = { "Functional" })
675   public void testHideColumns_subsumingHidden()
676   {
677     /*
678      * JAL-2370 bug scenario:
679      * two hidden ranges subsumed by a third
680      */
681     HiddenColumns cs = new HiddenColumns();
682     cs.hideColumns(49, 59);
683     cs.hideColumns(69, 79);
684     List<int[]> hidden = cs.getHiddenColumnsCopy();
685     assertEquals(2, hidden.size());
686     assertEquals("[49, 59]", Arrays.toString(hidden.get(0)));
687     assertEquals("[69, 79]", Arrays.toString(hidden.get(1)));
688
689     cs.hideColumns(48, 80);
690     hidden = cs.getHiddenColumnsCopy();
691     assertEquals(1, hidden.size());
692     assertEquals("[48, 80]", Arrays.toString(hidden.get(0)));
693
694     /*
695      * another...joining hidden ranges
696      */
697     cs = new HiddenColumns();
698     cs.hideColumns(10, 20);
699     cs.hideColumns(30, 40);
700     cs.hideColumns(50, 60);
701     // hiding 21-49 should merge to one range
702     cs.hideColumns(21, 49);
703     hidden = cs.getHiddenColumnsCopy();
704     assertEquals(1, hidden.size());
705     assertEquals("[10, 60]", Arrays.toString(hidden.get(0)));
706
707     /*
708      * another...left overlap, subsumption, right overlap,
709      * no overlap of existing hidden ranges
710      */
711     cs = new HiddenColumns();
712     cs.hideColumns(10, 20);
713     cs.hideColumns(10, 20);
714     cs.hideColumns(30, 35);
715     cs.hideColumns(40, 50);
716     cs.hideColumns(60, 70);
717
718     cs.hideColumns(15, 45);
719     hidden = cs.getHiddenColumnsCopy();
720     assertEquals(2, hidden.size());
721     assertEquals("[10, 50]", Arrays.toString(hidden.get(0)));
722     assertEquals("[60, 70]", Arrays.toString(hidden.get(1)));
723   }
724
725   @Test(groups = { "Functional" })
726   public void testHideBitset()
727   {
728     HiddenColumns cs;
729
730     BitSet one = new BitSet();
731
732     // one hidden range
733     one.set(1);
734     cs = new HiddenColumns();
735     cs.hideMarkedBits(one);
736     assertEquals(1, cs.getHiddenColumnsCopy().size());
737
738     one.set(2);
739     cs = new HiddenColumns();
740     cs.hideMarkedBits(one);
741     assertEquals(1, cs.getHiddenColumnsCopy().size());
742
743     one.set(3);
744     cs = new HiddenColumns();
745     cs.hideMarkedBits(one);
746     assertEquals(1, cs.getHiddenColumnsCopy().size());
747
748     // split
749     one.clear(2);
750     cs = new HiddenColumns();
751     cs.hideMarkedBits(one);
752     assertEquals(2, cs.getHiddenColumnsCopy().size());
753
754     assertEquals(0, cs.adjustForHiddenColumns(0));
755     assertEquals(2, cs.adjustForHiddenColumns(1));
756     assertEquals(4, cs.adjustForHiddenColumns(2));
757
758     // one again
759     one.clear(1);
760     cs = new HiddenColumns();
761     cs.hideMarkedBits(one);
762
763     assertEquals(1, cs.getHiddenColumnsCopy().size());
764
765     assertEquals(0, cs.adjustForHiddenColumns(0));
766     assertEquals(1, cs.adjustForHiddenColumns(1));
767     assertEquals(2, cs.adjustForHiddenColumns(2));
768     assertEquals(4, cs.adjustForHiddenColumns(3));
769   }
770
771   @Test(groups = { "Functional" })
772   public void testMarkHiddenRegions()
773   {
774     BitSet toMark, fromMark;
775     long seed = -3241532;
776     Random number = new Random(seed);
777     for (int n = 0; n < 1000; n++)
778     {
779       // create a random bitfield
780       toMark = BitSet
781               .valueOf(new long[]
782       { number.nextLong(), number.nextLong(), number.nextLong() });
783       toMark.set(n * number.nextInt(10), n * (25 + number.nextInt(25)));
784       HiddenColumns hc = new HiddenColumns();
785       hc.hideMarkedBits(toMark);
786
787       // see if we can recover bitfield
788       hc.markHiddenRegions(fromMark = new BitSet());
789       assertEquals(toMark, fromMark);
790     }
791   }
792
793   @Test(groups = { "Functional" })
794   public void testFindHiddenRegionPositions()
795   {
796     HiddenColumns hc = new HiddenColumns();
797
798     List<Integer> positions = hc.findHiddenRegionPositions(0, 20);
799     assertTrue(positions.isEmpty());
800
801     hc.hideColumns(3, 7);
802     hc.hideColumns(10, 10);
803     hc.hideColumns(14, 15);
804
805     positions = hc.findHiddenRegionPositions(0, 20);
806     assertEquals(3, positions.size());
807     assertEquals(3, positions.get(0).intValue());
808     assertEquals(5, positions.get(1).intValue());
809     assertEquals(8, positions.get(2).intValue());
810
811     positions = hc.findHiddenRegionPositions(7, 20);
812     assertEquals(2, positions.size());
813     assertEquals(5, positions.get(0).intValue());
814     assertEquals(8, positions.get(1).intValue());
815
816     positions = hc.findHiddenRegionPositions(11, 13);
817     assertEquals(0, positions.size());
818
819     positions = hc.findHiddenRegionPositions(7, 20);
820     assertEquals(2, positions.size());
821     assertEquals(5, positions.get(0).intValue());
822     assertEquals(8, positions.get(1).intValue());
823
824     positions = hc.findHiddenRegionPositions(0, 1);
825     assertEquals(0, positions.size());
826
827     positions = hc.findHiddenRegionPositions(17, 20);
828     assertEquals(0, positions.size());
829
830     positions = hc.findHiddenRegionPositions(10, 15);
831     assertEquals(2, positions.size());
832     assertEquals(5, positions.get(0).intValue());
833     assertEquals(8, positions.get(1).intValue());
834   }
835
836   @Test(groups = { "Functional" })
837   public void testRegionsToString()
838   {
839     HiddenColumns hc = new HiddenColumns();
840
841     String result = hc.regionsToString(",", "--");
842     assertEquals("", result);
843
844     hc.hideColumns(3, 7);
845     hc.hideColumns(10, 10);
846     hc.hideColumns(14, 15);
847
848     result = hc.regionsToString(",", "--");
849     assertEquals("3--7,10--10,14--15", result);
850   }
851
852   @Test(groups = "Functional")
853   public void testGetVisibleStartAndEndIndexTest()
854   {
855     Sequence seq = new Sequence("testSeq", "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
856     AlignmentI align = new Alignment(new SequenceI[] { seq });
857     HiddenColumns hc = new HiddenColumns();
858
859     int[] startEnd = hc.getVisibleStartAndEndIndex(align.getWidth());
860     assertEquals(0, startEnd[0]);
861     assertEquals(25, startEnd[1]);
862
863     hc.hideColumns(0, 0);
864     startEnd = hc.getVisibleStartAndEndIndex(align.getWidth());
865     assertEquals(1, startEnd[0]);
866     assertEquals(25, startEnd[1]);
867
868     hc.hideColumns(6, 9);
869     hc.hideColumns(11, 12);
870     startEnd = hc.getVisibleStartAndEndIndex(align.getWidth());
871     assertEquals(1, startEnd[0]);
872     assertEquals(25, startEnd[1]);
873
874     hc.hideColumns(24, 25);
875     startEnd = hc.getVisibleStartAndEndIndex(align.getWidth());
876     System.out.println(startEnd[0] + " : " + startEnd[1]);
877     assertEquals(1, startEnd[0]);
878     assertEquals(23, startEnd[1]);
879   }
880
881   @Test(groups = "Functional")
882   public void testGetRegionWithEdgeAtRes()
883   {
884     HiddenColumns hc = new HiddenColumns();
885
886     int[] result = hc.getRegionWithEdgeAtRes(5);
887     assertNull(result);
888
889     hc.hideColumns(3, 7);
890     hc.hideColumns(10, 10);
891     hc.hideColumns(14, 15);
892
893     result = hc.getRegionWithEdgeAtRes(2);
894     assertEquals(3, result[0]);
895     assertEquals(7, result[1]);
896
897     result = hc.getRegionWithEdgeAtRes(5);
898     assertEquals(10, result[0]);
899     assertEquals(10, result[1]);
900
901     result = hc.getRegionWithEdgeAtRes(6);
902     assertNull(result);
903
904     result = hc.getRegionWithEdgeAtRes(0);
905     assertNull(result);
906
907     result = hc.getRegionWithEdgeAtRes(7);
908     assertEquals(14, result[0]);
909     assertEquals(15, result[1]);
910
911     result = hc.getRegionWithEdgeAtRes(8);
912     assertEquals(14, result[0]);
913     assertEquals(15, result[1]);
914   }
915
916   @Test(groups = "Functional")
917   public void testPropagateInsertions()
918   {
919     // create an alignment with no gaps - this will be the profile seq and other
920     // JPRED seqs
921     AlignmentGenerator gen = new AlignmentGenerator(false);
922     AlignmentI al = gen.generate(25, 10, 1234, 0, 0);
923
924     // get the profileseq
925     SequenceI profileseq = al.getSequenceAt(0);
926     SequenceI gappedseq = new Sequence(profileseq);
927     gappedseq.insertCharAt(5, al.getGapCharacter());
928     gappedseq.insertCharAt(6, al.getGapCharacter());
929     gappedseq.insertCharAt(7, al.getGapCharacter());
930     gappedseq.insertCharAt(8, al.getGapCharacter());
931
932     // create an alignment view with the gapped sequence
933     SequenceI[] seqs = new SequenceI[1];
934     seqs[0] = gappedseq;
935     AlignmentI newal = new Alignment(seqs);
936     HiddenColumns hidden = new HiddenColumns();
937     hidden.hideColumns(15, 17);
938
939     AlignmentView view = new AlignmentView(newal, hidden, null, true, false,
940             false);
941
942     // confirm that original contigs are as expected
943     int[] oldcontigs = hidden.getVisibleContigs(0, 25);
944     int[] testcontigs = { 0, 14, 18, 24 };
945     assertTrue(Arrays.equals(oldcontigs, testcontigs));
946
947     // propagate insertions
948     HiddenColumns result = HiddenColumns.propagateInsertions(profileseq, al,
949             view);
950
951     // confirm that the contigs have changed to account for the gaps
952     int[] newcontigs = result.getVisibleContigs(0, 25);
953     testcontigs[1] = 10;
954     testcontigs[2] = 14;
955     assertTrue(Arrays.equals(newcontigs, testcontigs));
956
957     // confirm the alignment has been changed so that the other sequences have
958     // gaps inserted where the columns are hidden
959     assertFalse(Comparison.isGap(al.getSequenceAt(1).getSequence()[10]));
960     assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[11]));
961     assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[12]));
962     assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[13]));
963     assertFalse(Comparison.isGap(al.getSequenceAt(1).getSequence()[14]));
964
965   }
966
967   @Test(groups = "Functional")
968   public void testPropagateInsertionsOverlap()
969   {
970     // test propagateInsertions where gaps and hiddenColumns overlap
971
972     // create an alignment with no gaps - this will be the profile seq and other
973     // JPRED seqs
974     AlignmentGenerator gen = new AlignmentGenerator(false);
975     AlignmentI al = gen.generate(20, 10, 1234, 0, 0);
976
977     // get the profileseq
978     SequenceI profileseq = al.getSequenceAt(0);
979     SequenceI gappedseq = new Sequence(profileseq);
980     gappedseq.insertCharAt(5, al.getGapCharacter());
981     gappedseq.insertCharAt(6, al.getGapCharacter());
982     gappedseq.insertCharAt(7, al.getGapCharacter());
983     gappedseq.insertCharAt(8, al.getGapCharacter());
984
985     // create an alignment view with the gapped sequence
986     SequenceI[] seqs = new SequenceI[1];
987     seqs[0] = gappedseq;
988     AlignmentI newal = new Alignment(seqs);
989
990     // hide columns so that some overlap with the gaps
991     HiddenColumns hidden = new HiddenColumns();
992     hidden.hideColumns(7, 10);
993
994     AlignmentView view = new AlignmentView(newal, hidden, null, true, false,
995             false);
996
997     // confirm that original contigs are as expected
998     int[] oldcontigs = hidden.getVisibleContigs(0, 20);
999     int[] testcontigs = { 0, 6, 11, 19 };
1000     assertTrue(Arrays.equals(oldcontigs, testcontigs));
1001
1002     // propagate insertions
1003     HiddenColumns result = HiddenColumns.propagateInsertions(profileseq, al,
1004             view);
1005
1006     // confirm that the contigs have changed to account for the gaps
1007     int[] newcontigs = result.getVisibleContigs(0, 20);
1008     testcontigs[1] = 4;
1009     testcontigs[2] = 7;
1010     assertTrue(Arrays.equals(newcontigs, testcontigs));
1011
1012     // confirm the alignment has been changed so that the other sequences have
1013     // gaps inserted where the columns are hidden
1014     assertFalse(Comparison.isGap(al.getSequenceAt(1).getSequence()[4]));
1015     assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[5]));
1016     assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[6]));
1017     assertFalse(Comparison.isGap(al.getSequenceAt(1).getSequence()[7]));
1018   }
1019
1020   @Test(groups = "Functional")
1021   public void testHasHiddenColumns()
1022   {
1023     HiddenColumns h = new HiddenColumns();
1024
1025     // new HiddenColumns2 has no hidden cols
1026     assertFalse(h.hasHiddenColumns());
1027
1028     // some columns hidden, returns true
1029     h.hideColumns(5, 10);
1030     assertTrue(h.hasHiddenColumns());
1031
1032     // reveal columns, no hidden cols again
1033     ColumnSelection sel = new ColumnSelection();
1034     h.revealAllHiddenColumns(sel);
1035     assertFalse(h.hasHiddenColumns());
1036   }
1037
1038   @Test(groups = "Functional")
1039   public void testHasManyHiddenColumns()
1040   {
1041     HiddenColumns h = new HiddenColumns();
1042
1043     // new HiddenColumns2 has no hidden cols
1044     assertFalse(h.hasManyHiddenColumns());
1045
1046     // one set of columns hidden, returns false
1047     h.hideColumns(5, 10);
1048     assertFalse(h.hasManyHiddenColumns());
1049
1050     // two sets hidden, returns true
1051     h.hideColumns(15, 17);
1052     assertTrue(h.hasManyHiddenColumns());
1053
1054     // back to one block, asserts false
1055     h.hideColumns(11, 14);
1056     assertFalse(h.hasManyHiddenColumns());
1057   }
1058
1059   @Test(groups = "Functional")
1060   public void testAdjustForHiddenColumns()
1061   {
1062     HiddenColumns h = new HiddenColumns();
1063     // returns input value when there are no hidden columns
1064     assertEquals(10, h.adjustForHiddenColumns(10));
1065
1066     h.hideColumns(20, 30);
1067     assertEquals(10, h.adjustForHiddenColumns(10));
1068     assertEquals(20 + 11, h.adjustForHiddenColumns(20));
1069     assertEquals(35 + 11, h.adjustForHiddenColumns(35));
1070
1071     h.hideColumns(5, 7);
1072     assertEquals(10 + 3, h.adjustForHiddenColumns(10));
1073     assertEquals(20 + 14, h.adjustForHiddenColumns(20));
1074     assertEquals(35 + 14, h.adjustForHiddenColumns(35));
1075
1076     ColumnSelection sel = new ColumnSelection();
1077     h.revealAllHiddenColumns(sel);
1078     h.hideColumns(0, 1);
1079     assertEquals(4, h.adjustForHiddenColumns(2));
1080   }
1081
1082   @Test(groups = "Functional")
1083   public void testGetHiddenBoundaryLeft()
1084   {
1085     HiddenColumns h = new HiddenColumns();
1086
1087     // returns same value if no hidden cols
1088     assertEquals(3, h.getHiddenBoundaryLeft(3));
1089
1090     h.hideColumns(5, 10);
1091     assertEquals(10, h.getHiddenBoundaryLeft(15));
1092     assertEquals(3, h.getHiddenBoundaryLeft(3));
1093     assertEquals(7, h.getHiddenBoundaryLeft(7));
1094
1095     h.hideColumns(15, 20);
1096     assertEquals(10, h.getHiddenBoundaryLeft(15));
1097     assertEquals(20, h.getHiddenBoundaryLeft(21));
1098   }
1099
1100   @Test(groups = "Functional")
1101   public void testGetHiddenBoundaryRight()
1102   {
1103     HiddenColumns h = new HiddenColumns();
1104
1105     // returns same value if no hidden cols
1106     assertEquals(3, h.getHiddenBoundaryRight(3));
1107
1108     h.hideColumns(5, 10);
1109     assertEquals(5, h.getHiddenBoundaryRight(3));
1110     assertEquals(15, h.getHiddenBoundaryRight(15));
1111     assertEquals(7, h.getHiddenBoundaryRight(7));
1112
1113     h.hideColumns(15, 20);
1114     assertEquals(15, h.getHiddenBoundaryRight(7));
1115     assertEquals(15, h.getHiddenBoundaryRight(14));
1116   }
1117
1118   @Test(groups = "Functional")
1119   public void testGetHiddenColumnsCopy()
1120   {
1121     HiddenColumns h = new HiddenColumns();
1122     ArrayList<int[]> result = h.getHiddenColumnsCopy();
1123     assertTrue(result.isEmpty());
1124
1125     h.hideColumns(5, 10);
1126     result = h.getHiddenColumnsCopy();
1127     assertEquals(1, result.size());
1128     assertEquals(5, result.get(0)[0]);
1129     assertEquals(10, result.get(0)[1]);
1130
1131     h.hideColumns(22, 23);
1132     result = h.getHiddenColumnsCopy();
1133     assertEquals(2, result.size());
1134     assertEquals(5, result.get(0)[0]);
1135     assertEquals(10, result.get(0)[1]);
1136     assertEquals(22, result.get(1)[0]);
1137     assertEquals(23, result.get(1)[1]);
1138
1139     // test for only one hidden region at start of alignment
1140     ColumnSelection sel = new ColumnSelection();
1141     h.revealAllHiddenColumns(sel);
1142     h.hideColumns(0, 1);
1143     result = h.getHiddenColumnsCopy();
1144     assertEquals(1, result.size());
1145     assertEquals(0, result.get(0)[0]);
1146     assertEquals(1, result.get(0)[1]);
1147   }
1148
1149   @Test(groups = "Functional")
1150   public void testGetVisibleSequenceStrings()
1151   {
1152     HiddenColumns h = new HiddenColumns();
1153     SequenceI seq1 = new Sequence("TEST1", "GALMFWKQESPVICYHRNDT");
1154     SequenceI seq2 = new Sequence("TEST2", "VICYHRNDTGA");
1155     SequenceI[] seqs = new SequenceI[2];
1156     seqs[0] = seq1;
1157     seqs[1] = seq2;
1158     String[] result = h.getVisibleSequenceStrings(5, 10, seqs);
1159     assertEquals(2, result.length);
1160     assertEquals("WKQES", result[0]);
1161     assertEquals("RNDTG", result[1]);
1162
1163     h.hideColumns(6, 8);
1164     result = h.getVisibleSequenceStrings(5, 10, seqs);
1165     assertEquals(2, result.length);
1166     assertEquals("WS", result[0]);
1167     assertEquals("RG", result[1]);
1168
1169     SequenceI seq = new Sequence("RefSeq", "-A-SD-ASD--E---");
1170     ColumnSelection sel = new ColumnSelection();
1171     h.revealAllHiddenColumns(sel);
1172     h.hideColumns(1, 3);
1173     h.hideColumns(6, 11);
1174     assertEquals("-D",
1175             h.getVisibleSequenceStrings(0, 5, new SequenceI[]
1176     { seq })[0]);
1177   }
1178
1179   @Test(groups = "Functional")
1180   public void testHideInsertionsFor()
1181   {
1182     HiddenColumns h = new HiddenColumns();
1183     HiddenColumns h2 = new HiddenColumns();
1184     SequenceI seq1 = new Sequence("TEST1", "GAL---MFW-KQESPVICY--HRNDT");
1185     SequenceI seq2 = new Sequence("TEST1", "GALMFWKQESPVICYHRNDT");
1186
1187     h.hideInsertionsFor(seq2);
1188     assertTrue(h.equals(h2));
1189
1190     h.hideInsertionsFor(seq1);
1191     h2.hideColumns(3, 5);
1192     h2.hideColumns(9, 9);
1193     h2.hideColumns(19, 20);
1194     assertTrue(h.equals(h2));
1195   }
1196
1197   @Test(groups = "Functional")
1198   public void testHideMarkedBits()
1199   {
1200     HiddenColumns h = new HiddenColumns();
1201     HiddenColumns h2 = new HiddenColumns();
1202
1203     BitSet tohide = new BitSet(21);
1204     h.hideMarkedBits(tohide);
1205     assertTrue(h.equals(h2));
1206
1207     // NB in hideMarkedBits, the last bit is not set to hidden
1208     tohide.set(3, 6);
1209     tohide.set(9);
1210     tohide.set(19, 21);
1211     h.hideMarkedBits(tohide);
1212
1213     h2.hideColumns(3, 5);
1214     h2.hideColumns(9, 9);
1215     h2.hideColumns(19, 20);
1216     assertTrue(h.equals(h2));
1217   }
1218
1219   @Test(groups = "Functional")
1220   public void testMakeVisibleAnnotation()
1221   {
1222     HiddenColumns h = new HiddenColumns();
1223     Annotation[] anns = new Annotation[] { null, null, new Annotation(1),
1224         new Annotation(2), new Annotation(3), null, null, new Annotation(4),
1225         new Annotation(5), new Annotation(6), new Annotation(7),
1226         new Annotation(8) };
1227     AlignmentAnnotation ann = new AlignmentAnnotation("an", "some an",
1228             anns);
1229
1230     // without hidden cols, just truncates
1231     h.makeVisibleAnnotation(3, 5, ann);
1232     assertEquals(3, ann.annotations.length);
1233     assertEquals(2.0f, ann.annotations[0].value);
1234     assertEquals(3.0f, ann.annotations[1].value);
1235     assertNull(ann.annotations[2]);
1236
1237     anns = new Annotation[] { null, null, new Annotation(1),
1238         new Annotation(2), new Annotation(3), null, null, new Annotation(4),
1239         new Annotation(5), new Annotation(6), new Annotation(7),
1240         new Annotation(8) };
1241     ann = new AlignmentAnnotation("an", "some an", anns);
1242     h.hideColumns(4, 7);
1243     h.makeVisibleAnnotation(1, 9, ann);
1244     assertEquals(5, ann.annotations.length);
1245     assertNull(ann.annotations[0]);
1246     assertEquals(1.0f, ann.annotations[1].value);
1247     assertEquals(2.0f, ann.annotations[2].value);
1248     assertEquals(5.0f, ann.annotations[3].value);
1249     assertEquals(6.0f, ann.annotations[4].value);
1250
1251     anns = new Annotation[] { null, null, new Annotation(1),
1252         new Annotation(2), new Annotation(3), null, null, new Annotation(4),
1253         new Annotation(5), new Annotation(6), new Annotation(7),
1254         new Annotation(8) };
1255     ann = new AlignmentAnnotation("an", "some an", anns);
1256     h.hideColumns(1, 2);
1257     h.makeVisibleAnnotation(1, 9, ann);
1258     assertEquals(3, ann.annotations.length);
1259     assertEquals(2.0f, ann.annotations[0].value);
1260     assertEquals(5.0f, ann.annotations[1].value);
1261     assertEquals(6.0f, ann.annotations[2].value);
1262   }
1263
1264   @Test(groups = "Functional")
1265   public void testSubtractVisibleColumns()
1266   {
1267     HiddenColumns h = new HiddenColumns();
1268     int result = h.subtractVisibleColumns(1, 10);
1269     assertEquals(9, result);
1270
1271     h.hideColumns(7, 9);
1272     result = h.subtractVisibleColumns(4, 10);
1273     assertEquals(3, result);
1274
1275     h.hideColumns(14, 15);
1276     result = h.subtractVisibleColumns(4, 10);
1277     assertEquals(3, result);
1278
1279     result = h.subtractVisibleColumns(10, 17);
1280     assertEquals(2, result);
1281
1282     result = h.subtractVisibleColumns(1, 7);
1283     assertEquals(5, result);
1284
1285     result = h.subtractVisibleColumns(1, 8);
1286     assertEquals(5, result);
1287
1288     result = h.subtractVisibleColumns(3, 15);
1289     assertEquals(10, result);
1290
1291     ColumnSelection sel = new ColumnSelection();
1292     h.revealAllHiddenColumns(sel);
1293     h.hideColumns(0, 30);
1294     result = h.subtractVisibleColumns(31, 0);
1295     assertEquals(-31, result);
1296
1297   }
1298
1299 }