/*****************************************************************************
 * 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.source;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;

import org.eclipse.wst.css.core.parser.CSSTextParser;
import org.eclipse.wst.css.core.parser.CSSTextToken;
import org.eclipse.wst.css.core.tests.util.FileUtil;


public class CSSTextParserTest extends TestCase {
	public void testText1() throws IOException {
		textParserTest("sample01.css"); //$NON-NLS-1$
	}

	public void testText2() throws IOException {
		textParserTest("sample02.css"); //$NON-NLS-1$
	}

	public void testText3() throws IOException {
		textParserTest("sample03.css"); //$NON-NLS-1$
	}

	public void testText4() throws IOException {
		textParserTest("sample04.css"); //$NON-NLS-1$
	}

	public void testText5() throws IOException {
		textParserTest("sample05.css"); //$NON-NLS-1$
	}

	public void testText6() throws IOException {
		textParserTest("sample06.css"); //$NON-NLS-1$
	}

	public void testText7() throws IOException {
		textParserTest("sample07.css"); //$NON-NLS-1$
	}

	private void textParserTest(String filename) throws IOException {
		String source = createString(filename); //$NON-NLS-1$
		CSSTextParser parser = new CSSTextParser(CSSTextParser.MODE_STYLESHEET, source);
		String result = dumpRegions(parser.getTokenList());
		compareResult(result, "CSSTextParserTest-" + filename); //$NON-NLS-1$
	}

	private String createString(String filename) throws FileNotFoundException, IOException {
		return FileUtil.createString(FILES_DIR, filename);
	}

	private String dumpRegions(List tokens) {
		StringBuffer buf = new StringBuffer();
		Iterator i = tokens.iterator();
		while (i.hasNext()) {
			buf.append(dumpOneRegion((CSSTextToken) i.next()));
		}

		buf.append(FileUtil.commonEOL + "-------" + FileUtil.commonEOL); //$NON-NLS-1$

		return buf.toString();
	}

	private String dumpOneRegion(CSSTextToken token) {
		StringBuffer buf = new StringBuffer();

		buf.append("["); //$NON-NLS-1$
		buf.append(token.image);
		buf.append("] "); //$NON-NLS-1$
		buf.append(token.kind);
		buf.append(" - "); //$NON-NLS-1$
		buf.append(token.start);
		buf.append(", "); //$NON-NLS-1$
		buf.append(token.length);

		buf.append(FileUtil.commonEOL); //$NON-NLS-1$
		return buf.toString();
	}

	private boolean fDump = false;

	private void compareResult(String actual, String filename) throws IOException {
		if (fDump) {
			FileUtil.dumpString(actual, RESULTS_DIR, filename);
		}
		else {
			String result = FileUtil.createString(RESULTS_DIR, filename);
			assertEquals(result, actual);
		}
	}

	private static final String FILES_DIR = "src/org/eclipse/wst/css/core/tests/testfiles"; //$NON-NLS-1$
	private static final String RESULTS_DIR = "src/org/eclipse/wst/css/core/tests/testfiles/results";
}