| /******************************************************************************* |
| * Copyright (c) 2010 xored software, Inc. |
| * |
| * 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: |
| * xored software, Inc. - initial API and Implementation (Alex Panchenko) |
| *******************************************************************************/ |
| package org.eclipse.dltk.javascript.parser.tests; |
| |
| import static org.hamcrest.CoreMatchers.instanceOf; |
| import static org.junit.Assert.assertThat; |
| |
| import org.eclipse.dltk.ast.utils.ASTUtil; |
| import org.eclipse.dltk.compiler.problem.IProblem; |
| import org.eclipse.dltk.core.tests.util.StringList; |
| import org.eclipse.dltk.javascript.ast.ErrorExpression; |
| import org.eclipse.dltk.javascript.ast.ObjectInitializer; |
| import org.eclipse.dltk.javascript.ast.PropertyInitializer; |
| import org.eclipse.dltk.javascript.ast.Script; |
| import org.eclipse.dltk.javascript.ast.VariableDeclaration; |
| import org.eclipse.dltk.javascript.parser.JavaScriptParserProblems; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.JUnit4; |
| |
| @RunWith(JUnit4.class) |
| public class ObjectInitializerTests extends AbstractJSParserTest { |
| |
| @Test |
| public void testSimple() { |
| final Script script = parse("var z = {a:1,b:2,c:3}"); |
| assertFalse(reporter.hasErrors()); |
| final VariableDeclaration var = uniqueResult(ASTUtil.select(script, |
| VariableDeclaration.class)); |
| final ObjectInitializer obj = (ObjectInitializer) var.getInitializer(); |
| assertEquals(3, obj.getInitializers().size()); |
| final PropertyInitializer p1 = (PropertyInitializer) obj |
| .getInitializers().get(0); |
| assertIdentifier("a", p1.getName()); |
| assertDecimal("1", p1.getValue()); |
| final PropertyInitializer p2 = (PropertyInitializer) obj |
| .getInitializers().get(1); |
| assertIdentifier("b", p2.getName()); |
| assertDecimal("2", p2.getValue()); |
| final PropertyInitializer p3 = (PropertyInitializer) obj |
| .getInitializers().get(2); |
| assertIdentifier("c", p3.getName()); |
| assertDecimal("3", p3.getValue()); |
| } |
| |
| @Test |
| public void testExtraComma() { |
| final Script script = parse("var z = {a:1,b:2,}"); |
| assertFalse(reporter.hasErrors()); |
| final VariableDeclaration var = uniqueResult(ASTUtil.select(script, |
| VariableDeclaration.class)); |
| final ObjectInitializer obj = (ObjectInitializer) var.getInitializer(); |
| assertEquals(2, obj.getInitializers().size()); |
| final PropertyInitializer p1 = (PropertyInitializer) obj |
| .getInitializers().get(0); |
| assertIdentifier("a", p1.getName()); |
| assertDecimal("1", p1.getValue()); |
| final PropertyInitializer p2 = (PropertyInitializer) obj |
| .getInitializers().get(1); |
| assertIdentifier("b", p2.getName()); |
| assertDecimal("2", p2.getValue()); |
| } |
| |
| @Test |
| public void testTrailingComma() { |
| StringList code = new StringList(); |
| code.add(" var obj = { a:b,b:c,}"); |
| parse(code.toString()); |
| assertEquals( |
| JavaScriptParserProblems.TRAILING_COMMA_OBJECT_INITIALIZER, |
| getProblemId()); |
| } |
| |
| @Test |
| public void errorRecoveryMissingComma1() { |
| final String code = "var x = { a:1 b:2, c:3}"; |
| final Script script = parse(code); |
| assertEquals(reporter.getProblems().toString(), 1, reporter |
| .getProblems().size()); |
| final IProblem problem = reporter.getProblems().get(0); |
| assertEquals(JavaScriptParserProblems.SYNTAX_ERROR, problem.getID()); |
| assertEquals(code.indexOf('b'), problem.getSourceStart()); |
| final VariableDeclaration var = uniqueResult(ASTUtil.select(script, |
| VariableDeclaration.class)); |
| final ObjectInitializer obj = (ObjectInitializer) var.getInitializer(); |
| assertEquals(3, obj.getInitializers().size()); |
| final PropertyInitializer[] pi = obj.getPropertyInitializers(); |
| { |
| assertIdentifier("a", pi[0].getName()); |
| assertDecimal("1", pi[0].getValue()); |
| } |
| { |
| assertIdentifier("b", pi[1].getName()); |
| assertDecimal("2", pi[1].getValue()); |
| } |
| { |
| assertIdentifier("c", pi[2].getName()); |
| assertDecimal("3", pi[2].getValue()); |
| } |
| } |
| |
| @Test |
| public void errorRecoveryMissingComma2() { |
| final String code = "var x = { a:1, b:2 c:3}"; |
| final Script script = parse(code); |
| assertEquals(reporter.getProblems().toString(), 1, reporter |
| .getProblems().size()); |
| final IProblem problem = reporter.getProblems().get(0); |
| assertEquals(JavaScriptParserProblems.SYNTAX_ERROR, problem.getID()); |
| assertEquals(code.indexOf('c'), problem.getSourceStart()); |
| final VariableDeclaration var = uniqueResult(ASTUtil.select(script, |
| VariableDeclaration.class)); |
| final ObjectInitializer obj = (ObjectInitializer) var.getInitializer(); |
| assertEquals(3, obj.getInitializers().size()); |
| final PropertyInitializer[] pi = obj.getPropertyInitializers(); |
| { |
| assertIdentifier("a", pi[0].getName()); |
| assertDecimal("1", pi[0].getValue()); |
| } |
| { |
| assertIdentifier("b", pi[1].getName()); |
| assertDecimal("2", pi[1].getValue()); |
| } |
| { |
| assertIdentifier("c", pi[2].getName()); |
| assertDecimal("3", pi[2].getValue()); |
| } |
| } |
| |
| @Test |
| public void errorRecoveryAdditionalIdentifier() { |
| final String code = "var x = { a:1, b c:3}"; |
| final Script script = parse(code); |
| assertEquals(reporter.getProblems().toString(), 1, reporter |
| .getProblems().size()); |
| final IProblem problem = reporter.getProblems().get(0); |
| assertEquals(JavaScriptParserProblems.SYNTAX_ERROR, problem.getID()); |
| assertEquals(code.indexOf('c'), problem.getSourceStart()); |
| final VariableDeclaration var = uniqueResult(ASTUtil.select(script, |
| VariableDeclaration.class)); |
| final ObjectInitializer obj = (ObjectInitializer) var.getInitializer(); |
| assertEquals(2, obj.getInitializers().size()); |
| final PropertyInitializer[] pi = obj.getPropertyInitializers(); |
| { |
| assertIdentifier("a", pi[0].getName()); |
| assertDecimal("1", pi[0].getValue()); |
| } |
| { |
| assertIdentifier("b", pi[1].getName()); |
| assertDecimal("3", pi[1].getValue()); |
| } |
| } |
| |
| @Test |
| public void errorRecoveryMissingValue1() { |
| final String code = "var x = { a: b:2, c:3}"; |
| final Script script = parse(code); |
| assertEquals(reporter.getProblems().toString(), 1, reporter |
| .getProblems().size()); |
| final IProblem problem = reporter.getProblems().get(0); |
| assertEquals(JavaScriptParserProblems.SYNTAX_ERROR, problem.getID()); |
| assertEquals(code.indexOf(":2"), problem.getSourceStart()); |
| final VariableDeclaration var = uniqueResult(ASTUtil.select(script, |
| VariableDeclaration.class)); |
| final ObjectInitializer obj = (ObjectInitializer) var.getInitializer(); |
| assertEquals(3, obj.getInitializers().size()); |
| final PropertyInitializer[] pi = obj.getPropertyInitializers(); |
| { |
| assertIdentifier("a", pi[0].getName()); |
| assertThat(pi[0].getValue(), instanceOf(ErrorExpression.class)); |
| } |
| { |
| assertIdentifier("b", pi[1].getName()); |
| assertDecimal("2", pi[1].getValue()); |
| } |
| { |
| assertIdentifier("c", pi[2].getName()); |
| assertDecimal("3", pi[2].getValue()); |
| } |
| } |
| |
| @Test |
| public void errorRecoveryMissingValue2() { |
| final String code = "var x = { a: {}:2, c:3}"; |
| final Script script = parse(code); |
| assertEquals(reporter.getProblems().toString(), 1, reporter |
| .getProblems().size()); |
| final IProblem problem = reporter.getProblems().get(0); |
| assertEquals(JavaScriptParserProblems.SYNTAX_ERROR, problem.getID()); |
| assertEquals(code.indexOf(":2"), problem.getSourceStart()); |
| final VariableDeclaration var = uniqueResult(ASTUtil.select(script, |
| VariableDeclaration.class)); |
| final ObjectInitializer obj = (ObjectInitializer) var.getInitializer(); |
| assertEquals(2, obj.getInitializers().size()); |
| final PropertyInitializer[] pi = obj.getPropertyInitializers(); |
| { |
| assertIdentifier("a", pi[0].getName()); |
| assertThat(pi[0].getValue(), instanceOf(ObjectInitializer.class)); |
| } |
| { |
| assertIdentifier("c", pi[1].getName()); |
| assertDecimal("3", pi[1].getValue()); |
| } |
| } |
| |
| } |