package org.robotframework.ide.eclipse.main.plugin.tableeditor.source.colouring;
import static com.google.common.collect.Lists.newArrayList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.robotframework.red.junit.Conditions.absent;
import static org.robotframework.red.junit.Conditions.present;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
import java.util.Optional;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.rules.Token;
import org.junit.Test;
import org.rf.ide.core.testdata.text.read.IRobotLineElement;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.rf.ide.core.testdata.text.read.recognizer.RobotTokenType;
import org.rf.ide.core.testdata.text.read.separators.Separator;
import org.robotframework.ide.eclipse.main.plugin.tableeditor.source.colouring.ISyntaxColouringRule.PositionedTextToken;
public class VariableUsageRuleTest {
private final VariableUsageRule testedRule = new VariableUsageRule(new Token("token"));
@Test
public void ruleIsApplicableOnlyForRobotTokens() {
assertThat(testedRule.isApplicable(new RobotToken())).isTrue();
assertThat(testedRule.isApplicable(new Separator())).isFalse();
assertThat(testedRule.isApplicable(mock(IRobotLineElement.class))).isFalse();
}
@Test
public void nothingIsDetected_whenThereIsNoVariableUsage() {
final RobotToken token = RobotToken.create("${variable}");
final Optional<PositionedTextToken> evaluatedToken = testedRule.evaluate(token, 0,
new ArrayList<IRobotLineElement>());
assertThat(evaluatedToken).is(absent());
}
@Test
public void variableUsageIsDetected_forSimpleVariable() {
final RobotToken token = createToken("${variable}");
final Optional<PositionedTextToken> evaluatedToken = testedRule.evaluate(token, 0, new ArrayList<IRobotLineElement>());
assertThat(evaluatedToken).is(present());
assertThat(evaluatedToken.get().getPosition())
.isEqualTo(new Position(token.getStartOffset(), token.getText().length()));
assertThat(evaluatedToken.get().getToken().getData()).isEqualTo("token");
}
@Test
public void variableTokenIsDetected_whenPositionedInsideVariable() {
final String var1 = "${var}";
final String var2 = "@{list}";
final String var3 = "&{dir}";
final String content = "abc" + var1 + "def" + var2 + "ghi" + var3 + "[0]jkl";
final Collection<Position> varPositions = newArrayList();
varPositions.add(new Position(content.indexOf(var1), var1.length()));
varPositions.add(new Position(content.indexOf(var2), var2.length()));
varPositions.add(new Position(content.indexOf(var3), var3.length()));
final RobotToken token = createToken(content);
for (final Position position : varPositions) {
for (int i = position.getOffset(); i < position.getLength(); i++) {
final Optional<PositionedTextToken> evaluatedToken = testedRule.evaluate(token, i,
new ArrayList<IRobotLineElement>());
assertThat(evaluatedToken).is(present());
assertThat(evaluatedToken.get().getPosition()).isEqualTo(position);
assertThat(evaluatedToken.get().getToken().getData()).isEqualTo("token");
}
}
}
@Test
public void defaultTokenIsDetected_whenPositionedOutsideVariables() {
final String def1 = "abc";
final String def2 = "def";
final String def3 = "ghi";
final String def4 = "[0]jkl";
final String content = def1 + "${var}" + def2 + "@{list}" + def3 + "&{dir}" + def4;
final Collection<Position> varPositions = newArrayList();
varPositions.add(new Position(content.indexOf(def1), def1.length()));
varPositions.add(new Position(content.indexOf(def2), def2.length()));
varPositions.add(new Position(content.indexOf(def3), def3.length()));
varPositions.add(new Position(content.indexOf(def4), def4.length()));
final RobotToken token = createToken(content);
for (final Position position : varPositions) {
for (int i = position.getOffset(); i < position.getLength(); i++) {
final Optional<PositionedTextToken> evaluatedToken = testedRule.evaluate(token, i,
new ArrayList<IRobotLineElement>());
assertThat(evaluatedToken).is(present());
assertThat(evaluatedToken.get().getPosition()).isEqualTo(position);
assertThat(evaluatedToken.get().getToken()).isSameAs(ISyntaxColouringRule.DEFAULT_TOKEN);
}
}
}
private RobotToken createToken(final String content) {
final RobotToken token = RobotToken.create(content, EnumSet.of(RobotTokenType.VARIABLE_USAGE));
token.setLineNumber(1);
token.setStartColumn(0);
token.setStartOffset(0);
return token;
}
}