blob: ed20abfbd9ec8df6ea66dc266ac10b3eca05165d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 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.ui.completion.provider;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.Collection;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.ease.ICompletionContext;
import org.eclipse.ease.ui.completion.BasicContext;
import org.eclipse.ease.ui.completion.ScriptCompletionProposal;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
public class AbstractFileLocationCompletionProviderTest {
private AbstractFileLocationCompletionProvider fProvider;
// private static final String TEST_FILE = "test.file";
private static final String PROJECT_NAME = "Sample project";
private static final String FOLDER_NAME = "Subfolder";
private static final String FILE1_NAME = "test file.txt";
private static final String FILE2_NAME = "test file b.txt";
private static final String NEW_FILE_NAME = "another_file.txt";
private static final String FILE1_CONTENT = "Hello world";
private static final String DOES_NOT_EXIST = "does_not_exist";
private IWorkspaceRoot fWorkspace;
private IProject fProject;
private IFolder fFolder;
private IFile fFile1;
private IFile fFile2;
private File fFsWorkspace;
private File fFsProject;
private File fFsFolder;
private File fFsFile1;
private File fFsFile2;
public static boolean isWindows() {
return System.getProperty("os.name").toLowerCase().startsWith("windows");
}
public static boolean isLinux() {
return System.getProperty("os.name").toLowerCase().startsWith("linux");
}
@BeforeEach
public void setUp() throws Exception {
// create workspace sample project
fWorkspace = ResourcesPlugin.getWorkspace().getRoot();
fProject = fWorkspace.getProject(PROJECT_NAME);
if (!fProject.exists())
fProject.create(null);
if (!fProject.isOpen())
fProject.open(null);
fFolder = fProject.getFolder(FOLDER_NAME);
if (!fFolder.exists())
fFolder.create(0, true, null);
fFile1 = fProject.getFile(FILE1_NAME);
if (!fFile1.exists())
fFile1.create(new ByteArrayInputStream(FILE1_CONTENT.getBytes("UTF-8")), false, null);
fFile2 = fFolder.getFile(FILE2_NAME);
if (!fFile2.exists())
fFile2.create(new ByteArrayInputStream("Hello eclipse".getBytes("UTF-8")), false, null);
fFsFile1 = fFile1.getLocation().toFile();
fFsFile2 = fFile2.getLocation().toFile();
fFsFolder = fFsFile1.getParentFile();
fFsProject = fFsFolder.getParentFile();
fFsWorkspace = fWorkspace.getRawLocation().toFile();
fProvider = new AbstractFileLocationCompletionProvider() {
};
}
@AfterAll
public static void tearDown() throws CoreException {
final IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot();
if (workspace != null) {
final IProject project = workspace.getProject(PROJECT_NAME);
if (project != null)
project.delete(true, true, null);
}
}
@Test
@DisplayName("getProposals('') contains 'workspace://'")
public void getProposals_contains_workspace_root() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext(""));
assertNotNull(findProposal(proposals, "workspace://"));
}
@Test
@DisplayName("getProposals('') contains 'file://'")
public void getProposals_contains_filesystem_root() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext(""));
assertNotNull(findProposal(proposals, "file://"));
}
@Test
@DisplayName("getProposals('') does not contain 'project://' without resource")
public void getProposals_does_not_contain_project_root_without_resource() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext(""));
assertNull(findProposal(proposals, "project://"));
}
@Test
@DisplayName("getProposals('') does not contain 'project://' with file resource")
public void getProposals_does_not_contain_project_root_with_file_resource() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("", fFsFile1));
assertNull(findProposal(proposals, "project://"));
}
@Test
@DisplayName("getProposals('') contains 'project://' with workspace resource")
public void getProposals_contains_project_root_with_workspace_resource() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("", fFile1));
assertNotNull(findProposal(proposals, "project://"));
}
@Test
@DisplayName("getProposals('workspace://') contains projects")
public void getProposals_contains_projects_for_workspace_root() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("workspace://"));
assertNotNull(findProposal(proposals, fProject.getName()));
}
@Test
@DisplayName("getProposals('workspace://') does not contain '..'")
public void getProposals_does_not_contain_back_proposal() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("workspace://"));
assertNull(findProposal(proposals, ".."));
}
@Test
@DisplayName("getProposals('workspace://<project>/') contains project root folders")
public void getProposals_contains_project_root_folders_for_workspace_project() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("workspace://" + fProject.getName() + "/"));
assertNotNull(findProposal(proposals, fFolder.getName()));
}
@Test
@DisplayName("getProposals('workspace://<project>/<folder>/../') contains project root folders")
public void getProposals_contains_project_root_folders_for_workspace_project_with_back_path() {
final Collection<ScriptCompletionProposal> proposals = fProvider
.getProposals(createContext("workspace://" + fProject.getName() + "/" + fFolder.getName() + "/../"));
assertNotNull(findProposal(proposals, fFolder.getName()));
}
@Test
@DisplayName("getProposals('workspace://<project>/') contains project root files")
public void getProposals_contains_project_root_files_for_workspace_project() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("workspace://" + fProject.getName() + "/"));
assertNotNull(findProposal(proposals, fFile1.getName()));
}
@Test
@DisplayName("getProposals('workspace://<project>/') does not contain '..'")
public void getProposals_does_not_contain_back_proposal_for_project() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("workspace://" + fProject.getName() + "/"));
assertNull(findProposal(proposals, ".."));
}
@Test
@DisplayName("getProposals('workspace://<project>/<folder>/') contains folder files")
public void getProposals_contains_files_for_workspace_folder() {
final Collection<ScriptCompletionProposal> proposals = fProvider
.getProposals(createContext("workspace://" + fProject.getName() + "/" + fFolder.getName() + "/"));
assertNotNull(findProposal(proposals, fFile2.getName()));
}
@Test
@DisplayName("getProposals('workspace://<project>/<folder>/') contains '..' proposal")
public void getProposals_contains_back_for_workspace_folder() {
final Collection<ScriptCompletionProposal> proposals = fProvider
.getProposals(createContext("workspace://" + fProject.getName() + "/" + fFolder.getName() + "/"));
assertNotNull(findProposal(proposals, ".."));
}
@Test
@DisplayName("'..' proposal for 'workspace://<project>/<folder>/' contains correct replacement string")
public void back_proposal_contains_correct_replacement_string_for_absolute_workspace_folder_link() {
final Collection<ScriptCompletionProposal> proposals = fProvider
.getProposals(createContext("workspace://" + fProject.getName() + "/" + fFolder.getName() + "/"));
final ScriptCompletionProposal proposal = findProposal(proposals, "..");
assertEquals("\"workspace://" + fProject.getName() + "/" + fFolder.getName() + "/../", proposal.getContent());
}
@DisplayName("getProposals('project://') contains project root folders")
public void getProposals_contains_project_root_folders_for_project_root() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("project://", fFile2));
assertNotNull(findProposal(proposals, fFolder.getName()));
}
@Test
@DisplayName("getProposals('project://') contains project root files")
public void getProposals_contains_project_root_files_for_project_root() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("project://", fFile2));
assertNotNull(findProposal(proposals, fFile1.getName()));
}
@Test
@DisplayName("getProposals('project://<folder>/') contains folder files")
public void getProposals_contains_files_for_project_folder() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("project://" + fFolder.getName() + "/", fFile2));
assertNotNull(findProposal(proposals, fFile2.getName()));
}
@Test
@DisplayName("getProposals('project://<folder>/') contains '..' proposal")
public void getProposals_contains_back_for_project_folder() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("project://" + fFolder.getName() + "/", fFile2));
assertNotNull(findProposal(proposals, ".."));
}
@Test
@DisplayName("'..' proposal for 'project://<folder>/' contains correct replacement string")
public void back_proposal_contains_correct_replacement_string_for_relative_workspace_folder_link() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("project://" + fFolder.getName() + "/", fFile2));
final ScriptCompletionProposal proposal = findProposal(proposals, "..");
assertEquals("\"project://" + fFolder.getName() + "/../", proposal.getContent());
}
@Test
@DisplayName("getProposals('file://') contains root file systems")
public void getProposals_contains_root_file_systems() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("file://"));
for (final File root : File.listRoots())
assertNotNull(findProposal(proposals, root.getName()), String.format("Root entry not found for %s", root.getName()));
}
@Test
@DisplayName("getProposals('') contains files for project")
public void getProposals_contains_files_for_project() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("", fProject));
assertNotNull(findProposal(proposals, fFile1.getName()));
}
@Test
@DisplayName("getProposals('') contains files for filesystem")
public void getProposals_contains_files_for_filesystem() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("", fFsFile1));
assertNotNull(findProposal(proposals, fFsFile1.getName()));
}
@Test
@DisplayName("getProposals('') contains '..' for filesystem")
public void getProposals_contains_back_for_filesystem() {
final Collection<ScriptCompletionProposal> proposals = fProvider.getProposals(createContext("", fFsFile1));
assertNotNull(findProposal(proposals, ".."));
}
private ScriptCompletionProposal findProposal(Collection<ScriptCompletionProposal> proposals, String displayString) {
return proposals.stream().filter(p -> p.getDisplayString().startsWith(displayString)).findFirst().orElseGet(() -> null);
}
private ICompletionContext createContext(String input) {
return createContext(input, null);
}
private ICompletionContext createContext(String input, Object resource) {
return new BasicContext(null, resource, "\"" + input, input.length() + 1);
}
}