/*
* 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.mapping.testcases;
import java.util.List;
import java.util.Stack;
import org.rf.ide.core.testdata.mapping.table.ElementPositionResolver;
import org.rf.ide.core.testdata.mapping.table.IParsingMapper;
import org.rf.ide.core.testdata.mapping.table.ElementPositionResolver.PositionExpected;
import org.rf.ide.core.testdata.model.FilePosition;
import org.rf.ide.core.testdata.model.RobotFileOutput;
import org.rf.ide.core.testdata.model.table.TestCaseTable;
import org.rf.ide.core.testdata.model.table.testcases.TestCase;
import org.rf.ide.core.testdata.text.read.IRobotTokenType;
import org.rf.ide.core.testdata.text.read.ParsingState;
import org.rf.ide.core.testdata.text.read.RobotLine;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType;
import com.google.common.annotations.VisibleForTesting;
public class TestCaseNameMapper implements IParsingMapper {
private final ElementPositionResolver positionResolver;
public TestCaseNameMapper() {
this.positionResolver = new ElementPositionResolver();
}
@Override
public RobotToken map(final RobotLine currentLine,
final Stack<ParsingState> processingState,
final RobotFileOutput robotFileOutput, final RobotToken rt, final FilePosition fp,
final String text) {
final List<IRobotTokenType> types = rt.getTypes();
types.remove(RobotTokenType.UNKNOWN);
types.add(0, RobotTokenType.TEST_CASE_NAME);
rt.setText(text);
rt.setRaw(text);
final TestCaseTable testCaseTable = robotFileOutput.getFileModel()
.getTestCaseTable();
final TestCase testCase = new TestCase(rt);
testCaseTable.addTest(testCase);
processingState.push(ParsingState.TEST_CASE_DECLARATION);
return rt;
}
@Override
public boolean checkIfCanBeMapped(final RobotFileOutput robotFileOutput,
final RobotLine currentLine, final RobotToken rt, final String text,
final Stack<ParsingState> processingState) {
boolean result = false;
if (positionResolver.isCorrectPosition(PositionExpected.TEST_CASE_NAME,
robotFileOutput.getFileModel(), currentLine, rt)) {
if (isIncludedInTestCaseTable(currentLine, processingState)) {
boolean wasUpdated = false;
final String testCaseName = rt.getRaw().toString();
if (testCaseName != null) {
result = !testCaseName.trim().startsWith(
RobotTokenType.START_HASH_COMMENT
.getRepresentation().get(0));
wasUpdated = true;
}
if (!wasUpdated) {
result = true;
}
} else {
// FIXME: it is in wrong place means no keyword table
// declaration
}
} else {
// FIXME: wrong place | | Library or | Library | Library X |
// case.
}
return result;
}
@VisibleForTesting
protected boolean isIncludedInTestCaseTable(final RobotLine line,
final Stack<ParsingState> processingState) {
return processingState.contains(ParsingState.TEST_CASE_TABLE_INSIDE);
}
}