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.Optional; import java.util.Random; 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 KeywordNameRuleTest { private final KeywordNameRule testedRule = new KeywordNameRule(new Token("name_token"), new Token("var_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 simpleKeywordNameIsRecognized() { boolean thereWasName = false; for (final RobotToken token : TokensSource.createTokens()) { final Optional<PositionedTextToken> evaluatedToken = evaluate(token); if (token.getText().contains("userkw")) { thereWasName = true; assertThat(evaluatedToken).is(present()); assertThat(evaluatedToken.get().getPosition()) .isEqualTo(new Position(token.getStartOffset(), token.getText().length())); assertThat(evaluatedToken.get().getToken().getData()).isEqualTo("name_token"); } else { assertThat(evaluatedToken).is(absent()); } } assertThat(thereWasName).isTrue(); } @Test public void simpleKeywordNameIsRecognized_evenWhenPositionIsInsideToken() { boolean thereWasName = false; for (final RobotToken token : TokensSource.createTokens()) { final int positionInsideToken = new Random().nextInt(token.getText().length()); final Optional<PositionedTextToken> evaluatedToken = evaluate(token, positionInsideToken); if (token.getText().contains("userkw")) { thereWasName = true; assertThat(evaluatedToken).is(present()); assertThat(evaluatedToken.get().getPosition()) .isEqualTo(new Position(token.getStartOffset(), token.getText().length())); assertThat(evaluatedToken.get().getToken().getData()).isEqualTo("name_token"); } else { assertThat(evaluatedToken).is(absent()); } } assertThat(thereWasName).isTrue(); } @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("var_token"); } } } @Test public void keywordNameTokenIsDetected_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().getData()).isEqualTo("name_token"); } } } private RobotToken createToken(final String kwName) { final RobotToken token = RobotToken.create(kwName, newArrayList(RobotTokenType.KEYWORD_NAME, RobotTokenType.VARIABLE_USAGE)); token.setLineNumber(1); token.setStartColumn(0); token.setStartOffset(0); return token; } private Optional<PositionedTextToken> evaluate(final RobotToken token) { return evaluate(token, 0); } private Optional<PositionedTextToken> evaluate(final RobotToken token, final int position) { return testedRule.evaluate(token, position, new ArrayList<IRobotLineElement>()); } }