package org.eclipse.dltk.javascript.core.tests.contentassist; import static org.eclipse.dltk.core.tests.TestSupport.notYetImplemented; import static org.eclipse.dltk.javascript.typeinfo.ITypeNames.NUMBER; import static org.eclipse.dltk.javascript.typeinfo.MemberPredicates.STATIC; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import org.eclipse.dltk.codeassist.ICompletionEngine; import org.eclipse.dltk.compiler.env.IModuleSource; import org.eclipse.dltk.core.CompletionProposal; import org.eclipse.dltk.core.tests.util.StringList; import org.eclipse.dltk.javascript.ast.Keywords; import org.eclipse.dltk.javascript.core.JavaScriptKeywords; import org.eclipse.dltk.javascript.internal.core.codeassist.JSCompletionEngine; import org.eclipse.dltk.javascript.typeinfo.ITypeNames; @SuppressWarnings("restriction") public class CodeCompletion extends AbstractCompletionTest { private static final String ARGUMENTS = "arguments"; /** * dumb completion on keyword */ public void test0() { LinkedList<CompletionProposal> results = new LinkedList<CompletionProposal>(); ICompletionEngine c = createEngine(results, JSCompletionEngine.OPTION_NONE); c.complete(new TestModule(""), 0, 0); assertEquals(0, results.size()); } /** * dumb completion on function */ public void test1() { final IModuleSource module = createModule("test1.js"); basicTest(module, 0, new String[] { "main" }); } /** * dumb completion on function */ public void test2() { String[] names = new String[] { "firstVar", "secondVar" }; IModuleSource module = createModule("test2.js"); int position = lastPositionInFile("\n", module); basicTest(module, position, names); // basicTest("test2.js", 36, names); } /** * dumb completion on function */ public void test3() { String[] names = concat(getMembersOfObject(), "world"); IModuleSource module = createModule("test3.js"); int position = lastPositionInFile("firstVar.", module); basicTest(module, position, names); // basicTest(module, 63, names); } // 104 ,temperature /** * dumb completion on function */ public void test4() { String[] names = concat(getMembersOfString(), "temperature"); IModuleSource module = createModule("test4.js"); int position = lastPositionInFile("firstVar.world.", module); basicTest(module, position, names); // basicTest("test4.js", 100, names); } public void test5() { String[] names = concat(getMembersOfString(), "world"); String[] names1 = concat(getMembersOfString(), "temperature"); IModuleSource module = createModule("test5.js"); int positionFirst = lastPositionInFile("secondVar.", module); basicTest(module, positionFirst, names); int positionSecond = lastPositionInFile("world.", module); basicTest(module, positionSecond, names1); // basicTest(module, 120, names); // basicTest(module, 126, names1); } public void test6() { String[] names = concat(getMembersOfString(), "world"); // String[] names1=new String[]{"temperature"}; IModuleSource module = createModule("test6.js"); int position = lastPositionInFile("world.", module); basicTest(module, position, names); // basicTest(module, 158, names); // basicTest(module, 126, names1); } public void test7() { String[] names = concat(getMembersOfString(), "world"); // String[] names1=new String[]{"temperature"}; IModuleSource module = createModule("test7.js"); int position = lastPositionInFile("world.", module); basicTest(module, position, names); // basicTest(module, 157, names); // basicTest(module, 126, names1); } public void test8() { String[] names = concat(getMembersOfString(), "mission", "target"); // String[] names1=new String[]{"temperature"}; IModuleSource module = createModule("test8.js"); int position = lastPositionInFile("firstVar.", module); basicTest(module, position, names); // basicTest(module, 124, names); // basicTest(module, 126, names1); } public void test9() { String[] names = concat(getMembersOfString()); // String[] names1=new String[]{"temperature"}; IModuleSource module = createModule("test9.js"); int position = lastPositionInFile("firstVar.", module); basicTest(module, position, names); // basicTest(module, 138, names); // basicTest(module, 126, names1); } public void test10() { String[] names = concat(getMembersOfString(), "mission", "target"); // String[] names1=new String[]{"temperature"}; IModuleSource module = createModule("test10.js"); // basicTest(module, 139, names); int position = lastPositionInFile("secondVar.", module); basicTest(module, position, names); } public void test11() { String[] names = new String[] { ARGUMENTS, "firstVar", "secondVar", "main" }; IModuleSource module = createModule("test11.js"); int position = lastPositionInFile("{", module); basicTest(module, position, names); // basicTest(module, 56, names); } public void test12() { String[] names = new String[] { "p0", "p1" }; IModuleSource module = createModule("test12.js"); // basicTest(module, 62, names); int position = lastPositionInFile("p", module); basicTest(module, position, names); } public void test13() { String[] names = concat(getMembersOfString(), "element"); IModuleSource module = createModule("test13.js"); int position = lastPositionInFile("firstVar.", module); basicTest(module, position, names); } public void test14() { String[] names = concat(getMembersOfString(), "element"); IModuleSource module = createModule("test14.js"); int position = lastPositionInFile("firstVar.", module); basicTest(module, position, names); // basicTest(module, 88, names); } public void test15() { String[] names = concat(getMembersOfNumber()); IModuleSource module = createModule("test15.js"); int position = lastPositionInFile("firstVar.", module); basicTest(module, position, names); // basicTest(module, 104, names); } public void test16() { String[] names = new String[] { "xaml" }; IModuleSource module = createModule("test16.js"); int position = lastPositionInFile("x", module); basicTest(module, position, names); // basicTest(module, 86, names); } public void test17() { String[] names = new String[] {}; IModuleSource module = createModule("test17.js"); int position = lastPositionInFile("x", module); basicTest(module, position, names); // basicTest(module, 87, names); } public void test18() { String[] names = new String[] { "my" }; IModuleSource module = createModule("test18.js"); int position = lastPositionInFile("hello.", module); basicTest(module, position, names); // basicTest(module, 120, names); } public void test19() { String[] names = concat(getMembersOfNumber()); IModuleSource module = createModule("test19.js"); int position = lastPositionInFile("hello.", module); basicTest(module, position, names); // basicTest(module, 119, names); } public void test20() { String[] names = concat(getMembersOfNumber(), "my"); IModuleSource module = createModule("test20.js"); int position = lastPositionInFile("hello.", module); basicTest(module, position, names); // basicTest(module, 123, names); } public void test21() { String[] names = concat(getMembersOfNumber(), "favorite"); IModuleSource module = createModule("test21.js"); int position = lastPositionInFile("hello.my.", module); basicTest(module, position, names); // basicTest(module, 151, names); } public void test22() { if (notYetImplemented(this)) return; String[] names = concat(getMembersOfNumber()); IModuleSource module = createModule("test22.js"); int position = lastPositionInFile("hello.", module); basicTest(module, position, names); // basicTest(module, 147, names); } public void test23() { String[] names = new String[] { "my", "olive" }; IModuleSource module = createModule("test23.js"); int position = lastPositionInFile("hello.", module); basicTest(module, position, names); // basicTest(module, 160, names); } public void test24() { String[] names = concat(getMembersOfNumber(), "age", "wine"); IModuleSource module = createModule("test24.js"); int position = lastPositionInFile("hello.olive.", module); basicTest(module, position, names); // basicTest(module, 215, names); } public void test25() { String[] names = concat(getMembersOfNumber(), "age", "my", "olive", "wine"); IModuleSource module = createModule("test25.js"); int position = lastPositionInFile("hello.olive.", module); basicTest(module, position, names); // basicTest(module, 219, names); } public void test26() { if (notYetImplemented(this)) return; String[] names = concat(getMembersOfNumber(), "wine"); IModuleSource module = createModule("test26.js"); int position = lastPositionInFile("hello.olive.", module); basicTest(module, position, names); // basicTest(module, 256, names); } public void test27() { String[] names = new String[] { "olive" }; IModuleSource module = createModule("test27.js"); int position = lastPositionInFile("hello.o", module); basicTest(module, position, names); // basicTest(module, 131, names); } public void test28() { String[] names = concat(getMembersOfNumber()); IModuleSource module = createModule("test28.js"); int position = lastPositionInFile("hello.", module); basicTest(module, position, names); // basicTest(module, 118, names); } public void test29() { String[] names = new String[] { ARGUMENTS, "x", "main" }; IModuleSource module = createModule("test29.js"); int position = lastPositionInFile("{", module); basicTest(module, position, names); // basicTest(module, 46, names); } public void test30() { String[] names = concat(getMembersOfNumber(), "xsd"); IModuleSource module = createModule("test30.js"); int position = lastPositionInFile("sz.", module); basicTest(module, position, names); // basicTest(module, 79, names); } public void test31() { String[] names = concat(getMembersOfString(), "x"); IModuleSource module = createModule("test31.js"); int position = lastPositionInFile("node.", module); basicTest(module, position, names); // basicTest(module, 107, names); } public void test32() { String[] names = concat(getMembersOfString(), "x"); IModuleSource module = createModule("test32.js"); int position = lastPositionInFile("node.", module); basicTest(module, position, names); // basicTest(module, 110, names); } public void test33() { String[] names = new String[] { ARGUMENTS, "object", "objectVariable", "main" }; IModuleSource module = createModule("test33.js"); int position = lastPositionInFile("{", module); basicTest(module, position, names); // basicTest(module, 65, names); } public void test34() { String[] names = new String[] { "x2" }; IModuleSource module = createModule("test34.js"); int position = lastPositionInFile("object.", module); basicTest(module, position, names); // basicTest(module, 93, names); } public void test35() { String[] names = concat(getMembersOfNumber(), "x"); IModuleSource module = createModule("test35.js"); int position = lastPositionInFile("c.", module); basicTest(module, position, names); // basicTest(module, 82, names); } public void test36() { String[] names = new String[] { ARGUMENTS, "c", "object", "e", "main" }; IModuleSource module = createModule("test36.js"); int position = lastPositionInFile("{", module); basicTest(module, position, names); // basicTest(module, 76, names); } public void test37() { String[] names = new String[] { ARGUMENTS, "forward", "hello", "object", "main" }; IModuleSource module = createModule("test37.js"); int position = lastPositionInFile("{", module); basicTest(module, position, names); // basicTest(module, 85, names); } public void test38() { String[] names = new String[] { "object" }; IModuleSource module = createModule("test38.js"); int position = lastPositionInFile("o", module); basicTest(module, position, names); // basicTest(module, 102, names); } public void test39() { String[] names = concat(getMembersOfNumber(), "er"); IModuleSource module = createModule("test39.js"); int position = lastPositionInFile("eer.", module); basicTest(module, position, names); // basicTest(module, 125, names); } public void test40() { String[] names = new String[] { "s" }; IModuleSource module = createModule("test40.js"); int position = lastPositionInFile("v.", module); basicTest(module, position, names); // basicTest(module, 65, names); } public void test41() { String[] names = new String[] { "hello" }; IModuleSource module = createModule("test41.js"); int position = lastPositionInFile("er[0].", module); basicTest(module, position, names); // basicTest(module, 96, names); } public void test42() { String[] names = new String[] { "Hello", "Mama" }; IModuleSource module = createModule("test42.js"); int position = lastPositionInFile("object.", module); basicTest(module, position, names); // basicTest(module, 76, names); } public void test43() { String[] names = new String[] { ARGUMENTS, "main" }; IModuleSource module = createModule("test43.js"); int position = lastPositionInFile(";", module); basicTest(module, position, names); // basicTest(module, 45, names); } public void test44() { String[] names = new String[] { "main" }; IModuleSource module = createModule("test44.js"); int position = lastPositionInFile("object.", module); basicTest(module, position, names); // basicTest(module, 95, names); } public void test45() { String[] names = new String[] { "word", "other_word" }; IModuleSource module = createModule("test45.js"); int position = lastPositionInFile("x.hello.", module); basicTest(module, position, concat(getMembersOfObject(), names)); // basicTest(module, 139, names); } public void test46() { if (notYetImplemented(this)) return; String[] names = new String[] { "aaa", "baa", "my", "prototype" }; IModuleSource module = createModule("test46.js"); int position = lastPositionInFile("x.", module); basicTest(module, position, names); // basicTest(module, 102, names); } public void test47() { String[] names = new String[] { "x", "y" }; IModuleSource module = createModule("test47.js"); int position = lastPositionInFile("this.", module); basicTest(module, position, names); // basicTest(module, 54, names); } public void test48() { String[] names = new String[] { "erer" }; IModuleSource module = createModule("test48.js"); int position = lastPositionInFile("this.", module); basicTest(module, position, names); // basicTest(module, 105, names); } public void test49() { IModuleSource module = createModule("test49.js"); int position = lastPositionInFile("name.", module); basicTest(module, position, concat(getMembersOfString())); // basicTest(module, 105, names); } public void test50() { IModuleSource module = createModule("test50.js"); int position = lastPositionInFile("Function.", module); basicTest( module, position, concat(getMembers(ITypeNames.FUNCTION, STATIC), getMembersOfFunction())); // basicTest(module, 105, names); } public void test51() { IModuleSource module = createModule("test51.js"); int position = lastPositionInFile("test.", module); basicTest(module, position, concat(getMembersOfFunction())); // basicTest(module, 105, names); } public void test52() { IModuleSource module = createModule("test52.js"); int position = lastPositionInFile("x.", module); basicTest(module, position, concat(getMembersOfFunction())); // basicTest(module, 105, names); } public void testObjectFunctionReturnValue() { String[] names = new String[] { "a", "b" }; IModuleSource module = createModule("test-return-value.js"); int position = lastPositionInFile("execute().", module); basicTest(module, position, concat(getMembersOfObject(), names)); } public void testFunctionRefs() { String[] names = new String[] { "test1", "test2", "test3" }; IModuleSource module = createModule("test-function-refs.js"); int position = lastPositionInFile("a = test", module); basicTest(module, position, names); } public void testFunctionRefsAndKinds() { String[] names = new String[] { "test1()", "test2()", "test3()" }; IModuleSource module = createModule("test-function-refs.js"); int position = lastPositionInFile("a = test", module); testWithKinds(module, position, names); } public void testArrayInitializer() { IModuleSource module = createModule("test-array-intializer.js"); int position = lastPositionInFile("].", module); basicTest(module, position, concat(getMembersOfArray())); } public void testParamType() { IModuleSource module = createModule("test-function-paramtype.js"); int position = lastPositionInFile(".", module); basicTest(module, position, new String[] { "service", "status" }); } public void testElementReferenceType() { IModuleSource module = createModule("test-element-reference.js"); int position = lastPositionInFile(".", module); basicTest(module, position, new String[] { "anyReturn","deprecatedName", "service" }); } public void testNewViaClassRef() { IModuleSource module = createModule("test-new-via-class-ref.js"); int position = lastPositionInFile(".", module); basicTest(module, position, concat(getMembersOfNumber())); } public void testXmlVar() { IModuleSource module = createModule("test-xml-name.js"); int position = lastPositionInFile(".", module); basicTest(module, position, concat(getMembersOfNumber())); } public void testObjectLiteral() { IModuleSource module = createModule("test-object-literal.js"); int position = lastPositionInFile(":p", module); basicTest(module, position, new String[] { "person" }); } public void testCamelCase() { IModuleSource module = createModule("test-camel-case.js"); int position = lastPositionInFile("DS", module); basicTest(module, position, new String[] { "DataSource" }); } public void testStaticInference() { IModuleSource module = createModule("test-static.js"); int position = lastPositionInFile("num1.", module); basicTest(module, position, concat(getMembers(NUMBER, STATIC), getMembersOfFunction())); } public void testStaticMath() { IModuleSource module = new TestModule("Math."); int position = lastPositionInFile(".", module); basicTest(module, position, concat(getMembers("Math", STATIC), getMembersOfObject())); } public void testArrayOfRecords() { final StringList code = new StringList(); code.add("/** @type {Array<{x:Number,y:Number}>} */"); code.add("var points"); code.add("points[0]."); final IModuleSource module = new TestModule(code.toString()); String[] names = new String[] { "x", "y" }; int position = lastPositionInFile(".", module); basicTest(module, position, concat(getMembersOfObject(), names)); } public void testPropertyInitializerValue_FilteredKeywords1() { final StringList code = new StringList(); code.add("var figure = {"); code.add(" draw: "); code.add("}"); final IModuleSource module = new TestModule(code.toString()); final List<CompletionProposal> results = new ArrayList<CompletionProposal>(); final ICompletionEngine completionEngine = createEngine(results, JSCompletionEngine.OPTION_KEYWORDS); completionEngine.complete(module, lastPositionInFile(": ", module), 0); final String[] expectedProposals = concat( Collections.singletonList("figure"), JavaScriptKeywords.getJavaScriptValueKeywords()); if (!compareProposalNames(results, expectedProposals)) { assertEquals(new StringList(expectedProposals).sort().toString(), exractProposalNames(results, false).sort().toString()); } } public void testPropertyInitializerValue_FilteredKeywords2() { final StringList code = new StringList(); code.add("var figure = {"); code.add(" draw: fu"); code.add("}"); final IModuleSource module = new TestModule(code.toString()); final List<CompletionProposal> results = new ArrayList<CompletionProposal>(); final ICompletionEngine completionEngine = createEngine(results, JSCompletionEngine.OPTION_KEYWORDS); completionEngine.complete(module, lastPositionInFile("fu", module), 0); final String[] expectedProposals = { Keywords.FUNCTION }; if (!compareProposalNames(results, expectedProposals)) { assertEquals(new StringList(expectedProposals).sort().toString(), exractProposalNames(results, false).sort().toString()); } } public void testArrayOfLazyTypeInitializedEmpty() { final StringList code = new StringList(); code.add("function MyObject() {"); code.add(" this.test = 10;"); code.add("}"); code.add("/**"); code.add(" * @type {Array<MyObject>}"); code.add(" */"); code.add("var x = [];"); code.add("x[0]."); final IModuleSource module = new TestModule(code.toString()); String[] names = new String[] { "test" }; int position = lastPositionInFile(".", module); basicTest(module, position, concat(getMembersOfObject(), names)); } public void testRecordTypeFunction() { final StringList code = new StringList(); code.add("function test() {"); code.add(" return {"); code.add(" testProp: 10,"); code.add("testFunc: function(x){}"); code.add(" }"); code.add("}"); code.add("function testtest() {"); code.add(" test().testFunc"); code.add(" }"); final IModuleSource module = new TestModule(code.toString()); int position = lastPositionInFile(".testFunc", module); List<CompletionProposal> results = new ArrayList<CompletionProposal>(); ICompletionEngine c = createEngine(results, JSCompletionEngine.OPTION_NONE); c.complete(module, position, 0); assertEquals(1, results.size()); assertEquals(CompletionProposal.METHOD_REF, results.get(0).getKind()); } public void testRecordTypeFunctionWithConstructor() { final StringList code = new StringList(); code.add("function testConstructor() {"); code.add(" this.testMethod = function() {"); code.add(" return {"); code.add(" testProp: 10,"); code.add(" testFunc: function(x){}"); code.add(" }"); code.add(" }"); code.add("}"); code.add("function testtest() {"); code.add(" var x = new testConstructor();"); code.add(" x.testMethod().testFunc"); code.add(" }"); final IModuleSource module = new TestModule(code.toString()); int position = lastPositionInFile(".testFunc", module); List<CompletionProposal> results = new ArrayList<CompletionProposal>(); ICompletionEngine c = createEngine(results, JSCompletionEngine.OPTION_NONE); c.complete(module, position, 0); assertEquals(1, results.size()); assertEquals(CompletionProposal.METHOD_REF, results.get(0).getKind()); } public void testCodeCompletionWithValidWhiteSpace() { final StringList code = new StringList(); code.add("function Test() {"); code.add(" /**@return {Test}*/"); code.add(" this.f1 = function(){return this;}"); code.add(" /**@return {Test}*/"); code.add(" this.f2 = function(){return this;}"); code.add("}"); code.add("function testCC() {"); code.add(" var x = new Test();"); code.add(" x.f1().f2()."); code.add(" f1()"); code.add(" .f1(). f1()"); code.add(" .f1()."); code.add(" "); code.add(" }"); final IModuleSource module = new TestModule(code.toString()); int position = lastPositionInFile(" ", module); List<CompletionProposal> results = new ArrayList<CompletionProposal>(); ICompletionEngine c = createEngine(results, JSCompletionEngine.OPTION_NONE); c.complete(module, position, 0); assertEquals(2 + getMembersOfObject().size(), results.size()); } public void testArrayInArrayLookup() { final StringList code = new StringList(); code.add("function test() {"); code.add(" arrayTest.execute()[1].execute()[1]."); code.add("}"); final IModuleSource module = new TestModule(code.toString()); String[] names = new String[] { "execute" }; int position = lastPositionInFile(".", module); basicTest(module, position, names); } public void testVariableTypedAsTypedArrayThroughDoc() { final StringList code = new StringList(); code.add("function test() {"); code.add(" /** @type {Array<String>} */"); code.add(" this.scopeOneItems = new Array();"); code.add(" this.scopeOneItems[1]."); code.add("}"); final IModuleSource module = new TestModule(code.toString()); String[] names = getMembersOfString().toArray(new String[0]); int position = lastPositionInFile(".", module); basicTest(module, position, names); } public void testVariableTypedAsCustomTypeArrayThroughDoc() { final StringList code = new StringList(); code.add("function MyObject() {"); code.add(" this.num = 10;"); code.add("}"); code.add("function test() {"); code.add(" /** @type {Array<MyObject>} */"); code.add(" this.scopeOneItems = new Array();"); code.add(" this.scopeOneItems[1]."); code.add("}"); final IModuleSource module = new TestModule(code.toString()); String[] names = concat(getMembersOfObject(), "num"); int position = lastPositionInFile(".", module); basicTest(module, position, names); } public void testVariableTypedAsCustomTypeReferecingItselfArrayThroughDoc() { final StringList code = new StringList(); code.add("function MyObject() {"); code.add(" this.num = 10;"); code.add(" /**"); code.add(" * @param {Number} x"); code.add(" * @return {MyObject}"); code.add(" */"); code.add(" this.myfunc = function(x) {"); code.add(" return null;"); code.add(" }"); code.add("}"); code.add("function test() {"); code.add(" /** @type {Array<MyObject>} */"); code.add(" this.scopeOneItems = new Array();"); code.add(" this.scopeOneItems[1]."); code.add("}"); final IModuleSource module = new TestModule(code.toString()); String[] names = concat(getMembersOfObject(), "num", "myfunc"); int position = lastPositionInFile(".", module); basicTest(module, position, names); } public void testRecordTypeWithDeclaration() { final StringList code = new StringList(); code.add("function test() {"); code.add("/** @type {Object<Number>} */"); code.add("var y = {"); code.add(" KEY:1"); code.add("}"); code.add("y."); code.add("}"); final IModuleSource module = new TestModule(code.toString()); String[] names = concat(getMembersOfObject(), "KEY"); int position = lastPositionInFile(".", module); basicTest(module, position, names); } public void testLocalTypeInRecordType() { final StringList code = new StringList(); code.add("function MyObject() {"); code.add(" this.mytest = function() {}"); code.add("}"); code.add("/**"); code.add(" * @param {MyObject} param.options"); code.add(" */"); code.add("function test(param) {"); code.add(" param.options."); code.add("}"); final IModuleSource module = new TestModule(code.toString()); String[] names = concat(getMembersOfObject(), "mytest"); int position = lastPositionInFile(".", module); basicTest(module, position, names); } public void testExtends() { final StringList code = new StringList(); code.add("/**"); code.add(" * @constructor"); code.add(" */"); code.add("function BaseBase() {"); code.add(" this.basebase = function(a) {}"); code.add(" this.x = 10;"); code.add("}"); code.add("/**"); code.add(" * @constructor"); code.add(" * @extends {BaseBase}"); code.add(" */"); code.add("function Base() {"); code.add(" /** @this {Base} */"); code.add(" this.mytest = function(a) {"); code.add(" this.basebase(this.x);"); code.add(" }"); code.add("}"); code.add("/**"); code.add(" * @constructor"); code.add(" * @extends {Base}"); code.add(" */"); code.add("function Child () {"); code.add(" /** @this {Child} */"); code.add(" this.childsTest = function() {"); code.add(" this.mytest(1);"); code.add(" this.x = 11;"); code.add(" this.basebase(this.x);"); code.add(" }"); code.add("}"); code.add("function test() {"); code.add(" var x = new Child();"); code.add(" x.childsTest();"); code.add(" x.mytest(2);"); code.add(" x.x = 1;"); code.add(" x.basebase(x.x);"); code.add("}"); final IModuleSource module = new TestModule(code.toString()); String[] names = concat(getMembersOfObject(), "mytest","basebase","childsTest","x"); int position = lastPositionInFile("x.", module); basicTest(module, position, names); } public void testExtendsInFunction() { final StringList code = new StringList(); code.add("/**"); code.add(" * @constructor"); code.add(" */"); code.add("function BaseBase() {"); code.add(" this.basebase = function(a) {}"); code.add(" this.x = 10;"); code.add("}"); code.add("/**"); code.add(" * @constructor"); code.add(" * @extends {BaseBase}"); code.add(" */"); code.add("function Base() {"); code.add(" /** @this {Base} */"); code.add(" this.mytest = function(a) {"); code.add(" this.basebase(this.x);"); code.add(" }"); code.add("}"); final IModuleSource module = new TestModule(code.toString()); String[] names = concat(getMembersOfObject(), "mytest","basebase","x"); int position = lastPositionInFile("this.", module); basicTest(module, position, names); } public void testCompletionOfObjectInitializer() { final StringList code = new StringList(); code.add("/**"); code.add("* @type {Object<Object>}"); code.add("*/"); code.add("var MapTypeIds = {"); code.add(" HYBRID: new Object()"); code.add("}"); code.add("function test() {"); code.add(" Map"); code.add("}"); final IModuleSource module = new TestModule(code.toString()); final List<CompletionProposal> results = new ArrayList<CompletionProposal>(); final ICompletionEngine completionEngine = createEngine(results, JSCompletionEngine.OPTION_KEYWORDS); completionEngine.complete(module, lastPositionInFile("Map", module), 0); assertEquals(1, results.size()); assertEquals(CompletionProposal.FIELD_REF, results.get(0).getKind()); } public void testThisCompletionInsideObjectFunction() { final StringList code = new StringList(); code.add("function Test() {"); code.add(" this.x = 10;"); code.add(" this.myfunc = function() {"); code.add(" this."); code.add(" }"); code.add("}"); final IModuleSource module = new TestModule(code.toString()); String[] names = concat(getMembersOfObject(), "x", "myfunc"); int position = lastPositionInFile("this.", module); basicTest(module, position, names); } public void testAnyTypeNotAFunctionAsMemberReturnType() { final StringList code = new StringList(); code.add("var x = exampleForms.anyReturn();"); code.add("x"); final IModuleSource module = new TestModule(code.toString()); final List<CompletionProposal> results = new ArrayList<CompletionProposal>(); final ICompletionEngine completionEngine = createEngine(results, JSCompletionEngine.OPTION_KEYWORDS); completionEngine.complete(module, lastPositionInFile("x", module), 0); assertEquals(1, results.size()); assertEquals(CompletionProposal.FIELD_REF, results.get(0).getKind()); } public void testPrototypeWithExtends() { final StringList code = new StringList(); code.add("/**"); code.add(" * @constructor"); code.add(" */"); code.add("function MyConstructor() {"); code.add(" this.mypublicfunction = function() {"); code.add(" }"); code.add("}"); code.add("/**"); code.add(" * @constructor"); code.add(" * @extends {MyConstructor}"); code.add(" */"); code.add("function MySubConstructor() {"); code.add(" this.mypublicfunction = function() {"); code.add(" MySubConstructor.prototype."); code.add(" }"); code.add("}"); final IModuleSource module = new TestModule(code.toString()); final List<CompletionProposal> results = new ArrayList<CompletionProposal>(); final ICompletionEngine completionEngine = createEngine(results, JSCompletionEngine.OPTION_KEYWORDS); completionEngine.complete(module, lastPositionInFile(".", module), 0); assertEquals(8, results.size()); boolean found = false; for (CompletionProposal completionProposal : results) { if (completionProposal.getName().equals("mypublicfunction")) { found = true; break; } } assertEquals(true, found); } public void testPrototypeFunctionWith2Extends() { final StringList code = new StringList(); code.add("function A() {}"); code.add("A.prototype.afunction = function(){ }"); code.add("/**"); code.add(" * @extends {A}"); code.add(" */"); code.add("function B() {}"); code.add("B.prototype = new A();"); code.add("B.prototype.bfunction = function(){ }"); code.add("/**"); code.add(" * @extends {B}"); code.add(" */"); code.add("function C() {}"); code.add("C.prototype = new B();"); code.add("C.prototype.testDirectAssignment = function(){ }"); code.add("var x = new C();"); code.add("x."); final IModuleSource module = new TestModule(code.toString()); final List<CompletionProposal> results = new ArrayList<CompletionProposal>(); final ICompletionEngine completionEngine = createEngine(results, JSCompletionEngine.OPTION_KEYWORDS); completionEngine.complete(module, lastPositionInFile(".", module), 0); int found = 0; for (CompletionProposal completionProposal : results) { if (completionProposal.getName().equals("testDirectAssignment")) { found++; } if (completionProposal.getName().equals("bfunction")) { found++; } if (completionProposal.getName().equals("afunction")) { found++; } } assertEquals(3, found); } public void testPrototypeWithRecordTypeConstruction() { final StringList code = new StringList(); code.add("function D1() {}"); code.add("D1.prototype = {test: function(){}}"); code.add("D1.prototype.testDirectAssignment = function(){}"); code.add("var x = new D1()"); code.add("x."); final IModuleSource module = new TestModule(code.toString()); final List<CompletionProposal> results = new ArrayList<CompletionProposal>(); final ICompletionEngine completionEngine = createEngine(results, JSCompletionEngine.OPTION_KEYWORDS); completionEngine.complete(module, lastPositionInFile(".", module), 0); int found = 0; for (CompletionProposal completionProposal : results) { if (completionProposal.getName().equals("test")) { found++; } if (completionProposal.getName().equals("testDirectAssignment")) { found++; } } assertEquals(2, found); } public void testTypeDefParameterNamesTest() { final StringList code = new StringList(); code.add("/**"); code.add(" * @typedef {{ log: function(String, Number, *) }}"); code.add(" */"); code.add("var myType"); code.add("function tst(){"); code.add(" /**"); code.add(" * @type {myType}"); code.add(" */"); code.add(" var x = null;"); code.add(" x.log"); code.add("}"); final IModuleSource module = new TestModule(code.toString()); final List<CompletionProposal> results = new ArrayList<CompletionProposal>(); final ICompletionEngine completionEngine = createEngine(results, JSCompletionEngine.OPTION_KEYWORDS); completionEngine.complete(module, lastPositionInFile(".log", module), 0); assertEquals(1, results.size()); CompletionProposal completionProposal = results.get(0); assertEquals("log", completionProposal.getName()); String[] parameterNames = completionProposal.getParameterNames(); assertEquals(3, parameterNames.length); assertEquals("String", parameterNames[0]); assertEquals("Number", parameterNames[1]); assertEquals("Any", parameterNames[2]); } public void testTypeDefParameterNamesTestWithVariableArguments() { final StringList code = new StringList(); code.add("/**"); code.add(" * @typedef {{ log: function(String, Number, *...) }}"); code.add(" */"); code.add("var myType"); code.add("function tst(){"); code.add(" /**"); code.add(" * @type {myType}"); code.add(" */"); code.add(" var x = null;"); code.add(" x.log"); code.add("}"); final IModuleSource module = new TestModule(code.toString()); final List<CompletionProposal> results = new ArrayList<CompletionProposal>(); final ICompletionEngine completionEngine = createEngine(results, JSCompletionEngine.OPTION_KEYWORDS); completionEngine.complete(module, lastPositionInFile(".log", module), 0); assertEquals(1, results.size()); CompletionProposal completionProposal = results.get(0); assertEquals("log", completionProposal.getName()); String[] parameterNames = completionProposal.getParameterNames(); assertEquals(3, parameterNames.length); assertEquals("String", parameterNames[0]); assertEquals("Number", parameterNames[1]); assertEquals("Any", parameterNames[2]); } public void testPrototypeChainWithExtendsPublicPrivateAndProtectedMethods() { final StringList code = new StringList(); code.add("/**"); code.add(" * @param {String} name"); code.add(" */"); code.add("function BaseEntity(name) {"); code.add(" /**"); code.add(" * @protected"); code.add(" */"); code.add(" this.name = name"); code.add("}"); code.add("BaseEntity.prototype = {"); code.add(" publicMethod: function() {},"); code.add(" /**"); code.add(" * @protected"); code.add(" */"); code.add(" protectedMethod: function() {},"); code.add(" /**"); code.add(" * @deprecated"); code.add(" */"); code.add(" deprecatedMethod: function() {}"); code.add("}"); code.add("BaseEntity.prototype.getName = function() {"); code.add(" return this.name"); code.add("}"); code.add("/**"); code.add(" * @extends {BaseEntity}"); code.add(" * @param {Str*ing} name"); code.add(" * @param {String} type"); code.add(" * @constructor "); code.add(" */"); code.add("function ExtendedEntity(name, type) {"); code.add(" if (! (this instanceof ExtendedEntity)) {"); code.add(" return new ExtendedEntity(name, type)"); code.add("}"); code.add("BaseEntity.call(this, name)"); code.add("/**@protected*/"); code.add("this.type = type"); code.add("}"); code.add("ExtendedEntity.prototype = Object.create(BaseEntity.prototype)"); code.add("ExtendedEntity.prototype.constructor = ExtendedEntity"); code.add("ExtendedEntity.prototype.getType = function() {"); code.add(" return this.type"); code.add("}"); code.add("function test() {"); code.add(" var x = new ExtendedEntity('Servoy', 'company')"); code.add(" x."); code.add("}"); final IModuleSource module = new TestModule(code.toString()); final List<CompletionProposal> results = new ArrayList<CompletionProposal>(); final ICompletionEngine completionEngine = createEngine(results, JSCompletionEngine.OPTION_KEYWORDS); completionEngine.complete(module, lastPositionInFile("x.", module), 0); assertEquals(14, results.size()); HashSet<String> names = new HashSet<String>(16); for (CompletionProposal cp : results) { names.add(cp.getName()); } assertTrue(names.contains("getType")); assertTrue(names.contains("publicMethod")); assertTrue(names.contains("deprecatedMethod")); assertTrue(names.contains("getName")); // assertFalse(names.contains("protectedMethod")); } public void testPrototypeChainWithPropetiesWithTypeDeclaration() { final StringList code = new StringList(); code.add("function BaseEntity() {}"); code.add("/**"); code.add(" * @extends {BaseEntity}"); code.add(" */"); code.add("function ExtendedEntity() {}"); code.add("ExtendedEntity.prototype = Object.create(BaseEntity.prototype, {"); code.add("/**"); code.add(" * @type {String}"); code.add(" */"); code.add("foo: {configurable: false,get: function() { return 10 },set: function(value){ },value: null},"); code.add("bar:{ writable:true, configurable:true, value: 'hello' }});"); code.add("function test() {"); code.add(" var x = new ExtendedEntity();"); code.add(" x."); code.add("}"); final IModuleSource module = new TestModule(code.toString()); final List<CompletionProposal> results = new ArrayList<CompletionProposal>(); final ICompletionEngine completionEngine = createEngine(results, JSCompletionEngine.OPTION_KEYWORDS); completionEngine.complete(module, lastPositionInFile("x.", module), 0); assertEquals(9, results.size()); HashSet<String> names = new HashSet<String>(16); for (CompletionProposal cp : results) { names.add(cp.getName()); } assertTrue(names.contains("foo")); assertTrue(names.contains("bar")); } public void testPrototypeChainWithPropetiesWithTypeDeclarationProtected() { if (notYetImplemented(this)) return; final StringList code = new StringList(); code.add("function BaseEntity() {}"); code.add("/**"); code.add(" * @extends {BaseEntity}"); code.add(" */"); code.add("function ExtendedEntity() {}"); code.add("ExtendedEntity.prototype = Object.create(BaseEntity.prototype, {"); code.add("/**"); code.add(" * @type {String}"); code.add(" * @protected"); code.add(" */"); code.add("foo: {configurable: false,get: function() { return 10 },set: function(value){ },value: null},"); code.add("/**"); code.add(" * @protected"); code.add(" */"); code.add("bar:{ writable:true, configurable:true, value: 'hello' }});"); code.add("function test() {"); code.add(" var x = new ExtendedEntity();"); code.add(" x.;"); code.add("}"); final IModuleSource module = new TestModule(code.toString()); final List<CompletionProposal> results = new ArrayList<CompletionProposal>(); final ICompletionEngine completionEngine = createEngine(results, JSCompletionEngine.OPTION_KEYWORDS); completionEngine.complete(module, lastPositionInFile("x.", module), 0); assertEquals(9, results.size()); HashSet<String> names = new HashSet<String>(16); for (CompletionProposal cp : results) { names.add(cp.getName()); } assertFalse(names.contains("foo")); assertFalse(names.contains("bar")); } }