/*
* 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.project.build.validation;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.junit.Before;
import org.junit.Test;
import org.rf.ide.core.executor.SuiteExecutor;
import org.rf.ide.core.project.RobotProjectConfig.ReferencedLibrary;
import org.rf.ide.core.testdata.model.RobotVersion;
import org.rf.ide.core.testdata.model.search.keyword.KeywordScope;
import org.rf.ide.core.validation.ProblemPosition;
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.RobotSettingsSection;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile;
import org.robotframework.ide.eclipse.main.plugin.model.locators.AccessibleKeywordsEntities.AccessibleKeywordsCollector;
import org.robotframework.ide.eclipse.main.plugin.model.locators.KeywordEntity;
import org.robotframework.ide.eclipse.main.plugin.project.build.causes.ArgumentProblem;
import org.robotframework.ide.eclipse.main.plugin.project.build.causes.GeneralSettingsProblem;
import org.robotframework.ide.eclipse.main.plugin.project.build.causes.KeywordsProblem;
import org.robotframework.ide.eclipse.main.plugin.project.build.causes.VariablesProblem;
import org.robotframework.ide.eclipse.main.plugin.project.build.validation.FileValidationContext.ValidationKeywordEntity;
import org.robotframework.ide.eclipse.main.plugin.project.build.validation.MockReporter.Problem;
import org.robotframework.ide.eclipse.main.plugin.project.library.ArgumentsDescriptor;
import org.robotframework.ide.eclipse.main.plugin.project.library.LibrarySpecification;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Range;
public class GeneralSettingsTableValidatorTest {
private MockReporter reporter;
@Before
public void beforeTest() {
reporter = new MockReporter();
}
@Test
public void unknownSettingIsReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Unknown Setting")
.build();
final FileValidationContext context = prepareContext();
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(1);
assertThat(reporter.getReportedProblems()).containsExactly(
new Problem(GeneralSettingsProblem.UNKNOWN_SETTING, new ProblemPosition(2, Range.closed(17, 32))));
}
@Test
public void emptySettingsAreReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Test Setup")
.appendLine("Documentation")
.appendLine("Metadata")
.appendLine("Default Tags")
.appendLine("Test Template")
.appendLine("Test Timeout")
.build();
final FileValidationContext context = prepareContext();
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(6);
assertThat(reporter.getReportedProblems()).contains(
new Problem(GeneralSettingsProblem.EMPTY_SETTING, new ProblemPosition(2, Range.closed(17, 27))),
new Problem(GeneralSettingsProblem.EMPTY_SETTING, new ProblemPosition(3, Range.closed(28, 41))),
new Problem(GeneralSettingsProblem.EMPTY_SETTING, new ProblemPosition(4, Range.closed(42, 50))),
new Problem(GeneralSettingsProblem.EMPTY_SETTING, new ProblemPosition(5, Range.closed(51, 63))),
new Problem(GeneralSettingsProblem.EMPTY_SETTING, new ProblemPosition(6, Range.closed(64, 77))),
new Problem(GeneralSettingsProblem.EMPTY_SETTING, new ProblemPosition(7, Range.closed(78, 90))));
}
@Test
public void undeclaredVariableAndKeywordInSuiteSetupAreReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Suite Setup kw ${var}")
.build();
final FileValidationContext context = prepareContext();
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(2);
assertThat(reporter.getReportedProblems()).containsExactly(
new Problem(KeywordsProblem.UNKNOWN_KEYWORD, new ProblemPosition(2, Range.closed(30, 32))),
new Problem(VariablesProblem.UNDECLARED_VARIABLE_USE, new ProblemPosition(2, Range.closed(34, 40))));
}
@Test
public void undeclaredVariableAndKeywordInSuiteTeardownAreReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Suite Teardown kw ${var}")
.build();
final FileValidationContext context = prepareContext();
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(2);
assertThat(reporter.getReportedProblems()).containsExactly(
new Problem(KeywordsProblem.UNKNOWN_KEYWORD, new ProblemPosition(2, Range.closed(33, 35))),
new Problem(VariablesProblem.UNDECLARED_VARIABLE_USE, new ProblemPosition(2, Range.closed(37, 43))));
}
@Test
public void undeclaredVariableAndKeywordInTestSetupAreReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Test Setup kw ${var}")
.build();
final FileValidationContext context = prepareContext();
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(2);
assertThat(reporter.getReportedProblems()).containsExactly(
new Problem(KeywordsProblem.UNKNOWN_KEYWORD, new ProblemPosition(2, Range.closed(29, 31))),
new Problem(VariablesProblem.UNDECLARED_VARIABLE_USE, new ProblemPosition(2, Range.closed(33, 39))));
}
@Test
public void undeclaredVariableAndKeywordInTestTeardownAreReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Test Teardown kw ${var}")
.build();
final FileValidationContext context = prepareContext();
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(2);
assertThat(reporter.getReportedProblems()).containsExactly(
new Problem(KeywordsProblem.UNKNOWN_KEYWORD, new ProblemPosition(2, Range.closed(32, 34))),
new Problem(VariablesProblem.UNDECLARED_VARIABLE_USE, new ProblemPosition(2, Range.closed(36, 42))));
}
@Test
public void givenTestCaseWithEnvironmentVariable_whenNoMarkersShouldBeReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Suite Setup kw %{PATH}")
.build();
final KeywordEntity entity = newValidationKeywordEntity(KeywordScope.RESOURCE, "res", "kw",
new Path("/res.robot"), "var");
final ImmutableMap<String, Collection<KeywordEntity>> accessibleKws = ImmutableMap.of("kw",
(Collection<KeywordEntity>) Lists.<KeywordEntity> newArrayList(entity));
final FileValidationContext context = prepareContext(accessibleKws);
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(0);
assertThat(reporter.getReportedProblems()).isEmpty();
}
@Test
public void declaredVariableAndKeywordInSetupsAndTeardownsAreNotReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Suite Setup kw ${var}")
.appendLine("Suite Teardown kw ${var}")
.appendLine("Test Setup kw ${var}")
.appendLine("Test Teardown kw ${var}")
.build();
final KeywordEntity entity = newValidationKeywordEntity(KeywordScope.LOCAL, "suite", "kw",
new Path("/suite.robot"), "arg");
final ImmutableMap<String, Collection<KeywordEntity>> accessibleKws = ImmutableMap.of("kw",
(Collection<KeywordEntity>) Lists.<KeywordEntity> newArrayList(entity));
final Set<String> accessibleVariables = new HashSet<>();
accessibleVariables.add("${var}");
final FileValidationContext context = prepareContext(accessibleKws, accessibleVariables);
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(0);
}
@Test
public void declaredVariableAsKeywordInSetupsAndTeardownsIsReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Suite Setup ${var}")
.appendLine("Test Setup ${var}")
.appendLine("Suite Teardown ${var}")
.appendLine("Test Teardown ${var}")
.build();
final Set<String> accessibleVariables = new HashSet<>();
accessibleVariables.add("${var}");
final FileValidationContext context = prepareContext(new HashMap<String, Collection<KeywordEntity>>(),
accessibleVariables);
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(4);
assertThat(reporter.getReportedProblems()).contains(
new Problem(GeneralSettingsProblem.VARIABLE_AS_KEYWORD_USAGE_IN_SETTING,
new ProblemPosition(2, Range.closed(30, 36))),
new Problem(GeneralSettingsProblem.VARIABLE_AS_KEYWORD_USAGE_IN_SETTING,
new ProblemPosition(3, Range.closed(49, 55))),
new Problem(GeneralSettingsProblem.VARIABLE_AS_KEYWORD_USAGE_IN_SETTING,
new ProblemPosition(4, Range.closed(72, 78))),
new Problem(GeneralSettingsProblem.VARIABLE_AS_KEYWORD_USAGE_IN_SETTING,
new ProblemPosition(5, Range.closed(94, 100))));
}
@Test
public void undeclaredVariableInTagsIsReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Default Tags ${var} ${var1}")
.appendLine("Force Tags ${var} ${var2}")
.build();
final Set<String> accessibleVariables = new HashSet<>();
accessibleVariables.add("${var}");
final FileValidationContext context = prepareContext(new HashMap<String, Collection<KeywordEntity>>(),
accessibleVariables);
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(2);
assertThat(reporter.getReportedProblems()).contains(
new Problem(VariablesProblem.UNDECLARED_VARIABLE_USE, new ProblemPosition(2, Range.closed(39, 46))),
new Problem(VariablesProblem.UNDECLARED_VARIABLE_USE, new ProblemPosition(3, Range.closed(67, 74))));
}
@Test
public void undeclaredKeywordInTemplateIsReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Test Template kw1 ${var}")
.build();
final FileValidationContext context = prepareContext();
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(1);
assertThat(reporter.getReportedProblems())
.contains(new Problem(KeywordsProblem.UNKNOWN_KEYWORD, new ProblemPosition(2, Range.closed(32, 42))));
}
@Test
public void declaredKeywordInTemplateIsNotReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Test Template kw1 ${arg}")
.build();
final KeywordEntity entity = newValidationKeywordEntity(KeywordScope.LOCAL, "suite", "kw1 ${arg}",
new Path("/suite.robot"), "arg");
final ImmutableMap<String, Collection<KeywordEntity>> accessibleKws = ImmutableMap.of("kw1 ${arg}",
(Collection<KeywordEntity>) Lists.<KeywordEntity> newArrayList(entity));
final FileValidationContext context = prepareContext(accessibleKws);
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(0);
}
@Test
public void undeclaredVariableInTimeoutIsReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Test Timeout ${var}")
.build();
final FileValidationContext context = prepareContext();
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(1);
assertThat(reporter.getReportedProblems()).contains(
new Problem(VariablesProblem.UNDECLARED_VARIABLE_USE, new ProblemPosition(2, Range.closed(31, 37))));
}
@Test
public void undefinedTimeFormatInTimeoutIsReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Test Timeout time")
.build();
final FileValidationContext context = prepareContext();
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(1);
assertThat(reporter.getReportedProblems()).contains(
new Problem(ArgumentProblem.INVALID_TIME_FORMAT, new ProblemPosition(2, Range.closed(31, 35))));
}
@Test
public void definedTimeFormatInTimeoutIsNotReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Test Timeout 3 seconds")
.build();
final FileValidationContext context = prepareContext();
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(0);
}
@Test
public void declaredVariableInTimeoutIsNotReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Settings ***")
.appendLine("Test Timeout ${var}")
.build();
final Set<String> accessibleVariables = new HashSet<>();
accessibleVariables.add("${var}");
final FileValidationContext context = prepareContext(new HashMap<String, Collection<KeywordEntity>>(),
accessibleVariables);
final GeneralSettingsTableValidator validator = new GeneralSettingsTableValidator(context,
file.findSection(RobotSettingsSection.class), reporter);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(0);
}
private static KeywordEntity newValidationKeywordEntity(final KeywordScope scope, final String sourceName,
final String name, final IPath exposingPath, final String... args) {
return new ValidationKeywordEntity(scope, sourceName, name, "", false, exposingPath, 0,
ArgumentsDescriptor.createDescriptor(args));
}
private static FileValidationContext prepareContext() {
return prepareContext(new HashMap<String, Collection<KeywordEntity>>());
}
private static FileValidationContext prepareContext(final Map<String, Collection<KeywordEntity>> map) {
return prepareContext(createKeywordsCollector(map), new HashSet<String>());
}
private static FileValidationContext prepareContext(final Map<String, Collection<KeywordEntity>> map,
final Set<String> accessibleVariables) {
return prepareContext(createKeywordsCollector(map), accessibleVariables);
}
private static FileValidationContext prepareContext(final AccessibleKeywordsCollector collector,
final Set<String> accessibleVariables) {
final ValidationContext parentContext = new ValidationContext(new RobotModel(), RobotVersion.from("0.0"),
SuiteExecutor.Python, Maps.<String, LibrarySpecification> newHashMap(),
Maps.<ReferencedLibrary, LibrarySpecification> newHashMap());
final IFile file = mock(IFile.class);
when(file.getFullPath()).thenReturn(new Path("/suite.robot"));
final FileValidationContext context = new FileValidationContext(parentContext, file, collector,
accessibleVariables);
return context;
}
private static AccessibleKeywordsCollector createKeywordsCollector(
final Map<String, Collection<KeywordEntity>> map) {
return new AccessibleKeywordsCollector() {
@Override
public Map<String, Collection<KeywordEntity>> collect() {
return map;
}
};
}
}