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