/*******************************************************************************
 * Copyright (c) 2015, 2016 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Red Hat Inc. - Bug 462631
 *******************************************************************************/
package org.eclipse.swt.tests.junit;

import static org.junit.Assert.fail;

import org.eclipse.swt.graphics.RGBA;
import org.junit.Test;

/**
 * Automated Test Suite for class org.eclipse.swt.graphics.RGBA
 *
 * @see org.eclipse.swt.graphics.RGBA
 */
public class Test_org_eclipse_swt_graphics_RGBA {

@Test
public void test_ConstructorIIII() {
	// Test RGBA(int red, int green, int blue, int alpha)
	new RGBA(20,100,200,255);

	new RGBA(0,0,0,0);



	try {
		new RGBA(-1, 20, 50, 255);
		fail("No exception thrown for red < 0");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(256, 20, 50, 255);
		fail("No exception thrown for red > 255");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(20, -1, 50, 0);
		fail("No exception thrown for green < 0");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(20, 256, 50, 0);
		fail("No exception thrown for green > 255");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(20, 50, -1, 0);
		fail("No exception thrown for blue < 0");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(20, 50, 256, 0);
		fail("No exception thrown for blue > 255");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(20, 50, 10, -1);
		fail("No exception thrown for alpha < 0");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(20, 50, 10, 256);
		fail("No exception thrown for alpha > 255");
	}
	catch (IllegalArgumentException e) {
	}
}

@Test
public void test_ConstructorFFFF() {

	new RGBA(0f,0f,0f,0f);

	new RGBA(0f,1f,0f,0f);
	new RGBA(0f,0f,1f,1f);
	new RGBA(0f,0.6f,0.4f,0.8f);
	new RGBA(1f,0f,1f,1f);
	new RGBA(1f,1f,1f,1f);
	new RGBA(1f,0f,1f,0f);
	new RGBA(1f,1f,0f,1f);
	new RGBA(1f,0.6f,0.4f,0.8f);
	new RGBA(59f,0f,1f,1f);
	new RGBA(59f,1f,1f,1f);
	new RGBA(59f,0f,1f,1f);
	new RGBA(59f,1f,0f,1f);
	new RGBA(59f,0.6f,0.4f,0.8f);
	new RGBA(60f,0f,1f,1f);
	new RGBA(60f,1f,1f,1f);
	new RGBA(60f,0f,1f,1f);
	new RGBA(60f,1f,0f,1f);
	new RGBA(60f,0.6f,0.4f,0.8f);
	new RGBA(61f,0f,1f,1f);
	new RGBA(61f,1f,1f,1f);
	new RGBA(61f,0f,1f,1f);
	new RGBA(61f,1f,0f,1f);
	new RGBA(61f,0.6f,0.4f,0.8f);
	new RGBA(119f,0f,1f,1f);
	new RGBA(119f,1f,1f,1f);
	new RGBA(119f,0f,1f,1f);
	new RGBA(119f,1f,0f,0f);
	new RGBA(119f,0.6f,0.4f,0.8f);
	new RGBA(120f,0f,1f,1f);
	new RGBA(120f,1f,1f,1f);
	new RGBA(120f,0f,1f,1f);
	new RGBA(120f,1f,0f,0f);
	new RGBA(120f,0.6f,0.4f,0.8f);
	new RGBA(121f,0f,1f,1f);
	new RGBA(121f,1f,1f,1f);
	new RGBA(121f,0f,1f,1f);
	new RGBA(121f,1f,0f,0f);
	new RGBA(121f,0.6f,0.4f,0.8f);
	new RGBA(179f,0f,1f,1f);
	new RGBA(179f,1f,1f,1f);
	new RGBA(179f,0f,1f,1f);
	new RGBA(179f,1f,0f,0f);
	new RGBA(179f,0.6f,0.4f,0.8f);
	new RGBA(180f,0f,1f,1f);
	new RGBA(180f,1f,1f,1f);
	new RGBA(180f,0f,1f,1f);
	new RGBA(180f,1f,0f,0f);
	new RGBA(180f,0.6f,0.4f,0.8f);
	new RGBA(181f,0f,1f,1f);
	new RGBA(181f,1f,1f,1f);
	new RGBA(181f,0f,1f,1f);
	new RGBA(181f,1f,0f,0f);
	new RGBA(181f,0.6f,0.4f,0.8f);
	new RGBA(239f,0f,1f,1f);
	new RGBA(239f,1f,1f,1f);
	new RGBA(239f,0f,1f,1f);
	new RGBA(239f,1f,0f,0f);
	new RGBA(239f,0.6f,0.4f,0.8f);
	new RGBA(240f,0f,1f,1f);
	new RGBA(240f,1f,1f,1f);
	new RGBA(240f,0f,1f,1f);
	new RGBA(240f,1f,0f,0f);
	new RGBA(240f,0.6f,0.4f,0.8f);
	new RGBA(241f,0f,1f,1f);
	new RGBA(241f,1f,1f,1f);
	new RGBA(241f,0f,1f,1f);
	new RGBA(241f,1f,0f,0f);
	new RGBA(241f,0.6f,0.4f,0.8f);
	new RGBA(299f,0f,1f,1f);
	new RGBA(299f,1f,1f,1f);
	new RGBA(299f,0f,1f,1f);
	new RGBA(299f,1f,0f,0f);
	new RGBA(299f,0.6f,0.4f,0.8f);
	new RGBA(300f,0f,1f,1f);
	new RGBA(300f,1f,1f,1f);
	new RGBA(300f,0f,1f,1f);
	new RGBA(300f,1f,0f,0f);
	new RGBA(300f,0.6f,0.4f,0.8f);
	new RGBA(301f,0f,1f,1f);
	new RGBA(301f,1f,1f,1f);
	new RGBA(301f,0f,1f,1f);
	new RGBA(301f,1f,0f,0f);
	new RGBA(301f,0.6f,0.4f,0.8f);
	new RGBA(359f,0f,1f,1f);
	new RGBA(359f,1f,1f,1f);
	new RGBA(359f,0f,1f,1f);
	new RGBA(359f,1f,0f,0f);
	new RGBA(359f,0.6f,0.4f,0.8f);
	new RGBA(360f,0f,1f,1f);
	new RGBA(360f,1f,1f,1f);
	new RGBA(360f,0f,1f,1f);
	new RGBA(360f,1f,0f,0f);
	new RGBA(360f,0.6f,0.4f,0.8f);

	try {
		new RGBA(400f, 0.5f, 0.5f, 0.8f);
		fail("No exception thrown for hue > 360");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(-5f, 0.5f, 0.5f, 0.8f);
		fail("No exception thrown for hue < 0");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(200f, -0.5f, 0.5f, 0.8f);
		fail("No exception thrown for saturation < 0");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(200f, 300f, 0.5f, 0.8f);
		fail("No exception thrown for saturation > 1");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(200f, 0.5f, -0.5f, 0.8f);
		fail("No exception thrown for brightness < 0");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(200f, 0.5f, 400f, 0.8f);
		fail("No exception thrown for brightness > 1");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(200f, 0.5f, 0.5f, -0.5f);
		fail("No exception thrown for alpha < 0");
	}
	catch (IllegalArgumentException e) {
	}

	try {
		new RGBA(200f, 0.5f, 0.5f, 400f);
		fail("No exception thrown for alpha > 1");
	}
	catch (IllegalArgumentException e) {
	}
}

@Test
public void test_equalsLjava_lang_Object() {
	int r = 0, g = 127, b = 254, a = 254;
	RGBA rgba1 = new RGBA(r, g, b, a);
	RGBA rgba2;

	rgba2 = rgba1;
	if (!rgba1.equals(rgba2)) {
		fail("Two references to the same RGBA instance not found equal");
	}

	rgba2 = new RGBA(r, g, b, a);
	if (!rgba1.equals(rgba2)) {
		fail("References to two different RGBA instances with same R G B A parameters not found equal");
	}

	if (rgba1.equals(new RGBA(r+1, g, b, a)) ||
	    rgba1.equals(new RGBA(r, g+1, b, a)) ||
	    rgba1.equals(new RGBA(r, g, b+1, a)) ||
	    rgba1.equals(new RGBA(r, g, b, a+1)) ||
	    rgba1.equals(new RGBA(r+1, g+1, b+1, a+1))) {
		fail("Comparing two RGBA instances with different combination of R G B A parameters found equal");
	}

	float hue = 220f, sat = 0.6f, bright = 0.7f, alpha = 0.5f;
	rgba1 = new RGBA(hue, sat, bright, alpha);
	rgba2 = rgba1;
	if (!rgba1.equals(rgba2)) {
		fail("Two references to the same RGBA instance not found equal");
	}

	rgba2 = new RGBA(hue, sat, bright, alpha);
	if (!rgba1.equals(rgba2)) {
		fail("References to two different RGBA instances with same H S B A parameters not found equal");
	}

	if (rgba1.equals(new RGBA(hue+1, sat, bright, alpha)) ||
	    rgba1.equals(new RGBA(hue, sat+0.1f, bright, alpha)) ||
	    rgba1.equals(new RGBA(hue, sat, bright+0.1f, alpha)) ||
	    rgba1.equals(new RGBA(hue, sat, bright, alpha+1f)) ||
	    rgba1.equals(new RGBA(hue+1, sat+0.1f, bright+0.1f, alpha+1f))) {
		fail("Comparing two RGBA instances with different combination of H S B A parameters found equal");
	}
}

@Test
public void test_getHSBA() {
	float[] hsba = new float[] {
				0f,0f,0f,0f,
				0f,1f,1f,1f,
				0f,1f,0f,0f,
				0f,0f,1f,1f,
				0f,0.6f,0.4f,0.8f,
				1f,0f,1f,1f,
				1f,1f,1f,1f,
				1f,0f,1f,1f,
				1f,1f,0f,0f,
				1f,0.6f,0.4f,0.8f,
				59f,0f,1f,1f,
				59f,1f,1f,1f,
				59f,0f,1f,1f,
				59f,1f,0f,0f,
				59f,0.6f,0.4f,0.8f,
				60f,0f,1f,1f,
				60f,1f,1f,1f,
				60f,0f,1f,1f,
				60f,1f,0f,0f,
				60f,0.6f,0.4f,0.8f,
				61f,0f,1f,1f,
				61f,1f,1f,1f,
				61f,0f,1f,1f,
				61f,1f,0f,0f,
				61f,0.6f,0.4f,0.8f,
				119f,0f,1f,1f,
				119f,1f,1f,1f,
				119f,0f,1f,1f,
				119f,1f,0f,0f,
				119f,0.6f,0.4f,0.8f,
				120f,0f,1f,1f,
				120f,1f,1f,1f,
				120f,0f,1f,1f,
				120f,1f,0f,0f,
				120f,0.6f,0.4f,0.8f,
				121f,0f,1f,1f,
				121f,1f,1f,1f,
				121f,0f,1f,1f,
				121f,1f,0f,0f,
				121f,0.6f,0.4f,0.8f,
				179f,0f,1f,1f,
				179f,1f,1f,1f,
				179f,0f,1f,1f,
				179f,1f,0f,0f,
				179f,0.6f,0.4f,0.8f,
				180f,0f,1f,1f,
				180f,1f,1f,1f,
				180f,0f,1f,1f,
				180f,1f,0f,0f,
				180f,0.6f,0.4f,0.8f,
				181f,0f,1f,1f,
				181f,1f,1f,1f,
				181f,0f,1f,1f,
				181f,1f,0f,0f,
				181f,0.6f,0.4f,0.8f,
				239f,0f,1f,1f,
				239f,1f,1f,1f,
				239f,0f,1f,1f,
				239f,1f,0f,0f,
				239f,0.6f,0.4f,0.8f,
				240f,0f,1f,1f,
				240f,1f,1f,1f,
				240f,0f,1f,1f,
				240f,1f,0f,0f,
				240f,0.6f,0.4f,0.8f,
				241f,0f,1f,1f,
				241f,1f,1f,1f,
				241f,0f,1f,1f,
				241f,1f,0f,0f,
				241f,0.6f,0.4f,0.8f,
				299f,0f,1f,1f,
				299f,1f,1f,1f,
				299f,0f,1f,1f,
				299f,1f,0f,0f,
				299f,0.6f,0.4f,0.8f,
				300f,0f,1f,1f,
				300f,1f,1f,1f,
				300f,0f,1f,1f,
				300f,1f,0f,0f,
				300f,0.6f,0.4f,0.8f,
				301f,0f,1f,1f,
				301f,1f,1f,1f,
				301f,0f,1f,1f,
				301f,1f,0f,0f,
				301f,0.6f,0.4f,0.8f,
				359f,0f,1f,1f,
				359f,1f,1f,1f,
				359f,0f,1f,1f,
				359f,1f,0f,0f,
				359f,0.6f,0.4f,0.8f,
				360f,0f,1f,1f,
				360f,1f,1f,1f,
				360f,0f,1f,1f,
				360f,1f,0f,0f,
				360f,0.6f,0.4f,0.8f,
				220f,0.6f,0.7f,0.8f};
	for (int i = 0; i < hsba.length; i+=4) {
		RGBA rgba1 = new RGBA(hsba[i], hsba[i+1], hsba[i+2], hsba[i+3]);
		float[] hsba2 = rgba1.getHSBA();
		RGBA rgba2 = new RGBA(hsba2[0], hsba2[1], hsba2[2], hsba2[3]);
		if (!rgba1.equals(rgba2)) {
			fail("Two references to the same RGBA using getHSB() function not found equal");
		}
	}
}

@Test
public void test_hashCode() {
	int r = 255, g = 100, b = 0, a = 0, different = 150;
	RGBA rgba1 = new RGBA(r, g, b, a);
	RGBA rgba2 = new RGBA(r, g, b, a);

	int hash1 = rgba1.hashCode();
	int hash2 = rgba2.hashCode();

	if (hash1 != hash2) {
		fail("Two RGBA instances with same R G B A parameters returned different hash codes");
	}

	if (rgba1.hashCode() == new RGBA(g, b, r, a).hashCode() ||
		rgba1.hashCode() == new RGBA(b, r, g, a).hashCode()) {
		fail("Two RGB instances with different R G B A parameters returned the same hash code");
	}

	if (rgba1.hashCode() == new RGBA(different, g, b, a).hashCode()) {
		fail("Two RGBA instances with different RED parameters returned the same hash code");
	}

	if (rgba1.hashCode() == new RGBA(r, different, b, a).hashCode()) {
		fail("Two RGBA instances with different GREEN parameters returned the same hash code");
	}

	if (rgba1.hashCode() == new RGBA(r, g, different, a).hashCode()) {
		fail("Two RGBA instances with different BLUE parameters returned the same hash code");
	}

	if (rgba1.hashCode() == new RGBA(r, g, b, different).hashCode()) {
		fail("Two RGBA instances with different ALPHA parameters returned the same hash code");
	}
}

@Test
public void test_toString() {
	RGBA rgba = new RGBA(0, 100, 200, 255);

	String s = rgba.toString();

	if (s == null || s.length() == 0) {
		fail("RGBA.toString returns a null or empty String");
	}
}
}
