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);
29 ColumnSelection sel = new ColumnSelection();
30 al.getHiddenColumns().revealAllHiddenColumns(sel);
31 al.getHiddenSequences().showAll(null);
34 @Test(groups = { "Functional" })
35 public void testViewportRanges()
37 ViewportRanges vr = new ViewportRanges(al);
39 assertEquals(vr.getStartRes(),0);
40 assertEquals(vr.getEndRes(), al.getWidth()-1);
41 assertEquals(vr.getStartSeq(), 0);
42 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
45 @Test(groups = { "Functional" })
46 public void testGetAbsoluteAlignmentHeight()
48 ViewportRanges vr = new ViewportRanges(al);
50 assertEquals(vr.getAbsoluteAlignmentHeight(), al.getHeight());
52 al.getHiddenSequences().hideSequence(al.getSequenceAt(3));
53 assertEquals(vr.getAbsoluteAlignmentHeight(), al.getHeight() + 1);
56 @Test(groups = { "Functional" })
57 public void testGetAbsoluteAlignmentWidth()
59 ViewportRanges vr = new ViewportRanges(al);
60 assertEquals(vr.getAbsoluteAlignmentWidth(), al.getWidth());
63 @Test(groups = { "Functional" })
64 public void testSetEndRes()
66 ViewportRanges vr = new ViewportRanges(al);
68 assertEquals(vr.getEndRes(), 0);
70 vr.setEndRes(al.getWidth() - 1);
71 assertEquals(vr.getEndRes(), al.getWidth() - 1);
74 @Test(groups = { "Functional" })
75 public void testSetEndSeq()
77 ViewportRanges vr = new ViewportRanges(al);
79 assertEquals(vr.getEndSeq(), 0);
81 vr.setEndSeq(al.getHeight());
82 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
84 vr.setEndRes(al.getHeight() - 1);
85 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
88 @Test(groups = { "Functional" })
89 public void testSetStartRes()
91 ViewportRanges vr = new ViewportRanges(al);
93 assertEquals(vr.getStartRes(), 0);
95 vr.setStartRes(al.getWidth());
96 assertEquals(vr.getStartRes(), al.getWidth() - 1);
98 vr.setStartRes(al.getWidth() - 1);
99 assertEquals(vr.getStartRes(), al.getWidth() - 1);
102 @Test(groups = { "Functional" })
103 public void testSetStartSeq()
105 ViewportRanges vr = new ViewportRanges(al);
107 assertEquals(vr.getStartSeq(), 0);
109 vr.setStartSeq(al.getHeight() - vr.getViewportHeight() + 1);
110 assertEquals(vr.getStartSeq(), al.getHeight() - vr.getViewportHeight());
112 vr.setStartSeq(al.getHeight() - vr.getViewportHeight());
113 assertEquals(vr.getStartSeq(), al.getHeight() - vr.getViewportHeight());
116 @Test(groups = { "Functional" })
117 public void testSetStartEndRes()
119 ViewportRanges vr = new ViewportRanges(al);
120 vr.setStartEndRes(-1, -1);
121 assertEquals(vr.getStartRes(), 0);
122 assertEquals(vr.getEndRes(), 0);
124 vr.setStartEndRes(5, 19);
125 assertEquals(vr.getStartRes(), 5);
126 assertEquals(vr.getEndRes(), 19);
128 vr.setStartEndRes(al.getWidth(), al.getWidth());
129 assertEquals(vr.getEndRes(), al.getWidth());
132 @Test(groups = { "Functional" })
133 public void testSetStartEndSeq()
135 ViewportRanges vr = new ViewportRanges(al);
136 vr.setStartEndSeq(-1, -1);
137 assertEquals(vr.getStartSeq(), 0);
138 assertEquals(vr.getEndSeq(), 0);
140 vr.setStartEndSeq(5, 19);
141 assertEquals(vr.getStartSeq(), 5);
142 assertEquals(vr.getEndSeq(), 19);
144 vr.setStartEndSeq(al.getHeight(), al.getHeight());
145 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
148 @Test(groups = { "Functional" })
149 public void testSetViewportHeight()
151 ViewportRanges vr = new ViewportRanges(al);
152 vr.setViewportHeight(13);
153 assertEquals(vr.getViewportHeight(), 13);
156 @Test(groups = { "Functional" })
157 public void testSetViewportWidth()
159 ViewportRanges vr = new ViewportRanges(al);
160 vr.setViewportWidth(13);
161 assertEquals(vr.getViewportWidth(), 13);
164 @Test(groups = { "Functional" })
165 public void testSetViewportStartAndHeight()
167 ViewportRanges vr = new ViewportRanges(al);
168 vr.setViewportStartAndHeight(2, 6);
169 assertEquals(vr.getViewportHeight(), 6);
170 assertEquals(vr.getStartSeq(), 2);
172 // reset -ve values of start to 0
173 vr.setViewportStartAndHeight(-1, 7);
174 assertEquals(vr.getViewportHeight(), 7);
175 assertEquals(vr.getStartSeq(), 0);
177 // reset out of bounds start values to within bounds
178 vr.setViewportStartAndHeight(35, 5);
179 assertEquals(vr.getViewportHeight(), 5);
180 assertEquals(vr.getStartSeq(), 24);
183 @Test(groups = { "Functional" })
184 public void testSetViewportStartAndWidth()
186 ViewportRanges vr = new ViewportRanges(al);
187 vr.setViewportStartAndWidth(2, 6);
188 assertEquals(vr.getViewportWidth(), 6);
189 assertEquals(vr.getStartRes(), 2);
191 // reset -ve values of start to 0
192 vr.setViewportStartAndWidth(-1, 7);
193 assertEquals(vr.getViewportWidth(), 7);
194 assertEquals(vr.getStartRes(), 0);
196 // reset out of bounds start values to within bounds
197 vr.setViewportStartAndWidth(35, 5);
198 assertEquals(vr.getViewportWidth(), 5);
199 assertEquals(vr.getStartRes(), 20);
202 @Test(groups = { "Functional" })
203 public void testPageUpDown()
205 ViewportRanges vr = new ViewportRanges(al);
206 vr.setViewportStartAndHeight(8, 6);
208 assertEquals(vr.getStartSeq(), 13);
211 assertEquals(vr.getStartSeq(), 8);
214 assertEquals(vr.getStartSeq(), 3);
217 // pageup does not go beyond 0, viewport height stays the same
218 assertEquals(vr.getStartSeq(), 0);
219 assertEquals(vr.getViewportHeight(), 6);
227 // pagedown to bottom does not go beyond end, and height stays same
228 assertEquals(vr.getStartSeq(), 24);
229 assertEquals(vr.getViewportHeight(), 6);
232 @Test(groups = { "Functional" })
233 public void testScrollUp()
235 ViewportRanges vr = new ViewportRanges(al);
236 vr.setViewportStartAndHeight(1, 5);
238 assertEquals(vr.getStartSeq(), 0);
239 // can't scroll above top
241 assertEquals(vr.getStartSeq(), 0);
243 vr.setViewportStartAndHeight(24, 5);
245 assertEquals(vr.getStartSeq(), 25);
246 // can't scroll beyond bottom
248 assertEquals(vr.getStartSeq(), 25);
251 @Test(groups = { "Functional" })
252 public void testScrollUpWithHidden()
254 ViewportRanges vr = new ViewportRanges(al);
256 // hide last sequence
257 HiddenSequences hidden = new HiddenSequences(al);
258 hidden.hideSequence(al.getSequenceAt(29));
260 vr.setViewportStartAndHeight(1, 5);
262 assertEquals(vr.getStartSeq(), 0);
263 // can't scroll above top
265 assertEquals(vr.getStartSeq(), 0);
267 vr.setViewportStartAndHeight(23, 5);
269 assertEquals(vr.getStartSeq(), 24);
270 // can't scroll beyond bottom
272 assertEquals(vr.getStartSeq(), 24);
275 @Test(groups = { "Functional" })
276 public void testScrollRight()
278 ViewportRanges vr = new ViewportRanges(al);
279 vr.setViewportStartAndWidth(1, 5);
280 vr.scrollRight(false);
281 assertEquals(vr.getStartRes(), 0);
282 // can't scroll left past start
283 vr.scrollRight(false);
284 assertEquals(vr.getStartRes(), 0);
286 vr.setViewportStartAndWidth(19, 5);
287 vr.scrollRight(true);
288 assertEquals(vr.getStartRes(), 20);
289 // can't scroll right past end
290 vr.scrollRight(true);
291 assertEquals(vr.getStartRes(), 20);
294 @Test(groups = { "Functional" })
295 public void testScrollRightWithHidden()
297 ViewportRanges vr = new ViewportRanges(al);
299 // hide last 2 columns
300 HiddenColumns cols = new HiddenColumns();
301 cols.hideColumns(18, 19);
302 al.setHiddenColumns(cols);
304 vr.setViewportStartAndWidth(1, 5);
305 vr.scrollRight(false);
306 assertEquals(vr.getStartRes(), 0);
307 // can't scroll left past start
308 vr.scrollRight(false);
309 assertEquals(vr.getStartRes(), 0);
311 vr.setViewportStartAndWidth(19, 5);
312 vr.scrollRight(true);
313 assertEquals(vr.getStartRes(), 18);
314 // can't scroll right past last visible col
315 vr.scrollRight(true);
316 assertEquals(vr.getStartRes(), 18);
319 @Test(groups = { "Functional" })
320 public void testScrollToWrappedVisible()
322 ViewportRanges vr = new ViewportRanges(al);
323 vr.setViewportStartAndWidth(5, 10);
325 vr.scrollToWrappedVisible(0);
326 assertEquals(vr.getStartRes(), 0);
328 vr.scrollToWrappedVisible(10);
329 assertEquals(vr.getStartRes(), 10);
331 vr.scrollToWrappedVisible(15);
332 assertEquals(vr.getStartRes(), 10);
335 // leave until JAL-2388 is merged and we can do without viewport
336 /*@Test(groups = { "Functional" })
337 public void testScrollToVisible()
339 ViewportRanges vr = new ViewportRanges(al);
340 vr.setViewportStartAndWidth(12,5);
341 vr.setViewportStartAndHeight(10,6);
342 vr.scrollToVisible(13,14)
345 assertEquals(vr.getStartRes(), 12);
346 assertEquals(vr.getStartSeq(), 10);
348 vr.scrollToVisible(5,6);
349 assertEquals(vr.getStartRes(), 5);
350 assertEquals(vr.getStartSeq(), 6);
352 // test for hidden columns too
355 @Test(groups = { "Functional" })
356 public void testEventFiring()
358 ViewportRanges vr = new ViewportRanges(al);
359 MockPropChangeListener l = new MockPropChangeListener(vr);
360 List<String> emptylist = new ArrayList<>();
362 vr.setViewportWidth(5);
363 vr.setViewportHeight(5);
366 // one event fired when startRes is called with new value
368 assertTrue(l.verify(1, Arrays.asList("startres")));
371 // no event fired for same value
373 assertTrue(l.verify(0, emptylist));
377 assertTrue(l.verify(1, Arrays.asList("startres")));
380 // no event fired for same value
382 assertTrue(l.verify(0, emptylist));
386 assertTrue(l.verify(1, Arrays.asList("startseq")));
390 assertTrue(l.verify(0, emptylist));
394 assertTrue(l.verify(1, Arrays.asList("startseq")));
398 assertTrue(l.verify(0, emptylist));
401 vr.setStartEndRes(2, 15);
402 assertTrue(l.verify(1, Arrays.asList("startres")));
405 vr.setStartEndRes(2, 15);
406 assertTrue(l.verify(0, emptylist));
409 // check new value fired by event is corrected startres
410 vr.setStartEndRes(-1, 5);
411 assertTrue(l.verify(1, Arrays.asList("startres"), Arrays.asList(0)));
414 // check new value fired by event is corrected endres
415 vr.setStartEndRes(0, -1);
416 assertTrue(l.verify(1, Arrays.asList("endres"), Arrays.asList(0)));
419 vr.setStartEndSeq(2, 15);
420 assertTrue(l.verify(1, Arrays.asList("startseq")));
423 vr.setStartEndSeq(2, 15);
424 assertTrue(l.verify(0, emptylist));
427 vr.setStartEndRes(2, 2); // so seq and res values should be different, in
428 // case of transposing in code
431 // check new value fired by event is corrected startseq
432 vr.setStartEndSeq(-1, 5);
433 assertTrue(l.verify(1, Arrays.asList("startseq"), Arrays.asList(0)));
436 // check new value fired by event is corrected endseq
437 vr.setStartEndSeq(0, -1);
438 assertTrue(l.verify(1, Arrays.asList("endseq"), Arrays.asList(0)));
441 // reset for later tests
442 vr.setStartEndSeq(2, 15);
445 // test viewport height and width setting triggers event
446 vr.setViewportHeight(10);
447 assertTrue(l.verify(1, Arrays.asList("endseq")));
450 vr.setViewportWidth(18);
451 assertTrue(l.verify(1, Arrays.asList("endres")));
454 // already has seq start set to 2, so triggers endseq
455 vr.setViewportStartAndHeight(2, 16);
456 assertTrue(l.verify(1, Arrays.asList("endseq")));
459 vr.setViewportStartAndWidth(1, 14);
460 assertTrue(l.verify(1, Arrays.asList("startres")));
463 // test page up/down triggers event
465 assertTrue(l.verify(1, Arrays.asList("startseq")));
469 assertTrue(l.verify(1, Arrays.asList("startseq")));
472 // test scrolling triggers event
474 assertTrue(l.verify(1, Arrays.asList("startseq")));
478 assertTrue(l.verify(1, Arrays.asList("startseq")));
481 vr.scrollRight(true);
482 assertTrue(l.verify(1, Arrays.asList("startres")));
485 vr.scrollRight(false);
486 assertTrue(l.verify(1, Arrays.asList("startres")));
489 vr.scrollToVisible(10, 10);
490 assertTrue(l.verify(4,
491 Arrays.asList("startseq", "startseq", "startseq", "startseq")));
494 vr.scrollToWrappedVisible(5);
495 assertTrue(l.verify(1, Arrays.asList("startres")));
500 // mock listener for property change events
501 class MockPropChangeListener implements ViewportListenerI
503 private int firecount = 0;
505 private List<String> events = new ArrayList<>();
507 private List<Integer> newvalues = new ArrayList<>();
509 public MockPropChangeListener(ViewportRanges vr)
511 vr.addPropertyChangeListener(this);
515 public void propertyChange(PropertyChangeEvent evt)
518 events.add(evt.getPropertyName());
519 newvalues.add((Integer) evt.getNewValue());
522 public boolean verify(int count, List<String> eventslist,
523 List<Integer> valueslist)
525 return (count == firecount) && events.equals(eventslist)
526 && newvalues.equals(valueslist);
529 public boolean verify(int count, List<String> eventslist)
531 return (count == firecount) && events.equals(eventslist);