JAL-4260 encapsulate logic for resolving nearest column and do better using it in...
[jalview.git] / test / jalview / gui / ScalePanelTest.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.assertTrue;
25
26 import jalview.bin.Cache;
27 import jalview.bin.Jalview;
28 import jalview.datamodel.Alignment;
29 import jalview.datamodel.AlignmentI;
30 import jalview.datamodel.Sequence;
31 import jalview.datamodel.SequenceGroup;
32 import jalview.datamodel.SequenceI;
33 import jalview.io.DataSourceType;
34 import jalview.io.FileLoader;
35 import jalview.util.MessageManager;
36 import jalview.viewmodel.ViewportRanges;
37
38 import java.awt.event.MouseEvent;
39
40 import javax.swing.JMenuItem;
41 import javax.swing.JPopupMenu;
42
43 import org.testng.annotations.BeforeClass;
44 import org.testng.annotations.Test;
45
46 public class ScalePanelTest
47 {
48   @BeforeClass(alwaysRun = true)
49   public void setUpJvOptionPane()
50   {
51     JvOptionPane.setInteractiveMode(false);
52     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
53   }
54
55   @Test(groups = "Functional")
56   public void testPreventNegativeStartColumn()
57   {
58     SequenceI seq1 = new Sequence("Seq1", "MATRESS");
59     SequenceI seq2 = new Sequence("Seq2", "MADNESS");
60     AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
61
62     AlignFrame alignFrame = new AlignFrame(al, al.getWidth(),
63             al.getHeight());
64     ScalePanel scalePanel = alignFrame.alignPanel.getScalePanel();
65
66     MouseEvent mouse = new MouseEvent(scalePanel, 0, 1, 0, 4, 0, 1, false);
67     
68     // check the bounded lookup is not returning negatives
69     assertEquals(alignFrame.alignPanel.getSeqPanel().findAlignmentColumn(mouse),0);
70     
71     scalePanel.mousePressed(mouse);
72     scalePanel.mouseDragged(mouse);
73
74     // simulate dragging selection leftwards beyond the sequences giving
75     // negative X
76     mouse = new MouseEvent(scalePanel, 0, 1, 0, -30, 0, 1, false);
77
78     scalePanel.mouseReleased(mouse);
79
80     SequenceGroup sg = scalePanel.av.getSelectionGroup();
81     int startCol = sg.getStartRes();
82
83     assertTrue(startCol >= 0);
84   }
85
86   /**
87    * Test for JAL-3212
88    */
89   @Test(groups = "Functional")
90   public void testSelectColumns_withHidden()
91   {
92     String seq1 = ">Seq1\nANTOFAGASTAVALPARAISOMONTEVIDEOANTANANARIVO";
93     AlignFrame alignFrame = new FileLoader().LoadFileWaitTillLoaded(seq1,
94             DataSourceType.PASTE);
95     ScalePanel scalePanel = alignFrame.alignPanel.getScalePanel();
96
97     /*
98      * hide columns 1-20 (of 43); then 'drag' to select columns 30-31;
99      * 31 is 51 in absolute columns but bug JAL-3212 reduces it to
100      * endRes which is 22
101      */
102     AlignViewport viewport = alignFrame.getViewport();
103     ViewportRanges ranges = viewport.getRanges();
104     assertEquals(ranges.getStartRes(), 0);
105     assertEquals(ranges.getEndRes(), 42);
106     viewport.hideColumns(0, 19);
107     alignFrame.alignPanel.updateLayout();
108     assertEquals(ranges.getStartRes(), 0);
109     assertEquals(ranges.getEndRes(), 22);
110
111     int cw = viewport.getCharWidth();
112     int xPos = 9 * cw + 2;
113     MouseEvent mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1,
114             false);
115     scalePanel.mousePressed(mouse);
116     scalePanel.mouseDragged(mouse);
117     xPos += cw;
118     mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
119     scalePanel.mouseReleased(mouse);
120
121     SequenceGroup sg = scalePanel.av.getSelectionGroup();
122     assertEquals(sg.getStartRes(), 29);
123     assertEquals(sg.getEndRes(), 30);
124   }
125
126   @Test(groups = "Functional")
127   public void testBuildPopupMenu()
128   {
129     final String hide = MessageManager.getString("label.hide_columns");
130     final String reveal = MessageManager.getString("label.reveal");
131     final String revealAll = MessageManager.getString("action.reveal_all");
132
133     String seq1 = ">Seq1\nANTOFAGASTA";
134     AlignFrame alignFrame = new FileLoader().LoadFileWaitTillLoaded(seq1,
135             DataSourceType.PASTE);
136     ScalePanel scalePanel = alignFrame.alignPanel.getScalePanel();
137     AlignViewport viewport = alignFrame.getViewport();
138     int cw = viewport.getCharWidth();
139
140     /*
141      * hide columns 3-4 (counting from 0)
142      */
143     viewport.hideColumns(3, 4);
144     alignFrame.alignPanel.updateLayout();
145
146     /*
147      * verify popup menu left/right of hidden column marker
148      * NB need to call mouseMoved first as this sets field 'reveal'
149      */
150     int xPos = 1 * cw + 2; // 2 columns left of hidden marker
151     MouseEvent mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1,
152             false);
153     scalePanel.mouseMoved(mouse);
154     JPopupMenu popup = scalePanel.buildPopupMenu(1);
155     assertEquals(popup.getSubElements().length, 0);
156
157     /*
158      * popup just left of hidden marker has 'Reveal'
159      */
160     xPos = 2 * cw + 2;
161     mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
162     scalePanel.mouseMoved(mouse);
163     popup = scalePanel.buildPopupMenu(2);
164     assertEquals(popup.getSubElements().length, 1);
165     assertEquals(((JMenuItem) popup.getSubElements()[0]).getText(), reveal);
166
167     /*
168      * popup just right of hidden marker has 'Reveal'
169      */
170     xPos = 3 * cw + 2;
171     mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
172     scalePanel.mouseMoved(mouse);
173     popup = scalePanel.buildPopupMenu(5); // allowing for 2 hidden columns
174     assertEquals(popup.getSubElements().length, 1);
175     assertEquals(((JMenuItem) popup.getSubElements()[0]).getText(), reveal);
176
177     /*
178      * popup further right is empty
179      */
180     xPos = 4 * cw + 2;
181     mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
182     scalePanel.mouseMoved(mouse);
183     popup = scalePanel.buildPopupMenu(6); // allowing for 2 hidden columns
184     assertEquals(popup.getSubElements().length, 0);
185
186     /*
187      * 'drag' to select columns around the hidden column marker
188      */
189     xPos = 1 * cw + 2;
190     mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
191     scalePanel.mousePressed(mouse);
192     scalePanel.mouseDragged(mouse);
193     xPos = 5 * cw + 2;
194     mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
195     scalePanel.mouseReleased(mouse);
196
197     /*
198      * popup 2 columns left of marker: 'Hide' only
199      */
200     xPos = 1 * cw + 2;
201     mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
202     scalePanel.mouseMoved(mouse);
203     popup = scalePanel.buildPopupMenu(1);
204     assertEquals(popup.getSubElements().length, 1);
205     assertEquals(((JMenuItem) popup.getSubElements()[0]).getText(), hide);
206
207     /*
208      * popup just left of marker: 'Reveal' and 'Hide'
209      */
210     xPos = 2 * cw + 2;
211     mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
212     scalePanel.mouseMoved(mouse);
213     popup = scalePanel.buildPopupMenu(1);
214     assertEquals(popup.getSubElements().length, 2);
215     assertEquals(((JMenuItem) popup.getSubElements()[0]).getText(), reveal);
216     assertEquals(((JMenuItem) popup.getSubElements()[1]).getText(), hide);
217
218     /*
219      * popup just right of marker: 'Reveal' and 'Hide'
220      */
221     xPos = 3 * cw + 2;
222     mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
223     scalePanel.mouseMoved(mouse);
224     popup = scalePanel.buildPopupMenu(5);
225     assertEquals(popup.getSubElements().length, 2);
226     assertEquals(((JMenuItem) popup.getSubElements()[0]).getText(), reveal);
227     assertEquals(((JMenuItem) popup.getSubElements()[1]).getText(), hide);
228
229     /*
230      * hiding a second region adds option 'Reveal all' to 'Reveal'
231      */
232     viewport.hideColumns(6, 7);
233     alignFrame.alignPanel.updateLayout();
234     xPos = 3 * cw + 2;
235     mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
236     scalePanel.mouseMoved(mouse);
237     popup = scalePanel.buildPopupMenu(5);
238     assertEquals(popup.getSubElements().length, 3);
239     assertEquals(((JMenuItem) popup.getSubElements()[0]).getText(), reveal);
240     assertEquals(((JMenuItem) popup.getSubElements()[1]).getText(),
241             revealAll);
242     assertEquals(((JMenuItem) popup.getSubElements()[2]).getText(), hide);
243
244     alignFrame.deselectAllSequenceMenuItem_actionPerformed(null);
245     popup = scalePanel.buildPopupMenu(5);
246     assertEquals(popup.getSubElements().length, 2);
247     assertEquals(((JMenuItem) popup.getSubElements()[0]).getText(), reveal);
248     assertEquals(((JMenuItem) popup.getSubElements()[1]).getText(),
249             revealAll);
250   }
251
252   @BeforeClass(alwaysRun = true)
253   public static void setUpBeforeClass() throws Exception
254   {
255     /*
256      * use read-only test properties file
257      */
258     Cache.loadProperties("test/jalview/io/testProps.jvprops");
259     Jalview.main(new String[] { "--nonews" });
260   }
261
262 }