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
69 assertEquals(alignFrame.alignPanel.getSeqPanel().findAlignmentColumn(mouse),0);
71 scalePanel.mousePressed(mouse);
72 scalePanel.mouseDragged(mouse);
74 // simulate dragging selection leftwards beyond the sequences giving
76 mouse = new MouseEvent(scalePanel, 0, 1, 0, -30, 0, 1, false);
78 scalePanel.mouseReleased(mouse);
80 SequenceGroup sg = scalePanel.av.getSelectionGroup();
81 int startCol = sg.getStartRes();
83 assertTrue(startCol >= 0);
89 @Test(groups = "Functional")
90 public void testSelectColumns_withHidden()
92 String seq1 = ">Seq1\nANTOFAGASTAVALPARAISOMONTEVIDEOANTANANARIVO";
93 AlignFrame alignFrame = new FileLoader().LoadFileWaitTillLoaded(seq1,
94 DataSourceType.PASTE);
95 ScalePanel scalePanel = alignFrame.alignPanel.getScalePanel();
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
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);
111 int cw = viewport.getCharWidth();
112 int xPos = 9 * cw + 2;
113 MouseEvent mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1,
115 scalePanel.mousePressed(mouse);
116 scalePanel.mouseDragged(mouse);
118 mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
119 scalePanel.mouseReleased(mouse);
121 SequenceGroup sg = scalePanel.av.getSelectionGroup();
122 assertEquals(sg.getStartRes(), 29);
123 assertEquals(sg.getEndRes(), 30);
126 @Test(groups = "Functional")
127 public void testBuildPopupMenu()
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");
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();
141 * hide columns 3-4 (counting from 0)
143 viewport.hideColumns(3, 4);
144 alignFrame.alignPanel.updateLayout();
147 * verify popup menu left/right of hidden column marker
148 * NB need to call mouseMoved first as this sets field 'reveal'
150 int xPos = 1 * cw + 2; // 2 columns left of hidden marker
151 MouseEvent mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1,
153 scalePanel.mouseMoved(mouse);
154 JPopupMenu popup = scalePanel.buildPopupMenu(1);
155 assertEquals(popup.getSubElements().length, 0);
158 * popup just left of hidden marker has 'Reveal'
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);
168 * popup just right of hidden marker has 'Reveal'
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);
178 * popup further right is empty
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);
187 * 'drag' to select columns around the hidden column marker
190 mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
191 scalePanel.mousePressed(mouse);
192 scalePanel.mouseDragged(mouse);
194 mouse = new MouseEvent(scalePanel, 0, 1, 0, xPos, 0, 1, false);
195 scalePanel.mouseReleased(mouse);
198 * popup 2 columns left of marker: 'Hide' only
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);
208 * popup just left of marker: 'Reveal' and 'Hide'
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);
219 * popup just right of marker: 'Reveal' and 'Hide'
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);
230 * hiding a second region adds option 'Reveal all' to 'Reveal'
232 viewport.hideColumns(6, 7);
233 alignFrame.alignPanel.updateLayout();
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(),
242 assertEquals(((JMenuItem) popup.getSubElements()[2]).getText(), hide);
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(),
252 @BeforeClass(alwaysRun = true)
253 public static void setUpBeforeClass() throws Exception
256 * use read-only test properties file
258 Cache.loadProperties("test/jalview/io/testProps.jvprops");
259 Jalview.main(new String[] { "--nonews" });