JAL-2386 unit tests for change colour (and minor refactoring for
[jalview.git] / test / jalview / gui / AlignFrameTest.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.AssertJUnit.assertEquals;
24 import static org.testng.AssertJUnit.assertFalse;
25 import static org.testng.AssertJUnit.assertSame;
26 import static org.testng.AssertJUnit.assertTrue;
27
28 import jalview.datamodel.Alignment;
29 import jalview.datamodel.AlignmentI;
30 import jalview.datamodel.Sequence;
31 import jalview.datamodel.SequenceFeature;
32 import jalview.datamodel.SequenceGroup;
33 import jalview.datamodel.SequenceI;
34 import jalview.io.DataSourceType;
35 import jalview.io.FileLoader;
36 import jalview.schemes.BuriedColourScheme;
37 import jalview.schemes.HelixColourScheme;
38 import jalview.schemes.JalviewColourScheme;
39 import jalview.schemes.StrandColourScheme;
40 import jalview.schemes.TurnColourScheme;
41 import jalview.util.MessageManager;
42
43 import java.util.List;
44
45 import org.testng.annotations.BeforeClass;
46 import org.testng.annotations.BeforeMethod;
47 import org.testng.annotations.Test;
48
49 public class AlignFrameTest
50 {
51   AlignFrame af;
52
53   @BeforeClass(alwaysRun = true)
54   public void setUpJvOptionPane()
55   {
56     JvOptionPane.setInteractiveMode(false);
57     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
58   }
59
60   @Test(groups = "Functional")
61   public void testHideFeatureColumns()
62   {
63     SequenceI seq1 = new Sequence("Seq1", "ABCDEFGHIJ");
64     SequenceI seq2 = new Sequence("Seq2", "ABCDEFGHIJ");
65     seq1.addSequenceFeature(new SequenceFeature("Metal", "", 1, 5,
66             Float.NaN, null));
67     seq2.addSequenceFeature(new SequenceFeature("Metal", "", 6, 10,
68             Float.NaN, null));
69     seq1.addSequenceFeature(new SequenceFeature("Turn", "", 2, 4,
70             Float.NaN, null));
71     seq2.addSequenceFeature(new SequenceFeature("Turn", "", 7, 9,
72             Float.NaN, null));
73     AlignmentI al = new Alignment(new SequenceI[] { seq1, seq2 });
74     AlignFrame af = new AlignFrame(al, al.getWidth(), al.getHeight());
75
76     /*
77      * hiding a feature not present does nothing
78      */
79     assertFalse(af.hideFeatureColumns("exon", true));
80     assertTrue(af.getViewport().getColumnSelection().isEmpty());
81     assertTrue(af.getViewport().getColumnSelection().getHiddenColumns()
82             .isEmpty());
83     assertFalse(af.hideFeatureColumns("exon", false));
84     assertTrue(af.getViewport().getColumnSelection().isEmpty());
85     assertTrue(af.getViewport().getColumnSelection().getHiddenColumns()
86             .isEmpty());
87
88     /*
89      * hiding a feature in all columns does nothing
90      */
91     assertFalse(af.hideFeatureColumns("Metal", true));
92     assertTrue(af.getViewport().getColumnSelection().isEmpty());
93     List<int[]> hidden = af.getViewport().getColumnSelection()
94             .getHiddenColumns();
95     assertTrue(hidden.isEmpty());
96
97     /*
98      * hide a feature present in some columns
99      * sequence positions [2-4], [7-9] are column positions
100      * [1-3], [6-8] base zero
101      */
102     assertTrue(af.hideFeatureColumns("Turn", true));
103     hidden = af.getViewport().getColumnSelection().getHiddenColumns();
104     assertEquals(2, hidden.size());
105     assertEquals(1, hidden.get(0)[0]);
106     assertEquals(3, hidden.get(0)[1]);
107     assertEquals(6, hidden.get(1)[0]);
108     assertEquals(8, hidden.get(1)[1]);
109   }
110
111   @BeforeMethod
112   public void setUp()
113   {
114     af = new FileLoader().LoadFileWaitTillLoaded("examples/uniref50.fa",
115             DataSourceType.FILE);
116   }
117
118   /**
119    * Test that changing background (alignment) colour scheme
120    * <ul>
121    * <li>with Apply Colour to All Groups not selected, does not change group
122    * colours</li>
123    * <li>with Apply Colour to All Groups selected, does change group colours</li>
124    * <li>in neither case, changes alignment or group colour thresholds (PID or
125    * Conservation)</li>
126    * </ul>
127    */
128   @Test
129   public void testChangeColour_background_groupsAndThresholds()
130   {
131     AlignViewport av = af.getViewport();
132     AlignmentI al = av.getAlignment();
133
134     /*
135      * Colour alignment by Buried Index
136      */
137     af.applyToAllGroups_actionPerformed(false);
138     af.changeColour_actionPerformed(JalviewColourScheme.Buried.toString());
139     assertTrue(av.getGlobalColourScheme() instanceof BuriedColourScheme);
140     assertFalse(av.getViewportColourScheme().conservationApplied());
141     assertEquals(av.getViewportColourScheme().getThreshold(), 0);
142
143     /*
144      * Apply Conservation 20%
145      */
146     af.conservationMenuItem_actionPerformed(true);
147     SliderPanel sp = SliderPanel.getSliderPanel();
148     assertEquals(sp.getTitle(), MessageManager.formatMessage(
149             "label.conservation_colour_increment",
150             new String[] { "Background" }));
151     assertTrue(sp.isForConservation());
152     sp.valueChanged(20);
153     assertTrue(av.getViewportColourScheme().conservationApplied());
154     assertEquals(av.getViewportColourScheme().getConservationInc(), 20);
155
156     /*
157      * Apply PID threshold 10% (conservation still applies as well)
158      */
159     af.abovePIDThreshold_actionPerformed(true);
160     sp = SliderPanel.getSliderPanel();
161     assertFalse(sp.isForConservation());
162     assertEquals(sp.getTitle(), MessageManager.formatMessage(
163             "label.percentage_identity_threshold",
164             new String[] { "Background" }));
165     sp.valueChanged(10);
166     assertEquals(av.getViewportColourScheme().getThreshold(), 10);
167     assertTrue(av.getViewportColourScheme().conservationApplied());
168     assertEquals(av.getViewportColourScheme().getConservationInc(), 20);
169
170     /*
171      * create a group with Strand colouring, 30% Conservation
172      * and 40% PID threshold
173      */
174     SequenceGroup sg = new SequenceGroup();
175     sg.addSequence(al.getSequenceAt(0), false);
176     sg.setStartRes(15);
177     sg.setEndRes(25);
178     av.setSelectionGroup(sg);
179
180     /*
181      * apply 30% Conservation to group
182      */
183     PopupMenu popupMenu = new PopupMenu(af.alignPanel, null, null);
184     popupMenu.changeColour_actionPerformed(JalviewColourScheme.Strand
185             .toString());
186     assertTrue(sg.getColourScheme() instanceof StrandColourScheme);
187     assertEquals(al.getGroups().size(), 1);
188     assertSame(al.getGroups().get(0), sg);
189     popupMenu.conservationMenuItem_actionPerformed(true);
190     sp = SliderPanel.getSliderPanel();
191     assertTrue(sp.isForConservation());
192     assertEquals(sp.getTitle(), MessageManager.formatMessage(
193             "label.conservation_colour_increment",
194             new String[] { sg.getName() }));
195     sp.valueChanged(30);
196     assertTrue(sg.getGroupColourScheme().conservationApplied());
197     assertEquals(sg.getGroupColourScheme().getConservationInc(), 30);
198
199     /*
200      * apply 40% PID threshold to group
201      */
202     popupMenu.abovePIDColour_actionPerformed(true);
203     sp = SliderPanel.getSliderPanel();
204     assertFalse(sp.isForConservation());
205     assertEquals(sp.getTitle(), MessageManager.formatMessage(
206             "label.percentage_identity_threshold",
207             new String[] { sg.getName() }));
208     sp.valueChanged(40);
209     assertEquals(sg.getGroupColourScheme().getThreshold(), 40);
210     // conservation threshold is unchanged:
211     assertTrue(sg.getGroupColourScheme().conservationApplied());
212     assertEquals(sg.getGroupColourScheme().getConservationInc(), 30);
213
214     /*
215      * change alignment colour - group colour, and all thresholds,
216      * should be unaffected
217      */
218     af.changeColour_actionPerformed(JalviewColourScheme.Turn.toString());
219     assertTrue(av.getGlobalColourScheme() instanceof TurnColourScheme);
220     assertTrue(av.getViewportColourScheme().conservationApplied());
221     assertEquals(av.getViewportColourScheme().getConservationInc(), 20);
222     assertEquals(av.getViewportColourScheme().getThreshold(), 10);
223     assertTrue(sg.getColourScheme() instanceof StrandColourScheme);
224     assertTrue(sg.getGroupColourScheme().conservationApplied());
225     assertEquals(sg.getGroupColourScheme().getConservationInc(), 30);
226     assertEquals(sg.getGroupColourScheme().getThreshold(), 40);
227
228     /*
229      * Now change alignment colour with Apply Colour To All Groups
230      * - group colour should change, but not colour thresholds
231      */
232     af.applyToAllGroups_actionPerformed(true);
233     af.changeColour_actionPerformed(JalviewColourScheme.Helix.toString());
234     assertTrue(av.getGlobalColourScheme() instanceof HelixColourScheme);
235     assertTrue(av.getViewportColourScheme().conservationApplied());
236     assertEquals(av.getViewportColourScheme().getConservationInc(), 20);
237     assertEquals(av.getViewportColourScheme().getThreshold(), 10);
238     assertTrue(sg.getColourScheme() instanceof HelixColourScheme);
239     assertTrue(sg.getGroupColourScheme().conservationApplied());
240     assertEquals(sg.getGroupColourScheme().getConservationInc(), 30);
241     assertEquals(sg.getGroupColourScheme().getThreshold(), 40);
242   }
243 }