/*
* 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 org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
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.EnumSet;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.robotframework.ide.eclipse.main.plugin.mockmodel.RobotSuiteFileCreator;
import org.robotframework.ide.eclipse.main.plugin.model.RobotModel;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSetting.SettingsGroup;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile;
import org.robotframework.red.junit.ProjectProvider;
public class RedFileLocationProposalsTest {
@ClassRule
public static ProjectProvider projectProvider = new ProjectProvider(RedFileLocationProposalsTest.class);
private static IFile importingFile;
@BeforeClass
public static void beforeSuite() throws Exception {
projectProvider.createDir("dir1");
projectProvider.createDir("dir1_1");
projectProvider.createDir("dir2");
importingFile = projectProvider.createFile("importing_file.robot", "*** Test Cases ***");
projectProvider.createFile("dir1/res1.robot", "*** Variables ***");
projectProvider.createFile("dir1_1/lib.py");
projectProvider.createFile("dir1_1/vars.py");
projectProvider.createFile("dir2/res2.robot", "*** Variables ***");
projectProvider.createFile("dir2/tests.robot", "*** Test Cases ***");
}
@AfterClass
public static void afterSuite() {
importingFile = null;
}
@Test
public void exceptionIsThrown_whenTryingToCreateProposalsProviderForUnsupportedSettingsGroup() {
final EnumSet<SettingsGroup> supportedSettingGroups = EnumSet.of(SettingsGroup.RESOURCES, SettingsGroup.VARIABLES);
for (final SettingsGroup importType : EnumSet.complementOf(supportedSettingGroups)) {
try {
RedFileLocationProposals.create(importType, new RobotSuiteFileCreator().build());
fail("It should not be possible to create file locations proposals for " + importType);
} catch (final IllegalStateException e) {
// that's what is expected here
}
}
}
@Test
public void noResourcesProposalsProvided_whenNoResourceIsMatchingToGivenPrefix() {
final RobotSuiteFile model = new RobotModel().createSuiteFile(importingFile);
final RedFileLocationProposals proposalsProvider = RedFileLocationProposals.create(SettingsGroup.RESOURCES,
model);
assertThat(proposalsProvider.getFilesLocationsProposals("unknown")).isEmpty();
}
@Test
public void onlyResourcesProposalsMatchingPrefixAreProvided_whenPrefixIsGivenAndDefaultMatcherIsUsed() {
final RobotSuiteFile model = new RobotModel().createSuiteFile(importingFile);
final RedFileLocationProposals proposalsProvider = RedFileLocationProposals.create(SettingsGroup.RESOURCES,
model);
final List<? extends AssistProposal> proposals = proposalsProvider
.getFilesLocationsProposals("dir1");
assertThat(transform(proposals, toLabels()))
.containsExactly("dir1/res1.robot");
}
@Test
public void onlyResourcesProposalsMatchingInputAreProvided_whenCustomMatcherIsUsed() {
final RobotSuiteFile model = new RobotModel().createSuiteFile(importingFile);
final RedFileLocationProposals proposalsProvider = RedFileLocationProposals.create(SettingsGroup.RESOURCES,
model, substringMatcher());
final List<? extends AssistProposal> proposals = proposalsProvider.getFilesLocationsProposals("1");
assertThat(transform(proposals, toLabels()))
.containsExactly("dir1/res1.robot");
}
@Test
public void allResourcesProposalsAreProvided_whenPrefixIsEmptyAndDefaultMatcherIsUsed() {
final RobotSuiteFile model = new RobotModel().createSuiteFile(importingFile);
final RedFileLocationProposals proposalsProvider = RedFileLocationProposals.create(SettingsGroup.RESOURCES,
model);
final List<? extends AssistProposal> proposals = proposalsProvider.getFilesLocationsProposals("");
assertThat(transform(proposals, toLabels())).containsExactly(
"dir1/res1.robot", "dir2/res2.robot");
}
@Test
public void allResourcesProposalsAreProvidedInOrderInducedByComparator_whenCustomComparatorIsUsed() {
final RobotSuiteFile model = new RobotModel().createSuiteFile(importingFile);
final RedFileLocationProposals proposalsProvider = RedFileLocationProposals.create(SettingsGroup.RESOURCES,
model);
final Comparator<IFile> comparator = new Comparator<IFile>() {
@Override
public int compare(final IFile o1, final IFile o2) {
if (o1.equals(o2)) {
return 0;
} else if (o1.getName().contains("2")) {
return -1;
} else {
return 1;
}
}
};
final List<? extends AssistProposal> proposals = proposalsProvider.getFilesLocationsProposals("", comparator);
assertThat(transform(proposals, toLabels())).containsExactly("dir2/res2.robot", "dir1/res1.robot");
}
@Test
public void noVariablesFilesProposalsProvided_whenNoResourceIsMatchingToGivenPrefix() {
final RobotSuiteFile model = new RobotModel().createSuiteFile(importingFile);
final RedFileLocationProposals proposalsProvider = RedFileLocationProposals.create(SettingsGroup.VARIABLES,
model);
assertThat(proposalsProvider.getFilesLocationsProposals("unknown")).isEmpty();
}
@Test
public void onlyVariablesFilesProposalsMatchingPrefixAreProvided_whenPrefixIsGivenAndDefaultMatcherIsUsed() {
final RobotSuiteFile model = new RobotModel().createSuiteFile(importingFile);
final RedFileLocationProposals proposalsProvider = RedFileLocationProposals.create(SettingsGroup.VARIABLES,
model);
final List<? extends AssistProposal> proposals = proposalsProvider
.getFilesLocationsProposals("dir1_1/l");
assertThat(transform(proposals, toLabels()))
.containsExactly("dir1_1/lib.py");
}
@Test
public void onlyVariablesFilesProposalsMatchingInputAreProvided_whenCustomMatcherIsUsed() {
final RobotSuiteFile model = new RobotModel().createSuiteFile(importingFile);
final RedFileLocationProposals proposalsProvider = RedFileLocationProposals.create(SettingsGroup.VARIABLES,
model, substringMatcher());
final List<? extends AssistProposal> proposals = proposalsProvider.getFilesLocationsProposals("vars");
assertThat(transform(proposals, toLabels()))
.containsExactly("dir1_1/vars.py");
}
@Test
public void allVariablesFilesProposalsAreProvided_whenPrefixIsEmptyAndDefaultMatcherIsUsed() {
final RobotSuiteFile model = new RobotModel().createSuiteFile(importingFile);
final RedFileLocationProposals proposalsProvider = RedFileLocationProposals.create(SettingsGroup.VARIABLES,
model);
final List<? extends AssistProposal> proposals = proposalsProvider.getFilesLocationsProposals("");
assertThat(transform(proposals, toLabels())).containsExactly(
"dir1_1/lib.py", "dir1_1/vars.py");
}
@Test
public void allVariablesFilesProposalsAreProvidedInOrderInducedByComparator_whenCustomComparatorIsUsed() {
final RobotSuiteFile model = new RobotModel().createSuiteFile(importingFile);
final RedFileLocationProposals proposalsProvider = RedFileLocationProposals.create(SettingsGroup.VARIABLES,
model);
final Comparator<IFile> comparator = new Comparator<IFile>() {
@Override
public int compare(final IFile o1, final IFile o2) {
if (o1.equals(o2)) {
return 0;
} else if (o1.getName().contains("vars")) {
return -1;
} else {
return 1;
}
}
};
final List<? extends AssistProposal> proposals = proposalsProvider.getFilesLocationsProposals("", comparator);
assertThat(transform(proposals, toLabels())).containsExactly(
"dir1_1/vars.py", "dir1_1/lib.py");
}
}