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.
23 import static org.testng.Assert.assertEquals;
24 import static org.testng.Assert.assertTrue;
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;
38 import java.awt.event.MouseEvent;
40 import javax.swing.JMenuItem;
41 import javax.swing.JPopupMenu;
43 import org.testng.annotations.BeforeClass;
44 import org.testng.annotations.Test;
46 public class ScalePanelTest
48 @BeforeClass(alwaysRun = true)
49 public void setUpJvOptionPane()
51 JvOptionPane.setInteractiveMode(false);
52 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
55 @Test(groups = "Functional")
56 public void testPreventNegativeStartColumn()
58 SequenceI seq1 = new Sequence("Seq1", "MATRESS");
59 SequenceI seq2 = new Sequence("Seq2", "MADNESS");
60 AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
62 AlignFrame alignFrame = new AlignFrame(al, al.getWidth(),
64 ScalePanel scalePanel = alignFrame.alignPanel.getScalePanel();
66 MouseEvent mouse = new MouseEvent(scalePanel, 0, 1, 0, 4, 0, 1, false);
68 // check the bounded lookup is not returning negatives
70 alignFrame.alignPanel.getSeqPanel().findAlignmentColumn(mouse),
73 scalePanel.mousePressed(mouse);
74 scalePanel.mouseDragged(mouse);
76 // simulate dragging selection leftwards beyond the sequences giving
78 mouse = new MouseEvent(scalePanel, 0, 1, 0, -30, 0, 1, false);
80 scalePanel.mouseReleased(mouse);
82 SequenceGroup sg = scalePanel.av.getSelectionGroup();
83 int startCol = sg.getStartRes();
85 assertTrue(startCol >= 0);
91 @Test(groups = "Functional")
92 public void testSelectColumns_withHidden()
94 String seq1 = ">Seq1\nANTOFAGASTAVALPARAISOMONTEVIDEOANTANANARIVO";
95 AlignFrame alignFrame = new FileLoader().LoadFileWaitTillLoaded(seq1,
96 DataSourceType.PASTE);
97 ScalePanel scalePanel = alignFrame.alignPanel.getScalePanel();
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
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);
113 int cw = viewport.getCharWidth();
114 int xPos = 9 * cw + 2;
115 MouseEvent mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1,
117 scalePanel.mousePressed(mouse);
118 scalePanel.mouseDragged(mouse);
120 mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
121 scalePanel.mouseReleased(mouse);
123 SequenceGroup sg = scalePanel.av.getSelectionGroup();
124 assertEquals(sg.getStartRes(), 29);
125 assertEquals(sg.getEndRes(), 30);
128 @Test(groups = "Functional")
129 public void testBuildPopupMenu()
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");
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();
143 * hide columns 3-4 (counting from 0)
145 viewport.hideColumns(3, 4);
146 alignFrame.alignPanel.updateLayout();
149 * verify popup menu left/right of hidden column marker
150 * NB need to call mouseMoved first as this sets field 'reveal'
152 int xPos = 1 * cw + 2; // 2 columns left of hidden marker
153 MouseEvent mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1,
155 scalePanel.mouseMoved(mouse);
156 JPopupMenu popup = scalePanel.buildPopupMenu(1);
157 assertEquals(popup.getSubElements().length, 0);
160 * popup just left of hidden marker has 'Reveal'
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);
170 * popup just right of hidden marker has 'Reveal'
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);
180 * popup further right is empty
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);
189 * 'drag' to select columns around the hidden column marker
192 mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
193 scalePanel.mousePressed(mouse);
194 scalePanel.mouseDragged(mouse);
196 mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
197 scalePanel.mouseReleased(mouse);
200 * popup 2 columns left of marker: 'Hide' only
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);
210 * popup just left of marker: 'Reveal' and 'Hide'
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);
221 * popup just right of marker: 'Reveal' and 'Hide'
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);
232 * hiding a second region adds option 'Reveal all' to 'Reveal'
234 viewport.hideColumns(6, 7);
235 alignFrame.alignPanel.updateLayout();
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(),
244 assertEquals(((JMenuItem) popup.getSubElements()[2]).getText(), hide);
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(),
254 @BeforeClass(alwaysRun = true)
255 public static void setUpBeforeClass() throws Exception
258 * use read-only test properties file
260 Cache.loadProperties("test/jalview/io/testProps.jvprops");
261 Jalview.main(new String[] { "--nonews" });