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.assertFalse;
25 import static org.testng.Assert.assertSame;
26 import static org.testng.Assert.assertTrue;
28 import jalview.bin.Cache;
29 import jalview.datamodel.Alignment;
30 import jalview.datamodel.AlignmentI;
31 import jalview.datamodel.Sequence;
32 import jalview.datamodel.SequenceI;
33 import jalview.schemes.ClustalxColourScheme;
34 import jalview.schemes.ColourSchemeI;
35 import jalview.schemes.ColourSchemes;
36 import jalview.schemes.NucleotideColourScheme;
37 import jalview.schemes.PIDColourScheme;
38 import jalview.schemes.ResidueColourScheme;
39 import jalview.util.MessageManager;
41 import java.util.Enumeration;
42 import java.util.Iterator;
44 import javax.swing.AbstractButton;
45 import javax.swing.ButtonGroup;
46 import javax.swing.JMenu;
47 import javax.swing.JMenuItem;
49 import org.testng.annotations.BeforeClass;
50 import org.testng.annotations.Test;
52 public class ColourMenuHelperTest
55 * Use a properties file with a user-defined colour scheme
57 @BeforeClass(alwaysRun = true)
60 Cache.loadProperties("test/jalview/io/testProps.jvprops");
63 @Test(groups = "Functional")
64 public void testAddMenuItems_peptide()
66 SequenceI s1 = new Sequence("s1", "KFRQSILM");
67 AlignmentI al = new Alignment(new SequenceI[] { s1 });
68 JMenu menu = new JMenu();
70 ButtonGroup bg = ColourMenuHelper.addMenuItems(menu, null, al, false);
71 Enumeration<AbstractButton> bgElements = bg.getElements();
74 * first entry is 'No Colour' option
76 JMenuItem item = menu.getItem(0);
77 assertEquals(item.getName(), ResidueColourScheme.NONE);
78 assertEquals(item.getText(), MessageManager.getString("label.none"));
79 AbstractButton bgItem = bgElements.nextElement();
80 assertSame(bgItem, item);
83 * check that each registered colour scheme is in the menu,
84 * and in the button group;
85 * nucleotide-only schemes should be disabled menu items
87 Iterator<ColourSchemeI> colourSchemes = ColourSchemes.getInstance()
88 .getColourSchemes().iterator();
89 final int items = menu.getItemCount();
90 for (int i = 1; i < items; i++)
92 item = menu.getItem(i);
93 bgItem = bgElements.nextElement();
94 assertSame(bgItem, item);
95 ColourSchemeI cs = colourSchemes.next();
96 String name = cs.getSchemeName();
97 assertEquals(item.getName(), name);
98 boolean enabled = item.isEnabled();
99 assertEquals(enabled, cs.isApplicableTo(al));
100 if (cs instanceof NucleotideColourScheme) // nucleotide only
102 assertFalse(enabled);
104 if (cs instanceof ClustalxColourScheme) // peptide only
108 if (cs instanceof PIDColourScheme) // nucleotide or peptide
114 * check i18n for display name
116 String label = MessageManager.getStringOrReturn("label.colourScheme_",
118 assertEquals(item.getText(), label);
122 * check nothing left over
124 assertFalse(colourSchemes.hasNext());
125 assertFalse(bgElements.hasMoreElements());
128 @Test(groups = "Functional")
129 public void testAddMenuItems_nucleotide()
131 SequenceI s1 = new Sequence("s1", "GAATAATCCATAACAG");
132 AlignmentI al = new Alignment(new SequenceI[] { s1 });
133 JMenu menu = new JMenu();
134 AlignFrame af = new AlignFrame(al, 500, 500);
137 * menu for SequenceGroup excludes 'User Defined Colour'
139 PopupMenu popup = new PopupMenu(af.alignPanel, s1, null);
140 ButtonGroup bg = ColourMenuHelper.addMenuItems(menu, popup, al, false);
141 Enumeration<AbstractButton> bgElements = bg.getElements();
144 * first entry is 'No Colour' option
146 JMenuItem item = menu.getItem(0);
147 assertEquals(item.getName(), ResidueColourScheme.NONE);
148 assertEquals(item.getText(), MessageManager.getString("label.none"));
149 AbstractButton bgItem = bgElements.nextElement();
150 assertSame(bgItem, item);
153 * check that each registered colour scheme is in the menu,
154 * and in the button group;
155 * nucleotide-only schemes should be disabled menu items
157 Iterator<ColourSchemeI> colourSchemes = ColourSchemes.getInstance()
158 .getColourSchemes().iterator();
159 final int items = menu.getItemCount();
160 for (int i = 1; i < items; i++)
162 item = menu.getItem(i);
163 bgItem = bgElements.nextElement();
164 assertSame(bgItem, item);
165 ColourSchemeI cs = colourSchemes.next();
166 String name = cs.getSchemeName();
167 assertEquals(item.getName(), name);
168 boolean enabled = item.isEnabled();
169 assertEquals(enabled, cs.isApplicableTo(al));
170 if (cs instanceof NucleotideColourScheme) // nucleotide only
174 if (cs instanceof ClustalxColourScheme) // peptide only
176 assertFalse(enabled);
178 if (cs instanceof PIDColourScheme) // nucleotide or peptide
184 * check i18n for display name
186 String label = MessageManager.getStringOrReturn("label.colourScheme_",
188 assertEquals(item.getText(), label);
192 * check nothing left over
194 assertFalse(colourSchemes.hasNext());
195 assertFalse(bgElements.hasMoreElements());
199 * 'Simple only' mode constructs colour menu for structures
201 * <li>no 'No Colour' option</li>
202 * <li>only simple colour schemes (colour per residue)</li>
205 @Test(groups = "Functional")
206 public void testAddMenuItems_simpleOnly()
208 SequenceI s1 = new Sequence("s1", "KFRQSILM");
209 AlignmentI al = new Alignment(new SequenceI[] { s1 });
210 JMenu menu = new JMenu();
212 ButtonGroup bg = ColourMenuHelper.addMenuItems(menu, null, al, true);
213 Enumeration<AbstractButton> bgElements = bg.getElements();
216 * check that only 'simple' colour schemes are included
218 Iterator<ColourSchemeI> colourSchemes = ColourSchemes.getInstance()
219 .getColourSchemes().iterator();
221 while (colourSchemes.hasNext())
223 ColourSchemeI cs = colourSchemes.next();
228 JMenuItem item = menu.getItem(i++);
229 AbstractButton bgItem = bgElements.nextElement();
230 assertSame(bgItem, item);
234 * check nothing left over
236 assertEquals(i, menu.getItemCount());
237 assertFalse(bgElements.hasMoreElements());
241 * menu for AlignFrame includes 'User Defined Colour'
243 @Test(groups = "Functional")
244 public void testAddMenuItems_forAlignFrame()
246 SequenceI s1 = new Sequence("s1", "KFRQSILM");
247 AlignmentI al = new Alignment(new SequenceI[] { s1 });
248 AlignFrame af = new AlignFrame(al, 500, 500);
249 JMenu menu = new JMenu();
251 ButtonGroup bg = ColourMenuHelper.addMenuItems(menu, af, al, false);
252 Enumeration<AbstractButton> bgElements = bg.getElements();
255 * check that each registered colour scheme is in the menu,
256 * (skipping over No Colour which is the first menu item),
257 * and in the button group
259 bgElements.nextElement(); // skip No Colour
260 Iterator<ColourSchemeI> colourSchemes = ColourSchemes.getInstance()
261 .getColourSchemes().iterator();
262 final int items = menu.getItemCount();
263 for (int i = 1; i < items - 1; i++)
265 JMenuItem item = menu.getItem(i);
266 AbstractButton bgItem = bgElements.nextElement();
267 assertSame(bgItem, item);
268 ColourSchemeI cs = colourSchemes.next();
269 assertEquals(item.getName(), cs.getSchemeName());
273 * check menu also has User Defined Colour
275 assertFalse(colourSchemes.hasNext());
276 JMenuItem item = menu.getItem(items - 1);
277 AbstractButton bgItem = bgElements.nextElement();
278 assertSame(bgItem, item);
279 assertEquals(item.getName(), ResidueColourScheme.USER_DEFINED_MENU);
280 assertEquals(item.getText(),
281 MessageManager.getString("action.user_defined"));