| /******************************************************************************* |
| * 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.core.tests.structure; |
| |
| import junit.framework.TestCase; |
| |
| import org.eclipse.dltk.compiler.env.ModuleSource; |
| import org.eclipse.dltk.core.ISourceElementParser; |
| import org.eclipse.dltk.core.tests.util.StringList; |
| |
| @SuppressWarnings("restriction") |
| public class StructureParserTests extends TestCase { |
| |
| protected ISourceElementParser createParser() { |
| return new TestJavaScriptSourceElementParser(); |
| } |
| |
| protected Root parse(String code) { |
| if (TestJavaScriptSourceElementParser.DEBUG) { |
| System.out.println(code.trim()); |
| System.out.println("---"); |
| } |
| Recorder rec = new Recorder(); |
| ISourceElementParser parser = createParser(); |
| parser.setRequestor(rec); |
| parser.parseSourceModule(new ModuleSource(code)); |
| if (TestJavaScriptSourceElementParser.DEBUG) { |
| System.out.println("---"); |
| System.out.println(rec.getRoot()); |
| System.out.println("------"); |
| } |
| return rec.getRoot(); |
| } |
| |
| public void testMethod() { |
| Root root = parse("function hello(){}"); |
| assertEquals(new Root(new Method("hello")), root); |
| } |
| |
| public void testMethodWithParams() { |
| Root root = parse("function hello(name){}"); |
| assertEquals(new Root(new Method("hello", new Parameter("name"))), root); |
| } |
| |
| public void testField() { |
| Root root = parse("var x = 1"); |
| assertEquals(new Root(new Field("x")), root); |
| } |
| |
| public void testMethodField() { |
| Root root = parse("function hello(){var x = 1}"); |
| assertEquals(new Root(new Method("hello")), root); |
| } |
| |
| public void testMethodFieldMethod() { |
| Root root = parse("function hello() { var a = { z: function() { } } }"); |
| assertEquals( |
| new Root(new Method("hello").skip().add( |
| new Field("a").add(new Method("z")))), root); |
| } |
| |
| public void testMethodMethod() { |
| Root root = parse("function hello() { function world() { } }"); |
| assertEquals(new Root(new Method("hello").add(new Method("world"))), |
| root); |
| } |
| |
| public void testMethodReference() { |
| Root root = parse("var x = calculate()"); |
| assertEquals(new Root(new Field("x").add(new MethodRef("calculate"))), |
| root); |
| } |
| |
| public void testFieldReference() { |
| Root root = parse("var x = database.get()"); |
| assertEquals( |
| new Root(new Field("x").add(new FieldRef("database"), |
| new MethodRef("get"))), root); |
| } |
| |
| public void testFieldReference1() { |
| Root root = parse("var a = 1; var x = a"); |
| assertEquals( |
| new Root(new Field("a"), new Field("x").add(new FieldRef("a"))), |
| root); |
| } |
| |
| public void testFunctionFieldReference() { |
| Root root = parse("var database;function run() {var x = database.get()}"); |
| assertEquals( |
| new Root(new Field("database"), new Method("run").add( |
| new FieldRef("database"), new MethodRef("get"))), root); |
| } |
| |
| public void testFunctionFieldReference1() { |
| Root root = parse("function hello() { var a = 1; var x = a }"); |
| assertEquals(new Root(new Method("hello")), root); |
| } |
| |
| public void testThisVariableUnnamedFunctionReference() { |
| Root root = parse("function hello() { this.a = function(){} }"); |
| assertEquals(new Root(new Method("hello").add(new Method("a"))), root); |
| } |
| |
| public void testThisVariableUnnamedFunctionReferenceNestedVariable() { |
| Root root = parse("function hello() { this.a = function(){var b} }"); |
| assertEquals(new Root(new Method("hello").add(new Method("a"))), root); |
| } |
| |
| public void testThisVariableSameNamedFunctionReference() { |
| Root root = parse("function hello() { this.a = function a(){} }"); |
| assertEquals(new Root(new Method("hello").add(new Method("a"))), root); |
| } |
| |
| public void testThisVariableNamedFunctionReference() { |
| Root root = parse("function hello() { this.a = function b(){} }"); |
| assertEquals(new Root(new Method("hello").add(new Method("a"))), root); |
| } |
| |
| public void testObjectInitializerFunctionReference() { |
| Root root = parse("function hello() { var a = {b: function(){}} }"); |
| assertEquals( |
| new Root(new Method("hello").skip().add( |
| new Field("a").add(new Method("b")))), root); |
| } |
| |
| public void testThisVariableUnnamedFunctionReferenceWithArgumentAssignment() { |
| Root root = parse("function hello() { var x = function(a){this.b =a;}}"); |
| assertEquals( |
| new Root(new Method("hello").add(new Method("x", new Parameter( |
| "a")).add(new FieldRef("b")))), root); |
| } |
| |
| public void testVariableInitializedWithFunction() { |
| Root root = parse("var x = function(a) {this.b = a;}"); |
| assertEquals( |
| new Root(new Method("x", new Parameter("a")).add(new FieldRef( |
| "b"))), root); |
| } |
| |
| public void testManyFunctionCalls() { |
| StringList code = new StringList(); |
| code.add("function a(){x=1} a();fa=1;"); |
| code.add("function b(){y=2} b();fb=2;"); |
| code.add("function c(){z=3} c();fc=3;"); |
| Root root = parse(code.toString()); |
| Root expected = new Root(); |
| expected.add(new Method("a").add(new FieldRef("x")), |
| new MethodRef("a"), new FieldRef("fa")); |
| expected.add(new Method("b").add(new FieldRef("y")), |
| new MethodRef("b"), new FieldRef("fb")); |
| expected.add(new Method("c").add(new FieldRef("z")), |
| new MethodRef("c"), new FieldRef("fc")); |
| assertEquals(expected, root); |
| } |
| |
| /** |
| * @see org.eclipse.dltk.internal.javascript.ti.JSDocSupport |
| */ |
| public void testJsDocsType() { |
| StringList code = new StringList(); |
| code.add("/** @type Number */"); |
| code.add("function a(){}"); |
| Method a = new Method("a"); |
| a.setType("Number"); |
| assertEquals(new Root(a), parse(code.toString())); |
| code.remove(0); |
| assertFalse(new Root(a).equals(parse(code.toString()))); |
| } |
| |
| /** |
| * @see org.eclipse.dltk.internal.javascript.ti.JSDocSupport |
| */ |
| public void testJsDocsParam() { |
| StringList code = new StringList(); |
| code.add("/** @param {Number} n */"); |
| code.add("function a(n,s){}"); |
| Method a = new Method("a", new Parameter("n", "Number"), new Parameter( |
| "s")); |
| assertEquals(new Root(a), parse(code.toString())); |
| code.remove(0); |
| assertFalse(new Root(a).equals(parse(code.toString()))); |
| } |
| |
| public void testObjectLiterals() { |
| { |
| final StringList code = new StringList(); |
| code.add("function a(){"); |
| code.add(" return {"); |
| code.add(" color: 'red',"); |
| code.add(" point: {"); |
| code.add(" x: function(){},"); |
| code.add(" y: function(){}"); |
| code.add(" }"); |
| code.add(" }"); |
| code.add("}"); |
| assertEquals(new Root(new Method("a").setType("Object")), parse(code.toString())); |
| } |
| { |
| final StringList code = new StringList(); |
| code.add("a("); |
| code.add(" {"); |
| code.add(" color: 'red',"); |
| code.add(" point: {"); |
| code.add(" x: function(){var xx = 1},"); |
| code.add(" y: function(){var yy = 2}"); |
| code.add(" }"); |
| code.add(" }"); |
| code.add(")"); |
| assertEquals(new Root(new MethodRef("a")), parse(code.toString())); |
| } |
| } |
| |
| public void testGlobalObjectLiteral() { |
| final StringList code = new StringList(); |
| code.add("var POINT = {"); |
| code.add(" /** @return {Point} */"); |
| code.add(" copy: function() {},"); |
| code.add(" x: 1,"); |
| code.add(" y: 2"); |
| code.add("}"); |
| final Root actual = parse(code.toString()); |
| |
| final Root expected = new Root(); |
| expected.add(new Field("POINT").add( |
| new Method("copy").setType("Point"), new Field("x"), new Field( |
| "y"))); |
| assertEquals(expected, actual); |
| } |
| |
| public void testLocalObjectLiteral() { |
| final StringList code = new StringList(); |
| code.add("function test() {"); |
| code.add(" var POINT = {"); |
| code.add(" /** @return {Point} */"); |
| code.add(" copy: function() {},"); |
| code.add(" x: 1,"); |
| code.add(" y: 2"); |
| code.add(" }"); |
| code.add("}"); |
| |
| final Root expected = new Root(); |
| expected.add(new Method("test")); |
| assertEquals(expected, parse(code.toString())); |
| } |
| |
| } |