/*
* Copyright 2016 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.rf.ide.core.testdata.model.table.exec.descs.ast.mapping;
import static org.assertj.core.api.Assertions.assertThat;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.rf.ide.core.test.helpers.ClassFieldCleaner;
import org.rf.ide.core.test.helpers.ClassFieldCleaner.ForClean;
import org.rf.ide.core.testdata.model.table.exec.descs.TextPosition;
import org.rf.ide.core.testdata.model.table.exec.descs.VariableExtractor;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
@RunWith(Parameterized.class)
public class VariableComputationHelperExtractionParametrizedTest {
private final static Pattern SPLIT_CSV_PATTERN = Pattern.compile("(?<!\\\\),");
private final static Pattern NUMBER = Pattern.compile("[0-9]+");
@Parameters(name = "${0}")
public static Iterable<Object[]> data() throws Exception {
final List<String> lines = Files.readAllLines(Paths.get(VariableComputationHelperExtractionParametrizedTest.class
.getResource("VAR_WITH_MATH_OPERATIONS.cvs").toURI()), Charset.forName("UTF-8"));
final List<Object[]> o = new ArrayList<>(0);
int lineNumber = 0;
for (final String line : lines) {
lineNumber++;
if ("".equals(line.trim()) || line.trim().startsWith("#")) {
continue;
}
final String[] split = SPLIT_CSV_PATTERN.split(line);
if (split.length != 5) {
throw new IllegalStateException(
"Expected 5 columns for each line. Line " + lineNumber + " has " + split.length);
}
final String testName = split[0];
final String text = split[1];
final String variableNameStartText = split[2];
int variableNameStart = -1;
if (NUMBER.matcher(variableNameStartText).matches()) {
variableNameStart = Integer.parseInt(variableNameStartText);
} else {
throw new IllegalStateException(
"Variable name start - column 3, should be number from 0 to Integer.MAX got: "
+ variableNameStartText + ". Line " + lineNumber);
}
final String variableName = split[3];
final String shouldExtractText = split[4].trim().toLowerCase();
boolean shouldExtract = false;
if ("false".equals(shouldExtractText) || "true".equals(shouldExtractText)) {
shouldExtract = Boolean.parseBoolean(shouldExtractText);
} else {
throw new IllegalStateException("Flag should extract - column 5, should be boolean got: "
+ shouldExtractText + ". Line " + lineNumber);
}
final Object[] p = new Object[5];
p[0] = testName;
p[1] = text;
p[2] = variableNameStart;
p[3] = variableName;
p[4] = shouldExtract;
o.add(p);
}
return o;
}
@ForClean
private VariableComputationHelper vch;
private final String testName;
private final String text;
private final int variableNameStart;
private final String variableName;
private final boolean shouldExtract;
public VariableComputationHelperExtractionParametrizedTest(final String testName, final String text,
final int variableNameStart, final String variableName, final boolean shouldExtract) {
this.testName = testName;
this.text = text;
this.variableNameStart = variableNameStart;
this.variableName = variableName;
this.shouldExtract = shouldExtract;
}
@Test
public void test() {
assertForText(text, variableNameStart, variableName, shouldExtract);
}
private void assertForText(final String text, final int variableNameStart, final String variableName,
final boolean shouldExtract) {
final Optional<TextPosition> result = performOperationsFor(text);
if (shouldExtract) {
assertThat(result.isPresent()).isTrue();
final TextPosition varName = result.get();
assertThat(varName.getFullText()).isEqualTo(text);
assertThat(varName.getStart()).isEqualTo(variableNameStart);
assertThat(varName.getText()).isEqualTo(variableName);
assertThat(varName.getLength()).isEqualTo(variableName.length());
assertThat(varName.getEnd()).isEqualTo(variableNameStart + variableName.length() - 1);
} else {
assertThat(result.isPresent()).isFalse();
}
}
private Optional<TextPosition> performOperationsFor(final String text) {
final RobotToken token = new RobotToken();
token.setStartOffset(0);
token.setLineNumber(1);
token.setStartColumn(0);
token.setRaw(text);
token.setText(text);
final VariableExtractor varExtractor = new VariableExtractor();
final MappingResult extract = varExtractor.extract(token, "fileName_" + testName);
final List<VariableDeclaration> correctVariables = extract.getCorrectVariables();
return vch.extractVariableName(correctVariables.get(0));
}
@Before
public void setUp() throws Exception {
vch = new VariableComputationHelper();
}
@After
public void tearDown() throws Exception {
ClassFieldCleaner.init(this);
}
}