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;
9 import java.beans.PropertyChangeEvent;
10 import java.util.ArrayList;
11 import java.util.Arrays;
12 import java.util.List;
14 import org.testng.annotations.Test;
16 public class ViewportRangesTest {
18 AlignmentGenerator gen = new AlignmentGenerator(false);
20 AlignmentI al = gen.generate(20, 30, 1, 5, 5);
22 @Test(groups = { "Functional" })
23 public void testViewportRanges()
25 ViewportRanges vr = new ViewportRanges(al);
27 assertEquals(vr.getStartRes(),0);
28 assertEquals(vr.getEndRes(), al.getWidth()-1);
29 assertEquals(vr.getStartSeq(), 0);
30 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
33 @Test(groups = { "Functional" })
34 public void testGetAbsoluteAlignmentHeight()
36 ViewportRanges vr = new ViewportRanges(al);
38 assertEquals(vr.getAbsoluteAlignmentHeight(), al.getHeight());
40 al.getHiddenSequences().hideSequence(al.getSequenceAt(3));
41 assertEquals(vr.getAbsoluteAlignmentHeight(), al.getHeight() + 1);
44 @Test(groups = { "Functional" })
45 public void testGetAbsoluteAlignmentWidth()
47 ViewportRanges vr = new ViewportRanges(al);
48 assertEquals(vr.getAbsoluteAlignmentWidth(), al.getWidth());
51 @Test(groups = { "Functional" })
52 public void testSetEndRes()
54 ViewportRanges vr = new ViewportRanges(al);
56 assertEquals(vr.getEndRes(), 0);
58 vr.setEndRes(al.getWidth() - 1);
59 assertEquals(vr.getEndRes(), al.getWidth() - 1);
62 @Test(groups = { "Functional" })
63 public void testSetEndSeq()
65 ViewportRanges vr = new ViewportRanges(al);
67 assertEquals(vr.getEndSeq(), 0);
69 vr.setEndSeq(al.getHeight());
70 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
72 vr.setEndRes(al.getHeight() - 1);
73 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
76 @Test(groups = { "Functional" })
77 public void testSetStartRes()
79 ViewportRanges vr = new ViewportRanges(al);
81 assertEquals(vr.getStartRes(), 0);
83 vr.setStartRes(al.getWidth());
84 assertEquals(vr.getStartRes(), al.getWidth() - 1);
86 vr.setStartRes(al.getWidth() - 1);
87 assertEquals(vr.getStartRes(), al.getWidth() - 1);
90 @Test(groups = { "Functional" })
91 public void testSetStartSeq()
93 ViewportRanges vr = new ViewportRanges(al);
95 assertEquals(vr.getStartSeq(), 0);
97 vr.setStartSeq(al.getHeight() - vr.getViewportHeight() + 1);
98 assertEquals(vr.getStartSeq(), al.getHeight() - vr.getViewportHeight());
100 vr.setStartSeq(al.getHeight() - vr.getViewportHeight());
101 assertEquals(vr.getStartSeq(), al.getHeight() - vr.getViewportHeight());
104 @Test(groups = { "Functional" })
105 public void testSetStartEndRes()
107 ViewportRanges vr = new ViewportRanges(al);
108 vr.setStartEndRes(-1, -1);
109 assertEquals(vr.getStartRes(), 0);
110 assertEquals(vr.getEndRes(), 0);
112 vr.setStartEndRes(5, 19);
113 assertEquals(vr.getStartRes(), 5);
114 assertEquals(vr.getEndRes(), 19);
116 vr.setStartEndRes(al.getWidth(), al.getWidth());
117 assertEquals(vr.getEndRes(), al.getWidth());
120 @Test(groups = { "Functional" })
121 public void testSetStartEndSeq()
123 ViewportRanges vr = new ViewportRanges(al);
124 vr.setStartEndSeq(-1, -1);
125 assertEquals(vr.getStartSeq(), 0);
126 assertEquals(vr.getEndSeq(), 0);
128 vr.setStartEndSeq(5, 19);
129 assertEquals(vr.getStartSeq(), 5);
130 assertEquals(vr.getEndSeq(), 19);
132 vr.setStartEndSeq(al.getHeight(), al.getHeight());
133 assertEquals(vr.getEndSeq(), al.getHeight() - 1);
136 @Test(groups = { "Functional" })
137 public void testSetViewportHeight()
139 ViewportRanges vr = new ViewportRanges(al);
140 vr.setViewportHeight(13);
141 assertEquals(vr.getViewportHeight(), 13);
144 @Test(groups = { "Functional" })
145 public void testSetViewportWidth()
147 ViewportRanges vr = new ViewportRanges(al);
148 vr.setViewportWidth(13);
149 assertEquals(vr.getViewportWidth(), 13);
152 @Test(groups = { "Functional" })
153 public void testSetViewportStartAndHeight()
155 ViewportRanges vr = new ViewportRanges(al);
156 vr.setViewportStartAndHeight(2, 6);
157 assertEquals(vr.getViewportHeight(), 6);
158 assertEquals(vr.getStartSeq(), 2);
160 // reset -ve values of start to 0
161 vr.setViewportStartAndHeight(-1, 7);
162 assertEquals(vr.getViewportHeight(), 7);
163 assertEquals(vr.getStartSeq(), 0);
165 // reset out of bounds start values to within bounds
166 vr.setViewportStartAndHeight(35, 5);
167 assertEquals(vr.getViewportHeight(), 5);
168 assertEquals(vr.getStartSeq(), 24);
171 @Test(groups = { "Functional" })
172 public void testSetViewportStartAndWidth()
174 ViewportRanges vr = new ViewportRanges(al);
175 vr.setViewportStartAndWidth(2, 6);
176 assertEquals(vr.getViewportWidth(), 6);
177 assertEquals(vr.getStartRes(), 2);
179 // reset -ve values of start to 0
180 vr.setViewportStartAndWidth(-1, 7);
181 assertEquals(vr.getViewportWidth(), 7);
182 assertEquals(vr.getStartRes(), 0);
184 // reset out of bounds start values to within bounds
185 vr.setViewportStartAndWidth(35, 5);
186 assertEquals(vr.getViewportWidth(), 5);
187 assertEquals(vr.getStartRes(), 20);
190 @Test(groups = { "Functional" })
191 public void testPageUpDown()
193 ViewportRanges vr = new ViewportRanges(al);
194 vr.setViewportStartAndHeight(8, 6);
196 assertEquals(vr.getStartSeq(), 13);
199 assertEquals(vr.getStartSeq(), 8);
202 assertEquals(vr.getStartSeq(), 3);
205 // pageup does not go beyond 0, viewport height stays the same
206 assertEquals(vr.getStartSeq(), 0);
207 assertEquals(vr.getViewportHeight(), 6);
215 // pagedown to bottom does not go beyond end, and height stays same
216 assertEquals(vr.getStartSeq(), 23);
217 assertEquals(vr.getViewportHeight(), 6);
220 @Test(groups = { "Functional" })
221 public void testScrollUp()
223 ViewportRanges vr = new ViewportRanges(al);
224 vr.setViewportStartAndHeight(1, 5);
226 assertEquals(vr.getStartSeq(), 0);
227 // can't scroll above top
229 assertEquals(vr.getStartSeq(), 0);
231 vr.setViewportStartAndHeight(23, 5);
233 assertEquals(vr.getStartSeq(), 24);
234 // can't scroll beyond bottom
236 assertEquals(vr.getStartSeq(), 24);
239 @Test(groups = { "Functional" })
240 public void testScrollRight()
242 ViewportRanges vr = new ViewportRanges(al);
243 vr.setViewportStartAndWidth(1, 5);
244 vr.scrollRight(false);
245 assertEquals(vr.getStartRes(), 0);
246 // can't scroll left past start
247 vr.scrollRight(false);
248 assertEquals(vr.getStartRes(), 0);
250 vr.setViewportStartAndWidth(19, 5);
251 vr.scrollRight(true);
252 assertEquals(vr.getStartRes(), 20);
253 // can't scroll right past end
254 vr.scrollRight(true);
255 assertEquals(vr.getStartRes(), 20);
258 @Test(groups = { "Functional" })
259 public void testScrollToWrappedVisible()
261 ViewportRanges vr = new ViewportRanges(al);
262 vr.setViewportStartAndWidth(5, 10);
264 vr.scrollToWrappedVisible(0);
265 assertEquals(vr.getStartRes(), 0);
267 vr.scrollToWrappedVisible(10);
268 assertEquals(vr.getStartRes(), 10);
270 vr.scrollToWrappedVisible(15);
271 assertEquals(vr.getStartRes(), 10);
274 // leave until JAL-2388 is merged and we can do without viewport
275 /*@Test(groups = { "Functional" })
276 public void testScrollToVisible()
278 ViewportRanges vr = new ViewportRanges(al);
279 vr.setViewportStartAndWidth(12,5);
280 vr.setViewportStartAndHeight(10,6);
281 vr.scrollToVisible(13,14)
284 assertEquals(vr.getStartRes(), 12);
285 assertEquals(vr.getStartSeq(), 10);
287 vr.scrollToVisible(5,6);
288 assertEquals(vr.getStartRes(), 5);
289 assertEquals(vr.getStartSeq(), 6);
291 // test for hidden columns too
294 @Test(groups = { "Functional" })
295 public void testEventFiring()
297 ViewportRanges vr = new ViewportRanges(al);
298 MockPropChangeListener l = new MockPropChangeListener(vr);
299 List<String> emptylist = new ArrayList<String>();
301 vr.setViewportWidth(5);
302 vr.setViewportHeight(5);
305 // one event fired when startRes is called with new value
307 assertTrue(l.verify(1, Arrays.asList("startres")));
310 // no event fired for same value
312 assertTrue(l.verify(0, emptylist));
316 assertTrue(l.verify(1, Arrays.asList("startres")));
319 // no event fired for same value
321 assertTrue(l.verify(0, emptylist));
325 assertTrue(l.verify(1, Arrays.asList("startseq")));
329 assertTrue(l.verify(0, emptylist));
333 assertTrue(l.verify(1, Arrays.asList("startseq")));
337 assertTrue(l.verify(0, emptylist));
340 vr.setStartEndRes(2, 15);
341 assertTrue(l.verify(1, Arrays.asList("startres")));
344 vr.setStartEndRes(2, 15);
345 assertTrue(l.verify(0, emptylist));
348 // check new value fired by event is corrected startres
349 vr.setStartEndRes(-1, 5);
350 assertTrue(l.verify(1, Arrays.asList("startres"), Arrays.asList(0)));
353 // check new value fired by event is corrected endres
354 vr.setStartEndRes(0, -1);
355 assertTrue(l.verify(1, Arrays.asList("endres"), Arrays.asList(0)));
358 vr.setStartEndSeq(2, 15);
359 assertTrue(l.verify(1, Arrays.asList("startseq")));
362 vr.setStartEndSeq(2, 15);
363 assertTrue(l.verify(0, emptylist));
366 vr.setStartEndRes(2, 2); // so seq and res values should be different, in
367 // case of transposing in code
370 // check new value fired by event is corrected startseq
371 vr.setStartEndSeq(-1, 5);
372 assertTrue(l.verify(1, Arrays.asList("startseq"), Arrays.asList(0)));
375 // check new value fired by event is corrected endseq
376 vr.setStartEndSeq(0, -1);
377 assertTrue(l.verify(1, Arrays.asList("endseq"), Arrays.asList(0)));
380 // reset for later tests
381 vr.setStartEndSeq(2, 15);
384 // test viewport height and width setting triggers event
385 vr.setViewportHeight(10);
386 assertTrue(l.verify(1, Arrays.asList("endseq")));
389 vr.setViewportWidth(18);
390 assertTrue(l.verify(1, Arrays.asList("endres")));
393 // already has seq start set to 2, so triggers endseq
394 vr.setViewportStartAndHeight(2, 16);
395 assertTrue(l.verify(1, Arrays.asList("endseq")));
398 vr.setViewportStartAndWidth(1, 14);
399 assertTrue(l.verify(1, Arrays.asList("startres")));
402 // test page up/down triggers event
404 assertTrue(l.verify(1, Arrays.asList("startseq")));
408 assertTrue(l.verify(1, Arrays.asList("startseq")));
411 // test scrolling triggers event
413 assertTrue(l.verify(1, Arrays.asList("startseq")));
417 assertTrue(l.verify(1, Arrays.asList("startseq")));
420 vr.scrollRight(true);
421 assertTrue(l.verify(1, Arrays.asList("startres")));
424 vr.scrollRight(false);
425 assertTrue(l.verify(1, Arrays.asList("startres")));
428 // TODO test scrollToVisibble once hidden columns JAL-2388 merged in
429 // to avoid somersaults with align viewport
430 /*vr.scrollToVisible(10, 10);
431 assertTrue(l.verify(1, Arrays.asList("startres")));
434 vr.scrollToWrappedVisible(5);
435 assertTrue(l.verify(1, Arrays.asList("startres")));
440 // mock listener for property change events
441 class MockPropChangeListener implements ViewportListenerI
443 private int firecount = 0;
445 private List<String> events = new ArrayList<String>();
447 private List<Integer> newvalues = new ArrayList<Integer>();
449 public MockPropChangeListener(ViewportRanges vr)
451 vr.addPropertyChangeListener(this);
455 public void propertyChange(PropertyChangeEvent evt)
458 events.add(evt.getPropertyName());
459 newvalues.add((Integer) evt.getNewValue());
462 public boolean verify(int count, List<String> eventslist,
463 List<Integer> valueslist)
465 return (count == firecount) && events.equals(eventslist)
466 && newvalues.equals(valueslist);
469 public boolean verify(int count, List<String> eventslist)
471 return (count == firecount) && events.equals(eventslist);