/*******************************************************************************
 * Copyright (c) 2010 xored software, Inc.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 * 
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     xored software, Inc. - initial API and Implementation (Alex Panchenko)
 *******************************************************************************/
package org.eclipse.dltk.javascript.parser.tests;

import java.util.List;

import org.eclipse.dltk.ast.utils.ASTUtil;
import org.eclipse.dltk.core.tests.util.StringList;
import org.eclipse.dltk.javascript.ast.BinaryOperation;
import org.eclipse.dltk.javascript.ast.CallExpression;
import org.eclipse.dltk.javascript.ast.Expression;
import org.eclipse.dltk.javascript.ast.Identifier;
import org.eclipse.dltk.javascript.ast.PropertyExpression;
import org.eclipse.dltk.javascript.ast.Script;
import org.eclipse.dltk.javascript.ast.StatementBlock;
import org.eclipse.dltk.javascript.ast.VariableDeclaration;
import org.eclipse.dltk.javascript.ast.VariableStatement;
import org.eclipse.dltk.javascript.ast.WhileStatement;
import org.eclipse.dltk.javascript.ast.XmlExpressionFragment;
import org.eclipse.dltk.javascript.ast.XmlLiteral;
import org.eclipse.dltk.javascript.ast.XmlTextFragment;

@SuppressWarnings("nls")
public class XmlLiteralTests extends AbstractJSParserTest {

	public void testNoXmlLiteral() {
		final Script script = parse("while (a<b.c) { advance(); }");
		assertFalse(reporter.hasErrors());
		final List<?> statements = script.getStatements();
		assertEquals(1, statements.size());
		final WhileStatement whileStatement = (WhileStatement) statements
				.get(0);
		final BinaryOperation compare = (BinaryOperation) whileStatement
				.getCondition();
		assertEquals("a", ((Identifier) compare.getLeftExpression()).getName());
		final PropertyExpression right = (PropertyExpression) compare
				.getRightExpression();
		assertEquals("b", ((Identifier) right.getObject()).getName());
		assertEquals("c", ((Identifier) right.getProperty()).getName());
		final StatementBlock block = (StatementBlock) whileStatement.getBody();
		assertEquals(1, block.getStatements().size());
		final CallExpression call = uniqueResult(ASTUtil.select(block,
				CallExpression.class));
		assertTrue(call.getArguments().isEmpty());
		assertEquals("advance", ((Identifier) call.getExpression()).getName());
	}

	public void testXmlLiteralSimple() {
		parse("var x = <xml/>;");
		assertFalse(reporter.hasErrors());
	}

	public void testXmlLiteralTextContent() {
		parse("var x = <xml>CONTENT</xml>;");
		assertFalse(reporter.hasErrors());
	}

	public void testXmlLiteralAttributes() {
		parse("var x = <xml a='1' b='2'>CONTENT</xml>;");
		assertFalse(reporter.hasErrors());
	}

	public void testXmlLiteralEmptyTagName() {
		parse("var x = <></>;");
		assertFalse(reporter.hasErrors());
	}

	public void testXmlLiteralExtraRightBrace() {
		final StringList code = new StringList();
		code.add("var TOC = <xml>");
		code.add("<entry label={homePageTitle}/>");
		code.add("</xml>");
		code.add("}");
		code.add("");

		parse(code.toString());
		assertTrue(reporter.hasErrors());
	}

	public void testXmlLiteralExpressions() throws Exception {
		Script script = parse("var x = <xml>{value}</xml>;");
		assertFalse(reporter.getErrors().toString(), reporter.hasErrors());
		List<?> statements = script.getStatements();
		assertEquals(1, statements.size());
		final List<VariableStatement> declarations = ASTUtil.select(script,
				VariableStatement.class);
		assertEquals(1, declarations.size());
		final List<VariableDeclaration> vars = declarations.get(0)
				.getVariables();
		assertEquals(1, vars.size());
		VariableDeclaration var0 = vars.get(0);
		assertEquals("x", var0.getIdentifier().getName());
		final XmlLiteral literal = (XmlLiteral) var0.getInitializer();
		assertEquals(3, literal.getFragments().size());
		assertTrue(literal.getFragments().get(0) instanceof XmlTextFragment);
		assertTrue(literal.getFragments().get(1) instanceof XmlExpressionFragment);
		assertTrue(literal.getFragments().get(2) instanceof XmlTextFragment);
		assertEquals("<xml>",
				((XmlTextFragment) literal.getFragments().get(0)).getXml());
		Expression expression = ((XmlExpressionFragment) literal.getFragments()
				.get(1)).getExpression();
		assertTrue(expression instanceof Identifier);
		assertEquals("value", ((Identifier) expression).getName());
		assertEquals("</xml>",
				((XmlTextFragment) literal.getFragments().get(2)).getXml());
	}
}
