/*****************************************************************************
 * 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 java.io.IOException;

import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
import org.eclipse.wst.css.core.tests.util.FileUtil;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.CSSRule;
import org.w3c.dom.css.CSSRuleList;
import org.w3c.dom.css.CSSStyleDeclaration;
import org.w3c.dom.css.CSSStyleRule;
import org.w3c.dom.css.CSSStyleSheet;
import org.w3c.dom.css.CSSValue;

public class CSSStyleRuleTest extends AbstractModelTest {
	public void testInsertTextNumbers() throws IOException {
		ICSSModel model = getModel();
		IStructuredDocument structuredDocument = model.getStructuredDocument();
		structuredDocument.set(FileUtil.createString("src/org/eclipse/wst/css/core/tests/testfiles", "CSSStyleRuleTest.css"));

		CSSStyleSheet sheet = (CSSStyleSheet) model.getDocument();
		CSSRuleList ruleList = sheet.getCssRules();
		assertEquals(3, ruleList.getLength());

		CSSRule rule;
		CSSStyleDeclaration declaration;
		CSSValue value;

		rule = ruleList.item(0);
		assertEquals(CSSRule.STYLE_RULE, rule.getType());
		assertTrue(rule instanceof CSSStyleRule);

		declaration = ((CSSStyleRule) rule).getStyle();
		assertEquals(20, declaration.getLength());

		// 01
		value = declaration.getPropertyCSSValue("NUMBER");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_NUMBER, 123.456f));

		// 02
		value = declaration.getPropertyCSSValue("PERCENTAGE");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_PERCENTAGE, 123.456f));

		// 03
		value = declaration.getPropertyCSSValue("EMS");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_EMS, 123.456f));

		// 04
		value = declaration.getPropertyCSSValue("EXS");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_EXS, 123.456f));

		// 05
		value = declaration.getPropertyCSSValue("PX");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_PX, +123.456f));
		value = declaration.getPropertyCSSValue("PX2");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_PX, -123f));


		
		// 06
		value = declaration.getPropertyCSSValue("CM");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_CM, 123.456f));

		// 07
		value = declaration.getPropertyCSSValue("MM");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_MM, 123.456f));

		// 08
		value = declaration.getPropertyCSSValue("IN");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_IN, 123.456f));

		// 09
		value = declaration.getPropertyCSSValue("PT");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_PT, 123.456f));

		// 10
		value = declaration.getPropertyCSSValue("PC");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_PC, 123.456f));

		// 11
		value = declaration.getPropertyCSSValue("DEG");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_DEG, -123.456f));

		// 12
		value = declaration.getPropertyCSSValue("RAD");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_RAD, 123.456f));

		// 13
		value = declaration.getPropertyCSSValue("GRAD");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_GRAD, 123.456f));

		// 14
		value = declaration.getPropertyCSSValue("MS");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_MS, 123.456f));

		// 15
		value = declaration.getPropertyCSSValue("S");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_S, 123.456f));

		// 16
		value = declaration.getPropertyCSSValue("HZ");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_HZ, 123.456f));

		// 17
		value = declaration.getPropertyCSSValue("KHZ");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_KHZ, 123.456f));

		// 18
		value = declaration.getPropertyCSSValue("DIMENSION");
		checkPrimitiveNumber(value, new PrimitiveNumber(CSSPrimitiveValue.CSS_DIMENSION, -123.456f));

		// 19
		value = declaration.getPropertyCSSValue("INTEGER");
		checkPrimitiveNumber(value, new PrimitiveNumber(ICSSPrimitiveValue.CSS_INTEGER, 123));
	}

	public void testInsertTextStrings() throws IOException {
		ICSSModel model = getModel();
		IStructuredDocument structuredDocument = model.getStructuredDocument();
		structuredDocument.set(FileUtil.createString("src/org/eclipse/wst/css/core/tests/testfiles", "CSSStyleRuleTest.css"));

		CSSStyleSheet sheet = (CSSStyleSheet) model.getDocument();
		CSSRuleList ruleList = sheet.getCssRules();
		assertEquals(3, ruleList.getLength());

		CSSRule rule;
		CSSStyleDeclaration declaration;
		CSSValue value;

		rule = ruleList.item(1);
		assertEquals(CSSRule.STYLE_RULE, rule.getType());
		assertTrue(rule instanceof CSSStyleRule);

		declaration = ((CSSStyleRule) rule).getStyle();
		assertEquals(11, declaration.getLength());

		// 01
		value = declaration.getPropertyCSSValue("STRING");
		checkPrimitiveString(value, new PrimitiveString(CSSPrimitiveValue.CSS_STRING, "string"));

		// 02
		value = declaration.getPropertyCSSValue("URI");
		checkPrimitiveString(value, new PrimitiveString(CSSPrimitiveValue.CSS_URI, "http://www.ibm.com/"));

		// 03
		value = declaration.getPropertyCSSValue("IDENT");
		checkPrimitiveString(value, new PrimitiveString(CSSPrimitiveValue.CSS_IDENT, "left"));

		// 04
		value = declaration.getPropertyCSSValue("HASH");
		checkPrimitiveString(value, new PrimitiveString(ICSSPrimitiveValue.CSS_HASH, "#abcdef"));

		// 05
		value = declaration.getPropertyCSSValue("URANGE");
		checkPrimitiveString(value, new PrimitiveString(ICSSPrimitiveValue.CSS_URANGE, "U+20A7"));

		// 06
		value = declaration.getPropertyCSSValue("SLASH");
		checkPrimitiveString(value, new PrimitiveString(ICSSPrimitiveValue.CSS_SLASH, "/"));

		// 07
		value = declaration.getPropertyCSSValue("COMMA");
		checkPrimitiveString(value, new PrimitiveString(ICSSPrimitiveValue.CSS_COMMA, ","));

		// 08
		value = declaration.getPropertyCSSValue("INHERIT_PRIMITIVE");
		checkPrimitiveString(value, new PrimitiveString(ICSSPrimitiveValue.CSS_INHERIT_PRIMITIVE, "inherit"));

		// 09
		value = declaration.getPropertyCSSValue("ATTR");
		checkPrimitiveString(value, new PrimitiveString(CSSPrimitiveValue.CSS_ATTR, "KEY"));

		// 10
		value = declaration.getPropertyCSSValue("FORMAT");
		checkPrimitiveString(value, new PrimitiveString(ICSSPrimitiveValue.CSS_FORMAT, "truedoc"));

		// 11
		value = declaration.getPropertyCSSValue("LOCAL");
		checkPrimitiveString(value, new PrimitiveString(ICSSPrimitiveValue.CSS_LOCAL, "Excelsior Roman"));
	}

	public void testInsertTextFunctions() throws IOException {
		ICSSModel model = getModel();
		IStructuredDocument structuredDocument = model.getStructuredDocument();
		structuredDocument.set(FileUtil.createString("src/org/eclipse/wst/css/core/tests/testfiles", "CSSStyleRuleTest.css"));

		CSSStyleSheet sheet = (CSSStyleSheet) model.getDocument();
		CSSRuleList ruleList = sheet.getCssRules();
		assertEquals(3, ruleList.getLength());

		CSSRule rule;
		CSSStyleDeclaration declaration;
		CSSValue value;

		rule = ruleList.item(2);
		assertEquals(CSSRule.STYLE_RULE, rule.getType());
		assertTrue(rule instanceof CSSStyleRule);

		declaration = ((CSSStyleRule) rule).getStyle();
		assertEquals(3, declaration.getLength());

		value = declaration.getPropertyCSSValue("COUNTER");
		checkPrimitiveCounter(value, "par-num", "upper-roman", null);

		value = declaration.getPropertyCSSValue("RECT");
		checkPrimitiveRect(value, new Object[]{new PrimitiveNumber(ICSSPrimitiveValue.CSS_INTEGER, 12), new PrimitiveNumber(ICSSPrimitiveValue.CSS_INTEGER, 34), new PrimitiveNumber(ICSSPrimitiveValue.CSS_INTEGER, 56), new PrimitiveNumber(ICSSPrimitiveValue.CSS_INTEGER, 78)});

		value = declaration.getPropertyCSSValue("RGBCOLOR");
		checkPrimitiveRgb(value, new Object[]{new PrimitiveNumber(ICSSPrimitiveValue.CSS_INTEGER, 255), new PrimitiveNumber(ICSSPrimitiveValue.CSS_INTEGER, 128), new PrimitiveNumber(ICSSPrimitiveValue.CSS_INTEGER, 0)});
	}

}