JAL-2717 adjusted code so default correctly returned if i18n fails
[jalview.git] / test / jalview / gui / ColourMenuHelperTest.java
1 package jalview.gui;
2
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertFalse;
5 import static org.testng.Assert.assertSame;
6 import static org.testng.Assert.assertTrue;
7
8 import jalview.bin.Cache;
9 import jalview.datamodel.Alignment;
10 import jalview.datamodel.AlignmentI;
11 import jalview.datamodel.Sequence;
12 import jalview.datamodel.SequenceI;
13 import jalview.schemes.ClustalxColourScheme;
14 import jalview.schemes.ColourSchemeI;
15 import jalview.schemes.ColourSchemes;
16 import jalview.schemes.NucleotideColourScheme;
17 import jalview.schemes.PIDColourScheme;
18 import jalview.schemes.ResidueColourScheme;
19 import jalview.util.MessageManager;
20
21 import java.util.Enumeration;
22 import java.util.Iterator;
23
24 import javax.swing.AbstractButton;
25 import javax.swing.ButtonGroup;
26 import javax.swing.JMenu;
27 import javax.swing.JMenuItem;
28
29 import org.testng.annotations.BeforeClass;
30 import org.testng.annotations.Test;
31
32 public class ColourMenuHelperTest
33 {
34   /**
35    * Use a properties file with a user-defined colour scheme
36    */
37   @BeforeClass(alwaysRun = true)
38   public void setUp()
39   {
40     Cache.loadProperties("test/jalview/io/testProps.jvprops");
41   }
42
43   @Test(groups = "Functional")
44   public void testAddMenuItems_peptide()
45   {
46     SequenceI s1 = new Sequence("s1", "KFRQSILM");
47     AlignmentI al = new Alignment(new SequenceI[] { s1 });
48     JMenu menu = new JMenu();
49
50     ButtonGroup bg = ColourMenuHelper.addMenuItems(menu, null, al, false);
51     Enumeration<AbstractButton> bgElements = bg.getElements();
52
53     /*
54      * first entry is 'No Colour' option
55      */
56     JMenuItem item = menu.getItem(0);
57     assertEquals(item.getName(), ResidueColourScheme.NONE);
58     assertEquals(item.getText(), MessageManager.getString("label.none"));
59     AbstractButton bgItem = bgElements.nextElement();
60     assertSame(bgItem, item);
61
62     /*
63      * check that each registered colour scheme is in the menu,
64      * and in the button group;
65      * nucleotide-only schemes should be disabled menu items
66      */
67     Iterator<ColourSchemeI> colourSchemes = ColourSchemes.getInstance()
68             .getColourSchemes().iterator();
69     final int items = menu.getItemCount();
70     for (int i = 1; i < items; i++)
71     {
72       item = menu.getItem(i);
73       bgItem = bgElements.nextElement();
74       assertSame(bgItem, item);
75       ColourSchemeI cs = colourSchemes.next();
76       String name = cs.getSchemeName();
77       assertEquals(item.getName(), name);
78       boolean enabled = item.isEnabled();
79       assertEquals(enabled, cs.isApplicableTo(al));
80       if (cs instanceof NucleotideColourScheme) // nucleotide only
81       {
82         assertFalse(enabled);
83       }
84       if (cs instanceof ClustalxColourScheme) // peptide only
85       {
86         assertTrue(enabled);
87       }
88       if (cs instanceof PIDColourScheme) // nucleotide or peptide
89       {
90         assertTrue(enabled);
91       }
92
93       /*
94        * check i18n for display name
95        */
96       String label = MessageManager.getStringOrReturn("label.colourScheme_",
97               name);
98       assertEquals(item.getText(), label);
99     }
100
101     /*
102      * check nothing left over
103      */
104     assertFalse(colourSchemes.hasNext());
105     assertFalse(bgElements.hasMoreElements());
106   }
107
108   @Test(groups = "Functional")
109   public void testAddMenuItems_nucleotide()
110   {
111     SequenceI s1 = new Sequence("s1", "GAATAATCCATAACAG");
112     AlignmentI al = new Alignment(new SequenceI[] { s1 });
113     JMenu menu = new JMenu();
114     AlignFrame af = new AlignFrame(al, 500, 500);
115
116     /*
117      * menu for SequenceGroup excludes 'User Defined Colour'
118      */
119     PopupMenu popup = new PopupMenu(af.alignPanel, s1, null);
120     ButtonGroup bg = ColourMenuHelper.addMenuItems(menu, popup, al, false);
121     Enumeration<AbstractButton> bgElements = bg.getElements();
122   
123     /*
124      * first entry is 'No Colour' option
125      */
126     JMenuItem item = menu.getItem(0);
127     assertEquals(item.getName(), ResidueColourScheme.NONE);
128     assertEquals(item.getText(), MessageManager.getString("label.none"));
129     AbstractButton bgItem = bgElements.nextElement();
130     assertSame(bgItem, item);
131   
132     /*
133      * check that each registered colour scheme is in the menu,
134      * and in the button group;
135      * nucleotide-only schemes should be disabled menu items
136      */
137     Iterator<ColourSchemeI> colourSchemes = ColourSchemes.getInstance()
138             .getColourSchemes().iterator();
139     final int items = menu.getItemCount();
140     for (int i = 1; i < items; i++)
141     {
142       item = menu.getItem(i);
143       bgItem = bgElements.nextElement();
144       assertSame(bgItem, item);
145       ColourSchemeI cs = colourSchemes.next();
146       String name = cs.getSchemeName();
147       assertEquals(item.getName(), name);
148       boolean enabled = item.isEnabled();
149       assertEquals(enabled, cs.isApplicableTo(al));
150       if (cs instanceof NucleotideColourScheme) // nucleotide only
151       {
152         assertTrue(enabled);
153       }
154       if (cs instanceof ClustalxColourScheme) // peptide only
155       {
156         assertFalse(enabled);
157       }
158       if (cs instanceof PIDColourScheme) // nucleotide or peptide
159       {
160         assertTrue(enabled);
161       }
162   
163       /*
164        * check i18n for display name
165        */
166       String label = MessageManager.getStringOrReturn("label.colourScheme_",
167               name);
168       assertEquals(item.getText(), label);
169     }
170   
171     /*
172      * check nothing left over
173      */
174     assertFalse(colourSchemes.hasNext());
175     assertFalse(bgElements.hasMoreElements());
176   }
177
178   /**
179    * 'Simple only' mode constructs colour menu for structures
180    * <ul>
181    * <li>no 'No Colour' option</li>
182    * <li>only simple colour schemes (colour per residue)</li>
183    * </ul>
184    */
185   @Test(groups = "Functional")
186   public void testAddMenuItems_simpleOnly()
187   {
188     SequenceI s1 = new Sequence("s1", "KFRQSILM");
189     AlignmentI al = new Alignment(new SequenceI[] { s1 });
190     JMenu menu = new JMenu();
191   
192     ButtonGroup bg = ColourMenuHelper.addMenuItems(menu, null, al, true);
193     Enumeration<AbstractButton> bgElements = bg.getElements();
194   
195     /*
196      * check that only 'simple' colour schemes are included
197      */
198     Iterator<ColourSchemeI> colourSchemes = ColourSchemes.getInstance()
199             .getColourSchemes().iterator();
200     int i = 0;
201     while (colourSchemes.hasNext())
202     {
203       ColourSchemeI cs = colourSchemes.next();
204       if (!cs.isSimple())
205       {
206         continue;
207       }
208       JMenuItem item = menu.getItem(i++);
209       AbstractButton bgItem = bgElements.nextElement();
210       assertSame(bgItem, item);
211     }
212   
213     /*
214      * check nothing left over
215      */
216     assertEquals(i, menu.getItemCount());
217     assertFalse(bgElements.hasMoreElements());
218   }
219
220   /*
221    * menu for AlignFrame includes 'User Defined Colour'
222    */
223   @Test(groups = "Functional")
224   public void testAddMenuItems_forAlignFrame()
225   {
226     SequenceI s1 = new Sequence("s1", "KFRQSILM");
227     AlignmentI al = new Alignment(new SequenceI[] { s1 });
228     AlignFrame af = new AlignFrame(al, 500, 500);
229     JMenu menu = new JMenu();
230   
231     ButtonGroup bg = ColourMenuHelper.addMenuItems(menu, af, al, false);
232     Enumeration<AbstractButton> bgElements = bg.getElements();
233   
234     /*
235      * check that each registered colour scheme is in the menu,
236      * (skipping over No Colour which is the first menu item),
237      * and in the button group
238      */
239     bgElements.nextElement(); // skip No Colour
240     Iterator<ColourSchemeI> colourSchemes = ColourSchemes.getInstance()
241             .getColourSchemes().iterator();
242     final int items = menu.getItemCount();
243     for (int i = 1; i < items - 1; i++)
244     {
245       JMenuItem item = menu.getItem(i);
246       AbstractButton bgItem = bgElements.nextElement();
247       assertSame(bgItem, item);
248       ColourSchemeI cs = colourSchemes.next();
249       assertEquals(item.getName(), cs.getSchemeName());
250     }
251   
252     /*
253      * check menu also has User Defined Colour
254      */
255     assertFalse(colourSchemes.hasNext());
256     JMenuItem item = menu.getItem(items - 1);
257     AbstractButton bgItem = bgElements.nextElement();
258     assertSame(bgItem, item);
259     assertEquals(item.getName(), ResidueColourScheme.USER_DEFINED_MENU);
260     assertEquals(item.getText(),
261             MessageManager.getString("action.user_defined"));
262   }
263 }