package fitnesse.slim.test.statementexecutorconsumer;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import fitnesse.slim.SlimSymbol;
import fitnesse.slim.StatementExecutor;
import fitnesse.slim.StatementExecutorConsumer;
import fitnesse.slim.StatementExecutorInterface;
public class TableTableIncFirstCol implements StatementExecutorConsumer {
private StatementExecutorInterface context;
/*
* (non-Javadoc)
*
* @see
* fitnesse.slim.StatementExecutorConsumer#setStatementExecutor(fitnesse.slim
* .StatementExecutorInterface)
*/
@Override
public void setStatementExecutor(StatementExecutorInterface statementExecutor) {
this.context = statementExecutor;
// Tell Slim Agent that the fixture takes care of symbol replacements in all "doTable" methods
// IMPORTANT: Don't forget to set this back to null at the end of your fixture code
this.context.assign(StatementExecutor.SLIM_AGENT_FIXTURE_HANDLES_SYMBOLS,"tableTable.*\\.doTable");
}
public List<List<String>> doTable(List<List<?>> table) {
List<List<String>> ret = new ArrayList<>();
try {
for (List<?> line : table) {
List<String> retLine = new ArrayList<>();
ret.add(retLine);
retLine.add("no change");
String oldValue = replaceSymbolsInString(line.get(0).toString());
int newValue = Integer.parseInt(oldValue) + 1;
assignSymbolIfApplicable(line.get(1).toString(), newValue);
retLine.add("pass:" + newValue);
}
} finally {
// IMPORTANT: Switch symbol replacement on again
// or you get bad surprises
this.context.assign(StatementExecutor.SLIM_AGENT_FIXTURE_HANDLES_SYMBOLS, null);
}
return ret;
}
private String replaceSymbolsInString(String arg) {
int startingPosition = 0;
while (true) {
if ("".equals(arg) || null == arg) {
break;
}
Matcher symbolMatcher = SlimSymbol.SYMBOL_PATTERN.matcher(arg);
if (symbolMatcher.find(startingPosition)) {
String symbolName = symbolMatcher.group(1);
arg = replaceSymbolInArg(symbolMatcher, arg, symbolName);
startingPosition = symbolMatcher.start(1);
} else {
break;
}
}
return arg;
}
private String replaceSymbolInArg(Matcher symbolMatcher, String arg,
String symbolName) {
String replacement = "null";
Object value = context.getSymbol(symbolName);
if (value != null) {
replacement = value.toString();
}
arg = arg.substring(0, symbolMatcher.start()) + replacement
+ arg.substring(symbolMatcher.end());
return arg;
}
private void assignSymbolIfApplicable(String text, int value) {
String symbol = SlimSymbol.isSymbolAssignment(text);
if (symbol != null) {
context.assign(symbol, value);
}
}
}