JAL-2674 Reset tests
[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();
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();
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
812   @Test(groups = { "Functional" })
813   public void testRegionsToString()
814   {
815     HiddenColumns hc = new HiddenColumns();
816
817     String result = hc.regionsToString(",", "--");
818     assertEquals("", result);
819
820     hc.hideColumns(3, 7);
821     hc.hideColumns(10, 10);
822     hc.hideColumns(14, 15);
823
824     result = hc.regionsToString(",", "--");
825     assertEquals("3--7,10--10,14--15", result);
826   }
827
828   @Test(groups = "Functional")
829   public void testGetVisibleStartAndEndIndexTest()
830   {
831     Sequence seq = new Sequence("testSeq", "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
832     AlignmentI align = new Alignment(new SequenceI[] { seq });
833     HiddenColumns hc = new HiddenColumns();
834
835     int[] startEnd = hc.getVisibleStartAndEndIndex(align.getWidth());
836     assertEquals(0, startEnd[0]);
837     assertEquals(25, startEnd[1]);
838
839     hc.hideColumns(0, 0);
840     startEnd = hc.getVisibleStartAndEndIndex(align.getWidth());
841     assertEquals(1, startEnd[0]);
842     assertEquals(25, startEnd[1]);
843
844     hc.hideColumns(6, 9);
845     hc.hideColumns(11, 12);
846     startEnd = hc.getVisibleStartAndEndIndex(align.getWidth());
847     assertEquals(1, startEnd[0]);
848     assertEquals(25, startEnd[1]);
849
850     hc.hideColumns(24, 25);
851     startEnd = hc.getVisibleStartAndEndIndex(align.getWidth());
852     System.out.println(startEnd[0] + " : " + startEnd[1]);
853     assertEquals(1, startEnd[0]);
854     assertEquals(23, startEnd[1]);
855   }
856
857   @Test(groups = "Functional")
858   public void testGetRegionWithEdgeAtRes()
859   {
860     HiddenColumns hc = new HiddenColumns();
861
862     int[] result = hc.getRegionWithEdgeAtRes(5);
863     assertNull(result);
864
865     hc.hideColumns(3, 7);
866     hc.hideColumns(10, 10);
867     hc.hideColumns(14, 15);
868
869     result = hc.getRegionWithEdgeAtRes(2);
870     assertEquals(3, result[0]);
871     assertEquals(7, result[1]);
872
873     result = hc.getRegionWithEdgeAtRes(5);
874     assertEquals(10, result[0]);
875     assertEquals(10, result[1]);
876
877     result = hc.getRegionWithEdgeAtRes(6);
878     assertNull(result);
879
880     result = hc.getRegionWithEdgeAtRes(0);
881     assertNull(result);
882
883     result = hc.getRegionWithEdgeAtRes(7);
884     assertEquals(14, result[0]);
885     assertEquals(15, result[1]);
886
887     result = hc.getRegionWithEdgeAtRes(8);
888     assertEquals(14, result[0]);
889     assertEquals(15, result[1]);
890   }
891
892   @Test(groups = "Functional")
893   public void testPropagateInsertions()
894   {
895     // create an alignment with no gaps - this will be the profile seq and other
896     // JPRED seqs
897     AlignmentGenerator gen = new AlignmentGenerator(false);
898     AlignmentI al = gen.generate(25, 10, 1234, 0, 0);
899
900     // get the profileseq
901     SequenceI profileseq = al.getSequenceAt(0);
902     SequenceI gappedseq = new Sequence(profileseq);
903     gappedseq.insertCharAt(5, al.getGapCharacter());
904     gappedseq.insertCharAt(6, al.getGapCharacter());
905     gappedseq.insertCharAt(7, al.getGapCharacter());
906     gappedseq.insertCharAt(8, al.getGapCharacter());
907
908     // create an alignment view with the gapped sequence
909     SequenceI[] seqs = new SequenceI[1];
910     seqs[0] = gappedseq;
911     AlignmentI newal = new Alignment(seqs);
912     HiddenColumns hidden = new HiddenColumns();
913     hidden.hideColumns(15, 17);
914
915     AlignmentView view = new AlignmentView(newal, hidden, null, true, false,
916             false);
917
918     // confirm that original contigs are as expected
919     int[] oldcontigs = hidden.getVisibleContigs(0, 25);
920     int[] testcontigs = { 0, 14, 18, 24 };
921     assertTrue(Arrays.equals(oldcontigs, testcontigs));
922
923     // propagate insertions
924     HiddenColumns result = HiddenColumns.propagateInsertions(profileseq, al,
925             view);
926
927     // confirm that the contigs have changed to account for the gaps
928     int[] newcontigs = result.getVisibleContigs(0, 25);
929     testcontigs[1] = 10;
930     testcontigs[2] = 14;
931     assertTrue(Arrays.equals(newcontigs, testcontigs));
932
933     // confirm the alignment has been changed so that the other sequences have
934     // gaps inserted where the columns are hidden
935     assertFalse(Comparison.isGap(al.getSequenceAt(1).getSequence()[10]));
936     assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[11]));
937     assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[12]));
938     assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[13]));
939     assertFalse(Comparison.isGap(al.getSequenceAt(1).getSequence()[14]));
940
941   }
942
943   @Test(groups = "Functional")
944   public void testPropagateInsertionsOverlap()
945   {
946     // test propagateInsertions where gaps and hiddenColumns overlap
947
948     // create an alignment with no gaps - this will be the profile seq and other
949     // JPRED seqs
950     AlignmentGenerator gen = new AlignmentGenerator(false);
951     AlignmentI al = gen.generate(20, 10, 1234, 0, 0);
952
953     // get the profileseq
954     SequenceI profileseq = al.getSequenceAt(0);
955     SequenceI gappedseq = new Sequence(profileseq);
956     gappedseq.insertCharAt(5, al.getGapCharacter());
957     gappedseq.insertCharAt(6, al.getGapCharacter());
958     gappedseq.insertCharAt(7, al.getGapCharacter());
959     gappedseq.insertCharAt(8, al.getGapCharacter());
960
961     // create an alignment view with the gapped sequence
962     SequenceI[] seqs = new SequenceI[1];
963     seqs[0] = gappedseq;
964     AlignmentI newal = new Alignment(seqs);
965
966     // hide columns so that some overlap with the gaps
967     HiddenColumns hidden = new HiddenColumns();
968     hidden.hideColumns(7, 10);
969
970     AlignmentView view = new AlignmentView(newal, hidden, null, true, false,
971             false);
972
973     // confirm that original contigs are as expected
974     int[] oldcontigs = hidden.getVisibleContigs(0, 20);
975     int[] testcontigs = { 0, 6, 11, 19 };
976     assertTrue(Arrays.equals(oldcontigs, testcontigs));
977
978     // propagate insertions
979     HiddenColumns result = HiddenColumns.propagateInsertions(profileseq, al,
980             view);
981
982     // confirm that the contigs have changed to account for the gaps
983     int[] newcontigs = result.getVisibleContigs(0, 20);
984     testcontigs[1] = 4;
985     testcontigs[2] = 7;
986     assertTrue(Arrays.equals(newcontigs, testcontigs));
987
988     // confirm the alignment has been changed so that the other sequences have
989     // gaps inserted where the columns are hidden
990     assertFalse(Comparison.isGap(al.getSequenceAt(1).getSequence()[4]));
991     assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[5]));
992     assertTrue(Comparison.isGap(al.getSequenceAt(1).getSequence()[6]));
993     assertFalse(Comparison.isGap(al.getSequenceAt(1).getSequence()[7]));
994   }
995
996   @Test(groups = "Functional")
997   public void testHasHiddenColumns()
998   {
999     HiddenColumns h = new HiddenColumns();
1000
1001     // new HiddenColumns2 has no hidden cols
1002     assertFalse(h.hasHiddenColumns());
1003
1004     // some columns hidden, returns true
1005     h.hideColumns(5, 10);
1006     assertTrue(h.hasHiddenColumns());
1007
1008     // reveal columns, no hidden cols again
1009     ColumnSelection sel = new ColumnSelection();
1010     h.revealAllHiddenColumns(sel);
1011     assertFalse(h.hasHiddenColumns());
1012   }
1013
1014   @Test(groups = "Functional")
1015   public void testHasManyHiddenColumns()
1016   {
1017     HiddenColumns h = new HiddenColumns();
1018
1019     // new HiddenColumns2 has no hidden cols
1020     assertFalse(h.hasManyHiddenColumns());
1021
1022     // one set of columns hidden, returns false
1023     h.hideColumns(5, 10);
1024     assertFalse(h.hasManyHiddenColumns());
1025
1026     // two sets hidden, returns true
1027     h.hideColumns(15, 17);
1028     assertTrue(h.hasManyHiddenColumns());
1029
1030     // back to one block, asserts false
1031     h.hideColumns(11, 14);
1032     assertFalse(h.hasManyHiddenColumns());
1033   }
1034
1035   @Test(groups = "Functional")
1036   public void testAdjustForHiddenColumns()
1037   {
1038     HiddenColumns h = new HiddenColumns();
1039     // returns input value when there are no hidden columns
1040     assertEquals(10, h.adjustForHiddenColumns(10));
1041
1042     h.hideColumns(20, 30);
1043     assertEquals(10, h.adjustForHiddenColumns(10));
1044     assertEquals(20 + 11, h.adjustForHiddenColumns(20));
1045     assertEquals(35 + 11, h.adjustForHiddenColumns(35));
1046
1047     h.hideColumns(5, 7);
1048     assertEquals(10 + 3, h.adjustForHiddenColumns(10));
1049     assertEquals(20 + 14, h.adjustForHiddenColumns(20));
1050     assertEquals(35 + 14, h.adjustForHiddenColumns(35));
1051
1052     ColumnSelection sel = new ColumnSelection();
1053     h.revealAllHiddenColumns(sel);
1054     h.hideColumns(0, 1);
1055     assertEquals(4, h.adjustForHiddenColumns(2));
1056   }
1057
1058   @Test(groups = "Functional")
1059   public void testGetHiddenBoundaryLeft()
1060   {
1061     HiddenColumns h = new HiddenColumns();
1062
1063     // returns same value if no hidden cols
1064     assertEquals(3, h.getHiddenBoundaryLeft(3));
1065
1066     h.hideColumns(5, 10);
1067     assertEquals(10, h.getHiddenBoundaryLeft(15));
1068     assertEquals(3, h.getHiddenBoundaryLeft(3));
1069     assertEquals(7, h.getHiddenBoundaryLeft(7));
1070
1071     h.hideColumns(15, 20);
1072     assertEquals(10, h.getHiddenBoundaryLeft(15));
1073     assertEquals(20, h.getHiddenBoundaryLeft(21));
1074   }
1075
1076   @Test(groups = "Functional")
1077   public void testGetHiddenBoundaryRight()
1078   {
1079     HiddenColumns h = new HiddenColumns();
1080
1081     // returns same value if no hidden cols
1082     assertEquals(3, h.getHiddenBoundaryRight(3));
1083
1084     h.hideColumns(5, 10);
1085     assertEquals(5, h.getHiddenBoundaryRight(3));
1086     assertEquals(15, h.getHiddenBoundaryRight(15));
1087     assertEquals(7, h.getHiddenBoundaryRight(7));
1088
1089     h.hideColumns(15, 20);
1090     assertEquals(15, h.getHiddenBoundaryRight(7));
1091     assertEquals(15, h.getHiddenBoundaryRight(14));
1092   }
1093
1094   @Test(groups = "Functional")
1095   public void testGetHiddenColumnsCopy()
1096   {
1097     HiddenColumns h = new HiddenColumns();
1098     ArrayList<int[]> result = h.getHiddenColumnsCopy();
1099     assertTrue(result.isEmpty());
1100
1101     h.hideColumns(5, 10);
1102     result = h.getHiddenColumnsCopy();
1103     assertEquals(1, result.size());
1104     assertEquals(5, result.get(0)[0]);
1105     assertEquals(10, result.get(0)[1]);
1106
1107     h.hideColumns(22, 23);
1108     result = h.getHiddenColumnsCopy();
1109     assertEquals(2, result.size());
1110     assertEquals(5, result.get(0)[0]);
1111     assertEquals(10, result.get(0)[1]);
1112     assertEquals(22, result.get(1)[0]);
1113     assertEquals(23, result.get(1)[1]);
1114
1115     // test for only one hidden region at start of alignment
1116     ColumnSelection sel = new ColumnSelection();
1117     h.revealAllHiddenColumns(sel);
1118     h.hideColumns(0, 1);
1119     result = h.getHiddenColumnsCopy();
1120     assertEquals(1, result.size());
1121     assertEquals(0, result.get(0)[0]);
1122     assertEquals(1, result.get(0)[1]);
1123   }
1124
1125   @Test(groups = "Functional")
1126   public void testGetVisibleSequenceStrings()
1127   {
1128     HiddenColumns h = new HiddenColumns();
1129     SequenceI seq1 = new Sequence("TEST1", "GALMFWKQESPVICYHRNDT");
1130     SequenceI seq2 = new Sequence("TEST2", "VICYHRNDTGA");
1131     SequenceI[] seqs = new SequenceI[2];
1132     seqs[0] = seq1;
1133     seqs[1] = seq2;
1134     String[] result = h.getVisibleSequenceStrings(5, 10, seqs);
1135     assertEquals(2, result.length);
1136     assertEquals("WKQES", result[0]);
1137     assertEquals("RNDTG", result[1]);
1138
1139     h.hideColumns(6, 8);
1140     result = h.getVisibleSequenceStrings(5, 10, seqs);
1141     assertEquals(2, result.length);
1142     assertEquals("WS", result[0]);
1143     assertEquals("RG", result[1]);
1144
1145     SequenceI seq = new Sequence("RefSeq", "-A-SD-ASD--E---");
1146     ColumnSelection sel = new ColumnSelection();
1147     h.revealAllHiddenColumns(sel);
1148     h.hideColumns(1, 3);
1149     h.hideColumns(6, 11);
1150     assertEquals("-D",
1151             h.getVisibleSequenceStrings(0, 5, new SequenceI[]
1152     { seq })[0]);
1153   }
1154
1155   @Test(groups = "Functional")
1156   public void testHideInsertionsFor()
1157   {
1158     HiddenColumns h = new HiddenColumns();
1159     HiddenColumns h2 = new HiddenColumns();
1160     SequenceI seq1 = new Sequence("TEST1", "GAL---MFW-KQESPVICY--HRNDT");
1161     SequenceI seq2 = new Sequence("TEST1", "GALMFWKQESPVICYHRNDT");
1162
1163     h.hideInsertionsFor(seq2);
1164     assertTrue(h.equals(h2));
1165
1166     h.hideInsertionsFor(seq1);
1167     h2.hideColumns(3, 5);
1168     h2.hideColumns(9, 9);
1169     h2.hideColumns(19, 20);
1170     assertTrue(h.equals(h2));
1171   }
1172
1173   @Test(groups = "Functional")
1174   public void testHideMarkedBits()
1175   {
1176     HiddenColumns h = new HiddenColumns();
1177     HiddenColumns h2 = new HiddenColumns();
1178
1179     BitSet tohide = new BitSet(21);
1180     h.hideMarkedBits(tohide);
1181     assertTrue(h.equals(h2));
1182
1183     // NB in hideMarkedBits, the last bit is not set to hidden
1184     tohide.set(3, 6);
1185     tohide.set(9);
1186     tohide.set(19, 21);
1187     h.hideMarkedBits(tohide);
1188
1189     h2.hideColumns(3, 5);
1190     h2.hideColumns(9, 9);
1191     h2.hideColumns(19, 20);
1192     assertTrue(h.equals(h2));
1193   }
1194
1195   @Test(groups = "Functional")
1196   public void testMakeVisibleAnnotation()
1197   {
1198     HiddenColumns h = new HiddenColumns();
1199     Annotation[] anns = new Annotation[] { null, null, new Annotation(1),
1200         new Annotation(2), new Annotation(3), null, null, new Annotation(4),
1201         new Annotation(5), new Annotation(6), new Annotation(7),
1202         new Annotation(8) };
1203     AlignmentAnnotation ann = new AlignmentAnnotation("an", "some an",
1204             anns);
1205
1206     // without hidden cols, just truncates
1207     h.makeVisibleAnnotation(3, 5, ann);
1208     assertEquals(3, ann.annotations.length);
1209     assertEquals(2.0f, ann.annotations[0].value);
1210     assertEquals(3.0f, ann.annotations[1].value);
1211     assertNull(ann.annotations[2]);
1212
1213     anns = new Annotation[] { null, null, new Annotation(1),
1214         new Annotation(2), new Annotation(3), null, null, new Annotation(4),
1215         new Annotation(5), new Annotation(6), new Annotation(7),
1216         new Annotation(8) };
1217     ann = new AlignmentAnnotation("an", "some an", anns);
1218     h.hideColumns(4, 7);
1219     h.makeVisibleAnnotation(1, 9, ann);
1220     assertEquals(5, ann.annotations.length);
1221     assertNull(ann.annotations[0]);
1222     assertEquals(1.0f, ann.annotations[1].value);
1223     assertEquals(2.0f, ann.annotations[2].value);
1224     assertEquals(5.0f, ann.annotations[3].value);
1225     assertEquals(6.0f, ann.annotations[4].value);
1226
1227     anns = new Annotation[] { null, null, new Annotation(1),
1228         new Annotation(2), new Annotation(3), null, null, new Annotation(4),
1229         new Annotation(5), new Annotation(6), new Annotation(7),
1230         new Annotation(8) };
1231     ann = new AlignmentAnnotation("an", "some an", anns);
1232     h.hideColumns(1, 2);
1233     h.makeVisibleAnnotation(1, 9, ann);
1234     assertEquals(3, ann.annotations.length);
1235     assertEquals(2.0f, ann.annotations[0].value);
1236     assertEquals(5.0f, ann.annotations[1].value);
1237     assertEquals(6.0f, ann.annotations[2].value);
1238   }
1239
1240   @Test(groups = "Functional")
1241   public void testSubtractVisibleColumns()
1242   {
1243     HiddenColumns h = new HiddenColumns();
1244     int result = h.subtractVisibleColumns(1, 10);
1245     assertEquals(9, result);
1246
1247     h.hideColumns(7, 9);
1248     result = h.subtractVisibleColumns(4, 10);
1249     assertEquals(3, result);
1250
1251     h.hideColumns(14, 15);
1252     result = h.subtractVisibleColumns(4, 10);
1253     assertEquals(3, result);
1254
1255     result = h.subtractVisibleColumns(10, 17);
1256     assertEquals(2, result);
1257
1258     result = h.subtractVisibleColumns(1, 7);
1259     assertEquals(5, result);
1260
1261     result = h.subtractVisibleColumns(1, 8);
1262     assertEquals(5, result);
1263
1264     result = h.subtractVisibleColumns(3, 15);
1265     assertEquals(10, result);
1266
1267     ColumnSelection sel = new ColumnSelection();
1268     h.revealAllHiddenColumns(sel);
1269     h.hideColumns(0, 30);
1270     result = h.subtractVisibleColumns(31, 0);
1271     assertEquals(-31, result);
1272
1273   }
1274
1275 }