Bug 574940: refactor Code completion

  adapt to new api

Change-Id: Ieb32f47f38da76d1c78e24f1b56640e033197aba
diff --git a/plugins/org.eclipse.ease.modules.platform/plugin.xml b/plugins/org.eclipse.ease.modules.platform/plugin.xml
index 5d50d58..a0f48dd 100644
--- a/plugins/org.eclipse.ease.modules.platform/plugin.xml
+++ b/plugins/org.eclipse.ease.modules.platform/plugin.xml
@@ -58,7 +58,7 @@
             class="org.eclipse.ease.modules.platform.completion.ResourcesCompletionProvider">
       </codeCompletionProvider>
       <codeCompletionProvider
-            class="org.eclipse.ease.modules.platform.debug.LaunchModuleCompletionProvider">
+            class="org.eclipse.ease.modules.platform.completion.LaunchModuleCompletionProvider">
       </codeCompletionProvider>
    </extension>
    <extension
diff --git a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModuleCompletionProvider.java b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/LaunchModuleCompletionProvider.java
similarity index 75%
rename from plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModuleCompletionProvider.java
rename to plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/LaunchModuleCompletionProvider.java
index 176017b..84e038d 100644
--- a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModuleCompletionProvider.java
+++ b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/LaunchModuleCompletionProvider.java
@@ -10,7 +10,7 @@
  * Contributors:
  *     Jonah Graham - initial API and implementation
  *******************************************************************************/
-package org.eclipse.ease.modules.platform.debug;
+package org.eclipse.ease.modules.platform.completion;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -24,32 +24,33 @@
 import org.eclipse.debug.ui.DebugUITools;
 import org.eclipse.debug.ui.ILaunchGroup;
 import org.eclipse.ease.ICompletionContext;
-import org.eclipse.ease.ICompletionContext.Type;
 import org.eclipse.ease.Logger;
 import org.eclipse.ease.modules.platform.PluginConstants;
-import org.eclipse.ease.ui.completion.AbstractCompletionProvider;
+import org.eclipse.ease.modules.platform.debug.LaunchModule;
 import org.eclipse.ease.ui.completion.ScriptCompletionProposal;
+import org.eclipse.ease.ui.completion.provider.AbstractCompletionProvider;
 
 public class LaunchModuleCompletionProvider extends AbstractCompletionProvider {
 
 	@Override
 	public boolean isActive(final ICompletionContext context) {
-		if (context.getType() == Type.STRING_LITERAL) {
-			final String caller = context.getCaller();
-			final int param = context.getParameterOffset();
-			if (caller.endsWith("launch") || caller.endsWith("launchUI")) {
-				return (param == 0) || (param == 1);
-			}
-			if (caller.endsWith("getLaunchConfiguration")) {
-				return param == 0;
-			}
-		}
+		if ((isStringParameter(context)) && (context.getLoadedModules().contains(getModuleDefinition(LaunchModule.MODULE_ID))))
+			return isLaunchConfigurationParameter(context) || isLaunchTypeParameter(context);
+
 		return false;
 	}
 
+	private boolean isLaunchConfigurationParameter(ICompletionContext context) {
+		return isMethodParameter(context, "launch", 0) || isMethodParameter(context, "launchUI", 0) || isMethodParameter(context, "getLaunchConfiguration", 0);
+	}
+
+	private boolean isLaunchTypeParameter(ICompletionContext context) {
+		return isMethodParameter(context, "launch", 1) || isMethodParameter(context, "launchUI", 1);
+	}
+
 	@Override
 	protected void prepareProposals(ICompletionContext context) {
-		if (context.getParameterOffset() == 0) {
+		if (isLaunchConfigurationParameter(getContext())) {
 
 			try {
 				final ILaunchConfiguration[] configurations = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations();
@@ -64,7 +65,7 @@
 				Logger.warning(PluginConstants.PLUGIN_ID, "Code Completion: could not read launch configurations", e);
 			}
 
-		} else {
+		} else if (isLaunchTypeParameter(getContext())) {
 			// TODO: Make this parameter dependent on the selected launch config
 			// to only populate the relevant modes
 			final Collection<ScriptCompletionProposal> proposals = new ArrayList<>();
diff --git a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProvider.java b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProvider.java
index 5cd9b91..59c3f54 100644
--- a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProvider.java
+++ b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProvider.java
@@ -13,54 +13,43 @@
 package org.eclipse.ease.modules.platform.completion;
 
 import org.eclipse.ease.ICompletionContext;
-import org.eclipse.ease.modules.ModuleDefinition;
 import org.eclipse.ease.modules.platform.ResourcesModule;
 import org.eclipse.ease.modules.platform.ScriptingModule;
 import org.eclipse.ease.modules.platform.UIModule;
-import org.eclipse.ease.service.IScriptService;
 import org.eclipse.ease.ui.completion.provider.AbstractFileLocationCompletionProvider;
-import org.eclipse.ui.PlatformUI;
 
 public class ResourcesCompletionProvider extends AbstractFileLocationCompletionProvider {
 
 	@Override
 	public boolean isActive(final ICompletionContext context) {
-		if (super.isActive(context)) {
+		if (super.isActive(context))
+			return isMethodFromResources(context) || isMethodFromScripting(context) || isMethodFromUi(context);
 
-			// Resources module
-			if (context.getLoadedModules().contains(getModule(ResourcesModule.MODULE_ID))) {
+		return false;
+	}
 
-				// simple methods
-				if (context.getCaller().endsWith("copyFile") || context.getCaller().endsWith("createFile") || context.getCaller().endsWith("createFolder")
-						|| context.getCaller().endsWith("deleteFile") || context.getCaller().endsWith("deleteFolder")
-						|| context.getCaller().endsWith("fileExists"))
-					return true;
+	private boolean isMethodFromUi(final ICompletionContext context) {
+		if (context.getLoadedModules().contains(getModuleDefinition(UIModule.MODULE_ID)))
+			return isMethodParameter(context, "showEditor", 0) || isMethodParameter(context, "openEditor", 0);
 
-				if ((context.getCaller().endsWith("findFiles")) && (context.getParameterOffset() == 1))
-					return true;
-				if ((context.getCaller().endsWith("getFile")) && (context.getParameterOffset() == 0))
-					return true;
-				if ((context.getCaller().endsWith("openFile")) && (context.getParameterOffset() == 0))
-					return true;
-				if ((context.getCaller().endsWith("readFile")) && (context.getParameterOffset() == 0))
-					return true;
-				if ((context.getCaller().endsWith("writeFile")) && (context.getParameterOffset() == 0))
-					return true;
-				if ((context.getCaller().endsWith("createProblemMarker")) && (context.getParameterOffset() == 1))
-					return true;
-			}
+		return false;
+	}
 
-			// Scripting module
-			if (context.getLoadedModules().contains(getModule(ScriptingModule.MODULE_ID))) {
-				if ((context.getCaller().endsWith("fork")) && (context.getParameterOffset() == 0))
-					return true;
-			}
+	private boolean isMethodFromScripting(final ICompletionContext context) {
+		if (context.getLoadedModules().contains(getModuleDefinition(ScriptingModule.MODULE_ID)))
+			return isMethodParameter(context, "fork", 0);
 
-			// UI module
-			if (context.getLoadedModules().contains(getModule(UIModule.MODULE_ID))) {
-				if ((context.getCaller().endsWith("showEditor")) || (context.getCaller().endsWith("openEditor")))
-					return true;
-			}
+		return false;
+	}
+
+	private boolean isMethodFromResources(final ICompletionContext context) {
+		if (context.getLoadedModules().contains(getModuleDefinition(ResourcesModule.MODULE_ID))) {
+			return isMethodParameter(context, "copyFile", 0) || isMethodParameter(context, "copyFile", 1) || isMethodParameter(context, "createFile", 0)
+					|| isMethodParameter(context, "createFolder", 0) || isMethodParameter(context, "deleteFile", 0)
+					|| isMethodParameter(context, "deleteFolder", 0) || isMethodParameter(context, "fileExists", 0)
+					|| isMethodParameter(context, "findFiles", 1) || isMethodParameter(context, "getFile", 0) || isMethodParameter(context, "openFile", 0)
+					|| isMethodParameter(context, "readFile", 0) || isMethodParameter(context, "writeFile", 0)
+					|| isMethodParameter(context, "createProblemMarker", 1);
 		}
 
 		return false;
@@ -68,19 +57,13 @@
 
 	@Override
 	protected boolean showCandidate(final Object candidate) {
-		final String caller = getContext().getCaller();
-
-		if ((caller.endsWith("showEditor")) || (caller.endsWith("openEditor")))
+		if (isMethodFromUi(getContext()))
 			return !isFileSystemResource(candidate);
 
-		if ((caller.endsWith("createFile")) || (caller.endsWith("createFolder")) || (caller.endsWith("deleteFolder")) || (caller.endsWith("findFiles")))
+		if (isMethodParameter(getContext(), "createFile", 0) || isMethodParameter(getContext(), "createFolder", 0)
+				|| isMethodParameter(getContext(), "deleteFolder", 0) || isMethodParameter(getContext(), "findFiles", 1))
 			return !isFile(candidate);
 
 		return super.showCandidate(candidate);
 	}
-
-	private static ModuleDefinition getModule(final String identifier) {
-		final IScriptService scriptService = PlatformUI.getWorkbench().getService(IScriptService.class);
-		return scriptService.getModuleDefinition(identifier);
-	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModule.java b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModule.java
index a0b9f09..a12f634 100644
--- a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModule.java
+++ b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModule.java
@@ -41,7 +41,8 @@
  * </p>
  */
 public class LaunchModule extends AbstractScriptModule {
-	public static final String MODULE_NAME = "/System/Launch";
+
+	public static final String MODULE_ID = "/System/Launch";
 
 	/**
 	 * Obtain the platform launch manager. This allows access to the Eclipse debug core launch manager, allowing control over all non-UI aspects of launches.
diff --git a/tests/org.eclipse.ease.modules.platform.test/META-INF/MANIFEST.MF b/tests/org.eclipse.ease.modules.platform.test/META-INF/MANIFEST.MF
index f42c65d..eccd694 100644
--- a/tests/org.eclipse.ease.modules.platform.test/META-INF/MANIFEST.MF
+++ b/tests/org.eclipse.ease.modules.platform.test/META-INF/MANIFEST.MF
@@ -8,5 +8,6 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Require-Bundle: org.junit.jupiter.api,
  org.eclipse.ease.lang.javascript.rhino,
- org.mockito
+ org.mockito,
+ org.junit.jupiter.params
 Automatic-Module-Name: org.eclipse.ease.modules.platform.test
diff --git a/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/completion/LaunchModuleCompletionProviderTest.java b/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/completion/LaunchModuleCompletionProviderTest.java
new file mode 100644
index 0000000..61c596b
--- /dev/null
+++ b/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/completion/LaunchModuleCompletionProviderTest.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License_Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ease.modules.platform.completion;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.ease.ICompletionContext;
+import org.eclipse.ease.IScriptEngine;
+import org.eclipse.ease.modules.IEnvironment;
+import org.eclipse.ease.modules.platform.debug.LaunchModule;
+import org.eclipse.ease.service.EngineDescription;
+import org.eclipse.ease.service.ScriptType;
+import org.eclipse.ease.ui.completion.BasicContext;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+public class LaunchModuleCompletionProviderTest {
+	@ParameterizedTest(name = "for ''{0}''")
+	@DisplayName("isActive() = true")
+	@ValueSource(strings = { "launch(\"", "launchUI(\"", "getLaunchConfiguration(\"", "launch(1,\"", "launchUI(1,\"" })
+	public void isActive_equals_true(String input) {
+		assertTrue(new LaunchModuleCompletionProvider().isActive(createContext(input)));
+	}
+
+	@ParameterizedTest(name = "for ''{0}''")
+	@DisplayName("isActive() = false")
+	@ValueSource(strings = { "", "getLaunchConfiguration(1,\"" })
+	public void isActive_equals_false(String input) {
+		assertFalse(new LaunchModuleCompletionProvider().isActive(createContext(input)));
+	}
+
+	private ICompletionContext createContext(String input) {
+		return new BasicContext(createEngine(), input, input.length());
+	}
+
+	private IScriptEngine createEngine() {
+		final EngineDescription engineDescription = mock(EngineDescription.class);
+		when(engineDescription.getSupportedScriptTypes()).thenReturn(Arrays.asList(new ScriptType(null)));
+
+		final Map<String, Object> variables = new HashMap<>();
+		variables.put(IEnvironment.MODULE_PREFIX + "Launch", new LaunchModule());
+
+		final IScriptEngine engine = mock(IScriptEngine.class);
+		when(engine.getDescription()).thenReturn(engineDescription);
+		when(engine.getVariables()).thenReturn(variables);
+
+		return engine;
+	}
+}
diff --git a/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProviderTest.java b/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProviderTest.java
new file mode 100644
index 0000000..181fd49
--- /dev/null
+++ b/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProviderTest.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License_Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ease.modules.platform.completion;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.ease.ICompletionContext;
+import org.eclipse.ease.IScriptEngine;
+import org.eclipse.ease.modules.IEnvironment;
+import org.eclipse.ease.modules.platform.ResourcesModule;
+import org.eclipse.ease.modules.platform.ScriptingModule;
+import org.eclipse.ease.modules.platform.UIModule;
+import org.eclipse.ease.service.EngineDescription;
+import org.eclipse.ease.service.ScriptType;
+import org.eclipse.ease.ui.completion.BasicContext;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+public class ResourcesCompletionProviderTest {
+	@ParameterizedTest(name = "for ''{0}''")
+	@DisplayName("isActive() = true")
+	@ValueSource(strings = { "copyFile(\"", "copyFile(1,\"", "createFile(\"", "createFolder(\"", "deleteFile(\"", "deleteFolder(\"", "fileExists(\"",
+			"findFiles(1,\"", "getFile(\"", "openFile(\"", "readFile(\"", "writeFile(\"", "createProblemMarker(1,\"", "fork(\"", "showEditor(\"",
+			"openEditor(\"" })
+	public void isActive_equals_true(String input) {
+		assertTrue(new ResourcesCompletionProvider().isActive(createContext(input)));
+	}
+
+	@ParameterizedTest(name = "for ''{0}''")
+	@DisplayName("isActive() = false")
+	@ValueSource(strings = { "", "findFiles(\"" })
+	public void isActive_equals_false(String input) {
+		assertFalse(new ResourcesCompletionProvider().isActive(createContext(input)));
+	}
+
+	private ICompletionContext createContext(String input) {
+		return new BasicContext(createEngine(), input, input.length());
+	}
+
+	private IScriptEngine createEngine() {
+		final EngineDescription engineDescription = mock(EngineDescription.class);
+		when(engineDescription.getSupportedScriptTypes()).thenReturn(Arrays.asList(new ScriptType(null)));
+
+		final Map<String, Object> variables = new HashMap<>();
+		variables.put(IEnvironment.MODULE_PREFIX + "Resources", new ResourcesModule());
+		variables.put(IEnvironment.MODULE_PREFIX + "Scripting", new ScriptingModule());
+		variables.put(IEnvironment.MODULE_PREFIX + "UI", new UIModule());
+
+		final IScriptEngine engine = mock(IScriptEngine.class);
+		when(engine.getDescription()).thenReturn(engineDescription);
+		when(engine.getVariables()).thenReturn(variables);
+
+		return engine;
+	}
+}
diff --git a/tests/pom.xml b/tests/pom.xml
index a9e1d40..8ea53ca 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -24,7 +24,16 @@
 				<artifactId>tycho-surefire-plugin</artifactId>
 				<version>${tycho.version}</version>
 				<configuration>
-					<providerHint>junit5</providerHint>
+					<providerHint>junit57</providerHint>
+					<trimStackTrace>false</trimStackTrace>
+					
+					<dependencies>
+						<!-- avoid CNFE in Surefire when looking for JUnitPlatformProvider -->
+						<dependency>
+							<artifactId>org.junit</artifactId>
+							<type>eclipse-plugin</type>
+						</dependency>
+					</dependencies>
 				</configuration>
 			</plugin>