1 package jalview.viewmodel;
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertTrue;
6 import jalview.analysis.AlignmentGenerator;
7 import jalview.datamodel.AlignmentI;
8 import jalview.datamodel.ColumnSelection;
9 import jalview.datamodel.HiddenColumns;
10 import jalview.datamodel.HiddenSequences;
12 import java.beans.PropertyChangeEvent;
13 import java.util.ArrayList;
14 import java.util.Arrays;
15 import java.util.List;
17 import org.testng.annotations.BeforeMethod;
18 import org.testng.annotations.Test;
20 public class ViewportRangesTest {
22 AlignmentGenerator gen = new AlignmentGenerator(false);
24 AlignmentI al = gen.generate(20, 30, 1, 5, 5);
26 AlignmentI smallAl = gen.generate(7, 2, 2, 5, 5);
28 @BeforeMethod(alwaysRun = true)
31 ColumnSelection sel = new ColumnSelection();
32 al.getHiddenColumns().revealAllHiddenColumns(sel);
33 al.getHiddenSequences().showAll(null);
34 smallAl.getHiddenColumns().revealAllHiddenColumns(sel);
35 smallAl.getHiddenSequences().showAll(null);
38 @Test(groups = { "Functional" })
39 public void testViewportRanges()
41 ViewportRanges vr = new ViewportRanges(al);
43 assertEquals(vr.getStartRes(),0);
44 assertEquals(vr.getEndRes(), al.getWidth()-1);
45 assertEquals(vr.getStartSeq(), 0);
46 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
49 @Test(groups = { "Functional" })
50 public void testGetAbsoluteAlignmentHeight()
52 ViewportRanges vr = new ViewportRanges(al);
54 assertEquals(vr.getAbsoluteAlignmentHeight(), al.getHeight());
56 al.getHiddenSequences().hideSequence(al.getSequenceAt(3));
57 assertEquals(vr.getAbsoluteAlignmentHeight(), al.getHeight() + 1);
60 @Test(groups = { "Functional" })
61 public void testGetAbsoluteAlignmentWidth()
63 ViewportRanges vr = new ViewportRanges(al);
64 assertEquals(vr.getAbsoluteAlignmentWidth(), al.getWidth());
67 @Test(groups = { "Functional" })
68 public void testSetEndRes()
70 ViewportRanges vr = new ViewportRanges(al);
72 assertEquals(vr.getEndRes(), 0);
74 vr.setEndRes(al.getWidth() - 1);
75 assertEquals(vr.getEndRes(), al.getWidth() - 1);
78 @Test(groups = { "Functional" })
79 public void testSetEndSeq()
81 ViewportRanges vr = new ViewportRanges(al);
83 assertEquals(vr.getEndSeq(), 0);
85 vr.setEndSeq(al.getHeight());
86 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
88 vr.setEndRes(al.getHeight() - 1);
89 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
92 @Test(groups = { "Functional" })
93 public void testSetStartRes()
95 ViewportRanges vr = new ViewportRanges(al);
97 assertEquals(vr.getStartRes(), 0);
99 vr.setStartRes(al.getWidth());
100 assertEquals(vr.getStartRes(), al.getWidth() - 1);
102 vr.setStartRes(al.getWidth() - 1);
103 assertEquals(vr.getStartRes(), al.getWidth() - 1);
106 @Test(groups = { "Functional" })
107 public void testSetStartSeq()
109 ViewportRanges vr = new ViewportRanges(al);
111 assertEquals(vr.getStartSeq(), 0);
113 vr.setStartSeq(al.getHeight() - vr.getViewportHeight() + 1);
114 assertEquals(vr.getStartSeq(), al.getHeight() - vr.getViewportHeight());
116 vr.setStartSeq(al.getHeight() - vr.getViewportHeight());
117 assertEquals(vr.getStartSeq(), al.getHeight() - vr.getViewportHeight());
120 @Test(groups = { "Functional" })
121 public void testSetStartEndRes()
123 ViewportRanges vr = new ViewportRanges(al);
124 vr.setStartEndRes(-1, -1);
125 assertEquals(vr.getStartRes(), 0);
126 assertEquals(vr.getEndRes(), 0);
128 vr.setStartEndRes(5, 19);
129 assertEquals(vr.getStartRes(), 5);
130 assertEquals(vr.getEndRes(), 19);
132 vr.setStartEndRes(al.getWidth(), al.getWidth());
133 assertEquals(vr.getEndRes(), al.getWidth() - 1);
135 ViewportRanges vrsmall = new ViewportRanges(smallAl);
136 vrsmall.setStartEndRes(al.getWidth(), al.getWidth());
137 assertEquals(vrsmall.getEndRes(), 6);
139 // make visible alignment width = 0
140 smallAl.getHiddenColumns().hideColumns(0, 6);
141 vrsmall.setStartEndRes(0, 4);
142 assertEquals(vrsmall.getStartRes(), 0);
143 assertEquals(vrsmall.getEndRes(), 0);
146 @Test(groups = { "Functional" })
147 public void testSetStartEndSeq()
149 ViewportRanges vr = new ViewportRanges(al);
150 vr.setStartEndSeq(-1, -1);
151 assertEquals(vr.getStartSeq(), 0);
152 assertEquals(vr.getEndSeq(), 0);
154 vr.setStartEndSeq(5, 19);
155 assertEquals(vr.getStartSeq(), 5);
156 assertEquals(vr.getEndSeq(), 19);
158 vr.setStartEndSeq(al.getHeight(), al.getHeight());
159 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
161 // make visible alignment height = 0
162 smallAl.getHiddenSequences().hideSequence(smallAl.getSequenceAt(0));
163 smallAl.getHiddenSequences().hideSequence(smallAl.getSequenceAt(0));
164 ViewportRanges vrsmall = new ViewportRanges(smallAl);
165 vrsmall.setStartEndSeq(0, 3);
166 assertEquals(vrsmall.getStartSeq(), 0);
167 assertEquals(vrsmall.getEndSeq(), 0);
170 @Test(groups = { "Functional" })
171 public void testSetViewportHeight()
173 ViewportRanges vr = new ViewportRanges(al);
174 vr.setViewportHeight(13);
175 assertEquals(vr.getViewportHeight(), 13);
178 @Test(groups = { "Functional" })
179 public void testSetViewportWidth()
181 ViewportRanges vr = new ViewportRanges(al);
182 vr.setViewportWidth(13);
183 assertEquals(vr.getViewportWidth(), 13);
186 @Test(groups = { "Functional" })
187 public void testSetViewportStartAndHeight()
189 ViewportRanges vr = new ViewportRanges(al);
190 vr.setViewportStartAndHeight(2, 6);
191 assertEquals(vr.getViewportHeight(), 6);
192 assertEquals(vr.getStartSeq(), 2);
194 // reset -ve values of start to 0
195 vr.setViewportStartAndHeight(-1, 7);
196 assertEquals(vr.getViewportHeight(), 7);
197 assertEquals(vr.getStartSeq(), 0);
199 // reset out of bounds start values to within bounds
200 vr.setViewportStartAndHeight(35, 5);
201 assertEquals(vr.getViewportHeight(), 5);
202 assertEquals(vr.getStartSeq(), 24);
205 @Test(groups = { "Functional" })
206 public void testSetViewportStartAndWidth()
208 ViewportRanges vr = new ViewportRanges(al);
209 vr.setViewportStartAndWidth(2, 6);
210 assertEquals(vr.getViewportWidth(), 6);
211 assertEquals(vr.getStartRes(), 2);
213 // reset -ve values of start to 0
214 vr.setViewportStartAndWidth(-1, 7);
215 assertEquals(vr.getViewportWidth(), 7);
216 assertEquals(vr.getStartRes(), 0);
218 // reset out of bounds start values to within bounds
219 vr.setViewportStartAndWidth(35, 5);
220 assertEquals(vr.getViewportWidth(), 5);
221 assertEquals(vr.getStartRes(), 16);
223 // small alignment doesn't get bounds reset
224 ViewportRanges vrsmall = new ViewportRanges(smallAl);
225 vrsmall.setViewportStartAndWidth(0, 63);
226 assertEquals(vrsmall.getViewportWidth(), 7);
227 assertEquals(vrsmall.getStartRes(), 0);
230 @Test(groups = { "Functional" })
231 public void testPageUpDown()
233 ViewportRanges vr = new ViewportRanges(al);
234 vr.setViewportStartAndHeight(8, 6);
236 assertEquals(vr.getStartSeq(), 13);
239 assertEquals(vr.getStartSeq(), 8);
242 assertEquals(vr.getStartSeq(), 3);
245 // pageup does not go beyond 0, viewport height stays the same
246 assertEquals(vr.getStartSeq(), 0);
247 assertEquals(vr.getViewportHeight(), 6);
255 // pagedown to bottom does not go beyond end, and height stays same
256 assertEquals(vr.getStartSeq(), 24);
257 assertEquals(vr.getViewportHeight(), 6);
260 @Test(groups = { "Functional" })
261 public void testScrollUp()
263 ViewportRanges vr = new ViewportRanges(al);
264 vr.setViewportStartAndHeight(1, 5);
266 assertEquals(vr.getStartSeq(), 0);
267 // can't scroll above top
269 assertEquals(vr.getStartSeq(), 0);
271 vr.setViewportStartAndHeight(24, 5);
273 assertEquals(vr.getStartSeq(), 25);
274 // can't scroll beyond bottom
276 assertEquals(vr.getStartSeq(), 25);
279 @Test(groups = { "Functional" })
280 public void testScrollUpWithHidden()
282 ViewportRanges vr = new ViewportRanges(al);
284 // hide last sequence
285 HiddenSequences hidden = new HiddenSequences(al);
286 hidden.hideSequence(al.getSequenceAt(29));
288 vr.setViewportStartAndHeight(1, 5);
290 assertEquals(vr.getStartSeq(), 0);
291 // can't scroll above top
293 assertEquals(vr.getStartSeq(), 0);
295 vr.setViewportStartAndHeight(23, 5);
297 assertEquals(vr.getStartSeq(), 24);
298 // can't scroll beyond bottom
300 assertEquals(vr.getStartSeq(), 24);
303 @Test(groups = { "Functional" })
304 public void testScrollRight()
306 ViewportRanges vr = new ViewportRanges(al);
307 vr.setViewportStartAndWidth(1, 5);
308 vr.scrollRight(false);
309 assertEquals(vr.getStartRes(), 0);
310 // can't scroll left past start
311 vr.scrollRight(false);
312 assertEquals(vr.getStartRes(), 0);
314 vr.setViewportStartAndWidth(15, 5);
315 vr.scrollRight(true);
316 assertEquals(vr.getStartRes(), 16);
317 // can't scroll right past end
318 vr.scrollRight(true);
319 assertEquals(vr.getStartRes(), 16);
322 @Test(groups = { "Functional" })
323 public void testScrollRightWithHidden()
325 ViewportRanges vr = new ViewportRanges(al);
327 // hide last 2 columns
328 HiddenColumns cols = new HiddenColumns();
329 cols.hideColumns(19, 20);
330 al.setHiddenColumns(cols);
332 vr.setViewportStartAndWidth(1, 5);
333 vr.scrollRight(false);
334 assertEquals(vr.getStartRes(), 0);
335 // can't scroll left past start
336 vr.scrollRight(false);
337 assertEquals(vr.getStartRes(), 0);
339 vr.setViewportStartAndWidth(13, 5);
340 vr.scrollRight(true);
341 assertEquals(vr.getStartRes(), 14);
342 // can't scroll right past last visible col
343 vr.scrollRight(true);
344 assertEquals(vr.getStartRes(), 14);
347 @Test(groups = { "Functional" })
348 public void testScrollToWrappedVisible()
350 ViewportRanges vr = new ViewportRanges(al);
351 vr.setViewportStartAndWidth(5, 10);
353 vr.scrollToWrappedVisible(0);
354 assertEquals(vr.getStartRes(), 0);
356 vr.scrollToWrappedVisible(10);
357 assertEquals(vr.getStartRes(), 10);
359 vr.scrollToWrappedVisible(15);
360 assertEquals(vr.getStartRes(), 10);
363 // leave until JAL-2388 is merged and we can do without viewport
364 /*@Test(groups = { "Functional" })
365 public void testScrollToVisible()
367 ViewportRanges vr = new ViewportRanges(al);
368 vr.setViewportStartAndWidth(12,5);
369 vr.setViewportStartAndHeight(10,6);
370 vr.scrollToVisible(13,14)
373 assertEquals(vr.getStartRes(), 12);
374 assertEquals(vr.getStartSeq(), 10);
376 vr.scrollToVisible(5,6);
377 assertEquals(vr.getStartRes(), 5);
378 assertEquals(vr.getStartSeq(), 6);
380 // test for hidden columns too
383 @Test(groups = { "Functional" })
384 public void testEventFiring()
386 ViewportRanges vr = new ViewportRanges(al);
387 MockPropChangeListener l = new MockPropChangeListener(vr);
388 List<String> emptylist = new ArrayList<>();
390 vr.setViewportWidth(5);
391 vr.setViewportHeight(5);
394 // one event fired when startRes is called with new value
396 assertTrue(l.verify(1, Arrays.asList("startres")));
399 // no event fired for same value
401 assertTrue(l.verify(0, emptylist));
405 assertTrue(l.verify(1, Arrays.asList("startres")));
408 // no event fired for same value
410 assertTrue(l.verify(0, emptylist));
414 assertTrue(l.verify(1, Arrays.asList("startseq")));
418 assertTrue(l.verify(0, emptylist));
422 assertTrue(l.verify(1, Arrays.asList("startseq")));
426 assertTrue(l.verify(0, emptylist));
429 vr.setStartEndRes(2, 15);
430 assertTrue(l.verify(1, Arrays.asList("startres")));
433 vr.setStartEndRes(2, 15);
434 assertTrue(l.verify(0, emptylist));
437 // check new value fired by event is corrected startres
438 vr.setStartEndRes(-1, 5);
439 assertTrue(l.verify(1, Arrays.asList("startres"), Arrays.asList(0)));
442 // check new value fired by event is corrected endres
443 vr.setStartEndRes(0, -1);
444 assertTrue(l.verify(1, Arrays.asList("endres"), Arrays.asList(0)));
447 vr.setStartEndSeq(2, 15);
448 assertTrue(l.verify(1, Arrays.asList("startseq")));
451 vr.setStartEndSeq(2, 15);
452 assertTrue(l.verify(0, emptylist));
455 vr.setStartEndRes(2, 2); // so seq and res values should be different, in
456 // case of transposing in code
459 // check new value fired by event is corrected startseq
460 vr.setStartEndSeq(-1, 5);
461 assertTrue(l.verify(1, Arrays.asList("startseq"), Arrays.asList(0)));
464 // check new value fired by event is corrected endseq
465 vr.setStartEndSeq(0, -1);
466 assertTrue(l.verify(1, Arrays.asList("endseq"), Arrays.asList(0)));
469 // reset for later tests
470 vr.setStartEndSeq(2, 15);
473 // test viewport height and width setting triggers event
474 vr.setViewportHeight(10);
475 assertTrue(l.verify(1, Arrays.asList("endseq")));
478 vr.setViewportWidth(18);
479 assertTrue(l.verify(1, Arrays.asList("endres")));
482 // already has seq start set to 2, so triggers endseq
483 vr.setViewportStartAndHeight(2, 16);
484 assertTrue(l.verify(1, Arrays.asList("endseq")));
487 vr.setViewportStartAndWidth(1, 14);
488 assertTrue(l.verify(1, Arrays.asList("startres")));
491 // test page up/down triggers event
493 assertTrue(l.verify(1, Arrays.asList("startseq")));
497 assertTrue(l.verify(1, Arrays.asList("startseq")));
500 // test scrolling triggers event
502 assertTrue(l.verify(1, Arrays.asList("startseq")));
506 assertTrue(l.verify(1, Arrays.asList("startseq")));
509 vr.scrollRight(true);
510 assertTrue(l.verify(1, Arrays.asList("startres")));
513 vr.scrollRight(false);
514 assertTrue(l.verify(1, Arrays.asList("startres")));
517 vr.scrollToVisible(10, 10);
518 assertTrue(l.verify(4,
519 Arrays.asList("startseq", "startseq", "startseq", "startseq")));
522 vr.scrollToWrappedVisible(5);
523 assertTrue(l.verify(1, Arrays.asList("startres")));
528 // mock listener for property change events
529 class MockPropChangeListener implements ViewportListenerI
531 private int firecount = 0;
533 private List<String> events = new ArrayList<>();
535 private List<Integer> newvalues = new ArrayList<>();
537 public MockPropChangeListener(ViewportRanges vr)
539 vr.addPropertyChangeListener(this);
543 public void propertyChange(PropertyChangeEvent evt)
546 events.add(evt.getPropertyName());
547 newvalues.add((Integer) evt.getNewValue());
550 public boolean verify(int count, List<String> eventslist,
551 List<Integer> valueslist)
553 return (count == firecount) && events.equals(eventslist)
554 && newvalues.equals(valueslist);
557 public boolean verify(int count, List<String> eventslist)
559 return (count == firecount) && events.equals(eventslist);