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.viewmodel;
23 import static org.testng.Assert.assertEquals;
25 import jalview.bin.Cache;
26 import jalview.bin.Jalview;
27 import jalview.datamodel.Alignment;
28 import jalview.datamodel.Sequence;
29 import jalview.datamodel.SequenceI;
30 import jalview.gui.AlignViewport;
31 import jalview.gui.JvOptionPane;
33 import org.testng.annotations.AfterClass;
34 import org.testng.annotations.BeforeClass;
35 import org.testng.annotations.Test;
37 public class OverviewDimensionsTest {
39 boolean showConservationSetting;
41 SequenceI seq1 = new Sequence(
43 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
45 SequenceI seq2 = new Sequence(
47 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
49 SequenceI seq3 = new Sequence(
51 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
53 SequenceI seq4 = new Sequence(
55 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
57 SequenceI seq5 = new Sequence(
59 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
61 SequenceI seq6 = new Sequence(
63 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
65 SequenceI seq7 = new Sequence(
67 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
69 SequenceI seq8 = new Sequence(
71 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
73 SequenceI seq9 = new Sequence(
75 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
77 SequenceI seq10 = new Sequence(
79 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
81 SequenceI seq11 = new Sequence(
83 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
85 SequenceI seq12 = new Sequence(
87 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
89 SequenceI seq13 = new Sequence(
91 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
93 SequenceI seq14 = new Sequence(
95 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
97 SequenceI seq15 = new Sequence(
99 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
101 SequenceI seq16 = new Sequence(
103 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
105 SequenceI seq17 = new Sequence(
107 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
109 SequenceI seq18 = new Sequence(
111 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
113 SequenceI seq19 = new Sequence(
115 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
117 SequenceI seq20 = new Sequence(
119 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
121 SequenceI seq21 = new Sequence(
123 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
125 SequenceI seq22 = new Sequence(
127 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"
128 + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"
129 + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
131 SequenceI seq23 = new Sequence(
133 "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
136 @BeforeClass(alwaysRun = true)
139 JvOptionPane.setInteractiveMode(false);
140 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
142 Jalview.main(new String[] { "-nonews", "-props",
143 "test/jalview/testProps.jvprops" });
145 // get cached setting for showConservation
146 // reset it in AfterClass!
147 showConservationSetting = Cache.getDefault("SHOW_CONSERVATION", true);
150 @AfterClass(alwaysRun = true)
151 public void tearDown()
153 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
154 Boolean.toString(showConservationSetting));
158 * Test that the OverviewDimensions constructor sets width and height
161 @Test(groups = { "Functional" })
162 public void testConstructor()
164 SequenceI seqa = new Sequence("Seq1", "ABC");
165 SequenceI seqb = new Sequence("Seq2", "ABC");
166 SequenceI seqc = new Sequence("Seq3", "ABC");
167 SequenceI seqd = new Sequence("Seq4", "ABC");
168 SequenceI seqe = new Sequence("Seq5",
169 "ABCABCABCABCABCABCABCABCBACBACBACBAC");
171 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
172 Boolean.toString(true));
174 // test for alignment with width > height
175 SequenceI[] seqs1 = new SequenceI[] { seqa, seqb };
176 Alignment al1 = new Alignment(seqs1);
177 al1.setDataset(null);
178 AlignViewport av1 = new AlignViewport(al1);
180 OverviewDimensions od = new OverviewDimensions(av1);
181 assertEquals(od.getGraphHeight(), 20);
182 assertEquals(od.getSequencesHeight(), 266);
183 assertEquals(od.getWidth(), 400);
184 assertEquals(od.getHeight(), 286);
186 // test for alignment with width < height
187 SequenceI[] seqs2 = new SequenceI[] { seqa, seqb, seqc, seqd };
188 Alignment al2 = new Alignment(seqs2);
189 al2.setDataset(null);
190 AlignViewport av2 = new AlignViewport(al2);
192 od = new OverviewDimensions(av2);
193 assertEquals(od.getGraphHeight(), 20);
194 assertEquals(od.getSequencesHeight(), 300);
195 assertEquals(od.getWidth(), 300);
196 assertEquals(od.getHeight(), 320);
198 // test for alignment with width > height and sequence height scaled below
200 SequenceI[] seqs3 = new SequenceI[] { seqe };
201 Alignment al3 = new Alignment(seqs3);
202 al3.setDataset(null);
203 AlignViewport av3 = new AlignViewport(al3);
205 od = new OverviewDimensions(av3);
206 assertEquals(od.getGraphHeight(), 20);
207 assertEquals(od.getSequencesHeight(), 40);
208 assertEquals(od.getWidth(), 400);
209 assertEquals(od.getHeight(), 60);
211 // test for alignment with width < height and width scaled below min value
212 SequenceI[] seqs4 = new SequenceI[] { seqa, seqb, seqc, seqd, seqa,
213 seqb, seqc, seqd, seqa, seqb, seqc, seqd, seqa, seqb, seqc, seqd };
214 Alignment al4 = new Alignment(seqs4);
215 al4.setDataset(null);
216 AlignViewport av4 = new AlignViewport(al4);
218 od = new OverviewDimensions(av4);
219 assertEquals(od.getGraphHeight(), 20);
220 assertEquals(od.getSequencesHeight(), 300);
221 assertEquals(od.getWidth(), 120);
222 assertEquals(od.getHeight(), 320);
224 // test for alignment where no conservation annotation is shown
225 Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
226 Boolean.toString(false));
228 Alignment al5 = new Alignment(seqs4);
229 al5.setDataset(null);
230 AlignViewport av5 = new AlignViewport(al5);
232 od = new OverviewDimensions(av5);
233 assertEquals(od.getGraphHeight(), 0);
234 assertEquals(od.getSequencesHeight(), 300);
235 assertEquals(od.getWidth(), 120);
236 assertEquals(od.getHeight(), 300);
240 * Test that validation after mouse adjustments to boxX and boxY sets box
241 * dimensions and scroll values correctly, when there are no hidden rows or
244 @Test(groups = { "Functional" })
245 public void checkValidNoHidden()
248 SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4, seq5,
249 seq6, seq7, seq8, seq9, seq10, seq11, seq12, seq13, seq14, seq15,
250 seq16, seq17, seq18, seq19, seq20, seq21, seq22, seq23 };
251 Alignment al = new Alignment(seqs);
253 AlignViewport av = new AlignViewport(al);
255 // Initial box sizing - default path through code
256 OverviewDimensions od = new OverviewDimensions(av);
259 assertEquals(od.getBoxX(), 0);
260 assertEquals(od.getBoxY(), 0);
261 assertEquals(od.getBoxWidth(), 399);
262 assertEquals(od.getScrollCol(), 0);
263 assertEquals(od.getScrollRow(), 0);
265 // negative boxX value reset to 0
268 assertEquals(od.getBoxX(), 0);
270 // negative boxY value reset to 0
273 assertEquals(od.getBoxY(), 0);
275 // overly large boxX value reset to width-boxWidth
278 assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth());
282 OverviewDimensions od2 = new OverviewDimensions(av);
283 od2.setBoxPosition();
285 assertEquals(od2.getBoxX(), 61);
286 assertEquals(od2.getScrollCol(), 49);
290 * Test setting of the box position, when there are hidden cols at the start
293 @Test(groups = { "Functional" })
294 public void testSetBoxPosWithHiddenColsAtStart()
297 SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4, seq5,
298 seq6, seq7, seq8, seq9, seq10, seq11, seq12, seq13, seq14, seq15,
299 seq16, seq17, seq18, seq19, seq20, seq21, seq22, seq23 };
300 Alignment al = new Alignment(seqs);
302 AlignViewport av = new AlignViewport(al);
305 OverviewDimensions od = new OverviewDimensions(av);
307 // hiding columns before current position: changes boxX but not scrollCol or
311 av.showAllHiddenColumns();
314 int prevWidth = od.getBoxWidth();
316 // hide cols at start and check updated box position is correct
317 // changes boxX but not scrollCol or boxwidth
318 int lastHiddenCol = 50;
319 av.hideColumns(0, 50);
321 assertEquals(od.getBoxX(), 124);
322 assertEquals(od.getScrollCol(), lastHiddenCol - 1);
323 assertEquals(od.getBoxWidth(), prevWidth);
325 // set the box position by moving viewport & check it goes to the right
328 // update the box position via mouse and check it goes to the right place
331 @Test(groups = { "Functional" })
332 public void testSetBoxPosWithHiddenColsAtEnd()
337 @Test(groups = { "Functional" })
338 public void testSetBoxPosWithHiddenColsMiddle()
341 SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4, seq5,
342 seq6, seq7, seq8, seq9, seq10, seq11, seq12, seq13, seq14, seq15,
343 seq16, seq17, seq18, seq19, seq20, seq21, seq22, seq23 };
344 Alignment al = new Alignment(seqs);
346 AlignViewport av = new AlignViewport(al);
349 OverviewDimensions od = new OverviewDimensions(av);
351 // hiding columns after current position: changes end position but not start
352 // so scrollCol and boxX do not change but boxWidth does
353 float scalew = od.getWidth() / al.getWidth();
354 int prevWidth = od.getBoxWidth();
355 int prevX = od.getBoxX();
356 av.hideColumns(108, 110);
358 assertEquals(od.getBoxX(), prevX);
359 assertEquals(od.getScrollCol(), 49);
360 // assertEquals(od2.getBoxWidth(), prevWidth + ((int) 2 * av.getCharWidth()
364 @Test(groups = { "Functional" })
365 public void testSetBoxPosWithHiddenRowsAtStart()
368 SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4, seq5,
369 seq6, seq7, seq8, seq9, seq10, seq11, seq12, seq13, seq14, seq15,
370 seq16, seq17, seq18, seq19, seq20, seq21, seq22, seq23 };
371 Alignment al = new Alignment(seqs);
373 AlignViewport av = new AlignViewport(al);
376 OverviewDimensions od = new OverviewDimensions(av);
378 // account for hidden rows
379 SequenceI[] hidden = { seq2, seq3, seq4, seq5, seq6, seq7 };
380 av.showAllHiddenColumns();
381 av.hideSequence(hidden);
383 assertEquals(od.getBoxY(), 0);
384 assertEquals(od.getScrollRow(), 0);
388 * Test that the box position is set correctly
390 @Test(groups = { "Functional" })
391 public void setBoxPosition()
394 SequenceI[] seqs = new SequenceI[] { seq1, seq2, seq3, seq4, seq5,
395 seq6, seq7, seq8, seq9, seq10, seq11, seq12, seq13, seq14, seq15,
396 seq16, seq17, seq18, seq19, seq20, seq21, seq22, seq23 };
397 Alignment al = new Alignment(seqs);
399 AlignViewport av = new AlignViewport(al);
401 // Test box is in expected location when there are no hidden rows or columns
403 OverviewDimensions od = new OverviewDimensions(av);
406 assertEquals(od.getBoxHeight(), 81);
407 assertEquals(od.getBoxWidth(), 400);
408 assertEquals(od.getBoxX(), 0);
409 assertEquals(od.getBoxY(), 0);
411 // Account for hidden rows
412 SequenceI[] hidden = { seq2, seq3, seq4 };
413 av.hideSequence(hidden);
415 OverviewDimensions od1 = new OverviewDimensions(av);
416 od1.setBoxPosition();
418 assertEquals(od1.getBoxHeight(), 80);
419 assertEquals(od1.getBoxWidth(), 400);
420 assertEquals(od1.getBoxX(), 0);
421 assertEquals(od1.getBoxY(), 0);
423 // Account for hidden columns
424 av.hideColumns(10, 15);
425 av.showAllHiddenSeqs();
427 OverviewDimensions od2 = new OverviewDimensions(av);
428 od2.setBoxPosition();
430 assertEquals(od2.getBoxHeight(), 81);
431 assertEquals(od2.getBoxWidth(), 422);
432 assertEquals(od2.getBoxX(), 0);
433 assertEquals(od2.getBoxY(), 0);
435 // Account for hidden rows and cols
436 av.hideSequence(hidden);
437 OverviewDimensions od3 = new OverviewDimensions(av);
438 od3.setBoxPosition();
440 assertEquals(od3.getBoxHeight(), 80);
441 assertEquals(od3.getBoxWidth(), 422);
442 assertEquals(od3.getBoxX(), 0);
443 assertEquals(od3.getBoxY(), 0);