/*
* Copyright 2016 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.robotframework.ide.eclipse.main.plugin.assist;
import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Lists.newArrayList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.robotframework.ide.eclipse.main.plugin.assist.Commons.substringMatcher;
import static org.robotframework.ide.eclipse.main.plugin.assist.Commons.toLabels;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
import org.robotframework.ide.eclipse.main.plugin.model.RobotModel;
import org.robotframework.ide.eclipse.main.plugin.model.RobotProject;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile;
import org.robotframework.ide.eclipse.main.plugin.project.library.LibrarySpecification;
import org.robotframework.red.junit.ProjectProvider;
public class RedImportProposalsTest {
@ClassRule
public static ProjectProvider projectProvider = new ProjectProvider(RedImportProposalsTest.class);
private RobotModel robotModel;
@Before
public void beforeTest() {
robotModel = new RobotModel();
final RobotProject robotProject = robotModel.createRobotProject(projectProvider.getProject());
robotProject.setStandardLibraries(createStandardLibraries());
}
private static Map<String, LibrarySpecification> createStandardLibraries() {
final Map<String, LibrarySpecification> stdLibs = new HashMap<>();
for (final String libName : newArrayList("StdLib1", "StdLib2", "StdLib3")) {
final LibrarySpecification stdLib = new LibrarySpecification();
stdLib.setName(libName);
stdLibs.put(stdLib.getName(), stdLib);
}
return stdLibs;
}
@Test
public void noImportProposalsAreProvided_whenNothingIsImported_1() throws Exception {
final IFile file = projectProvider.createFile("file.robot",
"*** Test Cases ***");
final RobotSuiteFile model = robotModel.createSuiteFile(file);
final RedImportProposals proposalsProvider = new RedImportProposals(model);
assertThat(proposalsProvider.getImportsProposals("")).isEmpty();
file.delete(true, null);
}
@Test
public void noImportProposalsAreProvided_whenNothingIsImported_2() throws Exception {
final IFile file = projectProvider.createFile("file.robot",
"*** Settings ***",
"*** Test Cases ***");
final RobotSuiteFile model = robotModel.createSuiteFile(file);
final RedImportProposals proposalsProvider = new RedImportProposals(model);
assertThat(proposalsProvider.getImportsProposals("")).isEmpty();
file.delete(true, null);
}
@Test
public void noImportProposalsAreProvided_whenNothingIsMatchingGivenPrefix() throws Exception {
final IFile file = projectProvider.createFile("file.robot",
"*** Settings ***",
"Library StdLib1",
"Resource res1.robot",
"*** Test Cases ***");
final RobotSuiteFile model = robotModel.createSuiteFile(file);
final RedImportProposals proposalsProvider = new RedImportProposals(model);
assertThat(proposalsProvider.getImportsProposals("unknown")).isEmpty();
file.delete(true, null);
}
@Test
public void onlyImportProposalsMatchingPrefixAreProvided_whenPrefixIsGivenAndDefaultMatcherIsUsed()
throws Exception {
final IFile file = projectProvider.createFile("file.robot",
"*** Settings ***",
"Library StdLib1",
"Library RefLib1",
"Resource res1.robot",
"Resource other.robot",
"*** Test Cases ***");
final RobotSuiteFile model = robotModel.createSuiteFile(file);
final RedImportProposals proposalsProvider = new RedImportProposals(model);
final List<? extends AssistProposal> proposals = proposalsProvider.getImportsProposals("std");
assertThat(transform(proposals, toLabels())).containsExactly("StdLib1");
file.delete(true, null);
}
@Test
public void onlyImportProposalsMatchingInputAreProvided_whenCustomMatcherIsUsed() throws Exception {
final IFile file = projectProvider.createFile("file.robot",
"*** Settings ***",
"Library StdLib1",
"Library RefLib1",
"Resource res1.robot",
"Resource other.robot",
"*** Test Cases ***");
final RobotSuiteFile model = robotModel.createSuiteFile(file);
final RedImportProposals proposalsProvider = new RedImportProposals(model, substringMatcher());
final List<? extends AssistProposal> proposals = proposalsProvider.getImportsProposals("1");
assertThat(transform(proposals, toLabels())).containsExactly("StdLib1", "res1");
file.delete(true, null);
}
@Test
public void allImportProposalsAreProvided_whenPrefixIsEmptyAndDefaultMatcherIsUsed() throws Exception {
final IFile file = projectProvider.createFile("file.robot",
"*** Settings ***",
"Library StdLib1",
"Library RefLib1",
"Resource res1.robot",
"Resource other.robot",
"*** Test Cases ***");
final RobotSuiteFile model = robotModel.createSuiteFile(file);
final RedImportProposals proposalsProvider = new RedImportProposals(model);
final List<? extends AssistProposal> proposals = proposalsProvider.getImportsProposals("");
assertThat(transform(proposals, toLabels())).containsExactly("StdLib1", "other", "res1");
file.delete(true, null);
}
@Test
public void allImportProposalsAreProvided_whenPrefixIsBddSyntaxEmptyAndDefaultMatcherIsUsed() throws Exception {
final IFile file = projectProvider.createFile("file.robot",
"*** Settings ***",
"Library StdLib1",
"Library RefLib1",
"Resource res1.robot",
"Resource other.robot",
"*** Test Cases ***");
final RobotSuiteFile model = robotModel.createSuiteFile(file);
final RedImportProposals proposalsProvider = new RedImportProposals(model);
for (final String bddPrefix : newArrayList("Given", "When", "And", "But", "Then")) {
final List<? extends AssistProposal> proposals = proposalsProvider.getImportsProposals(bddPrefix + " ");
assertThat(transform(proposals, toLabels())).containsExactly("StdLib1", "other", "res1");
}
file.delete(true, null);
}
@Test
public void allImportProposalsAreProvidedInOrderInducedByComparator_whenCustomComparatorIsUsed()
throws Exception {
final IFile file = projectProvider.createFile("file.robot",
"*** Settings ***",
"Library StdLib1",
"Library RefLib1",
"Resource res1.robot",
"Resource other.robot",
"*** Test Cases ***");
final RobotSuiteFile model = robotModel.createSuiteFile(file);
final RedImportProposals proposalsProvider = new RedImportProposals(model, substringMatcher());
final Comparator<? super RedImportProposal> comparator = new Comparator<RedImportProposal>() {
@Override
public int compare(final RedImportProposal p1, final RedImportProposal p2) {
if (p1.equals(p2)) {
return 0;
} else if (p1.getLabel().contains("res1")) {
return -1;
} else {
return 1;
}
}
};
final List<? extends AssistProposal> proposals = proposalsProvider.getImportsProposals("e", comparator);
assertThat(transform(proposals, toLabels())).containsExactly("res1", "other");
file.delete(true, null);
}
@Test
public void libraryAliasesAreProvided_whenImportsAreUsingWithNameSyntax() throws Exception {
final IFile file = projectProvider.createFile("file.robot",
"*** Settings ***",
"Library StdLib1 WITH NAME lib_y",
"Library StdLib2 WITH NAME lib_x",
"*** Test Cases ***");
final RobotSuiteFile model = robotModel.createSuiteFile(file);
final RedImportProposals proposalsProvider = new RedImportProposals(model);
final List<? extends AssistProposal> proposals = proposalsProvider.getImportsProposals("");
assertThat(transform(proposals, toLabels())).containsExactly("lib_x", "lib_y");
file.delete(true, null);
}
}