Merge branch 'develop' into features/JAL-2379pcaMemory
[jalview.git] / test / jalview / schemes / ColourSchemesTest.java
diff --git a/test/jalview/schemes/ColourSchemesTest.java b/test/jalview/schemes/ColourSchemesTest.java
new file mode 100644 (file)
index 0000000..4618ed7
--- /dev/null
@@ -0,0 +1,299 @@
+package jalview.schemes;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertSame;
+import static org.testng.Assert.assertTrue;
+
+import jalview.bin.Cache;
+import jalview.bin.Jalview;
+import jalview.datamodel.AnnotatedCollectionI;
+import jalview.datamodel.SequenceCollectionI;
+import jalview.datamodel.SequenceI;
+import jalview.gui.AlignFrame;
+import jalview.gui.Desktop;
+import jalview.gui.SequenceRenderer;
+import jalview.io.DataSourceType;
+import jalview.io.FileLoader;
+import jalview.schemes.ClustalxColourScheme.ClustalColour;
+
+import java.awt.Color;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class ColourSchemesTest
+{
+  /*
+   * a colour scheme that alternates Taylor and Zappo
+   * colouring by column
+   */
+  class Stripy extends ResidueColourScheme
+  {
+    private ResidueColourScheme odd;
+
+    private ResidueColourScheme even;
+
+    private Stripy()
+    {
+    }
+
+    /**
+     * constructor given colours for odd and even columns
+     * 
+     * @param odd
+     * @param even
+     */
+    private Stripy(ColourSchemeI cs1, ColourSchemeI cs2)
+    {
+      odd = (ResidueColourScheme) cs1;
+      even = (ResidueColourScheme) cs2;
+    }
+
+    @Override
+    public ColourSchemeI getInstance(AnnotatedCollectionI sg,
+            Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
+    {
+      final ColourSchemeI cs1 = ColourSchemes.getInstance()
+              .getColourScheme(JalviewColourScheme.Taylor.toString(),
+                      (AnnotatedCollectionI) null);
+      final ColourSchemeI cs2 = ColourSchemes.getInstance()
+              .getColourScheme(JalviewColourScheme.Zappo.toString(),
+                      (AnnotatedCollectionI) null);
+      return new Stripy(cs1, cs2);
+    }
+
+    @Override
+    public Color findColour(char c, int j, SequenceI seq)
+    {
+      if (j % 2 == 1)
+      {
+        return odd.findColour(c, j, seq);
+      }
+      else
+      {
+        return even.findColour(c, j, seq);
+      }
+    }
+
+    @Override
+    public String getSchemeName()
+    {
+      return "stripy";
+    }
+  };
+  
+  /*
+   * a colour scheme that is Clustal but using AWT colour equivalents
+   */
+  class MyClustal extends ResidueColourScheme
+  {
+    ClustalxColourScheme delegate;
+
+    private MyClustal()
+    {
+    }
+
+    private MyClustal(AnnotatedCollectionI sg,
+            Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
+    {
+      delegate = new ClustalxColourScheme(sg, hiddenRepSequences);
+    }
+
+    @Override
+    public Color findColour(char c, int j, SequenceI seq)
+    {
+      Color col = delegate.findColour(c, j, seq);
+      Color result = col;
+      if (col.equals(ClustalColour.BLUE.colour))
+      {
+        result = Color.blue;
+      }
+      else if (col.equals(ClustalColour.CYAN.colour))
+      {
+        result = Color.cyan;
+      }
+      else if (col.equals(ClustalColour.GREEN.colour))
+      {
+        result = Color.green;
+      }
+      else if (col.equals(ClustalColour.MAGENTA.colour))
+      {
+        result = Color.magenta;
+      }
+      else if (col.equals(ClustalColour.ORANGE.colour))
+      {
+        result = Color.orange;
+      }
+      else if (col.equals(ClustalColour.PINK.colour))
+      {
+        result = Color.pink;
+      }
+      else if (col.equals(ClustalColour.RED.colour))
+      {
+        result = Color.red;
+      }
+      else if (col.equals(ClustalColour.YELLOW.colour))
+      {
+        result = Color.yellow;
+      }
+      return result;
+    }
+
+    @Override
+    public ColourSchemeI getInstance(AnnotatedCollectionI sg,
+            Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
+    {
+      return new MyClustal(sg,              hiddenRepSequences);
+    }
+
+    @Override
+    public String getSchemeName()
+    {
+      return "MyClustal";
+    }
+
+  }
+
+  @BeforeClass(alwaysRun = true)
+  public static void setUpBeforeClass() throws Exception
+  {
+    /*
+     * use read-only test properties file
+     */
+    Cache.loadProperties("test/jalview/io/testProps.jvprops");
+    Jalview.main(new String[] { "-nonews" });
+  }
+
+  @AfterClass(alwaysRun = true)
+  public static void tearDownAfterClass() throws Exception
+  {
+    Desktop.instance.closeAll_actionPerformed(null);
+  }
+
+  @Test(groups = "Functional")
+  public void testGetColourSchemes()
+  {
+    /*
+     * this just verifies that built-in colour schemes are loaded into ColourSchemes
+     * in the order in which they are declared in the JalviewColourScheme enum
+     * (this also determines their order in Colour menus)
+     */
+    Iterator<ColourSchemeI> schemes = ColourSchemes.getInstance().getColourSchemes().iterator();
+    JalviewColourScheme[] jalviewSchemes = JalviewColourScheme.values();
+    int i = 0;
+    while (schemes.hasNext() && i < jalviewSchemes.length)
+    {
+      assertTrue(schemes.next().getSchemeName()
+              .equals(jalviewSchemes[i].toString()));
+      i++;
+    }
+  }
+
+  @Test(groups = "Functional")
+  public void testGetColourScheme()
+  {
+    AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
+            ">seq1\nAGLRTWQU", DataSourceType.PASTE);
+    ColourSchemes schemes = ColourSchemes.getInstance();
+
+    AnnotatedCollectionI al = af.getViewport().getAlignment();
+
+    for (JalviewColourScheme cs : JalviewColourScheme.values())
+    {
+      ColourSchemeI registered = schemes.getColourScheme(cs.toString(), al);
+      assertSame(registered.getClass(), cs.getSchemeClass());
+    }
+    af.closeMenuItem_actionPerformed(true);
+  }
+  
+  @Test(groups = "Functional")
+  public void testRegisterColourScheme()
+  {
+    ColourSchemes.getInstance().registerColourScheme(new Stripy());
+    ColourSchemes.getInstance().registerColourScheme(new MyClustal());
+    AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(
+            "examples/uniref50.fa", DataSourceType.FILE);
+    /*
+     * set a breakpoint here to see and play with the newly registered
+     *  colour schemes in the AlignFrame colour menu
+     */
+    SequenceRenderer sr = new SequenceRenderer(af.getViewport());
+    SequenceI seq = af.getViewport().getAlignment().findName("FER_CAPAA");
+
+    /*
+     * set and check Taylor colours
+     */
+    af.changeColour_actionPerformed(JalviewColourScheme.Taylor.toString());
+    Color taylor1 = sr.getResidueBoxColour(seq, 88); // E 255,0,102
+    Color taylor2 = sr.getResidueBoxColour(seq, 89); // A 204,255,0
+    Color taylor3 = sr.getResidueBoxColour(seq, 90); // G 255,153,0
+    assertEquals(taylor1, new Color(255, 0, 102));
+    assertEquals(taylor2, new Color(204, 255, 0));
+    assertEquals(taylor3, new Color(255, 153, 0));
+
+    /*
+     * set and check Zappo colours
+     */
+    af.changeColour_actionPerformed(JalviewColourScheme.Zappo.toString());
+    Color zappo1 = sr.getResidueBoxColour(seq, 88); // E red
+    Color zappo2 = sr.getResidueBoxColour(seq, 89); // A pink
+    Color zappo3 = sr.getResidueBoxColour(seq, 90); // G magenta
+    assertEquals(zappo1, Color.red);
+    assertEquals(zappo2, Color.pink);
+    assertEquals(zappo3, Color.magenta);
+
+    /*
+     * set 'stripy' colours - odd columns are Taylor and even are Zappo 
+     */
+    af.changeColour_actionPerformed("stripy");
+    Color stripy1 = sr.getResidueBoxColour(seq, 88);
+    Color stripy2 = sr.getResidueBoxColour(seq, 89);
+    Color stripy3 = sr.getResidueBoxColour(seq, 90);
+    assertEquals(stripy1, zappo1);
+    assertEquals(stripy2, taylor2);
+    assertEquals(stripy3, zappo3);
+
+    /*
+     * set and check Clustal colours
+     */
+    af.changeColour_actionPerformed(JalviewColourScheme.Clustal.toString());
+    Color clustal1 = sr.getResidueBoxColour(seq, 88);
+    Color clustal2 = sr.getResidueBoxColour(seq, 89);
+    Color clustal3 = sr.getResidueBoxColour(seq, 90);
+    assertEquals(clustal1, ClustalColour.MAGENTA.colour);
+    assertEquals(clustal2, ClustalColour.BLUE.colour);
+    assertEquals(clustal3, ClustalColour.ORANGE.colour);
+
+    /*
+     * set 'MyClustal' colours - uses AWT colour equivalents
+     */
+    af.changeColour_actionPerformed("MyClustal");
+    Color myclustal1 = sr.getResidueBoxColour(seq, 88);
+    Color myclustal2 = sr.getResidueBoxColour(seq, 89);
+    Color myclustal3 = sr.getResidueBoxColour(seq, 90);
+    assertEquals(myclustal1, Color.MAGENTA);
+    assertEquals(myclustal2, Color.BLUE);
+    assertEquals(myclustal3, Color.ORANGE);
+  }
+
+  /**
+   * Tests for check if scheme name exists. Built-in scheme names are the
+   * toString() values of enum JalviewColourScheme.
+   */
+  @Test(groups = "Functional")
+  public void testNameExists()
+  {
+    ColourSchemes cs = ColourSchemes.getInstance();
+    assertFalse(cs.nameExists(null));
+    assertFalse(cs.nameExists(""));
+    assertTrue(cs.nameExists("Clustal"));
+    assertTrue(cs.nameExists("CLUSTAL"));
+    assertFalse(cs.nameExists("CLUSTAL "));
+    assertTrue(cs.nameExists("% Identity"));
+    assertFalse(cs.nameExists("PID"));
+  }
+}