blob: 4914bacaa1a1bd829064173ce5e62d63f442c5b3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2016 NumberFour AG and others
*
* 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:
* NumberFour AG - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.javascript.ui.tests.codeassist;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.tests.ProjectSetup;
import org.eclipse.dltk.javascript.ast.Keywords;
import org.eclipse.dltk.javascript.ast.MultiLineComment;
import org.eclipse.dltk.javascript.typeinfo.ITypeNames;
import org.eclipse.dltk.javascript.ui.tests.AllTests;
import org.eclipse.dltk.ui.templates.ScriptTemplateProposal;
import org.eclipse.dltk.ui.tests.UICompletionUtil;
import org.eclipse.dltk.ui.tests.UITestUtils;
import org.eclipse.dltk.ui.text.completion.IScriptCompletionProposal;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.hamcrest.CoreMatchers;
import org.hamcrest.Matcher;
import org.junit.After;
import org.junit.Assert;
import org.junit.ClassRule;
import org.junit.Test;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Lists;
public class JSCodeAssistUITest extends Assert {
@ClassRule
public static final ProjectSetup PROJECT = new ProjectSetup(
AllTests.WORKSPACE, "completion");
@After
public void closeAllEditors() {
UITestUtils.closeAllEditors();
}
private static <T extends ICompletionProposal> List<T> filter(
List<ICompletionProposal> proposals, Class<T> proposalClass,
Predicate<T> predicate) {
return FluentIterable.from(proposals).filter(proposalClass)
.filter(predicate).toList();
}
private List<ScriptTemplateProposal> filterProposalsWithJSDoc(
final List<ICompletionProposal> proposals) {
return filter(proposals, ScriptTemplateProposal.class,
input -> input.getAdditionalProposalInfo()
.contains(MultiLineComment.JSDOC_PREFIX));
}
private static Matcher<String> stringHasValue() {
return CoreMatchers.allOf(CoreMatchers.<String> notNullValue(String.class),
CoreMatchers.not(""));
}
@Test
public void functionDeclaration() throws CoreException {
final ISourceModule module = checkNotNull(PROJECT.getSourceModule(
"src", "function-declaration.js"));
final UICompletionUtil util = UICompletionUtil.openEditor(module)
.after("fu");
final List<ICompletionProposal> proposals = util.invokeCompletion();
assertEquals(4, proposals.size());
// function keyword
final List<IScriptCompletionProposal> keywords = filter(proposals,
IScriptCompletionProposal.class,
input -> Keywords.FUNCTION.equals(input.getDisplayString()));
assertEquals(1, keywords.size());
// 2 function declaration templates (with jsdoc and without it)
final List<ScriptTemplateProposal> templates = filter(proposals,
ScriptTemplateProposal.class,
Predicates.<ScriptTemplateProposal> alwaysTrue());
assertEquals(2, templates.size());
// Function global
final List<ICompletionProposal> globals = Lists.newArrayList(proposals);
globals.removeAll(keywords);
globals.removeAll(templates);
assertEquals(1, globals.size());
assertEquals(ITypeNames.FUNCTION, globals.get(0).getDisplayString());
}
@Test
public void functionKeywordProposal() throws CoreException {
final ISourceModule module = checkNotNull(PROJECT.getSourceModule(
"src", "file1.js"));
final UICompletionUtil util = UICompletionUtil.openEditor(module)
.after("fu");
final List<ICompletionProposal> proposals = util.invokeCompletion();
assertFalse(proposals.isEmpty());
final List<IScriptCompletionProposal> keywords = filter(proposals,
IScriptCompletionProposal.class,
input -> Keywords.FUNCTION.equals(input.getDisplayString()));
assertEquals(1, keywords.size());
util.apply(keywords.get(0));
assertEquals(PROJECT.getFileContentsAsString("src/file1keyword.txt"),
util.getText());
}
@Test
public void functionWithJSDoc() throws CoreException {
final ISourceModule module = checkNotNull(PROJECT.getSourceModule(
"src", "file1.js"));
final UICompletionUtil util = UICompletionUtil.openEditor(module)
.after("fu");
final List<ScriptTemplateProposal> templates = filterProposalsWithJSDoc(util
.invokeCompletion());
assertEquals(1, templates.size());
util.apply(templates.get(0));
assertEquals(PROJECT.getFileContentsAsString("src/file1.txt"),
util.getText());
}
@Test
public void secondFunctionWithJSDoc() throws CoreException {
final ISourceModule module = checkNotNull(PROJECT.getSourceModule(
"src", "file2.js"));
final UICompletionUtil util = UICompletionUtil.openEditor(module)
.afterLast("fu");
final List<ScriptTemplateProposal> templates = filterProposalsWithJSDoc(util
.invokeCompletion());
assertEquals(1, templates.size());
util.apply(templates.get(0));
assertEquals(PROJECT.getFileContentsAsString("src/file2.txt"),
util.getText());
}
@Test
public void functionWithJSDocIfJSDocAlreadyExists() throws CoreException {
final ISourceModule module = checkNotNull(PROJECT.getSourceModule(
"src", "file3.js"));
final UICompletionUtil util = UICompletionUtil.openEditor(module)
.afterLast("fu");
final List<ScriptTemplateProposal> templates = filterProposalsWithJSDoc(util
.invokeCompletion());
assertEquals(1, templates.size());
util.apply(templates.get(0));
assertEquals(PROJECT.getFileContentsAsString("src/file3.txt"),
util.getText());
}
@Test
public void additionalProposalInfoLengthProperty() throws CoreException {
final ISourceModule module = checkNotNull(PROJECT.getSourceModule(
"src", "additionalInfo.js"));
final UICompletionUtil util = UICompletionUtil.openEditor(module)
.afterLast("s.");
final List<IScriptCompletionProposal> proposals = filter(
util.invokeCompletion(), IScriptCompletionProposal.class,
input -> input.getDisplayString().startsWith("length"));
assertEquals(1, proposals.size());
assertThat(proposals.get(0).getAdditionalProposalInfo(),
stringHasValue());
}
@Test
public void additionalProposalInfoToStringMethod() throws CoreException {
final ISourceModule module = checkNotNull(PROJECT.getSourceModule(
"src", "additionalInfo.js"));
final UICompletionUtil util = UICompletionUtil.openEditor(module)
.afterLast("s.");
final List<IScriptCompletionProposal> proposals = filter(
util.invokeCompletion(), IScriptCompletionProposal.class,
input -> input.getDisplayString().startsWith("toString"));
assertEquals(1, proposals.size());
assertThat(proposals.get(0).getAdditionalProposalInfo(),
stringHasValue());
}
}