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 InTokenRuleTest { private final InTokenRule testedRule = new InTokenRule(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 inTokenIsRecognized() { 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("IN RANGE")) { thereWasName = true; assertThat(evaluatedToken).is(present()); assertThat(evaluatedToken.get().getPosition()) .isEqualTo(new Position(token.getStartOffset(), token.getText().length())); assertThat(evaluatedToken.get().getToken().getData()).isEqualTo("token"); } else { assertThat(evaluatedToken).is(absent()); } previousTokens.add(token); } assertThat(thereWasName).isTrue(); } @Test public void inTokenIsRecognized_evenWhenPositionIsInsideToken() { boolean thereWasName = false; for (final RobotToken token : TokensSource.createTokens()) { final int positionInsideToken = new Random().nextInt(token.getText().length()); final Optional<PositionedTextToken> evaluatedToken = testedRule.evaluate(token, positionInsideToken, new ArrayList<IRobotLineElement>()); if (token.getText().equals("IN RANGE")) { thereWasName = true; assertThat(evaluatedToken).is(present()); assertThat(evaluatedToken.get().getPosition()) .isEqualTo(new Position(token.getStartOffset(), token.getText().length())); assertThat(evaluatedToken.get().getToken().getData()).isEqualTo("token"); } else { assertThat(evaluatedToken).is(absent()); } } assertThat(thereWasName).isTrue(); } }