/*
* Copyright 2015 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 com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newHashSet;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
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.table.variables.IVariableHolder;
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.RobotSuiteFile;
import org.robotframework.ide.eclipse.main.plugin.model.RobotVariablesSection;
import org.robotframework.ide.eclipse.main.plugin.project.build.ProblemsReportingStrategy;
import org.robotframework.ide.eclipse.main.plugin.project.build.RobotProblem;
import org.robotframework.ide.eclipse.main.plugin.project.build.causes.IProblemCause;
import org.robotframework.ide.eclipse.main.plugin.project.build.causes.VariablesProblem;
import org.robotframework.ide.eclipse.main.plugin.project.build.validation.MockReporter.Problem;
import org.robotframework.ide.eclipse.main.plugin.project.build.validation.versiondependent.VersionDependentModelUnitValidator;
import org.robotframework.ide.eclipse.main.plugin.project.build.validation.versiondependent.VersionDependentValidators;
import org.robotframework.ide.eclipse.main.plugin.project.library.LibrarySpecification;
import com.google.common.collect.Maps;
import com.google.common.collect.Range;
public class VariablesTableValidatorTest {
private MockReporter reporter;
@Before
public void beforeTest() {
reporter = new MockReporter();
}
@Test
public void nothingIsReported_whenThereIsNoVariablesSection() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("").build();
final FileValidationContext context = prepareContext();
final VariablesTableValidator validator = new VariablesTableValidator(context,
file.findSection(RobotVariablesSection.class), reporter, createVersionDependentValidators());
validator.validate(null);
assertThat(reporter.wasProblemReported()).isFalse();
}
@Test
public void nothingIsReported_whenValidVariablesAreDefined() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator()
.appendLine("*** Variables ***")
.appendLine("${scalar} 1")
.appendLine("@{list} 1")
.appendLine("&{dict} k=v")
.build();
final FileValidationContext context = prepareContext();
final VariablesTableValidator validator = new VariablesTableValidator(context,
file.findSection(RobotVariablesSection.class), reporter, createVersionDependentValidators());
validator.validate(null);
assertThat(reporter.wasProblemReported()).isFalse();
}
@Test
public void customProblemsAreRaised_whenVersionDependentValidatorsAreUsed() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator()
.appendLine("*** Variables ***")
.appendLine("${scalar} 1")
.build();
final IProblemCause mockedCause = mock(IProblemCause.class);
final VersionDependentModelUnitValidator alwaysFailingVersionDepValidator_1 = new VersionDependentModelUnitValidator() {
@Override
public void validate(final IProgressMonitor monitor) throws CoreException {
reporter.handleProblem(RobotProblem.causedBy(mockedCause), null,
new ProblemPosition(2, Range.closed(18, 27)));
}
@Override
protected Range<RobotVersion> getApplicableVersionRange() {
return Range.all();
}
};
final VersionDependentModelUnitValidator alwaysFailingVersionDepValidator_2 = new VersionDependentModelUnitValidator() {
@Override
public void validate(final IProgressMonitor monitor) throws CoreException {
reporter.handleProblem(RobotProblem.causedBy(mockedCause), null,
new ProblemPosition(2, Range.closed(18, 30)));
}
@Override
protected Range<RobotVersion> getApplicableVersionRange() {
return Range.all();
}
};
final VersionDependentModelUnitValidator alwaysPassingVersionDepValidator = new VersionDependentModelUnitValidator() {
@Override
public void validate(final IProgressMonitor monitor) throws CoreException {
// that's fine it passes
}
@Override
protected Range<RobotVersion> getApplicableVersionRange() {
return Range.all();
}
};
final VersionDependentValidators versionValidators = createVersionDependentValidators(
alwaysFailingVersionDepValidator_1, alwaysFailingVersionDepValidator_2,
alwaysPassingVersionDepValidator);
final FileValidationContext context = prepareContext();
final VariablesTableValidator validator = new VariablesTableValidator(context,
file.findSection(RobotVariablesSection.class), reporter, versionValidators);
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(2);
assertThat(reporter.getReportedProblems()).containsOnly(
new Problem(mockedCause, new ProblemPosition(2, Range.closed(18, 27))),
new Problem(mockedCause, new ProblemPosition(2, Range.closed(18, 30))));
}
@Test
public void unrecognizedVariableIsReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator()
.appendLine("*** Variables ***")
.appendLine("var 1")
.build();
final FileValidationContext context = prepareContext();
final VariablesTableValidator validator = new VariablesTableValidator(context,
file.findSection(RobotVariablesSection.class), reporter, createVersionDependentValidators());
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(1);
assertThat(reporter.getReportedProblems()).containsExactly(
new Problem(VariablesProblem.INVALID_TYPE, new ProblemPosition(2, Range.closed(18, 21))));
}
@Test
public void invalidVariableNameIsReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator()
.appendLine("*** Variables ***")
.appendLine("$ {var} 1")
.build();
final FileValidationContext context = prepareContext();
final VariablesTableValidator validator = new VariablesTableValidator(context,
file.findSection(RobotVariablesSection.class), reporter, createVersionDependentValidators());
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(1);
assertThat(reporter.getReportedProblems()).containsExactly(
new Problem(VariablesProblem.INVALID_NAME, new ProblemPosition(2, Range.closed(18, 25))));
}
@Test
public void duplicatedVariablesAreReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator()
.appendLine("*** Variables ***")
.appendLine("${var} 1")
.appendLine("@{var} 2")
.build();
final FileValidationContext context = prepareContext();
final VariablesTableValidator validator = new VariablesTableValidator(context,
file.findSection(RobotVariablesSection.class), reporter, createVersionDependentValidators());
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(2);
assertThat(reporter.getReportedProblems()).containsOnly(
new Problem(VariablesProblem.DUPLICATED_VARIABLE, new ProblemPosition(2, Range.closed(18, 24))),
new Problem(VariablesProblem.DUPLICATED_VARIABLE, new ProblemPosition(3, Range.closed(28, 34))));
}
@Test
public void invalidDictionaryItemsAreReported() throws Exception {
final RobotSuiteFile file = new RobotSuiteFileCreator()
.appendLine("*** Variables ***")
.appendLine("&{dict} a ${b} c= d=1")
.build();
final FileValidationContext context = prepareContext(newHashSet("${b}"));
final VariablesTableValidator validator = new VariablesTableValidator(context,
file.findSection(RobotVariablesSection.class), reporter, createVersionDependentValidators());
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(2);
assertThat(reporter.getReportedProblems()).containsOnly(
new Problem(VariablesProblem.INVALID_DICTIONARY_ELEMENT_SYNTAX,
new ProblemPosition(2, Range.closed(27, 28))),
new Problem(VariablesProblem.INVALID_DICTIONARY_ELEMENT_SYNTAX,
new ProblemPosition(2, Range.closed(30, 34))));
}
@Test
public void unknownVariablesAreReportedInValues() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator()
.appendLine("*** Variables ***")
.appendLine("${scalar} ${a}")
.appendLine("@{list} ${b} ${c}")
.appendLine("&{dict} k1=${d} k2=${e}")
.build();
final FileValidationContext context = prepareContext();
final VariablesTableValidator validator = new VariablesTableValidator(context,
file.findSection(RobotVariablesSection.class), reporter, createVersionDependentValidators());
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(5);
assertThat(reporter.getReportedProblems()).containsOnly(
new Problem(VariablesProblem.UNDECLARED_VARIABLE_USE, new ProblemPosition(2, Range.closed(29, 33))),
new Problem(VariablesProblem.UNDECLARED_VARIABLE_USE, new ProblemPosition(3, Range.closed(43, 47))),
new Problem(VariablesProblem.UNDECLARED_VARIABLE_USE, new ProblemPosition(3, Range.closed(49, 53))),
new Problem(VariablesProblem.UNDECLARED_VARIABLE_USE, new ProblemPosition(4, Range.closed(66, 70))),
new Problem(VariablesProblem.UNDECLARED_VARIABLE_USE, new ProblemPosition(4, Range.closed(75, 79))));
}
@Test
public void multipleProblemsAreReported() throws CoreException {
final RobotSuiteFile file = new RobotSuiteFileCreator().appendLine("*** Variables ***")
.appendLine("scalar 1")
.appendLine("$ {x} 1")
.appendLine("${var} 1")
.appendLine("@{var} 2")
.build();
final FileValidationContext context = prepareContext();
final VariablesTableValidator validator = new VariablesTableValidator(context,
file.findSection(RobotVariablesSection.class), reporter, createVersionDependentValidators());
validator.validate(null);
assertThat(reporter.getNumberOfReportedProblems()).isEqualTo(4);
assertThat(reporter.getReportedProblems()).containsOnly(
new Problem(VariablesProblem.INVALID_TYPE, new ProblemPosition(2, Range.closed(18, 24))),
new Problem(VariablesProblem.INVALID_NAME, new ProblemPosition(3, Range.closed(28, 33))),
new Problem(VariablesProblem.DUPLICATED_VARIABLE, new ProblemPosition(4, Range.closed(37, 43))),
new Problem(VariablesProblem.DUPLICATED_VARIABLE, new ProblemPosition(5, Range.closed(47, 53))));
}
private static VersionDependentValidators createVersionDependentValidators(
final VersionDependentModelUnitValidator... validators) {
return new VersionDependentValidators() {
@Override
public Iterable<VersionDependentModelUnitValidator> getVariableValidators(
final FileValidationContext validationContext, final IVariableHolder variable,
final ProblemsReportingStrategy reporter) {
return newArrayList(validators);
}
};
}
private static FileValidationContext prepareContext() {
return prepareContext(new HashSet<String>());
}
private static FileValidationContext prepareContext(final Set<String> variables) {
final ValidationContext parentContext = new ValidationContext(new RobotModel(), RobotVersion.from("0.0"),
SuiteExecutor.Python, Maps.<String, LibrarySpecification> newHashMap(),
Maps.<ReferencedLibrary, LibrarySpecification> newHashMap());
return new FileValidationContext(parentContext, mock(IFile.class), null, variables);
}
}