package cucumber.runtime.java; import cucumber.api.java8.StepdefBody; import cucumber.runtime.CucumberException; import org.junit.Test; import java.util.List; import java.util.regex.Pattern; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class Java8StepDefinitionTest { @Test public void should_calculate_parameters_count_from_body_with_one_param() throws Exception { Java8StepDefinition java8StepDefinition = new Java8StepDefinition(Pattern.compile("^I have (\\d) some step (.*)$"), 0, oneParamStep(), null); assertEquals(new Integer(1), java8StepDefinition.getParameterCount()); } @Test public void should_calculate_parameters_count_from_body_with_two_params() throws Exception { Java8StepDefinition java8StepDefinition = new Java8StepDefinition(Pattern.compile("^I have some step $"), 0, twoParamStep(), null); assertEquals(new Integer(2), java8StepDefinition.getParameterCount()); } @Test public void should_fail_for_param_with_non_generic_list() throws Exception { try { new Java8StepDefinition(Pattern.compile("^I have (\\d) some step (.*)$"), 0, nonGenericListStep(), null); fail(); } catch (CucumberException expected) { assertEquals("Can't use java.util.List in lambda step definition. Declare a DataTable argument instead and convert manually with asList/asLists/asMap/asMaps", expected.getMessage()); } } @Test public void should_pass_for_param_with_generic_list() throws Exception { Java8StepDefinition java8StepDefinition = new Java8StepDefinition(Pattern.compile("^I have (\\d) some step (.*)$"), 0, genericListStep(), null); assertEquals(new Integer(1), java8StepDefinition.getParameterCount()); } private StepdefBody oneParamStep() { return new StepdefBody.A1<String>() { @Override public void accept(String p1) { } }; } private StepdefBody twoParamStep() { return new StepdefBody.A2<String, String>() { @Override public void accept(String p1, String p2) { } }; } private StepdefBody genericListStep() { return new StepdefBody.A1<List<String>>() { @Override public void accept(List<String> p1) { throw new UnsupportedOperationException(); } }; } private StepdefBody nonGenericListStep() { return new StepdefBody.A1<List>() { @Override public void accept(List p1) { throw new UnsupportedOperationException(); } }; } }