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.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 TestCaseSettingsRuleTest {
private final TestCaseSettingsRule testedRule = new TestCaseSettingsRule(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 testCaseSettingCallIsRecognized() {
boolean thereWasName = false;
for (final RobotToken token : TokensSource.createTokens()) {
final Optional<PositionedTextToken> evaluatedToken = evaluate(token);
if (isSettingDeclarationToken(token)) {
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();
}
@Test
public void testCaseSettingCallIsRecognized_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 (isSettingDeclarationToken(token)) {
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();
}
private boolean isSettingDeclarationToken(final RobotToken token) {
return token.getText().startsWith("[") && Character.isUpperCase(token.getText().charAt(1))
&& token.getText().endsWith("]");
}
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>());
}
}