/*******************************************************************************
 * 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.xml.tests.encoding.xml;

import java.io.IOException;
import java.io.Reader;

import org.eclipse.wst.xml.core.contenttype.XMLHeadTokenizerConstants;
import org.eclipse.wst.xml.core.internal.contenttype.EncodingParserConstants;
import org.eclipse.wst.xml.core.internal.contenttype.HeadParserToken;
import org.eclipse.wst.xml.core.internal.contenttype.XMLHeadTokenizer;
import org.eclipse.wst.xml.tests.encoding.TestsPlugin;

import junit.framework.TestCase;


public class XMLHeadTokenizerTester extends TestCase {

	private boolean DEBUG = false;
	private final String fileDir = "xml/";
	private final String fileHome = "testfiles/";
	private final String fileLocation = fileHome + fileDir;
	private String fEncoding = null;
	private HeadParserToken fFinalToken;

	private void doTestFile(String filename, String expectedName) {
		doTestFile(filename, expectedName, null);
	}

	private void doTestFile(String filename, String expectedName, String expectedFinalTokenType) {

		XMLHeadTokenizer tokenizer = null;
		Reader fileReader = null;
		try {
			if (DEBUG) {
				System.out.println();
				System.out.println("       " + filename);
				System.out.println();
			}
			fileReader = TestsPlugin.getTestReader(filename);
			tokenizer = new XMLHeadTokenizer(fileReader);
		}
		catch (IOException e) {
			System.out.println("Error opening file \"" + filename + "\"");
		}

		String resultValue = null;
		try {
			parse(tokenizer);
			resultValue = fEncoding;
			if (DEBUG) {
				System.out.println("XML Head Tokenizer Found Encoding: " + resultValue);
			}
			fileReader.close();
		}
		catch (java.io.IOException e) {
			System.out.println("An I/O error occured while scanning :");
			System.out.println(e);
		}

		if (expectedFinalTokenType != null) {
			assertTrue("did not end as expected. found:  " + fFinalToken.getType(), expectedFinalTokenType.equals(fFinalToken.getType()));
		}
		else {
			if (expectedName == null) {
				// TODO: this test branch needs to be improved ... doesn't fail
				// as it should
				// (such as when tokenizer changed to return early when Unicode
				// stream found).
				assertTrue("expected no encoding, but found: " + resultValue, resultValue == null);
			}
			else {
				assertTrue("expected " + expectedName + " but found " + resultValue, expectedName.equals(resultValue));
			}
		}

	}

	private void parse(XMLHeadTokenizer tokenizer) throws IOException {
		HeadParserToken token = null;
		String tokenType = null;
		do {
			token = tokenizer.getNextToken();
			tokenType = token.getType();
			// normally "parsing" the tokens should be done by parser
			// @see, XMLResourceEncodoingDetector
			// but we'll
			// do it here for a little
			// more independent test.
			if (tokenType == EncodingParserConstants.UTF16BE) {
				fEncoding = "UTF16BEInStream";
			}
			if (tokenType == EncodingParserConstants.UTF16LE) {
				fEncoding = "UTF16LEInStream";
			}
			if (tokenType == EncodingParserConstants.UTF83ByteBOM) {
				fEncoding = "UTF83ByteBOMInStream";
			}
			if (tokenType == XMLHeadTokenizerConstants.XMLDelEncoding) {
				if (tokenizer.hasMoreTokens()) {
					token = tokenizer.getNextToken();
					tokenType = token.getType();
					if (isLegalString(tokenType)) {
						fEncoding = token.getText();
					}
				}
			}
		}
		while (tokenizer.hasMoreTokens());
		// for testing
		fFinalToken = token;
	}

	private boolean isLegalString(String tokenType) {
		if (tokenType == null)
			return false;
		else
			return tokenType.equals(EncodingParserConstants.StringValue) || tokenType.equals(EncodingParserConstants.UnDelimitedStringValue) || tokenType.equals(EncodingParserConstants.InvalidTerminatedStringValue) || tokenType.equals(EncodingParserConstants.InvalidTermintatedUnDelimitedStringValue);
	}

	/**
	 * Normal XMLDeclaration with default encoding specified (UTF-8)
	 *  
	 */
	public void testBestCase() {
		String filename = fileLocation + "testNormalCase.xml";
		doTestFile(filename, "UTF-8");

	}

	/**
	 * This is a UTF-16 file (Unicode bytes in BOM). So, the tokenizer by
	 * itself can't read correctly. Returns null in "pure" tokenizer test, but
	 * encoding detector case should still handle since looks for bytes first.
	 */
	public void testUTF16() {
		String filename = fileLocation + "testUTF16.xml";
		doTestFile(filename, "UTF16BEInStream");
	}

	/**
	 * Just to make sure we don't choke on empty file.
	 *  
	 */
	public void testEmptyFile() {
		String filename = fileLocation + "EmptyFile.xml";
		doTestFile(filename, null);
	}

	/**
	 * Testing as a result of CMVC defect 217720
	 */
	public void testEUCJP() {
		String filename = fileLocation + "eucjp.xml";
		doTestFile(filename, "EUC-JP");
	}

	/**
	 * Extended XML Declaration that contains 'standalone' attribute
	 *  
	 */
	public void testExtraAttrCase() {
		String filename = fileLocation + "testExtraValidStuff.xml";
		doTestFile(filename, "UTF-8");

	}

	/**
	 * A case with a valid encoding, but extra attributes which are not
	 * valid/meaningful.
	 *  
	 */
	public void testExtraJunkCase() {
		String filename = fileLocation + "testExtraJunk.xml";
		doTestFile(filename, "ISO-8859-1");
	}

	/**
	 * Missing 2 quotes, one and end of version value and one at beginning of
	 * encoding value. In this case, tokenizer handles as undelimite string,
	 * but if we ever modifiy to also look for 'version', then would not work
	 * the same.
	 *  
	 */
	public void testIllFormed() {
		String filename = fileLocation + "testIllFormed.xml";
		doTestFile(filename, "UTF-8");
	}

	/**
	 * Missing XMLDecl end tag ... we should be able to safely guess.
	 *  
	 */
	public void testIllFormed2() {
		String filename = fileLocation + "testIllFormed2.xml";
		doTestFile(filename, "UTF-8");
	}

	/**
	 * Missing end quote on UTF-8 attribute, so picks up following attribte
	 * too.
	 *  
	 */
	public void testIllFormed3() {
		String filename = fileLocation + "testIllFormed3.xml";
		doTestFile(filename, "UTF-8 standalone=");
	}

	/**
	 * Missing end quote on UTF-8 attribute, but then XMLDeclEnds, so should be
	 * able to handle
	 *  
	 */
	public void testIllFormed4() {
		String filename = fileLocation + "testIllFormed4.xml";
		doTestFile(filename, "UTF-8");
	}

	/**
	 * Test of missing end quote on encoding value.
	 *  
	 */
	public void testIllformedNormalNonDefault() {
		String filename = fileLocation + "IllformedNormalNonDefault.xml";
		doTestFile(filename, "ISO-8859-1");
	}

	/**
	 * Empty string as encoding value; (And, malformed input, for UTF-8 ...
	 * should not effect results of this level of test).
	 *  
	 */
	public void testMalformedNoEncoding() {
		String filename = fileLocation + "MalformedNoEncoding.xml";
		doTestFile(filename, "");
	}

	/**
	 * Empty string as encoding value; (And, malformed input, for UTF-8 ...
	 * should not effect results of this level of test).
	 *  
	 */
	public void testMalformedNoEncodingXSL() {
		String filename = fileLocation + "MalformedNoEncoding.xsl";
		doTestFile(filename, "");
	}

	/**
	 * XMLDeclaration not all on same line
	 *  
	 */
	public void testMultiLineCase() {
		String filename = fileLocation + "testMultiLine.xml";
		doTestFile(filename, "ISO-8859-1");

	}

	/**
	 * No encoding in XMLDeclaration
	 *  
	 */
	public void testNoEncoding() {
		String filename = fileLocation + "NoEncoding.xml";
		doTestFile(filename, null);
	}

	/**
	 * ?Is this a dup?
	 *  
	 */
	public void testNoEncodingCase() {
		String filename = fileLocation + "testNoEncodingValue.xml";
		doTestFile(filename, null);
	}

	/**
	 * Normal XMLDeclaration with ISO-1 specified
	 *  
	 */
	public void testNormalNonDefault() {
		String filename = fileLocation + "NormalNonDefault.xml";
		doTestFile(filename, "ISO-8859-1");
	}

	/**
	 * No XMLDeclaration at all. (Invalid, but should still be able to parse).
	 *  
	 */
	public void testNoXMLDecl() {
		String filename = fileLocation + "testNoXMLDecl.xml";
		doTestFile(filename, null);
	}

	/**
	 * Hard to handle safely (may appear in comment, for example).
	 *  
	 */
	public void testNoXMLDeclAtFirst() {
		String filename = fileLocation + "testNoXMLDeclAtFirst.xml";
		doTestFile(filename, null);
	}

	/**
	 * This test is just to make sure the scanning ends before end of file is
	 * reached.
	 *  
	 */
	public void testNoXMLDeclInLargeFile() {
		String filename = fileLocation + "testNoXMLDeclInLargeFile.xml";
		doTestFile(filename, null, EncodingParserConstants.MAX_CHARS_REACHED);
	}

	/**
	 * Testing as a result of CMVC defect 217720
	 */
	public void testshiftjis() {
		String filename = fileLocation + "shiftjis.xml";
		doTestFile(filename, "Shift_JIS");
	}

	/**
	 * Testing as a result of CMVC defect 217720
	 */
	public void testUTF16LEWithJapaneseChars() {
		String filename = fileLocation + "utf16UnicodeStreamWithNoEncodingInHeader2.xml";
		doTestFile(filename, "UTF16LEInStream");
	}

	/**
	 * Testing as a result of CMVC defect 217720
	 */
	public void testUTF16BEWithJapaneseChars() {
		String filename = fileLocation + "utf16UnicodeStreamWithNoEncodingInHeaderBE.xml";
		doTestFile(filename, "UTF16BEInStream");
	}

	/**
	 * A common case. 
	 *  
	 */
	public void testUTF8With3ByteBOM() {
		String filename = fileLocation + "UTF8With3ByteBOM.xml";
		doTestFile(filename, "UTF83ByteBOMInStream");
	}

	public void UTF16LEAtStartOfLargeFile() {
		String filename = fileLocation + "UTF16LEAtStartOfLargeFile.xml";
		doTestFile(filename, "UTF16LEInStream");
	}
}