/*****************************************************************************
 * Copyright (c) 2004 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
 ****************************************************************************/
package org.eclipse.wst.css.core.tests.model;

import junit.framework.TestCase;

import org.eclipse.core.runtime.Preferences;
import org.eclipse.wst.css.core.internal.CSSCorePlugin;
import org.eclipse.wst.css.core.internal.preferences.CSSCorePreferenceNames;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleSheet;
import org.eclipse.wst.css.core.tests.util.FileUtil;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.CSSValue;
import org.w3c.dom.css.Counter;
import org.w3c.dom.css.RGBColor;
import org.w3c.dom.css.Rect;

public class AbstractModelTest extends TestCase {
	protected ICSSModel fModel = null;

	protected void setUp() throws Exception {
		super.setUp();

		Preferences prefs = CSSCorePlugin.getDefault().getPluginPreferences();
		prefs.setValue(CSSCorePreferenceNames.CASE_IDENTIFIER, CSSCorePreferenceNames.LOWER);
		prefs.setValue(CSSCorePreferenceNames.CASE_PROPERTY_NAME, CSSCorePreferenceNames.LOWER);
		prefs.setValue(CSSCorePreferenceNames.CASE_PROPERTY_VALUE, CSSCorePreferenceNames.LOWER);

		fModel = FileUtil.createModel();
	}

	protected void tearDown() throws Exception {
		if (fModel != null) {
			fModel.releaseFromEdit();
			fModel = null;
		}
		super.tearDown();
	}

	protected ICSSModel getModel() {
		return fModel;
	}

	protected ICSSStyleSheet getStyleSheet() {
		return (ICSSStyleSheet) fModel.getDocument();
	}

	class PrimitiveNumber {
		short type;
		float value;

		PrimitiveNumber(short newType, float newValue) {
			type = newType;
			value = newValue;
		}
	}

	class PrimitiveString {
		short type;
		String value;

		PrimitiveString(short newType, String newValue) {
			type = newType;
			value = newValue;
		}
	}

	/* for int, float */
	protected void checkPrimitiveNumber(CSSValue actual, PrimitiveNumber expected) {
		assertTrue(actual instanceof CSSPrimitiveValue);
		assertEquals(expected.type, ((CSSPrimitiveValue) actual).getPrimitiveType());
		assertEquals(expected.value, ((CSSPrimitiveValue) actual).getFloatValue(expected.type), 0);
	}

	/* for string */
	protected void checkPrimitiveString(CSSValue actual, PrimitiveString expected) {
		assertTrue(actual instanceof CSSPrimitiveValue);
		assertEquals(expected.type, ((CSSPrimitiveValue) actual).getPrimitiveType());
		assertEquals(expected.value, ((CSSPrimitiveValue) actual).getStringValue());
	}

	/* for counter */
	protected void checkPrimitiveCounter(CSSValue actual, String identifier, String listStyle, String separator) {
		assertTrue(actual instanceof CSSPrimitiveValue);
		assertEquals(CSSPrimitiveValue.CSS_COUNTER, ((CSSPrimitiveValue) actual).getPrimitiveType());
		Counter counter = ((CSSPrimitiveValue) actual).getCounterValue();
		assertEquals(identifier, counter.getIdentifier());
		assertEquals(listStyle, counter.getListStyle());
		assertEquals(separator, counter.getSeparator());
	}

	/* for rect */
	protected void checkPrimitiveRect(CSSValue actual, Object[] expectedArray) {
		assertTrue(actual instanceof CSSPrimitiveValue);
		assertEquals(CSSPrimitiveValue.CSS_RECT, ((CSSPrimitiveValue) actual).getPrimitiveType());
		Rect rect = ((CSSPrimitiveValue) actual).getRectValue();
		CSSPrimitiveValue value;
		Object expected;
		value = rect.getTop();
		expected = expectedArray[0];
		if (expected instanceof PrimitiveNumber) {
			checkPrimitiveNumber(value, (PrimitiveNumber) expected);
		}
		else {
			checkPrimitiveString(value, (PrimitiveString) expected);
		}
		value = rect.getRight();
		expected = expectedArray[1];
		if (expected instanceof PrimitiveNumber) {
			checkPrimitiveNumber(value, (PrimitiveNumber) expected);
		}
		else {
			checkPrimitiveString(value, (PrimitiveString) expected);
		}
		value = rect.getBottom();
		expected = expectedArray[2];
		if (expected instanceof PrimitiveNumber) {
			checkPrimitiveNumber(value, (PrimitiveNumber) expected);
		}
		else {
			checkPrimitiveString(value, (PrimitiveString) expected);
		}
		value = rect.getLeft();
		expected = expectedArray[3];
		if (expected instanceof PrimitiveNumber) {
			checkPrimitiveNumber(value, (PrimitiveNumber) expected);
		}
		else {
			checkPrimitiveString(value, (PrimitiveString) expected);
		}
	}

	/* for rgb */
	protected void checkPrimitiveRgb(CSSValue actual, Object[] expectedArray) {
		assertTrue(actual instanceof CSSPrimitiveValue);
		assertEquals(CSSPrimitiveValue.CSS_RGBCOLOR, ((CSSPrimitiveValue) actual).getPrimitiveType());
		RGBColor color = ((CSSPrimitiveValue) actual).getRGBColorValue();
		CSSPrimitiveValue value;
		Object expected;
		value = color.getRed();
		expected = expectedArray[0];
		if (expected instanceof PrimitiveNumber) {
			checkPrimitiveNumber(value, (PrimitiveNumber) expected);
		}
		else {
			checkPrimitiveString(value, (PrimitiveString) expected);
		}
		value = color.getGreen();
		expected = expectedArray[1];
		if (expected instanceof PrimitiveNumber) {
			checkPrimitiveNumber(value, (PrimitiveNumber) expected);
		}
		else {
			checkPrimitiveString(value, (PrimitiveString) expected);
		}
		value = color.getBlue();
		expected = expectedArray[2];
		if (expected instanceof PrimitiveNumber) {
			checkPrimitiveNumber(value, (PrimitiveNumber) expected);
		}
		else {
			checkPrimitiveString(value, (PrimitiveString) expected);
		}
	}

}