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}