/*
* 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.presenter.update;
import static com.google.common.collect.Lists.newArrayList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.BeforeClass;
import org.junit.Test;
import org.rf.ide.core.testdata.model.AModelElement;
import org.rf.ide.core.testdata.model.ModelType;
import org.rf.ide.core.testdata.model.RobotFile;
import org.rf.ide.core.testdata.model.table.SettingTable;
import org.rf.ide.core.testdata.model.table.VariableTable;
import org.rf.ide.core.testdata.model.table.setting.DefaultTags;
import org.rf.ide.core.testdata.model.table.setting.ForceTags;
import org.rf.ide.core.testdata.model.table.setting.LibraryImport;
import org.rf.ide.core.testdata.model.table.setting.Metadata;
import org.rf.ide.core.testdata.model.table.setting.ResourceImport;
import org.rf.ide.core.testdata.model.table.setting.SuiteDocumentation;
import org.rf.ide.core.testdata.model.table.setting.SuiteSetup;
import org.rf.ide.core.testdata.model.table.setting.SuiteTeardown;
import org.rf.ide.core.testdata.model.table.setting.TestSetup;
import org.rf.ide.core.testdata.model.table.setting.TestTeardown;
import org.rf.ide.core.testdata.model.table.setting.TestTemplate;
import org.rf.ide.core.testdata.model.table.setting.TestTimeout;
import org.rf.ide.core.testdata.model.table.setting.VariablesImport;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.write.NewRobotFileTestHelper;
public class SettingTableModelUpdaterTest {
private static final int INDEX = -1;
private static SettingTable settingTable;
private static SettingTableModelUpdater modelUpdater;
@BeforeClass
public static void setup() {
RobotFile model = NewRobotFileTestHelper.getModelFileToModify("2.9");
model.includeSettingTableSection();
settingTable = model.getSettingTable();
modelUpdater = new SettingTableModelUpdater();
}
@Test
public void testSuiteSetupCRUD() {
final String keywordName = "setup";
final List<String> settingArgs = newArrayList("arg1", "arg2");
final String comment = "comment";
final List<String> args = newArrayList(keywordName);
args.addAll(settingArgs);
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX,
SettingName.SUITE_SETUP.getName(), comment, args);
assertTrue(modelElement.getModelType() == ModelType.SUITE_SETUP);
SuiteSetup setting = (SuiteSetup) modelElement;
checkSetting(setting.getKeywordName(), keywordName, setting.getArguments(), settingArgs, setting.getComment(),
comment);
final String newKeywordName = "new setup";
final String newArg = "arg3";
settingArgs.add(newArg);
final String newComment = "new comment";
modelUpdater.update(setting, 0, newKeywordName);
modelUpdater.update(setting, 3, newArg);
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getKeywordName(), newKeywordName, setting.getArguments(), settingArgs,
setting.getComment(), newComment);
assertFalse(settingTable.getSuiteSetups().isEmpty());
modelUpdater.remove(settingTable, setting);
assertTrue(settingTable.getSuiteSetups().isEmpty());
}
@Test
public void testSuiteTeardownCRUD() {
final String keywordName = "teardown";
final List<String> settingArgs = newArrayList("arg1", "arg2");
final String comment = "comment";
final List<String> args = newArrayList(keywordName);
args.addAll(settingArgs);
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX,
SettingName.SUITE_TEARDOWN.getName(), comment, args);
assertTrue(modelElement.getModelType() == ModelType.SUITE_TEARDOWN);
SuiteTeardown setting = (SuiteTeardown) modelElement;
checkSetting(setting.getKeywordName(), keywordName, setting.getArguments(), settingArgs, setting.getComment(),
comment);
final String newKeywordName = "new teardown";
final String newArg = "new arg2";
settingArgs.remove(1);
settingArgs.add(newArg);
final String newComment = "new comment";
modelUpdater.update(setting, 0, newKeywordName);
modelUpdater.update(setting, 2, newArg);
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getKeywordName(), newKeywordName, setting.getArguments(), settingArgs,
setting.getComment(), newComment);
assertFalse(settingTable.getSuiteTeardowns().isEmpty());
modelUpdater.remove(settingTable, setting);
assertTrue(settingTable.getSuiteTeardowns().isEmpty());
}
@Test
public void testTestSetupCRUD() {
final String keywordName = "setup";
final List<String> settingArgs = newArrayList("arg1", "arg2");
final String comment = "comment";
final List<String> args = newArrayList(keywordName);
args.addAll(settingArgs);
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX, SettingName.TEST_SETUP.getName(),
comment, args);
assertTrue(modelElement.getModelType() == ModelType.SUITE_TEST_SETUP);
TestSetup setting = (TestSetup) modelElement;
checkSetting(setting.getKeywordName(), keywordName, setting.getArguments(), settingArgs, setting.getComment(),
comment);
final String newKeywordName = "new test setup";
final String newArg = "new arg1";
settingArgs.remove(0);
settingArgs.add(0, newArg);
final String newComment = "new comment";
modelUpdater.update(setting, 0, newKeywordName);
modelUpdater.update(setting, 1, newArg);
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getKeywordName(), newKeywordName, setting.getArguments(), settingArgs,
setting.getComment(), newComment);
assertFalse(settingTable.getTestSetups().isEmpty());
modelUpdater.remove(settingTable, setting);
assertTrue(settingTable.getTestSetups().isEmpty());
}
@Test
public void testTestTeardownCRUD() {
final String keywordName = "teardown";
final List<String> settingArgs = newArrayList("arg1", "arg2");
final String comment = "comment";
final List<String> args = newArrayList(keywordName);
args.addAll(settingArgs);
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX,
SettingName.TEST_TEARDOWN.getName(), comment, args);
assertTrue(modelElement.getModelType() == ModelType.SUITE_TEST_TEARDOWN);
TestTeardown setting = (TestTeardown) modelElement;
checkSetting(setting.getKeywordName(), keywordName, setting.getArguments(), settingArgs, setting.getComment(),
comment);
final String newKeywordName = "new test teardown";
final String newArg1 = "";
final String newArg2 = "new arg4";
settingArgs.add(newArg1);
settingArgs.add(newArg2);
final String newComment = "new comment";
modelUpdater.update(setting, 0, newKeywordName);
modelUpdater.update(setting, 3, newArg1);
modelUpdater.update(setting, 4, newArg2);
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getKeywordName(), newKeywordName, setting.getArguments(), settingArgs,
setting.getComment(), newComment);
assertFalse(settingTable.getTestTeardowns().isEmpty());
modelUpdater.remove(settingTable, setting);
assertTrue(settingTable.getTestTeardowns().isEmpty());
}
@Test
public void testTestTemplateCRUD() {
final String template = "template";
final List<String> settingArgs = newArrayList("arg1", "arg2");
final String comment = "comment";
final List<String> args = newArrayList(template);
args.addAll(settingArgs);
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX,
SettingName.TEST_TEMPLATE.getName(), comment, args);
assertTrue(modelElement.getModelType() == ModelType.SUITE_TEST_TEMPLATE);
TestTemplate setting = (TestTemplate) modelElement;
checkSetting(setting.getKeywordName(), template, setting.getUnexpectedTrashArguments(), settingArgs,
setting.getComment(), comment);
final String newKeywordName = "new template";
final String newArg = "new arg2";
settingArgs.remove(1);
settingArgs.add(newArg);
final String newComment = "new comment";
modelUpdater.update(setting, 0, newKeywordName);
modelUpdater.update(setting, 2, newArg);
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getKeywordName(), newKeywordName, setting.getUnexpectedTrashArguments(), settingArgs,
setting.getComment(), newComment);
assertFalse(settingTable.getTestTemplates().isEmpty());
modelUpdater.remove(settingTable, setting);
assertTrue(settingTable.getTestTemplates().isEmpty());
}
@Test
public void testTestTimeoutCRUD() {
final String timeout = "2 seconds";
final List<String> settingArgs = newArrayList("arg1", "arg2");
final String comment = "comment";
final List<String> args = newArrayList(timeout);
args.addAll(settingArgs);
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX,
SettingName.TEST_TIMEOUT.getName(), comment, args);
assertTrue(modelElement.getModelType() == ModelType.SUITE_TEST_TIMEOUT);
TestTimeout setting = (TestTimeout) modelElement;
checkSetting(setting.getTimeout(), timeout, setting.getMessageArguments(), settingArgs, setting.getComment(),
comment);
final String newTimeout = "4 seconds";
final String newArg = "new arg2";
settingArgs.remove(1);
settingArgs.add(newArg);
final String newComment = "new comment";
modelUpdater.update(setting, 0, newTimeout);
modelUpdater.update(setting, 2, newArg);
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getTimeout(), newTimeout, setting.getMessageArguments(), settingArgs, setting.getComment(),
newComment);
assertFalse(settingTable.getTestTimeouts().isEmpty());
modelUpdater.remove(settingTable, setting);
assertTrue(settingTable.getTestTimeouts().isEmpty());
}
@Test
public void testForceTagsCRUD() {
final List<String> tags = newArrayList("tag1", "tag2");
final String comment = "comment";
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX, SettingName.FORCE_TAGS.getName(),
comment, tags);
assertTrue(modelElement.getModelType() == ModelType.FORCE_TAGS_SETTING);
ForceTags setting = (ForceTags) modelElement;
checkSetting(setting.getTags(), tags, setting.getComment(), comment);
final List<String> newTags = newArrayList("tag3", "tag4", "tag5");
final String newComment = "new comment";
modelUpdater.update(setting, 0, newTags.get(0));
modelUpdater.update(setting, 1, newTags.get(1));
modelUpdater.update(setting, 2, newTags.get(2));
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getTags(), newTags, setting.getComment(), newComment);
assertFalse(settingTable.getForceTags().isEmpty());
modelUpdater.remove(settingTable, setting);
assertTrue(settingTable.getForceTags().isEmpty());
}
@Test
public void testDefaultTagsCRUD() {
final List<String> tags = newArrayList("tag1", "tag2");
final String comment = "comment";
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX,
SettingName.DEFAULT_TAGS.getName(), comment, tags);
assertTrue(modelElement.getModelType() == ModelType.DEFAULT_TAGS_SETTING);
DefaultTags setting = (DefaultTags) modelElement;
checkSetting(setting.getTags(), tags, setting.getComment(), comment);
final List<String> newTags = newArrayList("tag1", "tag4");
final String newComment = "new comment";
modelUpdater.update(setting, 1, newTags.get(1));
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getTags(), newTags, setting.getComment(), newComment);
assertFalse(settingTable.getDefaultTags().isEmpty());
modelUpdater.remove(settingTable, setting);
assertTrue(settingTable.getDefaultTags().isEmpty());
}
@Test
public void testDocumentationCRUD() {
final List<String> documentation = newArrayList("docPart1", "docPart2");
final String comment = "comment";
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX,
SettingName.DOCUMENTATION.getName(), comment, documentation);
assertTrue(modelElement.getModelType() == ModelType.SUITE_DOCUMENTATION);
SuiteDocumentation setting = (SuiteDocumentation) modelElement;
checkSetting(setting.getDocumentationText(), new ArrayList<String>(Arrays.asList("docPart1 docPart2")),
setting.getComment(), comment);
final List<String> newDocumentation = newArrayList("docPart3");
final String newComment = "new comment";
modelUpdater.update(setting, 0, newDocumentation.get(0));
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getDocumentationText(), newDocumentation, setting.getComment(), newComment);
assertFalse(settingTable.getDocumentation().isEmpty());
modelUpdater.remove(settingTable, setting);
assertTrue(settingTable.getDocumentation().isEmpty());
}
@Test
public void testLibraryImportCRUD() {
final String libName = "lib";
final List<String> settingArgs = newArrayList("arg1", "arg2");
final String comment = "comment";
final List<String> args = newArrayList(libName);
args.addAll(settingArgs);
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX,
SettingName.LIBRARY_IMPORT.getName(), comment, args);
assertTrue(modelElement.getModelType() == ModelType.LIBRARY_IMPORT_SETTING);
LibraryImport setting = (LibraryImport) modelElement;
checkSetting(setting.getPathOrName(), libName, setting.getArguments(), settingArgs, setting.getComment(),
comment);
final String newLibName = "new lib";
final List<String> newSettingArgs = newArrayList("arg3", "arg4");
final String newComment = "new comment";
modelUpdater.update(setting, 0, newLibName);
modelUpdater.update(setting, 1, newSettingArgs.get(0));
modelUpdater.update(setting, 2, newSettingArgs.get(1));
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getPathOrName(), newLibName, setting.getArguments(), newSettingArgs, setting.getComment(),
newComment);
assertTrue(settingTable.getImports().contains(setting));
modelUpdater.remove(settingTable, setting);
assertFalse(settingTable.getImports().contains(setting));
}
@Test
public void testResourceImportCRUD() {
final String resourceName = "resource";
final List<String> settingArgs = newArrayList("arg1", "arg2");
final String comment = "comment";
final List<String> args = newArrayList(resourceName);
args.addAll(settingArgs);
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX,
SettingName.RESOURCE_IMPORT.getName(), comment, args);
assertTrue(modelElement.getModelType() == ModelType.RESOURCE_IMPORT_SETTING);
ResourceImport setting = (ResourceImport) modelElement;
checkSetting(setting.getPathOrName(), resourceName, setting.getUnexpectedTrashArguments(), settingArgs,
setting.getComment(), comment);
final String newResourceName = "new resource";
final List<String> newSettingArgs = newArrayList("arg3", "arg4");
final String newComment = "new comment";
modelUpdater.update(setting, 0, newResourceName);
modelUpdater.update(setting, 1, newSettingArgs.get(0));
modelUpdater.update(setting, 2, newSettingArgs.get(1));
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getPathOrName(), newResourceName, setting.getUnexpectedTrashArguments(), newSettingArgs,
setting.getComment(), newComment);
assertTrue(settingTable.getImports().contains(setting));
modelUpdater.remove(settingTable, setting);
assertFalse(settingTable.getImports().contains(setting));
}
@Test
public void testVariablesImportCRUD() {
final String varName = "variables.py";
final List<String> settingArgs = newArrayList("arg1", "arg2");
final String comment = "comment";
final List<String> args = newArrayList(varName);
args.addAll(settingArgs);
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX,
SettingName.VARIABLES_IMPORT.getName(), comment, args);
assertTrue(modelElement.getModelType() == ModelType.VARIABLES_IMPORT_SETTING);
VariablesImport setting = (VariablesImport) modelElement;
checkSetting(setting.getPathOrName(), varName, setting.getArguments(), settingArgs, setting.getComment(),
comment);
final String newVarName = "new_variables.py";
final List<String> newSettingArgs = newArrayList("arg3", "");
final String newComment = "new comment";
modelUpdater.update(setting, 0, newVarName);
modelUpdater.update(setting, 1, newSettingArgs.get(0));
modelUpdater.update(setting, 2, "");
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getPathOrName(), newVarName, setting.getArguments(), newSettingArgs, setting.getComment(),
newComment);
assertTrue(settingTable.getImports().contains(setting));
modelUpdater.remove(settingTable, setting);
assertFalse(settingTable.getImports().contains(setting));
}
@Test
public void testMetadataCRUD() {
final String metadata = "data";
final List<String> settingArgs = newArrayList("arg1", "arg2");
final String comment = "comment";
final List<String> args = newArrayList(metadata);
args.addAll(settingArgs);
final AModelElement<?> modelElement = modelUpdater.create(settingTable, INDEX, SettingName.METADATA.getName(),
comment, args);
assertTrue(modelElement.getModelType() == ModelType.METADATA_SETTING);
Metadata setting = (Metadata) modelElement;
checkSetting(setting.getKey(), metadata, setting.getValues(), settingArgs, setting.getComment(), comment);
final String newMetadata = "data";
final List<String> newSettingArgs = newArrayList("arg3", "arg4", "arg5");
final String newComment = "new comment";
modelUpdater.update(setting, 0, newMetadata);
modelUpdater.update(setting, 1, newSettingArgs.get(0));
modelUpdater.update(setting, 2, newSettingArgs.get(1));
modelUpdater.update(setting, 3, newSettingArgs.get(2));
modelUpdater.updateComment(setting, newComment);
checkSetting(setting.getKey(), newMetadata, setting.getValues(), newSettingArgs, setting.getComment(),
newComment);
assertFalse(settingTable.getMetadatas().isEmpty());
modelUpdater.remove(settingTable, setting);
assertTrue(settingTable.getMetadatas().isEmpty());
}
@Test
public void testCreateWhenNoTableExists() {
assertNull(modelUpdater.create(null, INDEX, SettingName.METADATA.getName(), "", newArrayList("")));
}
@Test
public void testCreateWithOtherTable() {
RobotFile file = NewRobotFileTestHelper.getModelFileToModify("3.0");
file.includeSettingTableSection();
VariableTable variableTable = file.getVariableTable();
assertNull(modelUpdater.create(variableTable, INDEX, SettingName.METADATA.getName(), "", newArrayList("")));
}
@Test
public void testCreateWithUnknownSetting() {
assertNull(modelUpdater.create(settingTable, INDEX, "Unknown", "", newArrayList("")));
}
private void checkSetting(final RobotToken actualKeywordName, final String expectedKeywordName,
final List<RobotToken> actualArguments, final List<String> expectedArguments,
final List<RobotToken> actualComments, final String expectedComment) {
assertTrue(actualKeywordName.getText().equals(expectedKeywordName));
checkSettingArguments(actualArguments, expectedArguments);
checkSettingComment(actualComments, expectedComment);
}
private void checkSetting(final List<RobotToken> actualArguments, final List<String> expectedArguments,
final List<RobotToken> actualComments, final String expectedComment) {
checkSettingArguments(actualArguments, expectedArguments);
checkSettingComment(actualComments, expectedComment);
}
private void checkSettingComment(final List<RobotToken> actualComments, final String expectedComment) {
assertTrue(actualComments.get(0).getText().equals("#" + expectedComment));
}
private void checkSettingArguments(final List<RobotToken> actualArguments, final List<String> expectedArguments) {
assertEquals(expectedArguments.size(), actualArguments.size());
for (int i = 0; i < actualArguments.size(); i++) {
assertTrue(actualArguments.get(i).getText().equals(expectedArguments.get(i)));
}
}
enum SettingName {
SUITE_SETUP("Suite Setup"),
SUITE_TEARDOWN("Suite Teardown"),
TEST_SETUP("Test Setup"),
TEST_TEARDOWN("Test Teardown"),
TEST_TEMPLATE("Test Template"),
TEST_TIMEOUT("Test Timeout"),
FORCE_TAGS("Force Tags"),
DEFAULT_TAGS("Default Tags"),
DOCUMENTATION("Documentation"),
LIBRARY_IMPORT("Library"),
RESOURCE_IMPORT("Resource"),
VARIABLES_IMPORT("Variables"),
METADATA("Metadata");
private String name;
private SettingName(final String name) {
this.name = name;
}
public String getName() {
return name;
}
}
}