/*
* Copyright 2015 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.rf.ide.core.testdata.importer;
import static com.google.common.collect.Lists.newArrayList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.rf.ide.core.executor.RobotRuntimeEnvironment;
import org.rf.ide.core.project.ImportSearchPaths.PathsProvider;
import org.rf.ide.core.testdata.model.FilePosition;
import org.rf.ide.core.testdata.model.FileRegion;
import org.rf.ide.core.testdata.model.RobotFile;
import org.rf.ide.core.testdata.model.RobotFileOutput;
import org.rf.ide.core.testdata.model.RobotFileOutput.BuildMessage;
import org.rf.ide.core.testdata.model.RobotFileOutput.BuildMessage.LogLevel;
import org.rf.ide.core.testdata.model.RobotProjectHolder;
import org.rf.ide.core.testdata.model.RobotVersion;
import org.rf.ide.core.testdata.model.table.SettingTable;
import org.rf.ide.core.testdata.model.table.setting.AImported;
import org.rf.ide.core.testdata.model.table.setting.VariablesImport;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
@SuppressWarnings("PMD.MethodNamingConventions")
public class VariablesImporterTest {
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Test
public void importVariables_withWrongPath_shouldReturn_anEmptyList() throws IOException {
// prepare
final File processedFile = temporaryFolder.newFile("robot.robot");
final VariablesImporter varImporter = new VariablesImporter();
final RobotFileOutput robotFile = new RobotFileOutput(RobotVersion.UNKNOWN);
robotFile.setProcessedFile(processedFile);
final RobotFile fileModel = robotFile.getFileModel();
fileModel.includeSettingTableSection();
final SettingTable settingTable = fileModel.getSettingTable();
final String varImport = "\\VariableFiles\u0000/UnicodeInVariables.py*** Test Cases ***";
addNewVariableImport(settingTable, varImport);
final RobotProjectHolder robotProject = mock(RobotProjectHolder.class);
final RobotRuntimeEnvironment robotRunEnv = mock(RobotRuntimeEnvironment.class);
// execute
final List<VariablesFileImportReference> importVariables = varImporter.importVariables(null, robotRunEnv,
robotProject, robotFile);
// verify
assertThat(importVariables).isEmpty();
final List<BuildMessage> buildingMessages = robotFile.getBuildingMessages();
assertThat(buildingMessages.size()).isEqualTo(1);
final BuildMessage buildMessage = buildingMessages.get(0);
assertThat(buildMessage.getFileName()).contains("robot.robot");
assertThat(buildMessage.getType()).isEqualTo(LogLevel.ERROR);
assertThat(buildMessage.getMessage()).contains(
"Problem with importing variable file \\VariableFiles\u0000/UnicodeInVariables.py*** Test Cases *** with error stack: ");
final FileRegion fileRegion = buildMessage.getFileRegion();
assertThat(fileRegion).isNotNull();
assertThat(fileRegion.getStart().isSamePlace(new FilePosition(1, 9, 9))).isTrue();
final int importTextLength = "Variables".length() + varImport.length();
assertThat(fileRegion.getEnd().isSamePlace(new FilePosition(1, importTextLength, importTextLength))).isTrue();
}
@Test
public void importVariables_withThreeElements_and_withOne_withWrongPath_shouldReturn_onlyTwoCorrectInList()
throws IOException {
// prepare
final File processedFile = temporaryFolder.newFile("importing.robot");
temporaryFolder.newFile("robot.py");
temporaryFolder.newFile("robot2.py");
final VariablesImporter varImporter = new VariablesImporter();
final RobotFileOutput robotFile = new RobotFileOutput(RobotVersion.UNKNOWN);
robotFile.setProcessedFile(processedFile);
final RobotFile fileModel = robotFile.getFileModel();
fileModel.includeSettingTableSection();
final SettingTable settingTable = fileModel.getSettingTable();
addNewVariableImport(settingTable, "robot.py");
addNewVariableImport(settingTable, "new /robot.py");
addNewVariableImport(settingTable, "robot2.py");
final RobotProjectHolder robotProject = mock(RobotProjectHolder.class);
final RobotRuntimeEnvironment robotRunEnv = mock(RobotRuntimeEnvironment.class);
final PathsProvider pathsProvider = new PathsProvider() {
@Override
public List<File> provideUserSearchPaths() {
return newArrayList(new File(""));
}
@Override
public List<File> providePythonModulesSearchPaths() {
return newArrayList(new File(""));
}
};
// execute
final List<VariablesFileImportReference> importVariables = varImporter.importVariables(pathsProvider,
robotRunEnv, robotProject, robotFile);
// verify
assertThat(importVariables).hasSize(2);
final VariablesFileImportReference variablesFileImportReference = importVariables.get(0);
assertThat(variablesFileImportReference.getVariablesFile().getName()).isEqualTo("robot.py");
final VariablesFileImportReference variablesFileImportReference2 = importVariables.get(1);
assertThat(variablesFileImportReference2.getVariablesFile().getName()).isEqualTo("robot2.py");
}
@Test
public void importVariables_withTwoElements_and_withOne_withWrongPath_shouldReturn_onlyOneCorrectInList()
throws IOException {
// prepare
final File processedFile = temporaryFolder.newFile("robot.robot");
temporaryFolder.newFile("robot.py");
final VariablesImporter varImporter = new VariablesImporter();
final RobotFileOutput robotFile = new RobotFileOutput(RobotVersion.UNKNOWN);
robotFile.setProcessedFile(processedFile);
final RobotFile fileModel = robotFile.getFileModel();
fileModel.includeSettingTableSection();
final SettingTable settingTable = fileModel.getSettingTable();
addNewVariableImport(settingTable, "new /robot.py");
addNewVariableImport(settingTable, "robot.py");
final RobotProjectHolder robotProject = mock(RobotProjectHolder.class);
final RobotRuntimeEnvironment robotRunEnv = mock(RobotRuntimeEnvironment.class);
// execute
final List<VariablesFileImportReference> importVariables = varImporter.importVariables(null, robotRunEnv,
robotProject, robotFile);
// verify
assertThat(importVariables).hasSize(1);
final VariablesFileImportReference variablesFileImportReference = importVariables.get(0);
assertThat(variablesFileImportReference.getVariablesFile().getName()).isEqualTo("robot.py");
}
@Test
public void importVariables_withOneElement_and_withWrongPath_shouldReturn_emptyList() {
// prepare
final VariablesImporter varImporter = new VariablesImporter();
final RobotFileOutput robotFile = new RobotFileOutput(RobotVersion.UNKNOWN);
final RobotFile fileModel = robotFile.getFileModel();
fileModel.includeSettingTableSection();
final SettingTable settingTable = fileModel.getSettingTable();
addNewVariableImport(settingTable, "new /");
final RobotProjectHolder robotProject = null;
final RobotRuntimeEnvironment robotRunEnv = null;
// execute
final List<VariablesFileImportReference> importVariables = varImporter.importVariables(null, robotRunEnv,
robotProject, robotFile);
// verify
assertThat(importVariables).isEmpty();
}
private void addNewVariableImport(final SettingTable settingTable, final String text) {
final RobotToken rtDec = new RobotToken();
rtDec.setLineNumber(1);
rtDec.setStartColumn(0);
rtDec.setStartOffset(0);
rtDec.setText("Variables");
rtDec.setRaw("Variables");
final AImported importedOne = new VariablesImport(rtDec);
final RobotToken varPathOne = new RobotToken();
varPathOne.setRaw(text);
varPathOne.setText(text);
varPathOne.setStartOffset(importedOne.getEndPosition().getOffset());
varPathOne.setLineNumber(1);
varPathOne.setStartColumn(importedOne.getEndPosition().getColumn());
importedOne.setPathOrName(varPathOne);
settingTable.addImported(importedOne);
}
@Test
public void isCorrectPath_containsSpaceBackslash_AtDir2_WINDOWS_shouldReturn_FALSE() {
assertThat(new VariablesImporter().isCorrectPath("d:\\${var} \\windows")).isFalse();
}
@Test
public void isCorrectPath_containsSpaceBackslashSpaceInTheEnd_WINDOWS_shouldReturn_TRUE() {
assertThat(new VariablesImporter().isCorrectPath("${var} \\ ")).isTrue();
}
@Test
public void isCorrectPath_containsSpaceBackslashSpace_WINDOWS_shouldReturn_TRUE() {
assertThat(new VariablesImporter().isCorrectPath("${var} \\ windows")).isTrue();
}
@Test
public void isCorrectPath_containsSpaceBackslash_WINDOWS_shouldReturn_FALSE() {
assertThat(new VariablesImporter().isCorrectPath("${var} \\windows")).isFalse();
}
@Test
public void isCorrectPath_containsSpaceSlash_AtDir2_UNIX_shouldReturn_FALSE() {
assertThat(new VariablesImporter().isCorrectPath("/d/${var} /linux")).isFalse();
}
@Test
public void isCorrectPath_containsSpaceSlash_UNIX_shouldReturn_FALSE() {
assertThat(new VariablesImporter().isCorrectPath("${var} /linux")).isFalse();
}
}