001/** 002 * Copyright (c) 2008-2014 Ardor Labs, Inc. 003 * 004 * This file is part of Ardor3D. 005 * 006 * Ardor3D is free software: you can redistribute it and/or modify it 007 * under the terms of its license which may be found in the accompanying 008 * LICENSE file or at <http://www.ardor3d.com/LICENSE>. 009 */ 010 011package com.ardor3d.math; 012 013import static org.junit.Assert.*; 014 015import org.junit.Test; 016 017public class TestColorRGBA { 018 019 @Test 020 public void test() { 021 final ColorRGBA clr1 = new ColorRGBA(); 022 assertTrue(1f == clr1.getRed()); 023 assertTrue(1f == clr1.getGreen()); 024 assertTrue(1f == clr1.getBlue()); 025 assertTrue(1f == clr1.getAlpha()); 026 } 027 028 @Test 029 public void testGetSet() { 030 final ColorRGBA clr1 = new ColorRGBA(); 031 clr1.setRed(0f); 032 assertTrue(clr1.getRed() == 0.0f); 033 clr1.setRed(Float.POSITIVE_INFINITY); 034 assertTrue(clr1.getRed() == Float.POSITIVE_INFINITY); 035 clr1.setRed(Float.NEGATIVE_INFINITY); 036 assertTrue(clr1.getRed() == Float.NEGATIVE_INFINITY); 037 assertTrue(clr1.getValue(0) == Float.NEGATIVE_INFINITY); 038 039 clr1.setGreen(0); 040 assertTrue(clr1.getGreen() == 0.0); 041 clr1.setGreen(Float.POSITIVE_INFINITY); 042 assertTrue(clr1.getGreen() == Float.POSITIVE_INFINITY); 043 clr1.setGreen(Float.NEGATIVE_INFINITY); 044 assertTrue(clr1.getGreen() == Float.NEGATIVE_INFINITY); 045 assertTrue(clr1.getValue(1) == Float.NEGATIVE_INFINITY); 046 047 clr1.setBlue(0); 048 assertTrue(clr1.getBlue() == 0.0); 049 clr1.setBlue(Float.POSITIVE_INFINITY); 050 assertTrue(clr1.getBlue() == Float.POSITIVE_INFINITY); 051 clr1.setBlue(Float.NEGATIVE_INFINITY); 052 assertTrue(clr1.getBlue() == Float.NEGATIVE_INFINITY); 053 assertTrue(clr1.getValue(2) == Float.NEGATIVE_INFINITY); 054 055 clr1.setAlpha(0); 056 assertTrue(clr1.getAlpha() == 0.0); 057 clr1.setAlpha(Float.POSITIVE_INFINITY); 058 assertTrue(clr1.getAlpha() == Float.POSITIVE_INFINITY); 059 clr1.setAlpha(Float.NEGATIVE_INFINITY); 060 assertTrue(clr1.getAlpha() == Float.NEGATIVE_INFINITY); 061 assertTrue(clr1.getValue(3) == Float.NEGATIVE_INFINITY); 062 063 clr1.set((float) Math.PI, (float) Math.PI, (float) Math.PI, (float) Math.PI); 064 assertTrue(clr1.getRed() == (float) Math.PI); 065 assertTrue(clr1.getGreen() == (float) Math.PI); 066 assertTrue(clr1.getBlue() == (float) Math.PI); 067 assertTrue(clr1.getAlpha() == (float) Math.PI); 068 069 final ColorRGBA clr2 = new ColorRGBA(ColorRGBA.BLACK); 070 clr2.set(clr1); 071 assertEquals(clr1, clr2); 072 073 clr1.setValue(0, 1); 074 clr1.setValue(1, 1); 075 clr1.setValue(2, 1); 076 clr1.setValue(3, 1); 077 assertEquals(ColorRGBA.WHITE, clr1); 078 079 clr1.zero(); 080 assertEquals(ColorRGBA.BLACK_NO_ALPHA, clr1); 081 082 // catch a few expected exceptions 083 try { 084 clr2.getValue(4); 085 fail("getValue(4) should have thrown IllegalArgumentException."); 086 } catch (final IllegalArgumentException e) { 087 } 088 try { 089 clr2.getValue(-1); 090 fail("getValue(-1) should have thrown IllegalArgumentException."); 091 } catch (final IllegalArgumentException e) { 092 } 093 try { 094 clr2.setValue(-1, 0); 095 fail("setValue(-1, 0) should have thrown IllegalArgumentException."); 096 } catch (final IllegalArgumentException e) { 097 } 098 try { 099 clr2.setValue(4, 0); 100 fail("setValue(4, 0) should have thrown IllegalArgumentException."); 101 } catch (final IllegalArgumentException e) { 102 } 103 // above exceptions shouldn't have altered vec2 104 assertEquals(new ColorRGBA((float) Math.PI, (float) Math.PI, (float) Math.PI, (float) Math.PI), clr2); 105 } 106 107 @Test 108 public void testToArray() { 109 final ColorRGBA clr1 = new ColorRGBA(ColorRGBA.DARK_GRAY); 110 111 final float[] farray = clr1.toArray(null); 112 final float[] farray2 = clr1.toArray(new float[4]); 113 assertNotNull(farray); 114 assertNotNull(farray2); 115 assertTrue(farray.length == 4); 116 assertTrue(farray[0] == .2f); 117 assertTrue(farray[1] == .2f); 118 assertTrue(farray[2] == .2f); 119 assertTrue(farray[3] == 1f); 120 121 try { 122 clr1.toArray(new float[1]); 123 fail("toFloatArray(d[1]) should have thrown ArrayIndexOutOfBoundsException."); 124 } catch (final ArrayIndexOutOfBoundsException e) { 125 } 126 } 127 128 @Test 129 public void testClamp() { 130 final ColorRGBA clr1 = new ColorRGBA(-1, -1, -1, -1); 131 final ColorRGBA clr2 = clr1.clamp(new ColorRGBA()); 132 final ColorRGBA clr3 = clr1.clamp(null); 133 assertNotNull(clr2); 134 assertNotNull(clr3); 135 assertTrue(clr2.getRed() == 0); 136 assertTrue(clr2.getGreen() == 0); 137 assertTrue(clr2.getBlue() == 0); 138 assertTrue(clr2.getAlpha() == 0); 139 140 clr1.set(2, .5f, 1, 0); 141 clr1.clamp(clr2); 142 assertTrue(clr2.getRed() == 1); 143 assertTrue(clr2.getGreen() == .5f); 144 assertTrue(clr2.getBlue() == 1); 145 assertTrue(clr2.getAlpha() == 0); 146 147 clr1.set(2, 2, 2, 2); 148 clr1.clampLocal(); 149 assertTrue(clr1.getRed() == 1); 150 assertTrue(clr1.getGreen() == 1); 151 assertTrue(clr1.getBlue() == 1); 152 assertTrue(clr1.getAlpha() == 1); 153 154 clr1.set(0.5f, 0.5f, 0.5f, 0.5f); 155 assertEquals(clr1, clr1.clamp(null)); 156 } 157 158 @Test 159 public void testRandomColor() { 160 final ColorRGBA clr1 = new ColorRGBA(0, 0, 0, 0); 161 MathUtils.setRandomSeed(0); 162 ColorRGBA.randomColor(clr1); 163 assertEquals(new ColorRGBA(0.73096776f, 0.831441f, 0.24053639f, 1.0f), clr1); 164 final ColorRGBA clr2 = ColorRGBA.randomColor(null); 165 assertEquals(new ColorRGBA(0.6063452f, 0.6374174f, 0.30905056f, 1.0f), clr2); 166 } 167 168 @Test 169 public void testIntColor() { 170 assertTrue(ColorRGBA.BLACK.asIntARGB() == -16777216); 171 assertTrue(ColorRGBA.BLACK.asIntRGBA() == 255); 172 assertTrue(ColorRGBA.RED.asIntARGB() == -65536); 173 assertTrue(ColorRGBA.RED.asIntRGBA() == -16776961); 174 175 assertEquals(ColorRGBA.BLACK, new ColorRGBA().fromIntARGB(-16777216)); 176 assertEquals(ColorRGBA.BLACK, new ColorRGBA().fromIntRGBA(255)); 177 assertEquals(ColorRGBA.RED, new ColorRGBA().fromIntARGB(-65536)); 178 assertEquals(ColorRGBA.RED, new ColorRGBA().fromIntRGBA(-16776961)); 179 } 180 181 @Test 182 public void testHexColor() { 183 assertEquals("#00000000", ColorRGBA.BLACK_NO_ALPHA.asHexRRGGBBAA()); 184 assertEquals("#412819ff", ColorRGBA.BROWN.asHexRRGGBBAA()); 185 assertEquals("#fb8200ff", ColorRGBA.ORANGE.asHexRRGGBBAA()); 186 187 assertEquals(ColorRGBA.BROWN, ColorRGBA.parseColor("#412819ff", new ColorRGBA())); 188 assertEquals(ColorRGBA.BLACK_NO_ALPHA, ColorRGBA.parseColor("#00", null)); 189 assertEquals(ColorRGBA.WHITE, ColorRGBA.parseColor("#F", null)); 190 assertEquals(ColorRGBA.BLACK, ColorRGBA.parseColor("#0F", null)); 191 assertEquals(ColorRGBA.BLUE, ColorRGBA.parseColor("#00F", null)); 192 assertEquals(ColorRGBA.YELLOW, ColorRGBA.parseColor("#FF0F", null)); 193 assertEquals(ColorRGBA.MAGENTA, ColorRGBA.parseColor("#FF00FF", null)); 194 assertEquals(ColorRGBA.CYAN, ColorRGBA.parseColor("#00FFFFFF", null)); 195 } 196 197 @Test(expected = IllegalArgumentException.class) 198 public void testHexFail1() { 199 ColorRGBA.parseColor("000", null); 200 } 201 202 @Test(expected = IllegalArgumentException.class) 203 public void testHexFail2() { 204 ColorRGBA.parseColor("#000000000000000000000", null); 205 } 206 207 @Test 208 public void testClone() { 209 final ColorRGBA clr1 = new ColorRGBA(); 210 final ColorRGBA clr2 = clr1.clone(); 211 assertEquals(clr1, clr2); 212 assertNotSame(clr1, clr2); 213 } 214 215 @Test 216 public void testSimpleHash() { 217 // Just a simple sanity check. 218 final ColorRGBA clr1 = new ColorRGBA(1, 0, 0, 1); 219 final ColorRGBA clr2 = new ColorRGBA(1, 0, 0, 1); 220 final ColorRGBA clr3 = new ColorRGBA(1, 1, 1, 1); 221 222 assertTrue(clr1.hashCode() == clr2.hashCode()); 223 assertTrue(clr1.hashCode() != clr3.hashCode()); 224 } 225 226 @Test 227 public void testAdd() { 228 final ColorRGBA clr1 = new ColorRGBA(ColorRGBA.BLACK_NO_ALPHA); 229 final ColorRGBA clr2 = new ColorRGBA(ColorRGBA.WHITE); 230 231 clr1.addLocal(1, 2, 3, 4); 232 assertEquals(new ColorRGBA(1, 2, 3, 4), clr1); 233 clr1.addLocal(-1, -2, -3, -4); 234 assertEquals(ColorRGBA.BLACK_NO_ALPHA, clr1); 235 236 clr1.zero(); 237 clr1.addLocal(clr2); 238 assertEquals(ColorRGBA.WHITE, clr1); 239 240 clr1.zero(); 241 final ColorRGBA clr3 = clr1.add(clr2, new ColorRGBA()); 242 assertEquals(ColorRGBA.BLACK_NO_ALPHA, clr1); 243 assertEquals(ColorRGBA.WHITE, clr3); 244 245 final ColorRGBA clr4 = clr1.add(0, 0, 0, 1, null); 246 assertEquals(ColorRGBA.BLACK_NO_ALPHA, clr1); 247 assertEquals(ColorRGBA.BLACK, clr4); 248 } 249 250 @Test 251 public void testSubtract() { 252 final ColorRGBA clr1 = new ColorRGBA(ColorRGBA.BLACK_NO_ALPHA); 253 final ColorRGBA clr2 = new ColorRGBA(ColorRGBA.WHITE); 254 255 clr1.subtractLocal(1, 2, 3, 4); 256 assertEquals(new ColorRGBA(-1, -2, -3, -4), clr1); 257 clr1.subtractLocal(-1, -2, -3, -4); 258 assertEquals(ColorRGBA.BLACK_NO_ALPHA, clr1); 259 260 clr1.zero(); 261 clr1.subtractLocal(clr2); 262 assertEquals(new ColorRGBA(-1, -1, -1, -1), clr1); 263 264 clr1.zero(); 265 final ColorRGBA clr3 = clr1.subtract(clr2, new ColorRGBA()); 266 assertEquals(ColorRGBA.BLACK_NO_ALPHA, clr1); 267 assertEquals(new ColorRGBA(-1, -1, -1, -1), clr3); 268 269 final ColorRGBA clr4 = clr1.subtract(0, 0, 0, 1, null); 270 assertEquals(ColorRGBA.BLACK_NO_ALPHA, clr1); 271 assertEquals(new ColorRGBA(0, 0, 0, -1), clr4); 272 } 273 274 @Test 275 public void testMultiply() { 276 final ColorRGBA clr1 = new ColorRGBA(1, -1, 2, -2); 277 final ColorRGBA clr2 = clr1.multiply(2.0f, null); 278 final ColorRGBA clr2B = clr1.multiply(2.0f, new ColorRGBA()); 279 assertEquals(new ColorRGBA(2.0f, -2.0f, 4.0f, -4.0f), clr2); 280 assertEquals(new ColorRGBA(2.0f, -2.0f, 4.0f, -4.0f), clr2B); 281 282 clr2.multiplyLocal(0.5f); 283 assertEquals(new ColorRGBA(1.0f, -1.0f, 2.0f, -2.0f), clr2); 284 285 final ColorRGBA clr3 = clr1.multiply(clr2, null); 286 final ColorRGBA clr3B = clr1.multiply(clr2, new ColorRGBA()); 287 assertEquals(new ColorRGBA(1, 1, 4, 4), clr3); 288 assertEquals(new ColorRGBA(1, 1, 4, 4), clr3B); 289 290 clr1.multiplyLocal(clr2); 291 assertEquals(new ColorRGBA(1, 1, 4, 4), clr1); 292 } 293 294 @Test 295 public void testDivide() { 296 final ColorRGBA clr1 = new ColorRGBA(1, -1, 2, -2); 297 final ColorRGBA clr2 = clr1.divide(2.0f, null); 298 final ColorRGBA clr2B = clr1.divide(2.0f, new ColorRGBA()); 299 assertEquals(new ColorRGBA(0.5f, -0.5f, 1.0f, -1.0f), clr2); 300 assertEquals(new ColorRGBA(0.5f, -0.5f, 1.0f, -1.0f), clr2B); 301 302 clr2.divideLocal(0.5f); 303 assertEquals(new ColorRGBA(1.0f, -1.0f, 2.0f, -2.0f), clr2); 304 305 final ColorRGBA clr3 = clr1.divide(clr2, null); 306 final ColorRGBA clr3B = clr1.divide(clr2, new ColorRGBA()); 307 assertEquals(ColorRGBA.WHITE, clr3); 308 assertEquals(ColorRGBA.WHITE, clr3B); 309 310 clr1.divideLocal(clr2); 311 assertEquals(ColorRGBA.WHITE, clr1); 312 } 313 314 @Test 315 public void testLerp() { 316 final ColorRGBA clr1 = new ColorRGBA(8, 3, -2, 2); 317 final ColorRGBA clr2 = new ColorRGBA(2, 1, 0, -2); 318 assertEquals(new ColorRGBA(5, 2, -1, 0), clr1.lerp(clr2, 0.5f, null)); 319 assertEquals(new ColorRGBA(5, 2, -1, 0), clr1.lerp(clr2, 0.5f, new ColorRGBA())); 320 assertEquals(new ColorRGBA(5, 2, -1, 0), ColorRGBA.lerp(clr1, clr2, 0.5f, null)); 321 assertEquals(new ColorRGBA(5, 2, -1, 0), ColorRGBA.lerp(clr1, clr2, 0.5f, new ColorRGBA())); 322 323 clr1.set(14, 5, 4, 2); 324 clr1.lerpLocal(clr2, 0.25f); 325 assertEquals(new ColorRGBA(11, 4, 3, 1), clr1); 326 327 clr1.set(15, 7, 6, 8); 328 final ColorRGBA clr3 = new ColorRGBA(-1, -1, -1, -1); 329 clr3.lerpLocal(clr1, clr2, 0.5f); 330 assertEquals(new ColorRGBA(8.5f, 4.0f, 3.0f, 3.0f), clr3); 331 332 // coverage 333 assertEquals(clr1.lerp(clr1, .25f, null), clr1); 334 assertEquals(clr2.lerpLocal(clr2, .25f), clr2); 335 assertEquals(clr2.lerpLocal(clr2, clr2, .25f), clr2); 336 assertEquals(ColorRGBA.lerp(clr1, clr1, .25f, null), clr1); 337 } 338 339 @Test 340 public void testValid() { 341 final ColorRGBA clr1 = new ColorRGBA(0, 0, 0, 0); 342 final ColorRGBA clr2A = new ColorRGBA(Float.POSITIVE_INFINITY, 0, 0, 0); 343 final ColorRGBA clr2B = new ColorRGBA(0, Float.NEGATIVE_INFINITY, 0, 0); 344 final ColorRGBA clr2C = new ColorRGBA(0, 0, Float.POSITIVE_INFINITY, 0); 345 final ColorRGBA clr2D = new ColorRGBA(0, 0, 0, Float.POSITIVE_INFINITY); 346 final ColorRGBA clr3A = new ColorRGBA(Float.NaN, 0, 0, 0); 347 final ColorRGBA clr3B = new ColorRGBA(0, Float.NaN, 0, 0); 348 final ColorRGBA clr3C = new ColorRGBA(0, 0, Float.NaN, 0); 349 final ColorRGBA clr3D = new ColorRGBA(0, 0, 0, Float.NaN); 350 351 assertTrue(ColorRGBA.isValid(clr1)); 352 assertFalse(ColorRGBA.isValid(clr2A)); 353 assertFalse(ColorRGBA.isValid(clr2B)); 354 assertFalse(ColorRGBA.isValid(clr2C)); 355 assertFalse(ColorRGBA.isValid(clr2D)); 356 assertFalse(ColorRGBA.isValid(clr3A)); 357 assertFalse(ColorRGBA.isValid(clr3B)); 358 assertFalse(ColorRGBA.isValid(clr3C)); 359 assertFalse(ColorRGBA.isValid(clr3D)); 360 361 clr3C.zero(); 362 assertTrue(ColorRGBA.isValid(clr3C)); 363 364 assertFalse(ColorRGBA.isValid(null)); 365 366 // couple of equals validity tests 367 assertEquals(clr1, clr1); 368 assertFalse(clr1.equals(null)); 369 assertFalse(clr1.equals(new Vector2())); 370 371 // throw in a couple pool accesses for coverage 372 final ColorRGBA clr6 = ColorRGBA.fetchTempInstance(); 373 clr6.set(clr1); 374 assertEquals(clr1, clr6); 375 assertNotSame(clr1, clr6); 376 ColorRGBA.releaseTempInstance(clr6); 377 378 // cover more of equals 379 clr1.set(0, 1, 2, 3); 380 assertFalse(clr1.equals(new ColorRGBA(4, 4, 4, 4))); 381 assertFalse(clr1.equals(new ColorRGBA(0, 4, 4, 4))); 382 assertFalse(clr1.equals(new ColorRGBA(0, 1, 4, 4))); 383 assertFalse(clr1.equals(new ColorRGBA(0, 1, 2, 4))); 384 assertTrue(clr1.equals(new ColorRGBA(0, 1, 2, 3))); 385 } 386 387}