/*******************************************************************************
 * 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.html.core.tests.parser.css;

import org.eclipse.wst.html.core.tests.parser.ModelTest;
import org.eclipse.wst.xml.core.document.XMLModel;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import org.w3c.dom.css.CSSStyleSheet;
import org.w3c.dom.stylesheets.DocumentStyle;
import org.w3c.dom.stylesheets.LinkStyle;
import org.w3c.dom.stylesheets.StyleSheetList;

public class StyleTest extends ModelTest {
	/**
	 * Constructor for StyleTest.
	 * @param name
	 */
	public StyleTest(String name) {
		super(name);
	}

	public StyleTest() {
		super();
	}

	public static void main(java.lang.String[] args) {
		new StyleTest().testModel();
	}

	public void testModel() {
		XMLModel model = createHTMLModel(); //new HTMLModelImpl();
		Document document = model.getDocument();

		Element style = document.createElement("STYLE");
		Text text = document.createTextNode("BODY { color : red; } P { color : green; } B { color : blue; }");
		style.appendChild(text);
		document.appendChild(style);

		printSource(model);
		printTree(model);

		DocumentStyle ds = (DocumentStyle) document;
		StyleSheetList ssl = ds.getStyleSheets();
		if (ssl.getLength() > 0) {
			CSSStyleSheet ss = (CSSStyleSheet) ssl.item(0);
			ss.deleteRule(1);
		}

		printSource(model);
		printTree(model);

		LinkStyle ls = (LinkStyle) style;
		CSSStyleSheet ss2 = (CSSStyleSheet) ls.getSheet();
		if (ss2 != null) {
			ss2.deleteRule(0);
		}

		printSource(model);
		printTree(model);

		saveAndCompareTestResults();


	}
}