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