package org.robotframework.ide.eclipse.main.plugin.tableeditor.source.colouring; 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.List; 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.separators.Separator; import org.robotframework.ide.eclipse.main.plugin.tableeditor.source.colouring.ISyntaxColouringRule.PositionedTextToken; public class GherkinPrefixRuleTest { private final GherkinPrefixRule testedRule = new GherkinPrefixRule(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 gherkinprefixIsRecognized() { final List<IRobotLineElement> previousTokens = new ArrayList<>(); boolean thereWasName = false; for (final RobotToken token : TokensSource.createTokens()) { final Optional<PositionedTextToken> evaluatedToken = testedRule.evaluate(token, 0, previousTokens); if (token.getText().equals("given call") || token.getText().equals("when then call")) { thereWasName = true; assertThat(evaluatedToken).is(present()); assertThat(evaluatedToken.get().getPosition()) .isEqualTo(new Position(token.getStartOffset(), token.getText().length() - "call".length())); assertThat(evaluatedToken.get().getToken().getData()).isEqualTo("token"); } else { assertThat(evaluatedToken).is(absent()); } previousTokens.add(token); } assertThat(thereWasName).isTrue(); } @Test public void gherkinPrefixIsNotRecognized_whenPositionIsInsideToken() { final List<IRobotLineElement> previousTokens = new ArrayList<>(); boolean thereWasName = false; for (final RobotToken token : TokensSource.createTokens()) { final int positionInsideToken = new Random().nextInt(token.getText().length()) + 1; final Optional<PositionedTextToken> evaluatedToken = testedRule.evaluate(token, positionInsideToken, previousTokens); thereWasName = true; assertThat(evaluatedToken).is(absent()); previousTokens.add(token); } assertThat(thereWasName).isTrue(); } }