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