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