package cucumber.runtime; import cucumber.runtime.snippets.FunctionNameGenerator; import cucumber.runtime.snippets.Snippet; import cucumber.runtime.snippets.SnippetGenerator; import cucumber.runtime.snippets.UnderscoreConcatenator; import gherkin.I18n; import gherkin.formatter.model.Step; import org.junit.Test; import java.util.List; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class UndefinedStepsTrackerTest { private static final I18n ENGLISH = new I18n("en"); private FunctionNameGenerator functionNameGenerator = new FunctionNameGenerator(new UnderscoreConcatenator()); @Test public void has_undefined_steps() { UndefinedStepsTracker undefinedStepsTracker = new UndefinedStepsTracker(); undefinedStepsTracker.addUndefinedStep(new Step(null, "Given ", "A", 1, null, null), ENGLISH); assertTrue(undefinedStepsTracker.hasUndefinedSteps()); } @Test public void has_no_undefined_steps() { UndefinedStepsTracker undefinedStepsTracker = new UndefinedStepsTracker(); assertFalse(undefinedStepsTracker.hasUndefinedSteps()); } @Test public void removes_duplicates() { Backend backend = new TestBackend(); UndefinedStepsTracker tracker = new UndefinedStepsTracker(); tracker.storeStepKeyword(new Step(null, "Given ", "A", 1, null, null), ENGLISH); tracker.addUndefinedStep(new Step(null, "Given ", "B", 1, null, null), ENGLISH); tracker.addUndefinedStep(new Step(null, "Given ", "B", 1, null, null), ENGLISH); assertEquals("[Given ^B$]", tracker.getSnippets(asList(backend), functionNameGenerator).toString()); } @Test public void converts_and_to_previous_step_keyword() { Backend backend = new TestBackend(); UndefinedStepsTracker tracker = new UndefinedStepsTracker(); tracker.storeStepKeyword(new Step(null, "When ", "A", 1, null, null), ENGLISH); tracker.storeStepKeyword(new Step(null, "And ", "B", 1, null, null), ENGLISH); tracker.addUndefinedStep(new Step(null, "But ", "C", 1, null, null), ENGLISH); assertEquals("[When ^C$]", tracker.getSnippets(asList(backend), functionNameGenerator).toString()); } @Test public void doesnt_try_to_use_star_keyword() { Backend backend = new TestBackend(); UndefinedStepsTracker tracker = new UndefinedStepsTracker(); tracker.storeStepKeyword(new Step(null, "When ", "A", 1, null, null), ENGLISH); tracker.storeStepKeyword(new Step(null, "And ", "B", 1, null, null), ENGLISH); tracker.addUndefinedStep(new Step(null, "* ", "C", 1, null, null), ENGLISH); assertEquals("[When ^C$]", tracker.getSnippets(asList(backend), functionNameGenerator).toString()); } @Test public void star_keyword_becomes_given_when_no_previous_step() { Backend backend = new TestBackend(); UndefinedStepsTracker tracker = new UndefinedStepsTracker(); tracker.addUndefinedStep(new Step(null, "* ", "A", 1, null, null), ENGLISH); assertEquals("[Given ^A$]", tracker.getSnippets(asList(backend), functionNameGenerator).toString()); } @Test public void snippets_are_generated_for_correct_locale() throws Exception { Backend backend = new TestBackend(); UndefinedStepsTracker tracker = new UndefinedStepsTracker(); tracker.addUndefinedStep(new Step(null, "Если ", "Б", 1, null, null), new I18n("ru")); assertEquals("[Если ^Б$]", tracker.getSnippets(asList(backend), functionNameGenerator).toString()); } private class TestBackend implements Backend { @Override public void loadGlue(Glue glue, List<String> gluePaths) { throw new UnsupportedOperationException(); } @Override public void setUnreportedStepExecutor(UnreportedStepExecutor executor) { throw new UnsupportedOperationException(); } @Override public void buildWorld() { throw new UnsupportedOperationException(); } @Override public void disposeWorld() { throw new UnsupportedOperationException(); } @Override public String getSnippet(Step step, FunctionNameGenerator functionNameGenerator) { return new SnippetGenerator(new TestSnippet()).getSnippet(step, functionNameGenerator); } } private class TestSnippet implements Snippet { @Override public String template() { return "{0} {1}"; } @Override public String tableHint() { return null; } @Override public String arguments(List<Class<?>> argumentTypes) { return argumentTypes.toString(); } @Override public String namedGroupStart() { return null; } @Override public String namedGroupEnd() { return null; } @Override public String escapePattern(String pattern) { return pattern; } } }