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