/*******************************************************************************
 * 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.javascript.ast.CallExpression;
import org.eclipse.dltk.javascript.ast.Expression;
import org.eclipse.dltk.javascript.ast.Identifier;
import org.eclipse.dltk.javascript.ast.NewExpression;
import org.eclipse.dltk.javascript.ast.PropertyExpression;
import org.eclipse.dltk.javascript.ast.Script;
import org.eclipse.dltk.javascript.ast.VariableDeclaration;
import org.eclipse.dltk.javascript.parser.PropertyExpressionUtils;

public class NewTests extends AbstractJSParserTest {

	public void testNewIdentifier() {
		Script script = parse("var x = new a()");
		assertFalse(reporter.hasErrors());
		VariableDeclaration var = uniqueResult(ASTUtil.select(script,
				VariableDeclaration.class));
		NewExpression newExpr = (NewExpression) var.getInitializer();
		CallExpression call = (CallExpression) newExpr.getObjectClass();
		assertEquals("a", PropertyExpressionUtils.getPath(call.getExpression()));
		assertTrue(PropertyExpressionUtils.equals(call.getExpression(), "a"));
		assertIdentifier("a", call.getExpression());
	}

	public void testNewPath2() {
		Script script = parse("var x = new a.b()");
		assertFalse(reporter.hasErrors());
		VariableDeclaration var = uniqueResult(ASTUtil.select(script,
				VariableDeclaration.class));
		NewExpression newExpr = (NewExpression) var.getInitializer();
		CallExpression call = (CallExpression) newExpr.getObjectClass();
		assertEquals("a.b",
				PropertyExpressionUtils.getPath(call.getExpression()));
		assertTrue(PropertyExpressionUtils.equals(call.getExpression(), "a",
				"b"));
		PropertyExpression property = (PropertyExpression) call.getExpression();
		assertIdentifier("a", property.getObject());
		assertIdentifier("b", property.getProperty());
		final List<Expression> path = property.getPath();
		assertEquals(2, path.size());
		assertIdentifier("a", path.get(0));
		assertIdentifier("b", path.get(1));
	}

	public void testNewPath3() {
		Script script = parse("var x = new a.b.c()");
		assertFalse(reporter.hasErrors());
		VariableDeclaration var = uniqueResult(ASTUtil.select(script,
				VariableDeclaration.class));
		NewExpression newExpr = (NewExpression) var.getInitializer();
		CallExpression call = (CallExpression) newExpr.getObjectClass();
		assertEquals("a.b.c",
				PropertyExpressionUtils.getPath(call.getExpression()));
		assertTrue(PropertyExpressionUtils.equals(call.getExpression(), "a",
				"b", "c"));
		final List<Identifier> identifiers = PropertyExpressionUtils
				.getIdentifiers((PropertyExpression) call.getExpression());
		assertEquals(3, identifiers.size());
		assertIdentifier("a", identifiers.get(0));
		assertIdentifier("b", identifiers.get(1));
		assertIdentifier("c", identifiers.get(2));
		PropertyExpression property = (PropertyExpression) call.getExpression();
		PropertyExpression property2 = (PropertyExpression) property
				.getObject();
		assertIdentifier("a", property2.getObject());
		assertIdentifier("b", property2.getProperty());
		assertIdentifier("c", property.getProperty());
		final List<Expression> path = property.getPath();
		assertEquals(3, path.size());
		assertIdentifier("a", path.get(0));
		assertIdentifier("b", path.get(1));
		assertIdentifier("c", path.get(2));
	}

	public void testNewNew() {
		Script script = parse("var x = new new A()()");
		assertFalse(reporter.hasErrors());
		VariableDeclaration var = uniqueResult(ASTUtil.select(script,
				VariableDeclaration.class));
		NewExpression newExpr1 = (NewExpression) var.getInitializer();
		CallExpression call1 = (CallExpression) newExpr1.getObjectClass();
		NewExpression new2 = (NewExpression) call1.getExpression();
		CallExpression call2 = (CallExpression) new2.getObjectClass();
		assertIdentifier("A", call2.getExpression());
	}
}
