JAL-2388 Incomplete unit tests
[jalview.git] / test / jalview / viewmodel / OverviewDimensionsTest.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
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.
11  *  
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.
16  * 
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.
20  */
21 package jalview.viewmodel;
22
23 import static org.testng.Assert.assertEquals;
24
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;
32
33 import org.testng.annotations.AfterClass;
34 import org.testng.annotations.BeforeClass;
35 import org.testng.annotations.Test;
36
37 public class OverviewDimensionsTest {
38
39   boolean showConservationSetting;
40
41   SequenceI seq1 = new Sequence(
42           "Seq1",
43           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
44
45   SequenceI seq2 = new Sequence(
46           "Seq2",
47           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
48
49   SequenceI seq3 = new Sequence(
50           "Seq3",
51           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
52
53   SequenceI seq4 = new Sequence(
54           "Seq4",
55           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
56
57   SequenceI seq5 = new Sequence(
58           "Seq5",
59           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
60
61   SequenceI seq6 = new Sequence(
62           "Seq6",
63           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
64
65   SequenceI seq7 = new Sequence(
66           "Seq7",
67           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
68
69   SequenceI seq8 = new Sequence(
70           "Seq8",
71           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
72
73   SequenceI seq9 = new Sequence(
74           "Seq9",
75           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
76
77   SequenceI seq10 = new Sequence(
78           "Seq10",
79           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
80
81   SequenceI seq11 = new Sequence(
82           "Seq11",
83           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
84
85   SequenceI seq12 = new Sequence(
86           "Seq12",
87           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
88
89   SequenceI seq13 = new Sequence(
90           "Seq13",
91           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
92
93   SequenceI seq14 = new Sequence(
94           "Seq14",
95           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
96
97   SequenceI seq15 = new Sequence(
98           "Seq15",
99           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
100
101   SequenceI seq16 = new Sequence(
102           "Seq16",
103           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
104
105   SequenceI seq17 = new Sequence(
106           "Seq17",
107           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
108
109   SequenceI seq18 = new Sequence(
110           "Seq18",
111           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
112
113   SequenceI seq19 = new Sequence(
114           "Seq19",
115           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
116
117   SequenceI seq20 = new Sequence(
118           "Seq20",
119           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
120
121   SequenceI seq21 = new Sequence(
122           "Seq21",
123           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
124
125   SequenceI seq22 = new Sequence(
126           "Seq22",
127           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"
128                   + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC"
129                   + "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
130
131   SequenceI seq23 = new Sequence(
132           "Seq23",
133           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
134
135
136   @BeforeClass(alwaysRun = true)
137   public void setUp()
138   {
139     JvOptionPane.setInteractiveMode(false);
140     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
141
142     Jalview.main(new String[] { "-nonews", "-props",
143         "test/jalview/testProps.jvprops" });
144
145     // get cached setting for showConservation
146     // reset it in AfterClass!
147     showConservationSetting = Cache.getDefault("SHOW_CONSERVATION", true);
148   }
149
150   @AfterClass(alwaysRun = true)
151   public void tearDown()
152   {
153     Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
154             Boolean.toString(showConservationSetting));
155   }
156
157   /**
158    * Test that the OverviewDimensions constructor sets width and height
159    * correctly
160    */
161   @Test(groups = { "Functional" })
162       public void testConstructor()
163       {
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");
170
171         Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
172                 Boolean.toString(true));
173
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);
179
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);
185
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);
191
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);
197
198         // test for alignment with width > height and sequence height scaled below
199         // min value
200         SequenceI[] seqs3 = new SequenceI[] { seqe };
201         Alignment al3 = new Alignment(seqs3);
202         al3.setDataset(null);
203         AlignViewport av3 = new AlignViewport(al3);
204
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);
210
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);
217
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);
223
224         // test for alignment where no conservation annotation is shown
225         Cache.applicationProperties.setProperty("SHOW_CONSERVATION",
226                 Boolean.toString(false));
227
228         Alignment al5 = new Alignment(seqs4);
229         al5.setDataset(null);
230         AlignViewport av5 = new AlignViewport(al5);
231
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);
237       }
238
239   /**
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
242    * columns
243    */
244   @Test(groups = { "Functional" })
245   public void checkValidNoHidden()
246   {
247     seq23.setStart(386);
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);
252     al.setDataset(null);
253     AlignViewport av = new AlignViewport(al);
254
255     // Initial box sizing - default path through code
256     OverviewDimensions od = new OverviewDimensions(av);
257     od.setBoxPosition();
258     od.checkValid();
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);
264
265     // negative boxX value reset to 0
266     od.setBoxX(-5);
267     od.checkValid();
268     assertEquals(od.getBoxX(), 0);
269
270     // negative boxY value reset to 0
271     od.setBoxY(-2);
272     od.checkValid();
273     assertEquals(od.getBoxY(), 0);
274
275     // overly large boxX value reset to width-boxWidth
276     od.setBoxX(100);
277     od.checkValid();
278     assertEquals(od.getBoxX(), od.getWidth() - od.getBoxWidth());
279
280     // startRes non-zero
281     av.setStartRes(50);
282     OverviewDimensions od2 = new OverviewDimensions(av);
283     od2.setBoxPosition();
284     od2.checkValid();
285     assertEquals(od2.getBoxX(), 61);
286     assertEquals(od2.getScrollCol(), 49);
287   }
288
289   /**
290    * Test setting of the box position, when there are hidden cols at the start
291    * of the alignment
292    */
293   @Test(groups = { "Functional" })
294   public void testSetBoxPosWithHiddenColsAtStart()
295   {
296     seq23.setStart(386);
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);
301     al.setDataset(null);
302     AlignViewport av = new AlignViewport(al);
303
304     av.setStartRes(50);
305     OverviewDimensions od = new OverviewDimensions(av);
306
307     // hiding columns before current position: changes boxX but not scrollCol or
308     // boxwidth
309
310     // do a reset
311     av.showAllHiddenColumns();
312     od.setBoxPosition();
313     od.checkValid();
314     int prevWidth = od.getBoxWidth();
315
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);
320     od.setBoxPosition();
321     assertEquals(od.getBoxX(), 124);
322     assertEquals(od.getScrollCol(), lastHiddenCol - 1);
323     assertEquals(od.getBoxWidth(), prevWidth);
324
325     // set the box position by moving viewport & check it goes to the right
326     // place
327
328     // update the box position via mouse and check it goes to the right place
329   }
330
331   @Test(groups = { "Functional" })
332   public void testSetBoxPosWithHiddenColsAtEnd()
333   {
334
335   }
336
337   @Test(groups = { "Functional" })
338   public void testSetBoxPosWithHiddenColsMiddle()
339   {
340     seq23.setStart(386);
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);
345     al.setDataset(null);
346     AlignViewport av = new AlignViewport(al);
347
348     av.setStartRes(50);
349     OverviewDimensions od = new OverviewDimensions(av);
350
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);
357     od.setBoxPosition();
358     assertEquals(od.getBoxX(), prevX);
359     assertEquals(od.getScrollCol(), 49);
360     // assertEquals(od2.getBoxWidth(), prevWidth + ((int) 2 * av.getCharWidth()
361     // / scalew));
362   }
363
364   @Test(groups = { "Functional" })
365   public void testSetBoxPosWithHiddenRowsAtStart()
366   {
367     seq23.setStart(386);
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);
372     al.setDataset(null);
373     AlignViewport av = new AlignViewport(al);
374
375     av.setStartRes(50);
376     OverviewDimensions od = new OverviewDimensions(av);
377
378     // account for hidden rows
379     SequenceI[] hidden = { seq2, seq3, seq4, seq5, seq6, seq7 };
380     av.showAllHiddenColumns();
381     av.hideSequence(hidden);
382     od.checkValid();
383     assertEquals(od.getBoxY(), 0);
384     assertEquals(od.getScrollRow(), 0);
385   }
386
387      /**
388       * Test that the box position is set correctly
389       */
390   @Test(groups = { "Functional" })
391       public void setBoxPosition()
392       {
393
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);
398         al.setDataset(null);
399         AlignViewport av = new AlignViewport(al);
400
401         // Test box is in expected location when there are no hidden rows or columns
402
403         OverviewDimensions od = new OverviewDimensions(av);
404         od.setBoxPosition();
405
406         assertEquals(od.getBoxHeight(), 81);
407         assertEquals(od.getBoxWidth(), 400);
408         assertEquals(od.getBoxX(), 0);
409         assertEquals(od.getBoxY(), 0);
410
411         // Account for hidden rows
412         SequenceI[] hidden = { seq2, seq3, seq4 };
413         av.hideSequence(hidden);
414
415         OverviewDimensions od1 = new OverviewDimensions(av);
416         od1.setBoxPosition();
417
418         assertEquals(od1.getBoxHeight(), 80);
419         assertEquals(od1.getBoxWidth(), 400);
420         assertEquals(od1.getBoxX(), 0);
421         assertEquals(od1.getBoxY(), 0);
422
423         // Account for hidden columns
424         av.hideColumns(10, 15);
425         av.showAllHiddenSeqs();
426
427         OverviewDimensions od2 = new OverviewDimensions(av);
428         od2.setBoxPosition();
429
430         assertEquals(od2.getBoxHeight(), 81);
431         assertEquals(od2.getBoxWidth(), 422);
432         assertEquals(od2.getBoxX(), 0);
433         assertEquals(od2.getBoxY(), 0);
434
435         // Account for hidden rows and cols
436         av.hideSequence(hidden);
437         OverviewDimensions od3 = new OverviewDimensions(av);
438         od3.setBoxPosition();
439
440         assertEquals(od3.getBoxHeight(), 80);
441         assertEquals(od3.getBoxWidth(), 422);
442         assertEquals(od3.getBoxX(), 0);
443         assertEquals(od3.getBoxY(), 0);
444   }
445 }