package cucumber.runtime; import gherkin.formatter.Argument; import org.junit.Test; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.regex.Pattern; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; public class JdkPatternArgumentMatcherTest { @Test public void shouldDealWithOnlyAscii() throws UnsupportedEncodingException { assertVariables("Ja (.+) elsker (.+) landet", "Ja vi elsker dette landet", "vi", 3, "dette", 13); } @Test public void shouldDealWithUnicodeInsideCaptures() throws UnsupportedEncodingException { assertVariables("Ja (.+) elsker (.+) landet", "Ja vø elsker døtte landet", "vø", 3, "døtte", 13); } @Test public void shouldDealWithUnicodeOutsideCaptures() throws UnsupportedEncodingException { assertVariables("Jæ (.+) ålsker (.+) lændet", "Jæ vi ålsker dette lændet", "vi", 3, "dette", 13); } @Test public void shouldDealWithUnicodeEverywhere() throws UnsupportedEncodingException { assertVariables("Jæ (.+) ålsker (.+) lændet", "Jæ vø ålsker døtte lændet", "vø", 3, "døtte", 13); } @Test public void shouldDealWithUnAnchoredPattern() throws UnsupportedEncodingException { assertVariables("^I wait for (.+) and (.+) seconds", "I wait for 3 and 4 seconds to be sure", "3", 11, "4", 17 ); } @Test public void shouldDealWithAnchoredPattern() { JdkPatternArgumentMatcher matcher = new JdkPatternArgumentMatcher(Pattern.compile("^I wait for (.+) seconds$")); assertNull(matcher.argumentsFrom("I wait for 30 seconds to be sure")); assertEquals(1, matcher.argumentsFrom("I wait for 30 seconds").size()); } @Test public void canHandleVariableNumberOfArguments() { JdkPatternArgumentMatcher matcher = new JdkPatternArgumentMatcher(Pattern.compile("I wait for (.+) seconds|I wait for some time")); List<Argument> arguments = matcher.argumentsFrom("I wait for 30 seconds to be sure"); List<Argument> optionalArguments = matcher.argumentsFrom("I wait for some time"); assertEquals(1, arguments.size()); assertEquals(1, optionalArguments.size()); assertNull(matcher.argumentsFrom("I wait for some time").get(0).getOffset()); assertNull(matcher.argumentsFrom("I wait for some time").get(0).getVal()); } private void assertVariables(String regex, String string, String v1, Integer pos1, String v2, Integer pos2) throws UnsupportedEncodingException { List<Argument> args = new JdkPatternArgumentMatcher(Pattern.compile(regex)).argumentsFrom(string); assertEquals(2, args.size()); assertEquals(v1, args.get(0).getVal()); assertEquals(pos1, args.get(0).getOffset()); assertEquals(v2, args.get(1).getVal()); assertEquals(pos2, args.get(1).getOffset()); } }