1 package jalview.viewmodel;
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertFalse;
5 import static org.testng.Assert.assertTrue;
7 import jalview.analysis.AlignmentGenerator;
8 import jalview.datamodel.AlignmentI;
9 import jalview.datamodel.ColumnSelection;
10 import jalview.datamodel.HiddenColumns;
11 import jalview.datamodel.HiddenSequences;
13 import java.beans.PropertyChangeEvent;
14 import java.util.ArrayList;
15 import java.util.Arrays;
16 import java.util.List;
18 import org.testng.annotations.BeforeMethod;
19 import org.testng.annotations.Test;
21 public class ViewportRangesTest {
23 AlignmentGenerator gen = new AlignmentGenerator(false);
25 AlignmentI al = gen.generate(20, 30, 1, 5, 5);
27 AlignmentI smallAl = gen.generate(7, 2, 2, 5, 5);
29 @BeforeMethod(alwaysRun = true)
32 ColumnSelection sel = new ColumnSelection();
33 al.getHiddenColumns().revealAllHiddenColumns(sel);
34 al.getHiddenSequences().showAll(null);
35 smallAl.getHiddenColumns().revealAllHiddenColumns(sel);
36 smallAl.getHiddenSequences().showAll(null);
39 @Test(groups = { "Functional" })
40 public void testViewportRanges()
42 ViewportRanges vr = new ViewportRanges(al);
44 assertEquals(vr.getStartRes(),0);
45 assertEquals(vr.getEndRes(), al.getWidth()-1);
46 assertEquals(vr.getStartSeq(), 0);
47 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
50 @Test(groups = { "Functional" })
51 public void testGetAbsoluteAlignmentHeight()
53 ViewportRanges vr = new ViewportRanges(al);
55 assertEquals(vr.getAbsoluteAlignmentHeight(), al.getHeight());
57 al.getHiddenSequences().hideSequence(al.getSequenceAt(3));
58 assertEquals(vr.getAbsoluteAlignmentHeight(), al.getHeight() + 1);
61 @Test(groups = { "Functional" })
62 public void testGetAbsoluteAlignmentWidth()
64 ViewportRanges vr = new ViewportRanges(al);
65 assertEquals(vr.getAbsoluteAlignmentWidth(), al.getWidth());
68 @Test(groups = { "Functional" })
69 public void testSetEndRes()
71 ViewportRanges vr = new ViewportRanges(al);
73 assertEquals(vr.getEndRes(), 0);
75 vr.setEndRes(al.getWidth() - 1);
76 assertEquals(vr.getEndRes(), al.getWidth() - 1);
79 @Test(groups = { "Functional" })
80 public void testSetEndSeq()
82 ViewportRanges vr = new ViewportRanges(al);
84 assertEquals(vr.getEndSeq(), 0);
86 vr.setEndSeq(al.getHeight());
87 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
89 vr.setEndRes(al.getHeight() - 1);
90 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
93 @Test(groups = { "Functional" })
94 public void testSetStartRes()
96 ViewportRanges vr = new ViewportRanges(al);
98 assertEquals(vr.getStartRes(), 0);
100 vr.setStartRes(al.getWidth());
101 assertEquals(vr.getStartRes(), al.getWidth() - 1);
103 vr.setStartRes(al.getWidth() - 1);
104 assertEquals(vr.getStartRes(), al.getWidth() - 1);
107 @Test(groups = { "Functional" })
108 public void testSetStartSeq()
110 ViewportRanges vr = new ViewportRanges(al);
112 assertEquals(vr.getStartSeq(), 0);
114 vr.setStartSeq(al.getHeight() - vr.getViewportHeight() + 1);
115 assertEquals(vr.getStartSeq(), al.getHeight() - vr.getViewportHeight());
117 vr.setStartSeq(al.getHeight() - vr.getViewportHeight());
118 assertEquals(vr.getStartSeq(), al.getHeight() - vr.getViewportHeight());
121 @Test(groups = { "Functional" })
122 public void testSetStartEndRes()
124 ViewportRanges vr = new ViewportRanges(al);
125 vr.setStartEndRes(-1, -1);
126 assertEquals(vr.getStartRes(), 0);
127 assertEquals(vr.getEndRes(), 0);
129 vr.setStartEndRes(5, 19);
130 assertEquals(vr.getStartRes(), 5);
131 assertEquals(vr.getEndRes(), 19);
133 vr.setStartEndRes(al.getWidth(), al.getWidth());
134 assertEquals(vr.getEndRes(), al.getWidth() - 1);
136 ViewportRanges vrsmall = new ViewportRanges(smallAl);
137 vrsmall.setStartEndRes(al.getWidth(), al.getWidth());
138 assertEquals(vrsmall.getEndRes(), 6);
140 // make visible alignment width = 0
141 smallAl.getHiddenColumns().hideColumns(0, 6);
142 vrsmall.setStartEndRes(0, 4);
143 assertEquals(vrsmall.getStartRes(), 0);
144 assertEquals(vrsmall.getEndRes(), 0);
147 @Test(groups = { "Functional" })
148 public void testSetStartEndSeq()
150 ViewportRanges vr = new ViewportRanges(al);
151 vr.setStartEndSeq(-1, -1);
152 assertEquals(vr.getStartSeq(), 0);
153 assertEquals(vr.getEndSeq(), 0);
155 vr.setStartEndSeq(5, 19);
156 assertEquals(vr.getStartSeq(), 5);
157 assertEquals(vr.getEndSeq(), 19);
159 vr.setStartEndSeq(al.getHeight(), al.getHeight());
160 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
162 // make visible alignment height = 0
163 smallAl.getHiddenSequences().hideSequence(smallAl.getSequenceAt(0));
164 smallAl.getHiddenSequences().hideSequence(smallAl.getSequenceAt(0));
165 ViewportRanges vrsmall = new ViewportRanges(smallAl);
166 vrsmall.setStartEndSeq(0, 3);
167 assertEquals(vrsmall.getStartSeq(), 0);
168 assertEquals(vrsmall.getEndSeq(), 0);
171 @Test(groups = { "Functional" })
172 public void testSetViewportHeight()
174 ViewportRanges vr = new ViewportRanges(al);
175 vr.setViewportHeight(13);
176 assertEquals(vr.getViewportHeight(), 13);
179 @Test(groups = { "Functional" })
180 public void testSetViewportWidth()
182 ViewportRanges vr = new ViewportRanges(al);
183 vr.setViewportWidth(13);
184 assertEquals(vr.getViewportWidth(), 13);
187 @Test(groups = { "Functional" })
188 public void testSetViewportStartAndHeight()
190 ViewportRanges vr = new ViewportRanges(al);
191 vr.setViewportStartAndHeight(2, 6);
192 assertEquals(vr.getViewportHeight(), 6);
193 assertEquals(vr.getStartSeq(), 2);
195 // reset -ve values of start to 0
196 vr.setViewportStartAndHeight(-1, 7);
197 assertEquals(vr.getViewportHeight(), 7);
198 assertEquals(vr.getStartSeq(), 0);
200 // reset out of bounds start values to within bounds
201 vr.setViewportStartAndHeight(35, 5);
202 assertEquals(vr.getViewportHeight(), 5);
203 assertEquals(vr.getStartSeq(), 24);
206 @Test(groups = { "Functional" })
207 public void testSetViewportStartAndWidth()
209 ViewportRanges vr = new ViewportRanges(al);
210 vr.setViewportStartAndWidth(2, 6);
211 assertEquals(vr.getViewportWidth(), 6);
212 assertEquals(vr.getStartRes(), 2);
214 // reset -ve values of start to 0
215 vr.setViewportStartAndWidth(-1, 7);
216 assertEquals(vr.getViewportWidth(), 7);
217 assertEquals(vr.getStartRes(), 0);
219 // reset out of bounds start values to within bounds
220 vr.setViewportStartAndWidth(35, 5);
221 assertEquals(vr.getViewportWidth(), 5);
222 assertEquals(vr.getStartRes(), 16);
224 // small alignment doesn't get bounds reset
225 ViewportRanges vrsmall = new ViewportRanges(smallAl);
226 vrsmall.setViewportStartAndWidth(0, 63);
227 assertEquals(vrsmall.getViewportWidth(), 7);
228 assertEquals(vrsmall.getStartRes(), 0);
231 @Test(groups = { "Functional" })
232 public void testPageUpDown()
234 ViewportRanges vr = new ViewportRanges(al);
235 vr.setViewportStartAndHeight(8, 6);
237 assertEquals(vr.getStartSeq(), 13);
240 assertEquals(vr.getStartSeq(), 8);
243 assertEquals(vr.getStartSeq(), 3);
246 // pageup does not go beyond 0, viewport height stays the same
247 assertEquals(vr.getStartSeq(), 0);
248 assertEquals(vr.getViewportHeight(), 6);
256 // pagedown to bottom does not go beyond end, and height stays same
257 assertEquals(vr.getStartSeq(), 24);
258 assertEquals(vr.getViewportHeight(), 6);
261 @Test(groups = { "Functional" })
262 public void testScrollUp()
264 ViewportRanges vr = new ViewportRanges(al);
265 vr.setViewportStartAndHeight(1, 5);
267 assertEquals(vr.getStartSeq(), 0);
268 // can't scroll above top
270 assertEquals(vr.getStartSeq(), 0);
272 vr.setViewportStartAndHeight(24, 5);
274 assertEquals(vr.getStartSeq(), 25);
275 // can't scroll beyond bottom
277 assertEquals(vr.getStartSeq(), 25);
280 @Test(groups = { "Functional" })
281 public void testScrollUpWithHidden()
283 ViewportRanges vr = new ViewportRanges(al);
285 // hide last sequence
286 HiddenSequences hidden = new HiddenSequences(al);
287 hidden.hideSequence(al.getSequenceAt(29));
289 vr.setViewportStartAndHeight(1, 5);
291 assertEquals(vr.getStartSeq(), 0);
292 // can't scroll above top
294 assertEquals(vr.getStartSeq(), 0);
296 vr.setViewportStartAndHeight(23, 5);
298 assertEquals(vr.getStartSeq(), 24);
299 // can't scroll beyond bottom
301 assertEquals(vr.getStartSeq(), 24);
304 @Test(groups = { "Functional" })
305 public void testScrollRight()
307 ViewportRanges vr = new ViewportRanges(al);
308 vr.setViewportStartAndWidth(1, 5);
309 vr.scrollRight(false);
310 assertEquals(vr.getStartRes(), 0);
311 // can't scroll left past start
312 vr.scrollRight(false);
313 assertEquals(vr.getStartRes(), 0);
315 vr.setViewportStartAndWidth(15, 5);
316 vr.scrollRight(true);
317 assertEquals(vr.getStartRes(), 16);
318 // can't scroll right past end
319 vr.scrollRight(true);
320 assertEquals(vr.getStartRes(), 16);
323 @Test(groups = { "Functional" })
324 public void testScrollRightWithHidden()
326 ViewportRanges vr = new ViewportRanges(al);
328 // hide last 2 columns
329 HiddenColumns cols = new HiddenColumns();
330 cols.hideColumns(19, 20);
331 al.setHiddenColumns(cols);
333 vr.setViewportStartAndWidth(1, 5);
334 vr.scrollRight(false);
335 assertEquals(vr.getStartRes(), 0);
336 // can't scroll left past start
337 vr.scrollRight(false);
338 assertEquals(vr.getStartRes(), 0);
340 vr.setViewportStartAndWidth(13, 5);
341 vr.scrollRight(true);
342 assertEquals(vr.getStartRes(), 14);
343 // can't scroll right past last visible col
344 vr.scrollRight(true);
345 assertEquals(vr.getStartRes(), 14);
348 @Test(groups = { "Functional" })
349 public void testScrollToWrappedVisible()
351 AlignmentI al2 = gen.generate(60, 30, 1, 5, 5);
353 ViewportRanges vr = new ViewportRanges(al2);
355 // start with viewport on 5-14
356 vr.setViewportStartAndWidth(5, 10);
357 assertEquals(vr.getStartRes(), 5);
358 assertEquals(vr.getEndRes(), 14);
360 // scroll to 12 - no change
361 assertFalse(vr.scrollToWrappedVisible(12));
362 assertEquals(vr.getStartRes(), 5);
364 // scroll to 2 - back to 0-9
365 assertTrue(vr.scrollToWrappedVisible(2));
366 assertEquals(vr.getStartRes(), 0);
367 assertEquals(vr.getEndRes(), 9);
369 // scroll to 9 - no change
370 assertFalse(vr.scrollToWrappedVisible(9));
371 assertEquals(vr.getStartRes(), 0);
373 // scroll to 12 - moves to 10-19
374 assertTrue(vr.scrollToWrappedVisible(12));
375 assertEquals(vr.getStartRes(), 10);
376 assertEquals(vr.getEndRes(), 19);
379 assertEquals(vr.getStartRes(), 13);
380 assertEquals(vr.getEndRes(), 22);
382 // scroll to 45 - jumps to 43-52
383 assertTrue(vr.scrollToWrappedVisible(45));
384 assertEquals(vr.getStartRes(), 43);
385 assertEquals(vr.getEndRes(), 52);
388 // leave until JAL-2388 is merged and we can do without viewport
389 /*@Test(groups = { "Functional" })
390 public void testScrollToVisible()
392 ViewportRanges vr = new ViewportRanges(al);
393 vr.setViewportStartAndWidth(12,5);
394 vr.setViewportStartAndHeight(10,6);
395 vr.scrollToVisible(13,14)
398 assertEquals(vr.getStartRes(), 12);
399 assertEquals(vr.getStartSeq(), 10);
401 vr.scrollToVisible(5,6);
402 assertEquals(vr.getStartRes(), 5);
403 assertEquals(vr.getStartSeq(), 6);
405 // test for hidden columns too
408 @Test(groups = { "Functional" })
409 public void testEventFiring()
411 ViewportRanges vr = new ViewportRanges(al);
412 MockPropChangeListener l = new MockPropChangeListener(vr);
413 List<String> emptylist = new ArrayList<>();
415 vr.setViewportWidth(5);
416 vr.setViewportHeight(5);
419 // one event fired when startRes is called with new value
421 assertTrue(l.verify(1, Arrays.asList("startres")));
424 // no event fired for same value
426 assertTrue(l.verify(0, emptylist));
430 assertTrue(l.verify(1, Arrays.asList("startres")));
433 // no event fired for same value
435 assertTrue(l.verify(0, emptylist));
439 assertTrue(l.verify(1, Arrays.asList("startseq")));
443 assertTrue(l.verify(0, emptylist));
447 assertTrue(l.verify(1, Arrays.asList("startseq")));
451 assertTrue(l.verify(0, emptylist));
454 vr.setStartEndRes(2, 15);
455 assertTrue(l.verify(1, Arrays.asList("startres")));
458 vr.setStartEndRes(2, 15);
459 assertTrue(l.verify(0, emptylist));
462 // check new value fired by event is corrected startres
463 vr.setStartEndRes(-1, 5);
464 assertTrue(l.verify(1, Arrays.asList("startres"), Arrays.asList(0)));
467 // check new value fired by event is corrected endres
468 vr.setStartEndRes(0, -1);
469 assertTrue(l.verify(1, Arrays.asList("endres"), Arrays.asList(0)));
472 vr.setStartEndSeq(2, 15);
473 assertTrue(l.verify(1, Arrays.asList("startseq")));
476 vr.setStartEndSeq(2, 15);
477 assertTrue(l.verify(0, emptylist));
480 vr.setStartEndRes(2, 2); // so seq and res values should be different, in
481 // case of transposing in code
484 // check new value fired by event is corrected startseq
485 vr.setStartEndSeq(-1, 5);
486 assertTrue(l.verify(1, Arrays.asList("startseq"), Arrays.asList(0)));
489 // check new value fired by event is corrected endseq
490 vr.setStartEndSeq(0, -1);
491 assertTrue(l.verify(1, Arrays.asList("endseq"), Arrays.asList(0)));
494 // reset for later tests
495 vr.setStartEndSeq(2, 15);
498 // test viewport height and width setting triggers event
499 vr.setViewportHeight(10);
500 assertTrue(l.verify(1, Arrays.asList("endseq")));
503 vr.setViewportWidth(18);
504 assertTrue(l.verify(1, Arrays.asList("endres")));
507 // already has seq start set to 2, so triggers endseq
508 vr.setViewportStartAndHeight(2, 16);
509 assertTrue(l.verify(1, Arrays.asList("endseq")));
512 vr.setViewportStartAndWidth(1, 14);
513 assertTrue(l.verify(1, Arrays.asList("startres")));
516 // test page up/down triggers event
518 assertTrue(l.verify(1, Arrays.asList("startseq")));
522 assertTrue(l.verify(1, Arrays.asList("startseq")));
525 // test scrolling triggers event
527 assertTrue(l.verify(1, Arrays.asList("startseq")));
531 assertTrue(l.verify(1, Arrays.asList("startseq")));
534 vr.scrollRight(true);
535 assertTrue(l.verify(1, Arrays.asList("startres")));
538 vr.scrollRight(false);
539 assertTrue(l.verify(1, Arrays.asList("startres")));
542 vr.scrollToVisible(10, 10);
543 assertTrue(l.verify(4,
544 Arrays.asList("startseq", "startseq", "startseq", "startseq")));
547 vr.scrollToWrappedVisible(5);
548 assertTrue(l.verify(1, Arrays.asList("startres")));
553 // mock listener for property change events
554 class MockPropChangeListener implements ViewportListenerI
556 private int firecount = 0;
558 private List<String> events = new ArrayList<>();
560 private List<Integer> newvalues = new ArrayList<>();
562 public MockPropChangeListener(ViewportRanges vr)
564 vr.addPropertyChangeListener(this);
568 public void propertyChange(PropertyChangeEvent evt)
571 events.add(evt.getPropertyName());
572 newvalues.add((Integer) evt.getNewValue());
575 public boolean verify(int count, List<String> eventslist,
576 List<Integer> valueslist)
578 return (count == firecount) && events.equals(eventslist)
579 && newvalues.equals(valueslist);
582 public boolean verify(int count, List<String> eventslist)
584 return (count == firecount) && events.equals(eventslist);