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