f16b2ee8e8d84cbfec8d11ffa1dba967555abb7e
[jalview.git] / test / jalview / gui / AlignmentPanelTest.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.gui;
22
23 import static org.testng.Assert.assertEquals;
24 import static org.testng.Assert.assertNotEquals;
25
26 import jalview.bin.Cache;
27 import jalview.bin.Jalview;
28 import jalview.datamodel.Sequence;
29 import jalview.datamodel.SequenceI;
30 import jalview.io.DataSourceType;
31 import jalview.io.FileLoader;
32 import jalview.viewmodel.ViewportRanges;
33
34 import java.lang.reflect.InvocationTargetException;
35
36 import org.testng.annotations.BeforeMethod;
37 import org.testng.annotations.Test;
38
39 public class AlignmentPanelTest
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
129   SequenceI seq23 = new Sequence(
130           "Seq23",
131           "ABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBACABCABCABCABCABCABCABCABCBACBACBACBAC");
132
133   AlignFrame af;
134
135   @BeforeMethod(alwaysRun = true)
136   public void setUp() throws InvocationTargetException, InterruptedException
137   {
138     Jalview.setSynchronous(true);
139     Jalview.main(new String[] { "-nonews", "-props",
140         "test/jalview/testProps.jvprops" });
141
142     Cache.setPropertyNoSave("SHOW_IDENTITY",
143             Boolean.TRUE.toString());
144     af = new FileLoader().LoadFileWaitTillLoaded("examples/uniref50.fa",
145             DataSourceType.FILE);
146     
147     af.paintImmediately(af.getBounds());
148
149     /*
150      * wait for Consensus thread to complete
151      */
152     synchronized (this)
153     {
154       while (af.getViewport().getConsensusSeq() == null)
155       {
156         try
157         {
158           wait(250); // BH was 50
159         } catch (InterruptedException e)
160         {
161         }
162       }
163     }
164   }
165
166
167   /**
168    * Test side effect that end residue is set correctly by setScrollValues, with
169    * or without hidden columns
170    */
171   @Test(groups = "Functional")
172   public void testSetScrollValues()
173   {
174     ViewportRanges ranges = af.getViewport().getRanges();
175     af.alignPanel.setScrollValues(0, 0);
176
177     int oldres = ranges.getEndRes();
178     af.alignPanel.setScrollValues(-1, 5);
179
180     // setting -ve x value does not change residue
181     assertEquals(ranges.getEndRes(), oldres);
182
183     af.alignPanel.setScrollValues(0, 5);
184
185     // setting 0 as x value does not change residue
186     assertEquals(ranges.getEndRes(), oldres);
187
188     af.alignPanel.setScrollValues(5, 5);
189     // setting x value to 5 extends endRes by 5 residues
190     assertEquals(ranges.getEndRes(), oldres + 5);
191
192     // scroll to position after hidden columns sets endres to oldres (width) +
193     // position
194     int scrollpos = 60;
195     af.getViewport().hideColumns(30, 50);
196     af.alignPanel.setScrollValues(scrollpos, 5);
197
198     af.paintImmediately(af.getBounds());
199     assertEquals(ranges.getEndRes(), oldres + scrollpos);
200
201     // scroll to position within hidden columns, still sets endres to oldres +
202     // position
203     // not sure if this is actually correct behaviour but this is what Jalview
204     // currently does
205     scrollpos = 40;
206     af.getViewport().showAllHiddenColumns();
207     af.getViewport().hideColumns(30, 50);
208     af.alignPanel.setScrollValues(scrollpos, 5);
209     assertEquals(ranges.getEndRes(), oldres + scrollpos);
210
211     // scroll to position within <width> distance of the end of the alignment
212     // endRes should be set to width of alignment - 1
213     scrollpos = 130;
214     af.getViewport().showAllHiddenColumns();
215     af.alignPanel.setScrollValues(scrollpos, 5);
216     af.paintImmediately(af.getBounds());
217     assertEquals(ranges.getEndRes(), af.getViewport()
218             .getAlignment().getWidth() - 1);
219
220     // now hide some columns, and scroll to position within <width>
221     // distance of the end of the alignment
222     // endRes should be set to width of alignment - 1 - the number of hidden
223     // columns
224     af.getViewport().hideColumns(30, 50);
225     af.paintImmediately(af.getBounds());
226     af.alignPanel.setScrollValues(scrollpos, 5);
227     assertEquals(ranges.getEndRes(), af.getViewport()
228             .getAlignment().getWidth() - 1 - 21); // 21 is the number of hidden
229                                                   // columns
230   }
231
232   /**
233    * Test that update layout reverts to original (unwrapped) values for endRes
234    * when switching from wrapped back to unwrapped mode (JAL-2739)
235    */
236   @Test(groups = "Functional")
237   public void testUpdateLayout_endRes()
238   {
239     // get details of original alignment dimensions
240     ViewportRanges ranges = af.getViewport().getRanges();
241     int endres = ranges.getEndRes();
242
243     // System.out.println("APT range end0 " + ranges.getEndRes());
244     // wrap
245     af.alignPanel.getAlignViewport().setWrapAlignment(true);
246     af.alignPanel.updateLayout();
247     af.paintImmediately(af.getBounds());
248     waitSome();
249     // System.out.println("APT range end1 " + ranges.getEndRes());
250     // endRes has changed
251     assertNotEquals(ranges.getEndRes(), endres);
252
253     // unwrap
254     af.alignPanel.getAlignViewport().setWrapAlignment(false);
255     af.alignPanel.updateLayout();
256     waitSome();
257     af.paintImmediately(af.getBounds());
258
259     // System.out.println("APT range end3 " + ranges.getEndRes());
260
261     // endRes back to original value
262     assertEquals(ranges.getEndRes(), endres);
263
264   }
265
266   private void waitSome()
267   {
268
269     // just a hack
270     synchronized (this)
271     {
272       try
273       {
274         wait(250);
275       } catch (InterruptedException e)
276       {
277       }
278     }
279   }
280 }