2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
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.
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.
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.
21 package jalview.datamodel;
23 import static org.testng.AssertJUnit.assertEquals;
24 import static org.testng.AssertJUnit.assertFalse;
25 import static org.testng.AssertJUnit.assertSame;
26 import static org.testng.AssertJUnit.assertTrue;
27 import static org.testng.AssertJUnit.fail;
29 import jalview.gui.JvOptionPane;
31 import java.util.Arrays;
32 import java.util.BitSet;
33 import java.util.Collections;
34 import java.util.ConcurrentModificationException;
35 import java.util.List;
37 import org.testng.annotations.BeforeClass;
38 import org.testng.annotations.Test;
40 public class ColumnSelectionTest
43 @BeforeClass(alwaysRun = true)
44 public void setUpJvOptionPane()
46 JvOptionPane.setInteractiveMode(false);
47 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
50 @Test(groups = { "Functional" })
51 public void testAddElement()
53 ColumnSelection cs = new ColumnSelection();
57 cs.addElement(5); // ignored
58 List<Integer> sel = cs.getSelected();
59 assertEquals("[2, 5, 3]", sel.toString());
63 * Test the remove method - in particular to verify that remove(int i) removes
64 * the element whose value is i, _NOT_ the i'th element.
66 @Test(groups = { "Functional" })
67 public void testRemoveElement()
69 ColumnSelection cs = new ColumnSelection();
73 // removing elements not in the list has no effect
76 List<Integer> sel = cs.getSelected();
77 assertEquals(2, sel.size());
78 assertEquals(new Integer(2), sel.get(0));
79 assertEquals(new Integer(5), sel.get(1));
81 // removing an element in the list removes it
83 // ...and also from the read-only view
84 assertEquals(1, sel.size());
85 sel = cs.getSelected();
86 assertEquals(1, sel.size());
87 assertEquals(new Integer(5), sel.get(0));
91 * Test the method that finds the visible column position of an alignment
92 * column, allowing for hidden columns.
94 @Test(groups = { "Functional" })
95 public void testFindColumnPosition()
97 ColumnSelection cs = new ColumnSelection();
98 assertEquals(5, cs.findColumnPosition(5));
100 // hiding column 6 makes no difference
101 cs.hideColumns(6, 6);
102 assertEquals(5, cs.findColumnPosition(5));
104 // hiding column 4 moves column 5 to column 4
105 cs.hideColumns(4, 4);
106 assertEquals(4, cs.findColumnPosition(5));
108 // hiding column 4 moves column 4 to position 3
109 assertEquals(3, cs.findColumnPosition(4));
111 // hiding columns 1 and 2 moves column 5 to column 2
112 cs.hideColumns(1, 2);
113 assertEquals(2, cs.findColumnPosition(5));
115 // check with > 1 hidden column regions
116 // where some columns are in the hidden regions
117 ColumnSelection cs2 = new ColumnSelection();
118 cs2.hideColumns(5, 10);
119 cs2.hideColumns(20, 27);
120 cs2.hideColumns(40, 44);
122 // hiding columns 5-10 and 20-27 moves column 8 to column 4
123 assertEquals(4, cs2.findColumnPosition(8));
125 // and moves column 24 to 13
126 assertEquals(13, cs2.findColumnPosition(24));
128 // and moves column 28 to 14
129 assertEquals(14, cs2.findColumnPosition(28));
131 // and moves column 40 to 25
132 assertEquals(25, cs2.findColumnPosition(40));
134 // check when hidden columns start at 0 that the visible column
136 ColumnSelection cs3 = new ColumnSelection();
137 cs3.hideColumns(0, 4);
138 assertEquals(0, cs3.findColumnPosition(2));
143 * Test the method that finds the visible column position a given distance
144 * before another column
146 @Test(groups = { "Functional" })
147 public void testFindColumnNToLeft()
149 ColumnSelection cs = new ColumnSelection();
151 // test that without hidden columns, findColumnNToLeft returns
152 // position n to left of provided position
153 int pos = cs.subtractVisibleColumns(3, 10);
154 assertEquals(7, pos);
156 // 0 returns same position
157 pos = cs.subtractVisibleColumns(0, 10);
158 assertEquals(10, pos);
160 // overflow to left returns negative number
161 pos = cs.subtractVisibleColumns(3, 0);
162 assertEquals(-3, pos);
164 // test that with hidden columns to left of result column
165 // behaviour is the same as above
166 cs.hideColumns(1, 3);
168 // position n to left of provided position
169 pos = cs.subtractVisibleColumns(3, 10);
170 assertEquals(7, pos);
172 // 0 returns same position
173 pos = cs.subtractVisibleColumns(0, 10);
174 assertEquals(10, pos);
176 // test with one set of hidden columns between start and required position
177 cs.hideColumns(12, 15);
178 pos = cs.subtractVisibleColumns(8, 17);
179 assertEquals(5, pos);
181 // test with two sets of hidden columns between start and required position
182 cs.hideColumns(20, 21);
183 pos = cs.subtractVisibleColumns(8, 23);
184 assertEquals(9, pos);
186 // repeat last 2 tests with no hidden columns to left of required position
187 cs.revealAllHiddenColumns();
189 // test with one set of hidden columns between start and required position
190 cs.hideColumns(12, 15);
191 pos = cs.subtractVisibleColumns(8, 17);
192 assertEquals(5, pos);
194 // test with two sets of hidden columns between start and required position
195 cs.hideColumns(20, 21);
196 pos = cs.subtractVisibleColumns(8, 23);
197 assertEquals(9, pos);
202 * Test the code used to locate the reference sequence ruler origin
204 @Test(groups = { "Functional" })
205 public void testLocateVisibleBoundsofSequence()
207 ColumnSelection cs = new ColumnSelection();
208 SequenceI seq = new Sequence("RefSeq", "-A-SD-ASD--E---");
209 assertEquals(2, seq.findIndex(seq.getStart()));
213 Arrays.toString(new int[] { seq.findIndex(seq.getStart()) - 1,
214 seq.findIndex(seq.getEnd()) - 1, seq.getStart(),
215 seq.getEnd(), seq.findIndex(seq.getStart()) - 1,
216 seq.findIndex(seq.getEnd()) - 1 }),
217 Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
219 // hidden column on gap after end of sequence - should not affect bounds
222 Arrays.toString(new int[] { seq.findIndex(seq.getStart()) - 1,
223 seq.findIndex(seq.getEnd()) - 1, seq.getStart(),
224 seq.getEnd(), seq.findIndex(seq.getStart()) - 1,
225 seq.findIndex(seq.getEnd()) - 1 }),
226 Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
228 cs.revealAllHiddenColumns();
229 // hidden column on gap before beginning of sequence - should vis bounds by
233 Arrays.toString(new int[] { seq.findIndex(seq.getStart()) - 2,
234 seq.findIndex(seq.getEnd()) - 2, seq.getStart(),
235 seq.getEnd(), seq.findIndex(seq.getStart()) - 1,
236 seq.findIndex(seq.getEnd()) - 1 }),
237 Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
239 cs.revealAllHiddenColumns();
240 // hide columns around most of sequence - leave one residue remaining
241 cs.hideColumns(1, 3);
242 cs.hideColumns(6, 11);
244 cs.getVisibleSequenceStrings(0, 5, new SequenceI[] { seq })[0]);
246 Arrays.toString(new int[] { 1, 1, 3, 3,
247 seq.findIndex(seq.getStart()) - 1,
248 seq.findIndex(seq.getEnd()) - 1 }),
249 Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
250 cs.revealAllHiddenColumns();
252 // hide whole sequence - should just get location of hidden region
253 // containing sequence
254 cs.hideColumns(1, 11);
256 Arrays.toString(new int[] { 0, 1, 0, 0,
257 seq.findIndex(seq.getStart()) - 1,
258 seq.findIndex(seq.getEnd()) - 1 }),
259 Arrays.toString(cs.locateVisibleBoundsOfSequence(seq)));
263 @Test(groups = { "Functional" })
264 public void testLocateVisibleBoundsPathologicals()
266 // test some pathological cases we missed
267 AlignmentI al = new Alignment(new SequenceI[] { new Sequence(
268 "refseqGaptest", "KTDVTI----------NFI-----G----L") });
269 ColumnSelection cs = new ColumnSelection();
270 cs.hideInsertionsFor(al.getSequenceAt(0));
274 + al.getSequenceAt(0).getCharAt(
275 cs.adjustForHiddenColumns(9)));
279 @Test(groups = { "Functional" })
280 public void testHideColumns()
282 ColumnSelection cs = new ColumnSelection();
284 List<int[]> hidden = cs.getHiddenColumns();
285 assertEquals(1, hidden.size());
286 assertEquals("[5, 5]", Arrays.toString(hidden.get(0)));
289 assertEquals(2, hidden.size());
290 // two hidden ranges, in order:
291 assertSame(hidden, cs.getHiddenColumns());
292 assertEquals("[3, 3]", Arrays.toString(hidden.get(0)));
293 assertEquals("[5, 5]", Arrays.toString(hidden.get(1)));
295 // hiding column 4 expands [3, 3] to [3, 4]
296 // and merges to [5, 5] to make [3, 5]
298 hidden = cs.getHiddenColumns();
299 assertEquals(1, hidden.size());
300 assertEquals("[3, 5]", Arrays.toString(hidden.get(0)));
302 // clear hidden columns (note they are added to selected)
303 cs.revealAllHiddenColumns();
304 // it is now actually null but getter returns an empty list
305 assertTrue(cs.getHiddenColumns().isEmpty());
307 cs.hideColumns(3, 6);
308 hidden = cs.getHiddenColumns();
309 int[] firstHiddenRange = hidden.get(0);
310 assertEquals("[3, 6]", Arrays.toString(firstHiddenRange));
312 // adding a subrange of already hidden should do nothing
313 cs.hideColumns(4, 5);
314 assertEquals(1, hidden.size());
315 assertSame(firstHiddenRange, cs.getHiddenColumns().get(0));
316 cs.hideColumns(3, 5);
317 assertEquals(1, hidden.size());
318 assertSame(firstHiddenRange, cs.getHiddenColumns().get(0));
319 cs.hideColumns(4, 6);
320 assertEquals(1, hidden.size());
321 assertSame(firstHiddenRange, cs.getHiddenColumns().get(0));
322 cs.hideColumns(3, 6);
323 assertEquals(1, hidden.size());
324 assertSame(firstHiddenRange, cs.getHiddenColumns().get(0));
326 cs.revealAllHiddenColumns();
327 cs.hideColumns(2, 4);
328 hidden = cs.getHiddenColumns();
329 assertEquals(1, hidden.size());
330 assertEquals("[2, 4]", Arrays.toString(hidden.get(0)));
332 // extend contiguous with 2 positions overlap
333 cs.hideColumns(3, 5);
334 assertEquals(1, hidden.size());
335 assertEquals("[2, 5]", Arrays.toString(hidden.get(0)));
337 // extend contiguous with 1 position overlap
338 cs.hideColumns(5, 6);
339 assertEquals(1, hidden.size());
340 assertEquals("[2, 6]", Arrays.toString(hidden.get(0)));
342 // extend contiguous with overlap both ends:
343 cs.hideColumns(1, 7);
344 assertEquals(1, hidden.size());
345 assertEquals("[1, 7]", Arrays.toString(hidden.get(0)));
349 * Test the method that hides a specified column including any adjacent
350 * selected columns. This is a convenience method for the case where multiple
351 * column regions are selected and then hidden using menu option View | Hide |
354 @Test(groups = { "Functional" })
355 public void testHideColumns_withSelection()
357 ColumnSelection cs = new ColumnSelection();
358 // select columns 4-6
362 // hide column 5 (and adjacent):
365 List<int[]> hidden = cs.getHiddenColumns();
366 assertEquals(1, hidden.size());
367 assertEquals("[4, 6]", Arrays.toString(hidden.get(0)));
368 // none now selected:
369 assertTrue(cs.getSelected().isEmpty());
371 // repeat, hiding column 4 (5 and 6)
372 cs = new ColumnSelection();
377 hidden = cs.getHiddenColumns();
378 assertEquals(1, hidden.size());
379 assertEquals("[4, 6]", Arrays.toString(hidden.get(0)));
380 assertTrue(cs.getSelected().isEmpty());
382 // repeat, hiding column (4, 5 and) 6
383 cs = new ColumnSelection();
388 hidden = cs.getHiddenColumns();
389 assertEquals(1, hidden.size());
390 assertEquals("[4, 6]", Arrays.toString(hidden.get(0)));
391 assertTrue(cs.getSelected().isEmpty());
393 // repeat, with _only_ adjacent columns selected
394 cs = new ColumnSelection();
398 hidden = cs.getHiddenColumns();
399 assertEquals(1, hidden.size());
400 assertEquals("[4, 6]", Arrays.toString(hidden.get(0)));
401 assertTrue(cs.getSelected().isEmpty());
405 * Test the method that hides all (possibly disjoint) selected column ranges
407 @Test(groups = { "Functional" })
408 public void testHideSelectedColumns()
410 ColumnSelection cs = new ColumnSelection();
411 int[] sel = { 2, 3, 4, 7, 8, 9, 20, 21, 22 };
416 cs.hideColumns(15, 18);
418 cs.hideSelectedColumns();
419 assertTrue(cs.getSelected().isEmpty());
420 List<int[]> hidden = cs.getHiddenColumns();
421 assertEquals(4, hidden.size());
422 assertEquals("[2, 4]", Arrays.toString(hidden.get(0)));
423 assertEquals("[7, 9]", Arrays.toString(hidden.get(1)));
424 assertEquals("[15, 18]", Arrays.toString(hidden.get(2)));
425 assertEquals("[20, 22]", Arrays.toString(hidden.get(3)));
429 * Test the method that gets runs of selected columns ordered by column. If
430 * this fails, HideSelectedColumns may also fail
432 @Test(groups = { "Functional" })
433 public void testGetSelectedRanges()
436 * getSelectedRanges returns ordered columns regardless
437 * of the order in which they are added
439 ColumnSelection cs = new ColumnSelection();
440 int[] sel = { 4, 3, 7, 21, 9, 20, 8, 22, 2 };
446 range = cs.getSelectedRanges();
447 assertEquals(3, range.size());
448 assertEquals("[2, 4]", Arrays.toString(range.get(0)));
449 assertEquals("[7, 9]", Arrays.toString(range.get(1)));
450 assertEquals("[20, 22]", Arrays.toString(range.get(2)));
453 range = cs.getSelectedRanges();
454 assertEquals(3, range.size());
455 assertEquals("[0, 4]", Arrays.toString(range.get(0)));
459 * Test the method that reveals a range of hidden columns given the start
460 * column of the range
462 @Test(groups = { "Functional" })
463 public void testRevealHiddenColumns()
465 ColumnSelection cs = new ColumnSelection();
466 cs.hideColumns(5, 8);
468 cs.revealHiddenColumns(5);
469 // hidden columns list now null but getter returns empty list:
470 assertTrue(cs.getHiddenColumns().isEmpty());
471 // revealed columns are marked as selected (added to selection):
472 assertEquals("[10, 5, 6, 7, 8]", cs.getSelected().toString());
474 // calling with a column other than the range start does nothing:
475 cs = new ColumnSelection();
476 cs.hideColumns(5, 8);
477 List<int[]> hidden = cs.getHiddenColumns();
478 cs.revealHiddenColumns(6);
479 assertSame(hidden, cs.getHiddenColumns());
480 assertTrue(cs.getSelected().isEmpty());
483 @Test(groups = { "Functional" })
484 public void testRevealAllHiddenColumns()
486 ColumnSelection cs = new ColumnSelection();
487 cs.hideColumns(5, 8);
488 cs.hideColumns(2, 3);
491 cs.revealAllHiddenColumns();
494 * revealing hidden columns adds them (in order) to the (unordered)
497 assertTrue(cs.getHiddenColumns().isEmpty());
498 assertEquals("[11, 1, 2, 3, 5, 6, 7, 8]", cs.getSelected().toString());
501 @Test(groups = { "Functional" })
502 public void testIsVisible()
504 ColumnSelection cs = new ColumnSelection();
505 cs.hideColumns(2, 4);
506 cs.hideColumns(6, 7);
507 assertTrue(cs.isVisible(0));
508 assertTrue(cs.isVisible(-99));
509 assertTrue(cs.isVisible(1));
510 assertFalse(cs.isVisible(2));
511 assertFalse(cs.isVisible(3));
512 assertFalse(cs.isVisible(4));
513 assertTrue(cs.isVisible(5));
514 assertFalse(cs.isVisible(6));
515 assertFalse(cs.isVisible(7));
518 @Test(groups = { "Functional" })
519 public void testGetVisibleContigs()
521 ColumnSelection cs = new ColumnSelection();
522 cs.hideColumns(3, 6);
523 cs.hideColumns(8, 9);
524 cs.hideColumns(12, 12);
526 // start position is inclusive, end position exclusive:
527 int[] visible = cs.getVisibleContigs(1, 13);
528 assertEquals("[1, 2, 7, 7, 10, 11]", Arrays.toString(visible));
530 visible = cs.getVisibleContigs(4, 14);
531 assertEquals("[7, 7, 10, 11, 13, 13]", Arrays.toString(visible));
533 visible = cs.getVisibleContigs(3, 10);
534 assertEquals("[7, 7]", Arrays.toString(visible));
536 visible = cs.getVisibleContigs(4, 6);
537 assertEquals("[]", Arrays.toString(visible));
540 @Test(groups = { "Functional" })
541 public void testInvertColumnSelection()
543 ColumnSelection cs = new ColumnSelection();
547 cs.hideColumns(3, 3);
548 cs.hideColumns(6, 6);
550 // invert selection from start (inclusive) to end (exclusive)
551 // hidden columns are _not_ changed
552 cs.invertColumnSelection(2, 9);
553 assertEquals("[2, 5, 7]", cs.getSelected().toString());
555 cs.invertColumnSelection(1, 9);
556 assertEquals("[1, 4, 8]", cs.getSelected().toString());
559 @Test(groups = { "Functional" })
560 public void testMaxColumnSelection()
562 ColumnSelection cs = new ColumnSelection();
566 assertEquals(513, cs.getMax());
567 cs.removeElement(513);
568 assertEquals(1, cs.getMax());
570 assertEquals(0, cs.getMax());
573 assertEquals(513, cs.getMax());
577 @Test(groups = { "Functional" })
578 public void testMinColumnSelection()
580 ColumnSelection cs = new ColumnSelection();
584 assertEquals(0, cs.getMin());
586 assertEquals(1, cs.getMin());
588 assertEquals(0, cs.getMin());
591 @Test(groups = { "Functional" })
592 public void testEquals()
594 ColumnSelection cs = new ColumnSelection();
600 cs.hideColumns(5, 9);
602 // same selections added in a different order
603 ColumnSelection cs2 = new ColumnSelection();
608 // with no hidden columns
609 assertFalse(cs.equals(cs2));
610 assertFalse(cs2.equals(cs));
612 // with hidden columns added in a different order
613 cs2.hideColumns(6, 9);
614 cs2.hideColumns(5, 8);
617 assertTrue(cs.equals(cs2));
618 assertTrue(cs.equals(cs));
619 assertTrue(cs2.equals(cs));
620 assertTrue(cs2.equals(cs2));
623 assertFalse(cs.equals(cs2));
624 assertFalse(cs2.equals(cs));
626 cs2.removeElement(12);
627 assertTrue(cs.equals(cs2));
630 assertFalse(cs.equals(cs2));
632 * unhiding a column adds it to selection!
634 cs2.revealHiddenColumns(88);
635 assertFalse(cs.equals(cs2));
637 assertTrue(cs.equals(cs2));
641 * Test the method that returns selected columns, in the order in which they
644 @Test(groups = { "Functional" })
645 public void testGetSelected()
647 ColumnSelection cs = new ColumnSelection();
648 int[] sel = { 4, 3, 7, 21 };
654 List<Integer> selected = cs.getSelected();
655 assertEquals(4, selected.size());
656 assertEquals("[4, 3, 7, 21]", selected.toString());
659 * getSelected returns a read-only view of the list
660 * verify the view follows any changes in it
665 assertEquals("[3, 21, 1]", selected.toString());
669 * Test to verify that the list returned by getSelection cannot be modified
671 @Test(groups = { "Functional" })
672 public void testGetSelected_isReadOnly()
674 ColumnSelection cs = new ColumnSelection();
677 List<Integer> selected = cs.getSelected();
681 fail("expected exception");
682 } catch (UnsupportedOperationException e)
689 fail("expected exception");
690 } catch (UnsupportedOperationException e)
697 fail("expected exception");
698 } catch (UnsupportedOperationException e)
704 Collections.sort(selected);
705 fail("expected exception");
706 } catch (UnsupportedOperationException e)
713 * Test that demonstrates a ConcurrentModificationException is thrown if you
714 * change the selection while iterating over it
717 groups = "Functional",
718 expectedExceptions = { ConcurrentModificationException.class })
719 public void testGetSelected_concurrentModification()
721 ColumnSelection cs = new ColumnSelection();
727 * simulate changing the list under us (e.g. in a separate
728 * thread) while iterating over it -> ConcurrentModificationException
730 List<Integer> selected = cs.getSelected();
731 for (Integer col : selected)
733 if (col.intValue() == 0)
740 @Test(groups = "Functional")
741 public void testMarkColumns()
743 ColumnSelection cs = new ColumnSelection();
744 cs.addElement(5); // this will be cleared
745 BitSet toMark = new BitSet();
751 assertTrue(cs.markColumns(toMark, 3, 8, false, false, false));
752 List<Integer> selected = cs.getSelected();
753 assertEquals(2, selected.size());
754 assertTrue(selected.contains(3));
755 assertTrue(selected.contains(6));
758 @Test(groups = "Functional")
759 public void testMarkColumns_extend()
761 ColumnSelection cs = new ColumnSelection();
764 BitSet toMark = new BitSet();
771 * extending selection of {3, 6} should leave {1, 3, 5, 6} selected
773 assertTrue(cs.markColumns(toMark, 3, 8, false, true, false));
774 List<Integer> selected = cs.getSelected();
775 assertEquals(4, selected.size());
776 assertTrue(selected.contains(1));
777 assertTrue(selected.contains(3));
778 assertTrue(selected.contains(5));
779 assertTrue(selected.contains(6));
782 @Test(groups = "Functional")
783 public void testMarkColumns_invert()
785 ColumnSelection cs = new ColumnSelection();
786 cs.addElement(5); // this will be cleared
787 BitSet toMark = new BitSet();
794 * inverted selection of {3, 6} should select {4, 5, 7, 8}
796 assertTrue(cs.markColumns(toMark, 3, 8, true, false, false));
797 List<Integer> selected = cs.getSelected();
798 assertEquals(4, selected.size());
799 assertTrue(selected.contains(4));
800 assertTrue(selected.contains(5));
801 assertTrue(selected.contains(7));
802 assertTrue(selected.contains(8));
805 @Test(groups = "Functional")
806 public void testMarkColumns_toggle()
808 ColumnSelection cs = new ColumnSelection();
809 cs.addElement(1); // outside change range
812 cs.addElement(10); // outside change range
813 BitSet toMark = new BitSet();
820 * toggling state of {3, 6} should leave {1, 4, 6, 10} selected
822 assertTrue(cs.markColumns(toMark, 3, 8, false, false, true));
823 List<Integer> selected = cs.getSelected();
824 assertEquals(4, selected.size());
825 assertTrue(selected.contains(1));
826 assertTrue(selected.contains(4));
827 assertTrue(selected.contains(6));
828 assertTrue(selected.contains(10));
831 @Test(groups = "Functional")
832 public void testCopyConstructor()
834 ColumnSelection cs = new ColumnSelection();
837 cs.hideColumns(10, 11);
838 cs.hideColumns(5, 7);
839 assertEquals("[5, 7]", Arrays.toString(cs.getHiddenColumns().get(0)));
841 ColumnSelection cs2 = new ColumnSelection(cs);
842 assertTrue(cs2.hasSelectedColumns());
843 assertTrue(cs2.hasHiddenColumns());
844 // order of column selection is preserved
845 assertEquals("[3, 1]", cs2.getSelected().toString());
846 assertEquals(2, cs2.getHiddenColumns().size());
847 // hidden columns are held in column order
848 assertEquals("[5, 7]", Arrays.toString(cs2.getHiddenColumns().get(0)));
849 assertEquals("[10, 11]", Arrays.toString(cs2.getHiddenColumns().get(1)));
853 * Test for the case when a hidden range encloses more one already hidden
856 @Test(groups = { "Functional" })
857 public void testHideColumns_subsumingHidden()
860 * JAL-2370 bug scenario:
861 * two hidden ranges subsumed by a third
863 ColumnSelection cs = new ColumnSelection();
864 cs.hideColumns(49, 59);
865 cs.hideColumns(69, 79);
866 List<int[]> hidden = cs.getHiddenColumns();
867 assertEquals(2, hidden.size());
868 assertEquals("[49, 59]", Arrays.toString(hidden.get(0)));
869 assertEquals("[69, 79]", Arrays.toString(hidden.get(1)));
871 cs.hideColumns(48, 80);
872 hidden = cs.getHiddenColumns();
873 assertEquals(1, hidden.size());
874 assertEquals("[48, 80]", Arrays.toString(hidden.get(0)));
877 * another...joining hidden ranges
879 cs = new ColumnSelection();
880 cs.hideColumns(10, 20);
881 cs.hideColumns(30, 40);
882 cs.hideColumns(50, 60);
883 // hiding 21-49 should merge to one range
884 cs.hideColumns(21, 49);
885 hidden = cs.getHiddenColumns();
886 assertEquals(1, hidden.size());
887 assertEquals("[10, 60]", Arrays.toString(hidden.get(0)));
890 * another...lef overlap, subsumption, right overlap,
891 * no overlap of existing hidden ranges
893 cs = new ColumnSelection();
894 cs.hideColumns(10, 20);
895 cs.hideColumns(10, 20);
896 cs.hideColumns(30, 35);
897 cs.hideColumns(40, 50);
898 cs.hideColumns(60, 70);
900 cs.hideColumns(15, 45);
901 hidden = cs.getHiddenColumns();
902 assertEquals(2, hidden.size());
903 assertEquals("[10, 50]", Arrays.toString(hidden.get(0)));
904 assertEquals("[60, 70]", Arrays.toString(hidden.get(1)));
907 @Test(groups = { "Functional" })
908 public void testStretchGroup_expand()
911 * test that emulates clicking column 4 (selected)
912 * and dragging right to column 5 (all base 0)
914 ColumnSelection cs = new ColumnSelection();
916 SequenceGroup sg = new SequenceGroup();
919 cs.stretchGroup(5, sg, 4, 4);
920 assertEquals(cs.getSelected().size(), 2);
921 assertTrue(cs.contains(4));
922 assertTrue(cs.contains(5));
923 assertEquals(sg.getStartRes(), 4);
924 assertEquals(sg.getEndRes(), 5);
927 * emulate drag right with columns 10-20 already selected
930 for (int i = 10; i <= 20; i++)
934 assertEquals(cs.getSelected().size(), 11);
935 sg = new SequenceGroup();
938 cs.stretchGroup(21, sg, 10, 20);
939 assertEquals(cs.getSelected().size(), 12);
940 assertTrue(cs.contains(10));
941 assertTrue(cs.contains(21));
942 assertEquals(sg.getStartRes(), 10);
943 assertEquals(sg.getEndRes(), 21);
946 @Test(groups = { "Functional" })
947 public void testStretchGroup_shrink()
950 * emulate drag left to 19 with columns 10-20 already selected
952 ColumnSelection cs = new ColumnSelection();
953 for (int i = 10; i <= 20; i++)
957 assertEquals(cs.getSelected().size(), 11);
958 SequenceGroup sg = new SequenceGroup();
961 cs.stretchGroup(19, sg, 10, 20);
962 assertEquals(cs.getSelected().size(), 10);
963 assertTrue(cs.contains(10));
964 assertTrue(cs.contains(19));
965 assertFalse(cs.contains(20));
966 assertEquals(sg.getStartRes(), 10);
967 assertEquals(sg.getEndRes(), 19);