JAL-3368 removed parsing web colours (now on a separate branch)
[jalview.git] / test / jalview / util / ColorUtilsTest.java
index a00d79f..08d77b6 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
- * Copyright (C) 2015 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
@@ -22,14 +22,25 @@ package jalview.util;
 
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertNull;
+import static org.testng.AssertJUnit.assertSame;
+
+import jalview.gui.JvOptionPane;
 
 import java.awt.Color;
 
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 public class ColorUtilsTest
 {
 
+  @BeforeClass(alwaysRun = true)
+  public void setUpJvOptionPane()
+  {
+    JvOptionPane.setInteractiveMode(false);
+    JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
+  }
+
   Color paleColour = new Color(97, 203, 111); // pale green
 
   Color midColour = new Color(135, 57, 41); // mid red
@@ -60,9 +71,6 @@ public class ColorUtilsTest
     assertNull(ColorUtils.brighterThan(null));
   }
 
-  /**
-   * @see http://www.rtapo.com/notes/named_colors.html
-   */
   @Test(groups = { "Functional" })
   public void testToTkCode()
   {
@@ -72,4 +80,165 @@ public class ColorUtilsTest
     assertEquals("#800080", ColorUtils.toTkCode(new Color(128, 0, 128))); // purple
     assertEquals("#00ff00", ColorUtils.toTkCode(new Color(0, 255, 0))); // lime
   }
+
+  @Test(groups = { "Functional" })
+  public void testGetGraduatedColour()
+  {
+    Color minColour = new Color(100, 100, 100);
+    Color maxColour = new Color(180, 200, 220);
+
+    /*
+     * value half-way between min and max
+     */
+    Color col = ColorUtils.getGraduatedColour(20f, 10f, minColour, 30f,
+            maxColour);
+    assertEquals(140, col.getRed());
+    assertEquals(150, col.getGreen());
+    assertEquals(160, col.getBlue());
+
+    /*
+     * value two-thirds of the way between min and max
+     */
+    col = ColorUtils
+            .getGraduatedColour(30f, 10f, minColour, 40f, maxColour);
+    assertEquals(153, col.getRed());
+    // Color constructor rounds float value to nearest int
+    assertEquals(167, col.getGreen());
+    assertEquals(180, col.getBlue());
+
+    /*
+     * value = min
+     */
+    col = ColorUtils
+            .getGraduatedColour(10f, 10f, minColour, 30f, maxColour);
+    assertEquals(minColour, col);
+
+    /*
+     * value = max
+     */
+    col = ColorUtils
+            .getGraduatedColour(30f, 10f, minColour, 30f, maxColour);
+    assertEquals(maxColour, col);
+
+    /*
+     * value < min
+     */
+    col = ColorUtils.getGraduatedColour(0f, 10f, minColour, 30f, maxColour);
+    assertEquals(minColour, col);
+
+    /*
+     * value > max
+     */
+    col = ColorUtils
+            .getGraduatedColour(40f, 10f, minColour, 30f, maxColour);
+    assertEquals(maxColour, col);
+
+    /*
+     * min = max
+     */
+    col = ColorUtils
+            .getGraduatedColour(40f, 10f, minColour, 10f, maxColour);
+    assertEquals(minColour, col);
+  }
+
+  @Test(groups = { "Functional" })
+  public void testBleachColour()
+  {
+    Color colour = new Color(155, 105, 55);
+    assertSame(colour, ColorUtils.bleachColour(colour, 0));
+    assertEquals(Color.WHITE, ColorUtils.bleachColour(colour, 1));
+    assertEquals(Color.WHITE, ColorUtils.bleachColour(colour, 2));
+    assertEquals(new Color(175, 135, 95),
+            ColorUtils.bleachColour(colour, 0.2f));
+    assertEquals(new Color(225, 210, 195),
+            ColorUtils.bleachColour(colour, 0.7f));
+
+    /*
+     * and some 'negative fade'
+     */
+    assertEquals(Color.BLACK, ColorUtils.bleachColour(colour, -1));
+    assertEquals(Color.BLACK, ColorUtils.bleachColour(colour, -2));
+    assertEquals(new Color(124, 84, 44),
+            ColorUtils.bleachColour(colour, -0.2f));
+    assertEquals(new Color(46, 31, 16), // with rounding down
+            ColorUtils.bleachColour(colour, -0.7f));
+  }
+
+  @Test(groups = "Functional")
+  public void testParseColourString()
+  {
+    /*
+     * by colour name - if known to AWT, and included in
+     * 
+     * @see ColourSchemeProperty.getAWTColorFromName()
+     */
+    assertSame(Color.RED, ColorUtils.parseColourString("red"));
+    assertSame(Color.RED, ColorUtils.parseColourString("Red"));
+    assertSame(Color.RED, ColorUtils.parseColourString(" RED "));
+
+    /*
+     * by RGB hex code
+     */
+    String hexColour = Integer.toHexString(Color.RED.getRGB() & 0xffffff);
+    assertEquals("ff0000", hexColour);
+    assertEquals(Color.RED, ColorUtils.parseColourString(hexColour));
+    // 'hex' prefixes _not_ wanted here
+    assertNull(ColorUtils.parseColourString("0x" + hexColour));
+    assertNull(ColorUtils.parseColourString("#" + hexColour));
+    // hex values must be 6 hex digits
+    assertNull(ColorUtils.parseColourString("1000000"));
+    assertNull(ColorUtils.parseColourString("0ff00"));
+
+    /*
+     * by RGB triplet
+     */
+    Color c = Color.pink;
+    String rgb = String.format("%d,%d,%d", c.getRed(), c.getGreen(),
+            c.getBlue());
+    assertEquals("255,175,175", rgb);
+    assertEquals(c, ColorUtils.parseColourString(rgb));
+    assertEquals(c, ColorUtils.parseColourString("255, 175 , 175"));
+
+    /*
+     * odds and ends
+     */
+    assertNull(ColorUtils.parseColourString(null));
+    assertNull(ColorUtils.parseColourString("rubbish"));
+    assertNull(ColorUtils.parseColourString("-1"));
+    assertNull(ColorUtils.parseColourString(String
+            .valueOf(Integer.MAX_VALUE)));
+    assertNull(ColorUtils.parseColourString("100,200,300")); // out of range
+    assertNull(ColorUtils.parseColourString("100,200")); // too few
+    assertNull(ColorUtils.parseColourString("100,200,100,200")); // too many
+  }
+
+  @Test(groups = "Functional")
+  public void testGetAWTColorFromName() {
+    assertEquals(Color.white, ColorUtils.getColorFromName("white"));
+    assertEquals(Color.white, ColorUtils.getColorFromName("White"));
+    assertEquals(Color.white, ColorUtils.getColorFromName("WHITE"));
+    assertEquals(Color.pink, ColorUtils.getColorFromName("pink"));
+    assertNull(ColorUtils.getColorFromName("mauve")); // no such name
+    assertNull(ColorUtils.getColorFromName(""));
+    assertNull(ColorUtils.getColorFromName(null));
+  }
+
+  @Test(groups = "Functional")
+  public void testCreateColourFromName()
+  {
+    assertEquals(Color.white, ColorUtils.createColourFromName(null));
+    assertEquals(new Color(20, 20, 20), ColorUtils.createColourFromName(""));
+    assertEquals(new Color(98, 131, 171),
+            ColorUtils.createColourFromName("None")); // no special treatment!
+    assertEquals(new Color(123, 211, 122),
+            ColorUtils.createColourFromName("hello world"));
+    assertEquals(new Color(27, 147, 112),
+            ColorUtils.createColourFromName("HELLO WORLD"));
+    /*
+     * the algorithm makes the same values for r,g,b if 
+     * the string consists of 3 repeating substrings
+     */
+    assertEquals(new Color(184, 184, 184),
+            ColorUtils.createColourFromName("HELLO HELLO HELLO "));
+  }
 }