package org.jbehave.eclipse.parser;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jbehave.core.parsers.RegexPrefixCapturingPatternParser;
import org.jbehave.core.parsers.StepMatcher;
import org.jbehave.core.parsers.StepPatternParser;
import org.jbehave.core.steps.StepType;
import org.jbehave.eclipse.util.New;
import org.junit.Before;
import org.junit.Test;
public class StepPatternParserTest {
private StepPatternParser parser;
@Before
public void setUp() {
parser = new RegexPrefixCapturingPatternParser();
}
@Test
public void canMatchStep() {
StepMatcher matcher = parser.parseStep(StepType.WHEN, "a user clicks on $buttonId button");
assertThat(matcher.parameterNames(), equalTo(new String[] { "buttonId" }));
String text = "a user clicks on enter'n go button";
assertThat(matcher.matches(text), is(true));
}
@Test
public void parseStepPattern() {
parseStepPattern("a user clicks on $buttonId button");
parseStepPattern("a user clicks on $buttonId");
}
private void parseStepPattern(String input) {
String prefix = "$";
Pattern pattern = Pattern.compile("(\\" + prefix + "\\w*)(\\W|\\Z)", Pattern.DOTALL);
Matcher matcher = pattern.matcher(input);
List<Token> frags = New.arrayList();
int prev = 0;
while (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
if (start > 0) {
frags.add(new Token(prev, start - prev, false, ""));
}
frags.add(new Token(start, end - start, true, matcher.group(2)));
prev = end;
}
if (prev < input.length()) {
frags.add(new Token(prev, input.length() - prev, false, ""));
}
for (Token token : frags) {
System.out.println(">>" + token.value(input) + "<< isIdentifier: " + token);
}
}
public class Token {
public final int offset;
public final int length;
public final boolean isIdentifier;
public final String whitespaceIfAny;
public Token(int offset, int length, boolean isIdentifier, String whitespaceIfAny) {
this.offset = offset;
this.length = length;
this.isIdentifier = isIdentifier;
this.whitespaceIfAny = whitespaceIfAny;
}
public String value(String content) {
return content.substring(offset, offset + length);
}
@Override
public String toString() {
return "Token [offset=" + offset + ", length=" + length + ", isIdentifier=" + isIdentifier + ", whitespaceIfAny='" + whitespaceIfAny + "']";
}
}
}