JAL-3746 apply copyright to tests
[jalview.git] / test / jalview / schemes / ColourSchemesTest.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.schemes;
22
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;
27
28 import jalview.api.AlignViewportI;
29 import jalview.bin.Cache;
30 import jalview.bin.Jalview;
31 import jalview.datamodel.AnnotatedCollectionI;
32 import jalview.datamodel.SequenceCollectionI;
33 import jalview.datamodel.SequenceI;
34 import jalview.gui.AlignFrame;
35 import jalview.gui.Desktop;
36 import jalview.gui.SequenceRenderer;
37 import jalview.io.DataSourceType;
38 import jalview.io.FileLoader;
39 import jalview.schemes.ClustalxColourScheme.ClustalColour;
40
41 import java.awt.Color;
42 import java.util.Iterator;
43 import java.util.Map;
44
45 import org.testng.annotations.AfterClass;
46 import org.testng.annotations.BeforeClass;
47 import org.testng.annotations.Test;
48
49 public class ColourSchemesTest
50 {
51   /*
52    * a colour scheme that alternates Taylor and Zappo
53    * colouring by column
54    */
55   class Stripy extends ResidueColourScheme
56   {
57     private ResidueColourScheme odd;
58
59     private ResidueColourScheme even;
60
61     private Stripy()
62     {
63     }
64
65     /**
66      * constructor given colours for odd and even columns
67      * 
68      * @param odd
69      * @param even
70      */
71     private Stripy(ColourSchemeI cs1, ColourSchemeI cs2)
72     {
73       odd = (ResidueColourScheme) cs1;
74       even = (ResidueColourScheme) cs2;
75     }
76
77     @Override
78     public ColourSchemeI getInstance(AlignViewportI view,
79             AnnotatedCollectionI sg)
80     {
81       final ColourSchemeI cs1 = ColourSchemes.getInstance().getColourScheme(
82               JalviewColourScheme.Taylor.toString(),
83               (AnnotatedCollectionI) null);
84       final ColourSchemeI cs2 = ColourSchemes.getInstance().getColourScheme(
85               JalviewColourScheme.Zappo.toString(),
86               (AnnotatedCollectionI) null);
87       return new Stripy(cs1, cs2);
88     }
89
90     @Override
91     public Color findColour(char c, int j, SequenceI seq)
92     {
93       if (j % 2 == 1)
94       {
95         return odd.findColour(c, j, seq);
96       }
97       else
98       {
99         return even.findColour(c, j, seq);
100       }
101     }
102
103     @Override
104     public String getSchemeName()
105     {
106       return "stripy";
107     }
108   };
109
110   /*
111    * a colour scheme that is Clustal but using AWT colour equivalents
112    */
113   class MyClustal extends ResidueColourScheme
114   {
115     ClustalxColourScheme delegate;
116
117     private MyClustal()
118     {
119     }
120
121     private MyClustal(AnnotatedCollectionI sg,
122             Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
123     {
124       delegate = new ClustalxColourScheme(sg, hiddenRepSequences);
125     }
126
127     @Override
128     public Color findColour(char c, int j, SequenceI seq)
129     {
130       Color col = delegate.findColour(c, j, seq);
131       Color result = col;
132       if (col.equals(ClustalColour.BLUE.colour))
133       {
134         result = Color.blue;
135       }
136       else if (col.equals(ClustalColour.CYAN.colour))
137       {
138         result = Color.cyan;
139       }
140       else if (col.equals(ClustalColour.GREEN.colour))
141       {
142         result = Color.green;
143       }
144       else if (col.equals(ClustalColour.MAGENTA.colour))
145       {
146         result = Color.magenta;
147       }
148       else if (col.equals(ClustalColour.ORANGE.colour))
149       {
150         result = Color.orange;
151       }
152       else if (col.equals(ClustalColour.PINK.colour))
153       {
154         result = Color.pink;
155       }
156       else if (col.equals(ClustalColour.RED.colour))
157       {
158         result = Color.red;
159       }
160       else if (col.equals(ClustalColour.YELLOW.colour))
161       {
162         result = Color.yellow;
163       }
164       return result;
165     }
166
167     @Override
168     public ColourSchemeI getInstance(AlignViewportI view,
169             AnnotatedCollectionI sg)
170     {
171       return new MyClustal(sg, view.getHiddenRepSequences());
172     }
173
174     @Override
175     public String getSchemeName()
176     {
177       return "MyClustal";
178     }
179
180   }
181
182   @BeforeClass(alwaysRun = true)
183   public static void setUpBeforeClass() throws Exception
184   {
185     /*
186      * use read-only test properties file
187      */
188     Cache.loadProperties("test/jalview/io/testProps.jvprops");
189     Jalview.main(new String[] { "-nonews" });
190   }
191
192   @AfterClass(alwaysRun = true)
193   public static void tearDownAfterClass() throws Exception
194   {
195     Desktop.instance.closeAll_actionPerformed(null);
196   }
197
198   @Test(groups = "Functional")
199   public void testGetColourSchemes()
200   {
201     /*
202      * this just verifies that built-in colour schemes are loaded into ColourSchemes
203      * in the order in which they are declared in the JalviewColourScheme enum
204      * (this also determines their order in Colour menus)
205      */
206     Iterator<ColourSchemeI> schemes = ColourSchemes.getInstance()
207             .getColourSchemes().iterator();
208     JalviewColourScheme[] jalviewSchemes = JalviewColourScheme.values();
209     int i = 0;
210     while (schemes.hasNext() && i < jalviewSchemes.length)
211     {
212       assertTrue(schemes.next().getSchemeName()
213               .equals(jalviewSchemes[i].toString()));
214       i++;
215     }
216   }
217
218   @Test(groups = "Functional")
219   public void testGetColourScheme()
220   {
221     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
222             ">seq1\nAGLRTWQU", DataSourceType.PASTE);
223     ColourSchemes schemes = ColourSchemes.getInstance();
224
225     AnnotatedCollectionI al = af.getViewport().getAlignment();
226
227     for (JalviewColourScheme cs : JalviewColourScheme.values())
228     {
229       ColourSchemeI registered = schemes.getColourScheme(cs.toString(), al);
230       assertSame(registered.getClass(), cs.getSchemeClass());
231     }
232     af.closeMenuItem_actionPerformed(true);
233   }
234
235   @Test(groups = "Functional")
236   public void testRegisterColourScheme()
237   {
238     ColourSchemes.getInstance().registerColourScheme(new Stripy());
239     ColourSchemes.getInstance().registerColourScheme(new MyClustal());
240     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
241             "examples/uniref50.fa", DataSourceType.FILE);
242     /*
243      * set a breakpoint here to see and play with the newly registered
244      *  colour schemes in the AlignFrame colour menu
245      */
246     SequenceRenderer sr = new SequenceRenderer(af.getViewport());
247     SequenceI seq = af.getViewport().getAlignment().findName("FER_CAPAA");
248
249     /*
250      * set and check Taylor colours
251      */
252     af.changeColour_actionPerformed(JalviewColourScheme.Taylor.toString());
253     Color taylor1 = sr.getResidueColour(seq, 88, null); // E 255,0,102
254     Color taylor2 = sr.getResidueColour(seq, 89, null); // A 204,255,0
255     Color taylor3 = sr.getResidueColour(seq, 90, null); // G 255,153,0
256     assertEquals(taylor1, new Color(255, 0, 102));
257     assertEquals(taylor2, new Color(204, 255, 0));
258     assertEquals(taylor3, new Color(255, 153, 0));
259
260     /*
261      * set and check Zappo colours
262      */
263     af.changeColour_actionPerformed(JalviewColourScheme.Zappo.toString());
264     Color zappo1 = sr.getResidueColour(seq, 88, null); // E red
265     Color zappo2 = sr.getResidueColour(seq, 89, null); // A pink
266     Color zappo3 = sr.getResidueColour(seq, 90, null); // G magenta
267     assertEquals(zappo1, Color.red);
268     assertEquals(zappo2, Color.pink);
269     assertEquals(zappo3, Color.magenta);
270
271     /*
272      * set 'stripy' colours - odd columns are Taylor and even are Zappo 
273      */
274     af.changeColour_actionPerformed("stripy");
275     Color stripy1 = sr.getResidueColour(seq, 88, null);
276     Color stripy2 = sr.getResidueColour(seq, 89, null);
277     Color stripy3 = sr.getResidueColour(seq, 90, null);
278     assertEquals(stripy1, zappo1);
279     assertEquals(stripy2, taylor2);
280     assertEquals(stripy3, zappo3);
281
282     /*
283      * set and check Clustal colours
284      */
285     af.changeColour_actionPerformed(JalviewColourScheme.Clustal.toString());
286     Color clustal1 = sr.getResidueColour(seq, 88, null);
287     Color clustal2 = sr.getResidueColour(seq, 89, null);
288     Color clustal3 = sr.getResidueColour(seq, 90, null);
289     assertEquals(clustal1, ClustalColour.MAGENTA.colour);
290     assertEquals(clustal2, ClustalColour.BLUE.colour);
291     assertEquals(clustal3, ClustalColour.ORANGE.colour);
292
293     /*
294      * set 'MyClustal' colours - uses AWT colour equivalents
295      */
296     af.changeColour_actionPerformed("MyClustal");
297     Color myclustal1 = sr.getResidueColour(seq, 88, null);
298     Color myclustal2 = sr.getResidueColour(seq, 89, null);
299     Color myclustal3 = sr.getResidueColour(seq, 90, null);
300     assertEquals(myclustal1, Color.MAGENTA);
301     assertEquals(myclustal2, Color.BLUE);
302     assertEquals(myclustal3, Color.ORANGE);
303   }
304
305   /**
306    * Tests for check if scheme name exists. Built-in scheme names are the
307    * toString() values of enum JalviewColourScheme.
308    */
309   @Test(groups = "Functional")
310   public void testNameExists()
311   {
312     ColourSchemes cs = ColourSchemes.getInstance();
313     assertFalse(cs.nameExists(null));
314     assertFalse(cs.nameExists(""));
315     assertTrue(cs.nameExists("Clustal"));
316     assertTrue(cs.nameExists("CLUSTAL"));
317     assertFalse(cs.nameExists("CLUSTAL "));
318     assertTrue(cs.nameExists("% Identity"));
319     assertFalse(cs.nameExists("PID"));
320   }
321 }