1 /*
   2  * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package test.javafx.scene.paint;
  27 
  28 import javafx.animation.Interpolatable;
  29 import java.lang.reflect.Field;
  30 import java.lang.reflect.Modifier;
  31 import java.util.ArrayList;
  32 import com.sun.javafx.util.Utils;
  33 import javafx.scene.paint.Color;
  34 import org.junit.Test;
  35 import static org.junit.Assert.assertEquals;
  36 import static org.junit.Assert.assertFalse;
  37 import static org.junit.Assert.assertNotNull;
  38 import static org.junit.Assert.assertTrue;
  39 
  40 public class ColorTest {
  41     
  42     @Test
  43     public void testRedIsBoundedBy0And1() {
  44         try {
  45             Color c = new Color(-1, 0, 0, 0);
  46             assertTrue(false);
  47         } catch (Exception e) {}
  48         
  49         try {
  50             Color c = new Color(100, 0, 0, 0);
  51             assertTrue(false);
  52         } catch (Exception ee) {}
  53     }
  54 
  55     @Test
  56     public void testGreenIsBoundedBy0And1() {
  57         try {
  58             Color c = new Color(0, -1, 0, 0);
  59             assertTrue(false);
  60         } catch (Exception e) {}
  61 
  62         try {
  63             Color c = new Color(0, 100, 0, 0);
  64             assertTrue(false);
  65         } catch (Exception ee) {}
  66     }
  67     
  68     @Test
  69     public void testBlueIsBoundedBy0And1() {
  70         try {
  71             Color c = new Color(0, 0, -1, 0);
  72             assertTrue(false);
  73         } catch (Exception e) {}
  74 
  75         try {
  76             Color c = new Color(0, 0, 100, 0);
  77             assertTrue(false);
  78         } catch (Exception ee) {}
  79     }
  80 
  81     @Test
  82     public void testOpacityIsBoundedBy0And1() {
  83         try {
  84             Color c = new Color(0, 0, 0, -1);
  85             assertTrue(false);
  86         } catch (Exception e) {}
  87 
  88         try {
  89             Color c = new Color(0, 0, 0, 100);
  90             assertTrue(false);
  91         } catch (Exception ee) {}
  92     }
  93     
  94     @Test
  95     public void testOfTheWay() {
  96         Color start = new Color(0, 0, 0, 0);
  97         Color end = new Color(1, 1, 1, 1);
  98         Color mid = start.interpolate(end, .5);
  99         assertEquals(mid.getRed(), .5, 0.0001);
 100         assertEquals(mid.getGreen(), .5, 0.0001);
 101         assertEquals(mid.getBlue(), .5, 0.0001);
 102         assertEquals(mid.getOpacity(), .5, 0.0001);
 103     }
 104 
 105     @Test
 106     public void testOfTheWayAll()
 107         throws IllegalArgumentException, IllegalAccessException
 108     {
 109         ArrayList<Color> colors = new ArrayList<Color>();
 110         for (Field f : Color.class.getDeclaredFields()) {
 111             if (Modifier.isStatic(f.getModifiers()) &&
 112                 f.getType() == Color.class)
 113             {
 114                 Color c = (Color) f.get(null);
 115                 colors.add(c);
 116             }
 117         }
 118         for (Color c1 : colors) {
 119             for (Color c2 : colors) {
 120                 c1.interpolate(c2, 0.0);
 121                 c1.interpolate(c2, Double.MIN_VALUE);
 122                 c1.interpolate(c2, 0.5);
 123                 c1.interpolate(c2, 1.0 - Double.MIN_VALUE);
 124                 c1.interpolate(c2, 1.0);
 125             }
 126         }
 127     }
 128 
 129     @Test
 130     public void testOfTheWayIndirect() {
 131         Interpolatable<Color> start = new Color(0, 0, 0, 0);
 132         Color end = new Color(1, 1, 1, 1);
 133         Color mid = start.interpolate(end, .5);
 134         assertEquals(mid.getRed(), .5, 0.0001);
 135         assertEquals(mid.getGreen(),.5, 0.0001);
 136         assertEquals(mid.getBlue(), .5, 0.0001);
 137         assertEquals(mid.getOpacity(), .5, 0.0001);
 138     }
 139     
 140     @Test
 141     public void testColorIsBoundedBy0And1() {
 142         try {
 143             Color color = Color.color(-1, 0, 0, 0);
 144             assertTrue(false);
 145         } catch (Exception e) {}
 146         
 147         try {
 148             Color color = Color.color(0, -1, 0, 0);
 149             assertTrue(false);
 150         } catch (Exception ee) {}
 151 
 152         try {
 153             Color color = Color.color(0, 0, -1, 0);
 154             assertTrue(false);
 155         } catch (Exception eee) {}
 156 
 157         try {
 158             Color color = Color.color(0, 0, 0, -1);
 159             assertTrue(false);
 160         } catch (Exception eeee) {}
 161 
 162         try {
 163             Color color = Color.color(2, 0, 0, 0);
 164             assertTrue(false);
 165         } catch (Exception eeeee) {}
 166 
 167         try {
 168             Color color = Color.color(0, 2, 0, 0);
 169             assertTrue(false);
 170         } catch (Exception eeeeee) {}
 171 
 172         try {
 173             Color color = Color.color(0, 0, 2, 0);
 174             assertTrue(false);
 175         } catch (Exception eeeeeee) {}
 176 
 177         try {
 178             Color color = Color.color(0, 0, 0, 2);
 179             assertTrue(false);
 180         } catch (Exception eeeeeeee) {}
 181     }
 182     
 183     @Test
 184     public void testColor() {
 185         Color color = Color.color(.1, .2, .3);
 186         assertEquals(.1, color.getRed(), 0.0001);
 187         assertEquals(.2, color.getGreen(), 0.0001);
 188         assertEquals(.3, color.getBlue(), 0.0001);
 189         assertEquals(1, color.getOpacity(), 0.0001);
 190     }
 191     
 192     @Test
 193     public void testColorWithOpacity() {
 194         Color color = Color.color(.1, .2, .3, .4);
 195         assertEquals(.1, color.getRed(), 0.0001);
 196         assertEquals(.2, color.getGreen(), 0.0001);
 197         assertEquals(.3, color.getBlue(), 0.0001);
 198         assertEquals(.4, color.getOpacity(), 0.0001);
 199     }
 200 
 201     @Test
 202     public void testRgbIsBoundedBy0And255() {
 203         try {
 204             Color color = Color.rgb(-1, 0, 0, 0);
 205             assertTrue(false);
 206         } catch (Exception e) {}
 207         
 208         try {
 209             Color color = Color.rgb(0, -1, 0, 0);
 210             assertTrue(false);
 211         } catch (Exception ee) {}
 212 
 213         try {
 214             Color color = Color.rgb(0, 0, -1, 0);
 215             assertTrue(false);
 216         } catch (Exception eee) {}
 217 
 218         try {
 219             Color color = Color.rgb(0, 0, 0, -1);
 220             assertTrue(false);
 221         } catch (Exception eeee) {}
 222 
 223         try {
 224             Color color = Color.rgb(300, 0, 0, 0);
 225             assertTrue(false);
 226         } catch (Exception eeeee) {}
 227 
 228         try {
 229             Color color = Color.rgb(0, 300, 0, 0);
 230             assertTrue(false);
 231         } catch (Exception eeeeee) {}
 232 
 233         try {
 234             Color color = Color.rgb(0, 0, 300, 0);
 235             assertTrue(false);
 236         } catch (Exception eeeeeee) {}
 237 
 238         try {
 239             Color color = Color.rgb(0, 0, 0, 300);
 240             assertTrue(false);
 241         } catch (Exception eeeeeeee) {}
 242     }
 243     
 244     @Test
 245     public void testRgb() {
 246         Color color = Color.rgb(255, 0, 255, 0);
 247         assertTrue(color.getRed() == 1);
 248         assertTrue(color.getGreen() == 0);
 249         assertTrue(color.getBlue() == 1);
 250         assertTrue(color.getOpacity() == 0);
 251         double[] hsb = Utils.RGBtoHSB(1.0, 0.0, 1.0);
 252         assertEquals(hsb[0], color.getHue(), 0.0001);
 253         assertEquals(hsb[1], color.getSaturation(), 0.0001);
 254         assertEquals(hsb[2], color.getBrightness(), 0.0001);
 255     }
 256     
 257     @Test
 258     public void testGray() {
 259         Color color = Color.gray(0.5);
 260         assertEquals(0.5, color.getRed(), 0.0001);
 261         assertEquals(0.5, color.getGreen(), 0.0001);
 262         assertEquals(0.5, color.getBlue(), 0.0001);
 263         assertEquals(1.0, color.getOpacity(), 0.0001);
 264     }
 265 
 266     @Test
 267     public void testGrayWithOpacity() {
 268         Color color = Color.gray(0.5, 0.3);
 269         assertEquals(0.5, color.getRed(), 0.0001);
 270         assertEquals(0.5, color.getGreen(), 0.0001);
 271         assertEquals(0.5, color.getBlue(), 0.0001);
 272         assertEquals(0.3, color.getOpacity(), 0.0001);
 273     }
 274 
 275     @Test
 276     public void testGrayRgb() {
 277         Color color = Color.grayRgb(255, 0.5);
 278         assertEquals(1.0, color.getRed(), 0.0001);
 279         assertEquals(1.0, color.getGreen(), 0.0001);
 280         assertEquals(1.0, color.getBlue(), 0.0001);
 281         assertEquals(0.5, color.getOpacity(), 0.0001);
 282     }
 283 
 284     @Test
 285     public void testHsbIsBounded() {
 286         Color.hsb(10000, 0, 0); // this should work!
 287     
 288         try {
 289             Color color = Color.hsb(100, -1, 0);
 290             assertTrue(false);
 291         } catch (Exception ee) {}
 292     
 293         try {
 294             Color color = Color.hsb(100, 0, -1);
 295             assertTrue(false);
 296         } catch (Exception eee) {}
 297     
 298         try {
 299             Color color = Color.hsb(100, 2, 0);
 300             assertTrue(false);
 301         } catch (Exception eeee) {}
 302     
 303         try {
 304             Color color = Color.hsb(100, 0, 2);
 305             assertTrue(false);
 306         } catch (Exception eeeee) {}
 307     }
 308     
 309     @Test
 310     public void testHsb() {
 311         Color color = Color.hsb(210, 1, .5);
 312         assertEquals(0.0, color.getRed(), .0001);
 313         assertEquals(0.25, color.getGreen(), .0001);
 314         assertEquals(0.5, color.getBlue(), .0001);
 315         assertEquals(1.0, color.getOpacity(), .0001);
 316         assertEquals(210, color.getHue(), 0.0001);
 317         assertEquals(1.0, color.getSaturation(), 0.0001);
 318         assertEquals(0.5, color.getBrightness(), 0.0001);
 319     }
 320 
 321     @Test
 322     public void testHsbWithOpacity() {
 323         Color color = Color.hsb(210, 1, .5, .4);
 324         assertEquals(0.0, color.getRed(), .0001);
 325         assertEquals(0.25, color.getGreen(), .0001);
 326         assertEquals(0.5, color.getBlue(), .0001);
 327         assertEquals(0.4, color.getOpacity(), .0001);
 328         assertEquals(210, color.getHue(), 0.0001);
 329         assertEquals(1.0, color.getSaturation(), 0.0001);
 330         assertEquals(0.5, color.getBrightness(), 0.0001);
 331     }
 332 
 333     @Test
 334     public void testWebPoundNotation() {
 335         Color color = Color.web("#aabbcc");
 336         assertEquals(color.getRed(), 170.0/255.0, 0.0001);
 337         assertEquals(color.getGreen(), 187.0/255.0, 0.0001);
 338         assertEquals(color.getBlue(), 204.0/255.0, 0.0001);
 339     }
 340 
 341     @Test
 342     public void testWebPoundNotationShort() {
 343         Color color = Color.web("#abc");
 344         assertEquals(color.getRed(), 10.0/15.0, 0.0001);
 345         assertEquals(color.getGreen(), 11.0/15.0, 0.0001);
 346         assertEquals(color.getBlue(), 12.0/15.0, 0.0001);
 347     }
 348 
 349     @Test
 350     public void testWebPoundNotationWithAlphaAndOpacity() {
 351         Color color = Color.web("#aabbcc80", 0.5);
 352         assertEquals(color.getRed(), 170.0/255.0, 0.0001);
 353         assertEquals(color.getGreen(), 187.0/255.0, 0.0001);
 354         assertEquals(color.getBlue(), 204.0/255.0, 0.0001);
 355         assertEquals((128.0/255.0)/2.0, color.getOpacity(), 0.0001);
 356     }
 357 
 358     @Test(expected=IllegalArgumentException.class)
 359     public void testWebPoundNotationIllegalValue() {
 360         Color.web("#aabbccddee");
 361     }
 362 
 363     @Test(expected=NullPointerException.class)
 364     public void testWebNullValue() {
 365         Color.web(null);
 366     }
 367 
 368     @Test(expected=IllegalArgumentException.class)
 369     public void testWebEmptyColor() {
 370         Color.web("", 0.5);
 371     }
 372     
 373     @Test
 374     public void testWebHexNotation() {
 375         Color color = Color.web("0xaabbcc");
 376         assertEquals(color.getRed(), 170.0/255.0, 0.0001);
 377         assertEquals(color.getGreen(), 187.0/255.0, 0.0001);
 378         assertEquals(color.getBlue(), 204.0/255.0, 0.0001);
 379     }
 380     
 381     @Test
 382     public void testWebHexNotationWithAlpha() {
 383         Color color = Color.web("0xaabbcc80");
 384         assertEquals(color.getRed(), 170.0/255.0, 0.0001);
 385         assertEquals(color.getGreen(), 187.0/255.0, 0.0001);
 386         assertEquals(color.getBlue(), 204.0/255.0, 0.0001);
 387         assertEquals(128.0/255.0, color.getOpacity(), 0.0001);
 388     }
 389 
 390     @Test(expected=IllegalArgumentException.class)
 391     public void testWebHexNotationIllegalValue() {
 392         Color.web("0xaabbccddee");
 393     }
 394     
 395     @Test
 396     public void testWebNamed() {
 397         Color color = Color.web("orangered");
 398         Color expected = Color.rgb(0xFF, 0x45, 0x00);
 399         assertTrue(expected.getRed() == color.getRed());
 400         assertTrue(expected.getGreen() == color.getGreen());
 401         assertTrue(expected.getBlue() == color.getBlue());
 402         assertTrue(expected.getOpacity() == color.getOpacity());
 403         double[] hsb = Utils.RGBtoHSB(1.0, 69.0/255.0, 0.0);
 404         assertEquals(hsb[0], color.getHue(), 0.001);
 405         assertEquals(hsb[1], color.getSaturation(), 0.001);
 406         assertEquals(hsb[2], color.getBrightness(), 0.001);
 407     }
 408     
 409     @Test
 410     public void testWebNamedWithOpacity() {
 411         Color color = Color.web("orangered", 0.4);
 412         Color expected = Color.rgb(0xFF, 0x45, 0x00, 0.4);
 413         assertTrue(expected.getRed() == color.getRed());
 414         assertTrue(expected.getGreen() == color.getGreen());
 415         assertTrue(expected.getBlue() == color.getBlue());
 416         assertTrue(expected.getOpacity() == color.getOpacity());
 417     }
 418 
 419     @Test
 420     public void testWebNamedMixedCase() {
 421         Color color = Color.web("oRAngEReD");
 422         Color expected = Color.rgb(0xFF, 0x45, 0x00);
 423         assertTrue(expected.getRed() == color.getRed());
 424         assertTrue(expected.getGreen() == color.getGreen());
 425         assertTrue(expected.getBlue() == color.getBlue());
 426         assertTrue(expected.getOpacity() == color.getOpacity());
 427     }
 428     
 429     @Test(expected=IllegalArgumentException.class)
 430     public void testWebNamedWrongName() {
 431         Color.web("foobar");
 432     }
 433 
 434     @Test
 435     public void testWebHex0xNotation() {
 436         Color color = Color.web("0xaabbcc");
 437         assertEquals(color.getRed(), 170.0/255.0, 0.0001);
 438         assertEquals(color.getGreen(), 187.0/255.0, 0.0001);
 439         assertEquals(color.getBlue(), 204.0/255.0, 0.0001);
 440     }
 441 
 442     @Test
 443     public void testWebHex0xNotationShort() {
 444         Color color = Color.web("0xabc");
 445         assertEquals(color.getRed(), 10.0/15.0, 0.0001);
 446         assertEquals(color.getGreen(), 11.0/15.0, 0.0001);
 447         assertEquals(color.getBlue(), 12.0/15.0, 0.0001);
 448     }
 449 
 450     @Test
 451     public void testWebHexNoLeadingSymbol() {
 452         Color color = Color.web("aAbBcC");
 453         assertEquals(color.getRed(), 170.0/255.0, 0.0001);
 454         assertEquals(color.getGreen(), 187.0/255.0, 0.0001);
 455         assertEquals(color.getBlue(), 204.0/255.0, 0.0001);
 456     }
 457 
 458     @Test
 459     public void testWebHexNoLeadingSymbolShort() {
 460         Color color = Color.web("aBc");
 461         assertEquals(color.getRed(), 10.0/15.0, 0.0001);
 462         assertEquals(color.getGreen(), 11.0/15.0, 0.0001);
 463         assertEquals(color.getBlue(), 12.0/15.0, 0.0001);
 464     }
 465 
 466     @Test
 467     public void testWebHexNoLeadingSymbolShortWithAlpha() {
 468         Color color = Color.web("aBc9");
 469         assertEquals(color.getRed(), 10.0/15.0, 0.0001);
 470         assertEquals(color.getGreen(), 11.0/15.0, 0.0001);
 471         assertEquals(color.getBlue(), 12.0/15.0, 0.0001);
 472         assertEquals(0.6, color.getOpacity(), 0.0001);
 473     }
 474 
 475     @Test
 476     public void testWebRgb() {
 477         Color color = Color.web("rgb(128, 64, 192)");
 478         assertEquals(128.0/255.0, color.getRed(), 0.0001);
 479         assertEquals( 64.0/255.0, color.getGreen(), 0.0001);
 480         assertEquals(192.0/255.0, color.getBlue(), 0.0001);
 481         assertEquals(1.0, color.getOpacity(), 0.0001);
 482     }
 483 
 484     @Test
 485     public void testWebRgbRange() {
 486         Color c1 = Color.web("rgb(255, 0, 255)");
 487         Color c2 = Color.web("rgb(256, -1, 256)");
 488         assertEquals(c1, c2);
 489         Color c3 = Color.web("rgb(0, 255, 0)");
 490         Color c4 = Color.web("rgb(-1, 256, -1)");
 491         assertEquals(c3, c4);
 492     }
 493 
 494     @Test
 495     public void testWebRgba() {
 496         Color color = Color.web("rgba(128, 64, 192, 0.6)");
 497         assertEquals(128.0/255.0, color.getRed(), 0.0001);
 498         assertEquals( 64.0/255.0, color.getGreen(), 0.0001);
 499         assertEquals(192.0/255.0, color.getBlue(), 0.0001);
 500         assertEquals(0.6, color.getOpacity(), 0.0001);
 501     }
 502 
 503     @Test
 504     public void testWebRgbaRange() {
 505         Color c1 = Color.web("rgba(255, 0, 255, 1.0)");
 506         Color c2 = Color.web("rgba(256, -1, 256, 1.1)");
 507         assertEquals(c1, c2);
 508         Color c3 = Color.web("rgba(0, 255, 0, 1.0)");
 509         Color c4 = Color.web("rgba(-1, 256, -1, 1.1)");
 510         assertEquals(c3, c4);
 511         Color c5 = Color.web("rgba(0, 0, 0, 0.0)");
 512         Color c6 = Color.web("rgba(0, 0, 0, -1)");
 513         assertEquals(c5, c6);
 514     }
 515 
 516     @Test
 517     public void testWebRgbPercent() {
 518         Color color = Color.web("rgb(60%, 40%, 100%)");
 519         assertEquals(0.6, color.getRed(), 0.0001);
 520         assertEquals(0.4, color.getGreen(), 0.0001);
 521         assertEquals(1.0, color.getBlue(), 0.0001);
 522         assertEquals(1.0, color.getOpacity(), 0.0001);
 523     }
 524 
 525     @Test
 526     public void testWebRgbPercentFloat() {
 527         Color color = Color.web("rgb(60.0%, 40.0%, 100.0%)");
 528         assertEquals(0.6, color.getRed(), 0.0001);
 529         assertEquals(0.4, color.getGreen(), 0.0001);
 530         assertEquals(1.0, color.getBlue(), 0.0001);
 531         assertEquals(1.0, color.getOpacity(), 0.0001);
 532     }
 533 
 534     @Test
 535     public void testWebRgbPercentRange() {
 536         Color c1 = Color.web("rgb(100%,  0%, 100%)");
 537         Color c2 = Color.web("rgb(101%, -1%, 101%)");
 538         assertEquals(c1, c2);
 539         Color c3 = Color.web("rgb( 0%, 100%,  0%)");
 540         Color c4 = Color.web("rgb(-1%, 101%, -1%)");
 541         assertEquals(c3, c4);
 542     }
 543 
 544     @Test
 545     public void testWebRgbaPercent() {
 546         Color color = Color.web("rgba(60%, 40%, 100%, 0.6)");
 547         assertEquals(0.6, color.getRed(), 0.0001);
 548         assertEquals(0.4, color.getGreen(), 0.0001);
 549         assertEquals(1.0, color.getBlue(), 0.0001);
 550         assertEquals(0.6, color.getOpacity(), 0.0001);
 551     }
 552     
 553     @Test
 554     public void testWebRgbaPercentFloat() {
 555         Color color = Color.web("rgba(60.0%, 40.0%, 100.0%, 0.6)");
 556         assertEquals(0.6, color.getRed(), 0.0001);
 557         assertEquals(0.4, color.getGreen(), 0.0001);
 558         assertEquals(1.0, color.getBlue(), 0.0001);
 559         assertEquals(0.6, color.getOpacity(), 0.0001);
 560     }
 561 
 562     @Test
 563     public void testWebRgbaPercentRange() {
 564         Color c1 = Color.web("rgba(100%,  0%, 100%, 1.0)");
 565         Color c2 = Color.web("rgba(101%, -1%, 101%, 1.1)");
 566         assertEquals(c1, c2);
 567         Color c3 = Color.web("rgba( 0%, 100%,  0%, 1.0)");
 568         Color c4 = Color.web("rgba(-1%, 101%, -1%, 1.1)");
 569         assertEquals(c3, c4);
 570         Color c5 = Color.web("rgba(0%, 0%, 0%, 0.0)");
 571         Color c6 = Color.web("rgba(0%, 0%, 0%, -1)");
 572         assertEquals(c5, c6);
 573     }
 574 
 575     @Test
 576     public void testWebRgbPercentMix() {
 577         Color color = Color.web("rgb(60%, 40.0%, 192)");
 578         assertEquals(0.6, color.getRed(), 0.0001);
 579         assertEquals(0.4, color.getGreen(), 0.0001);
 580         assertEquals(192.0/255.0, color.getBlue(), 0.0001);
 581         assertEquals(1.0, color.getOpacity(), 0.0001);
 582     }
 583 
 584     @Test
 585     public void testWebRgbaPercentMix() {
 586         Color color = Color.web("rgba(60%, 40.0%, 192, 0.6)");
 587         assertEquals(0.6, color.getRed(), 0.0001);
 588         assertEquals(0.4, color.getGreen(), 0.0001);
 589         assertEquals(192.0/255.0, color.getBlue(), 0.0001);
 590         assertEquals(0.6, color.getOpacity(), 0.0001);
 591     }
 592 
 593     @Test
 594     public void testWebHsl() {
 595         Color color = Color.web("hsl(180, 50%, 100%)");
 596         Color ref = Color.hsb(180, 0.5, 1.0);
 597         assertEquals(ref.getRed(),     color.getRed(),     0.0001);
 598         assertEquals(ref.getGreen(),   color.getGreen(),   0.0001);
 599         assertEquals(ref.getBlue(),    color.getBlue(),    0.0001);
 600         assertEquals(ref.getOpacity(), color.getOpacity(), 0.0001);
 601     }
 602 
 603     @Test
 604     public void testWebHslFloat() {
 605         Color color = Color.web("hsl(180.0, 50.0%, 100.0%)");
 606         Color ref = Color.hsb(180, 0.5, 1.0);
 607         assertEquals(ref.getRed(),     color.getRed(),     0.0001);
 608         assertEquals(ref.getGreen(),   color.getGreen(),   0.0001);
 609         assertEquals(ref.getBlue(),    color.getBlue(),    0.0001);
 610         assertEquals(ref.getOpacity(), color.getOpacity(), 0.0001);
 611     }
 612 
 613     @Test
 614     public void testWebHslRange() {
 615         Color c1 = Color.web("hsl( 240,  0%, 100%)");
 616         Color c2 = Color.web("hsl(-120, -1%, 101%)");
 617         assertEquals(c1, c2);
 618         Color c3 = Color.web("hsl(240, 100%,  0%)");
 619         Color c4 = Color.web("hsl(600, 101%, -1%)");
 620         assertEquals(c3, c4);
 621     }
 622 
 623     @Test
 624     public void testWebHsla() {
 625         Color color = Color.web("hsla(180, 50%, 100%, 0.6)");
 626         Color ref = Color.hsb(180, 0.5, 1.0, 0.6);
 627         assertEquals(ref.getRed(),     color.getRed(),     0.0001);
 628         assertEquals(ref.getGreen(),   color.getGreen(),   0.0001);
 629         assertEquals(ref.getBlue(),    color.getBlue(),    0.0001);
 630         assertEquals(ref.getOpacity(), color.getOpacity(), 0.0001);
 631     }
 632 
 633     @Test
 634     public void testWebHslaFloat() {
 635         Color color = Color.web("hsla(180.0, 50.0%, 100.0%, 0.6)");
 636         Color ref = Color.hsb(180, 0.5, 1.0, 0.6);
 637         assertEquals(ref.getRed(),     color.getRed(),     0.0001);
 638         assertEquals(ref.getGreen(),   color.getGreen(),   0.0001);
 639         assertEquals(ref.getBlue(),    color.getBlue(),    0.0001);
 640         assertEquals(ref.getOpacity(), color.getOpacity(), 0.0001);
 641     }
 642 
 643     @Test
 644     public void testWebHslaRange() {
 645         Color c1 = Color.web("hsla( 240,  0%, 100%, 1.0)");
 646         Color c2 = Color.web("hsla(-120, -1%, 101%, 1.1)");
 647         assertEquals(c1, c2);
 648         Color c3 = Color.web("hsla(240, 100%,  0%, 1.0)");
 649         Color c4 = Color.web("hsla(600, 101%, -1%, 1.1)");
 650         assertEquals(c3, c4);
 651         Color c5 = Color.web("hsla(240, 0%, 0%, 0.0)");
 652         Color c6 = Color.web("hsla(240, 0%, 0%, -1)");
 653         assertEquals(c5, c6);
 654     }
 655 
 656     @Test(expected=IllegalArgumentException.class)
 657     public void testWebRgb2Param() {
 658         Color.web("rgb(100, 100)");
 659     }
 660 
 661     @Test(expected=IllegalArgumentException.class)
 662     public void testWebRgb1Param() {
 663         Color.web("rgb(100)");
 664     }
 665 
 666     @Test(expected=IllegalArgumentException.class)
 667     public void testWebRgb0Param() {
 668         Color.web("rgb()");
 669     }
 670 
 671     @Test(expected=IllegalArgumentException.class)
 672     public void testWebRgbNoParen() {
 673         Color.web("rgb 100, 100, 100");
 674     }
 675 
 676     @Test(expected=IllegalArgumentException.class)
 677     public void testWebRgbNoCloseParen() {
 678         Color.web("rgb(100, 100, 100");
 679     }
 680 
 681     @Test(expected=IllegalArgumentException.class)
 682     public void testWebRgba3Param() {
 683         Color.web("rgba(100, 100, 100)");
 684     }
 685 
 686     @Test(expected=IllegalArgumentException.class)
 687     public void testWebRgba2Param() {
 688         Color.web("rgba(100, 100)");
 689     }
 690 
 691     @Test(expected=IllegalArgumentException.class)
 692     public void testWebRgba1Param() {
 693         Color.web("rgba(100)");
 694     }
 695 
 696     @Test(expected=IllegalArgumentException.class)
 697     public void testWebRgba0Param() {
 698         Color.web("rgba()");
 699     }
 700 
 701     @Test(expected=IllegalArgumentException.class)
 702     public void testWebRgbaNoParen() {
 703         Color.web("rgba 100, 100, 100");
 704     }
 705 
 706     @Test(expected=IllegalArgumentException.class)
 707     public void testWebRgbaNoCloseParen() {
 708         Color.web("rgba(100, 100, 100, 0.5");
 709     }
 710 
 711     @Test(expected=IllegalArgumentException.class)
 712     public void testWebHsl2Param() {
 713         Color.web("hsl(240, 50%)");
 714     }
 715 
 716     @Test(expected=IllegalArgumentException.class)
 717     public void testWebHsl1Param() {
 718         Color.web("hsl(240)");
 719     }
 720 
 721     @Test(expected=IllegalArgumentException.class)
 722     public void testWebHsl0Param() {
 723         Color.web("hsl()");
 724     }
 725 
 726     @Test(expected=IllegalArgumentException.class)
 727     public void testWebHslNoParen() {
 728         Color.web("hsl 240, 50%, 50%");
 729     }
 730 
 731     @Test(expected=IllegalArgumentException.class)
 732     public void testWebHslNoCloseParen() {
 733         Color.web("hsl(240, 50%, 50%");
 734     }
 735 
 736     @Test(expected=IllegalArgumentException.class)
 737     public void testWebHsla3Param() {
 738         Color.web("hsla(240, 50%, 50%)");
 739     }
 740 
 741     @Test(expected=IllegalArgumentException.class)
 742     public void testWebHsla2Param() {
 743         Color.web("hsla(240, 50%)");
 744     }
 745 
 746     @Test(expected=IllegalArgumentException.class)
 747     public void testWebHsla1Param() {
 748         Color.web("hsla(240)");
 749     }
 750 
 751     @Test(expected=IllegalArgumentException.class)
 752     public void testWebHsla0Param() {
 753         Color.web("hsla()");
 754     }
 755 
 756     @Test(expected=IllegalArgumentException.class)
 757     public void testWebHslaNoParen() {
 758         Color.web("hsla 240, 50%, 50%, 0.5");
 759     }
 760 
 761     @Test(expected=IllegalArgumentException.class)
 762     public void testWebHslaNoCloseParen() {
 763         Color.web("hsla(240, 50%, 50%, 0.5");
 764     }
 765 
 766     @Test
 767     public void testDeriveColor() {
 768         Color original = Color.hsb(180, 0.4, 0.8, 0.5);
 769         Color color = original.deriveColor(-90, 2, 0.5, 2);
 770         assertEquals(90, color.getHue(), 0.0001);
 771         assertEquals(0.8, color.getSaturation(), 0.0001);
 772         assertEquals(0.4, color.getBrightness(), 0.0001);
 773         assertEquals(1.0, color.getOpacity(), 0.0001);
 774     }
 775 
 776     @Test
 777     public void testDeriveColorFromRgb() {
 778         Color original = Color.rgb(128, 0, 255);
 779         double[] hsb = Utils.RGBtoHSB(128.0/255.0, 0.0, 1.0);
 780         Color color = original.deriveColor(-30, 0.5, 0.5, 0.5);
 781         assertEquals((hsb[0] - 30), color.getHue(), 0.0001);
 782         assertEquals(hsb[1] / 2, color.getSaturation(), 0.0001);
 783         assertEquals(hsb[2] / 2, color.getBrightness(), 0.0001);
 784         assertEquals(0.5, color.getOpacity(), 0.0001);
 785     }
 786 
 787     @Test
 788     public void testDeriveColorClipS() {
 789         Color original = Color.hsb(180, 0.4, 0.8, 0.5);
 790         Color color = original.deriveColor(-1170, -5, 20, -5);
 791         assertEquals(0, color.getHue(), 0.0001);
 792         assertEquals(0.0, color.getSaturation(), 0.0001);
 793         assertEquals(1.0, color.getBrightness(), 0.0001);
 794         assertEquals(0.0, color.getOpacity(), 0.0001);
 795     }
 796 
 797     @Test
 798     public void testDeriveColorClipHB() {
 799         Color original = Color.hsb(180, 0.4, 0.8, 0.5);
 800         Color color = original.deriveColor(-1170, 1.0, 20, -5);
 801         assertEquals(90, color.getHue(), 0.0001);
 802         assertEquals(0.4, color.getSaturation(), 0.0001);
 803         assertEquals(1.0, color.getBrightness(), 0.0001);
 804         assertEquals(0.0, color.getOpacity(), 0.0001);
 805     }
 806 
 807     @Test
 808     public void testDarker() {
 809         Color original = Color.hsb(180, 0.4, 0.8, 0.5);
 810         Color color = original.darker();
 811         assertEquals(180, color.getHue(), 0.0001);
 812         assertEquals(0.4, color.getSaturation(), 0.0001);
 813         assertEquals(0.56, color.getBrightness(), 0.0001);
 814         assertEquals(0.5, color.getOpacity(), 0.0001);
 815     }
 816 
 817     @Test
 818     public void testBrighter() {
 819         Color original = Color.hsb(180, 0.4, 0.4, 0.5);
 820         Color color = original.brighter();
 821         assertEquals(180, color.getHue(), 0.0001);
 822         assertEquals(0.4, color.getSaturation(), 0.0001);
 823         assertEquals(0.5714, color.getBrightness(), 0.0001);
 824         assertEquals(0.5, color.getOpacity(), 0.0001);
 825     }
 826 
 827     @Test
 828     public void testBlackBrighter() {
 829         Color color = Color.BLACK.brighter();
 830         assertTrue(color.getBrightness() > 0.0);
 831         assertEquals(color.getRed(), color.getGreen(), 0.0001);
 832         assertEquals(color.getRed(), color.getBlue(), 0.0001);
 833     }
 834 
 835     @Test
 836     public void testSaturate() {
 837         Color original = Color.hsb(180, 0.4, 0.4, 0.5);
 838         Color color = original.saturate();
 839         assertEquals(180, color.getHue(), 0.0001);
 840         assertEquals(0.5714, color.getSaturation(), 0.0001);
 841         assertEquals(0.4, color.getBrightness(), 0.0001);
 842         assertEquals(0.5, color.getOpacity(), 0.0001);
 843     }
 844 
 845     @Test
 846     public void testDesaturate() {
 847         Color original = Color.hsb(180, 0.8, 0.4, 0.5);
 848         Color color = original.desaturate();
 849         assertEquals(180, color.getHue(), 0.0001);
 850         assertEquals(0.56, color.getSaturation(), 0.0001);
 851         assertEquals(0.4, color.getBrightness(), 0.0001);
 852         assertEquals(0.5, color.getOpacity(), 0.0001);
 853     }
 854 
 855     @Test
 856     public void testInvert() {
 857         Color original = Color.color(0.2, 0.3, 0.4, 0.6);
 858         Color color = original.invert();
 859         assertEquals(0.8, color.getRed(), 0.0001);
 860         assertEquals(0.7, color.getGreen(), 0.0001);
 861         assertEquals(0.6, color.getBlue(), 0.0001);
 862         assertEquals(0.6, color.getOpacity(), 0.0001);
 863     }
 864 
 865     @Test
 866     public void testGreyscale() {
 867         Color original = Color.color(0.2, 0.3, 0.4, 0.6);
 868         Color color = original.grayscale();
 869         assertEquals(0.283, color.getRed(), 0.0001);
 870         assertEquals(0.283, color.getGreen(), 0.0001);
 871         assertEquals(0.283, color.getBlue(), 0.0001);
 872         assertEquals(0.6, color.getOpacity(), 0.0001);
 873     }
 874 
 875     @Test
 876     public void testEquals() {
 877         Color basic = Color.rgb(0, 0, 0, 0.5);
 878         Color equal = Color.rgb(0, 0, 0, 0.5);
 879         Color color1 = Color.rgb(0xAA, 0, 0, 0.5);
 880         Color color2 = Color.rgb(0, 0xAA, 0, 0.5);
 881         Color color3 = Color.rgb(0, 0, 0xAA, 0.5);
 882         Color color4 = Color.rgb(0, 0, 0, 0.6);
 883 
 884         assertFalse(basic.equals(null));
 885         assertFalse(basic.equals(new Object()));
 886         assertTrue(basic.equals(basic));
 887         assertTrue(basic.equals(equal));
 888         assertFalse(basic.equals(color1));
 889         assertFalse(basic.equals(color2));
 890         assertFalse(basic.equals(color3));
 891         assertFalse(basic.equals(color4));
 892     }
 893 
 894     @Test
 895     public void testHashCode() {
 896         Color basic = Color.rgb(0, 0, 0, 0.5);
 897         Color equal = Color.rgb(0, 0, 0, 0.5);
 898         Color diffColor = Color.rgb(0, 0xAA, 0, 0.5);
 899         Color diffOpacity = Color.rgb(0, 0, 0, 0.7);
 900         Color transparent = Color.rgb(0, 0, 0, 0.0);
 901 
 902         int code = basic.hashCode();
 903         int second = basic.hashCode();
 904         assertTrue(code == second);
 905         assertTrue(code == equal.hashCode());
 906         assertFalse(code == diffColor.hashCode());
 907         assertFalse(code == diffOpacity.hashCode());
 908         assertEquals(0, Color.TRANSPARENT.hashCode());
 909         assertEquals(0, transparent.hashCode());
 910     }
 911 
 912     @Test
 913     public void testToString() {
 914         Color color = Color.rgb(0, 0, 0, 0.0);
 915 
 916         String s = color.toString();
 917         assertNotNull(s);
 918         assertFalse(s.isEmpty());
 919     }
 920 
 921     @Test
 922     public void testToStringEquals() {
 923         Color color = Color.web("#aabbcc");
 924         assertEquals(color, Color.valueOf(color.toString()));
 925         color = Color.web("#abc");
 926         assertEquals(color, Color.valueOf(color.toString()));
 927         color = Color.web("#aabbcc80", 0.5);
 928         assertEquals(color, Color.valueOf(color.toString()));
 929         color = Color.web("0xaabbcc");
 930         assertEquals(color, Color.valueOf(color.toString()));
 931         color = Color.web("0xaabbcc80");
 932         assertEquals(color, Color.valueOf(color.toString()));
 933         color = Color.web("orangered");
 934         assertEquals(color, Color.valueOf(color.toString()));
 935         color = Color.web("orangered", 0.4);
 936         assertEquals(color, Color.valueOf(color.toString()));
 937         color = Color.web("oRAngEReD");
 938         assertEquals(color, Color.valueOf(color.toString()));
 939         color = Color.web("0xaabbcc");
 940         assertEquals(color, Color.valueOf(color.toString()));
 941         color = Color.web("0xabc");
 942         assertEquals(color, Color.valueOf(color.toString()));
 943         color = Color.web("aAbBcC");
 944         assertEquals(color, Color.valueOf(color.toString()));
 945         color = Color.web("aBc");
 946         assertEquals(color, Color.valueOf(color.toString()));
 947         color = Color.web("aBc9");
 948         assertEquals(color, Color.valueOf(color.toString()));
 949     }
 950 
 951     //function testOfTheWayHandlesNegatives() {
 952         // TODO should this be tested? What does it mean?
 953     //}
 954     
 955     //function testOfTheWayHandlesLargeNumbers() {
 956         // TODO What should happen for numbers > 1?
 957     //}
 958 }