Skip to content

Commit 6675ff8

Browse files
committed
[Core] update to Gherkin5.
1 parent b3795da commit 6675ff8

23 files changed

+184
-141
lines changed

core/src/main/java/cucumber/api/TestCase.java

+11-11
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,25 @@
44
import cucumber.api.event.TestCaseStarted;
55
import cucumber.runner.EventBus;
66
import cucumber.runtime.ScenarioImpl;
7-
import gherkin.pickles.Pickle;
7+
import gherkin.events.PickleEvent;
88
import gherkin.pickles.PickleLocation;
99
import gherkin.pickles.PickleTag;
1010

1111
import java.util.List;
1212

1313
public class TestCase {
14-
private final Pickle pickle;
14+
private final PickleEvent pickleEvent;
1515
private final List<TestStep> testSteps;
1616

17-
public TestCase(List<TestStep> testSteps, Pickle pickle) {
17+
public TestCase(List<TestStep> testSteps, PickleEvent pickleEvent) {
1818
this.testSteps = testSteps;
19-
this.pickle = pickle;
19+
this.pickleEvent = pickleEvent;
2020
}
2121

2222
public void run(EventBus bus, String language) {
2323
boolean skipNextStep = false;
2424
bus.send(new TestCaseStarted(bus.getTime(), this));
25-
ScenarioImpl scenarioResult = new ScenarioImpl(bus, pickle);
25+
ScenarioImpl scenarioResult = new ScenarioImpl(bus, pickleEvent.pickle);
2626
for (TestStep step : testSteps) {
2727
Result stepResult = step.run(bus, language, scenarioResult, skipNextStep);
2828
if (stepResult.getStatus() != Result.PASSED) {
@@ -38,26 +38,26 @@ public List<TestStep> getTestSteps() {
3838
}
3939

4040
public String getName() {
41-
return pickle.getName();
41+
return pickleEvent.pickle.getName();
4242
}
4343

4444
public String getScenarioDesignation() {
45-
return fileColonLine(pickle.getLocations().get(0)) + " # " + getName();
45+
return fileColonLine(pickleEvent.pickle.getLocations().get(0)) + " # " + getName();
4646
}
4747

4848
public String getPath() {
49-
return pickle.getLocations().get(0).getPath();
49+
return pickleEvent.uri;
5050
}
5151

5252
public int getLine() {
53-
return pickle.getLocations().get(0).getLine();
53+
return pickleEvent.pickle.getLocations().get(0).getLine();
5454
}
5555

5656
private String fileColonLine(PickleLocation location) {
57-
return location.getPath() + ":" + Integer.toString(location.getLine());
57+
return pickleEvent.uri + ":" + Integer.toString(location.getLine());
5858
}
5959

6060
public List<PickleTag> getTags() {
61-
return pickle.getTags();
61+
return pickleEvent.pickle.getTags();
6262
}
6363
}

core/src/main/java/cucumber/runner/PickleTestStep.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
import java.util.List;
1111

1212
public class PickleTestStep extends TestStep {
13+
private String uri;
1314
private PickleStep step;
1415

15-
public PickleTestStep(PickleStep step, DefinitionMatch definitionMatch) {
16+
public PickleTestStep(String uri, PickleStep step, DefinitionMatch definitionMatch) {
1617
super(definitionMatch);
18+
this.uri = uri;
1719
this.step = step;
1820
}
1921

@@ -29,7 +31,7 @@ public PickleStep getPickleStep() {
2931

3032
@Override
3133
public String getStepLocation() {
32-
return step.getLocations().get(0).getPath() + ":" + Integer.toString(getStepLine());
34+
return uri + ":" + Integer.toString(getStepLine());
3335
}
3436

3537
@Override

core/src/main/java/cucumber/runner/Runner.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
import cucumber.runtime.StepDefinitionMatch;
1616
import cucumber.runtime.UndefinedStepDefinitionMatch;
1717
import cucumber.runtime.UnreportedStepExecutor;
18+
import gherkin.events.PickleEvent;
1819
import gherkin.pickles.Argument;
19-
import gherkin.pickles.Pickle;
2020
import gherkin.pickles.PickleLocation;
2121
import gherkin.pickles.PickleRow;
2222
import gherkin.pickles.PickleStep;
@@ -73,7 +73,7 @@ public void runUnreportedStep(String featurePath, String language, String stepNa
7373
match.runStep(language, null);
7474
}
7575

76-
public void runPickle(Pickle pickle, String language) {
76+
public void runPickle(PickleEvent pickle, String language) {
7777
buildBackendWorlds(); // Java8 step definitions will be added to the glue here
7878
TestCase testCase = createTestCaseForPickle(pickle);
7979
testCase.run(bus, language);
@@ -89,24 +89,24 @@ public void reportStepDefinitions(StepDefinitionReporter stepDefinitionReporter)
8989
glue.reportStepDefinitions(stepDefinitionReporter);
9090
}
9191

92-
private TestCase createTestCaseForPickle(Pickle pickle) {
92+
private TestCase createTestCaseForPickle(PickleEvent pickleEvent) {
9393
List<TestStep> testSteps = new ArrayList<TestStep>();
9494
if (!runtimeOptions.isDryRun()) {
95-
addTestStepsForBeforeHooks(testSteps, pickle.getTags());
95+
addTestStepsForBeforeHooks(testSteps, pickleEvent.pickle.getTags());
9696
}
97-
addTestStepsForPickleSteps(testSteps, pickle);
97+
addTestStepsForPickleSteps(testSteps, pickleEvent);
9898
if (!runtimeOptions.isDryRun()) {
99-
addTestStepsForAfterHooks(testSteps, pickle.getTags());
99+
addTestStepsForAfterHooks(testSteps, pickleEvent.pickle.getTags());
100100
}
101-
TestCase testCase = new TestCase(testSteps, pickle);
101+
TestCase testCase = new TestCase(testSteps, pickleEvent);
102102
return testCase;
103103
}
104104

105-
private void addTestStepsForPickleSteps(List<TestStep> testSteps, Pickle pickle) {
106-
for (PickleStep step : pickle.getSteps()) {
105+
private void addTestStepsForPickleSteps(List<TestStep> testSteps, PickleEvent pickleEvent) {
106+
for (PickleStep step : pickleEvent.pickle.getSteps()) {
107107
StepDefinitionMatch match;
108108
try {
109-
match = glue.stepDefinitionMatch(pickle.getLocations().get(0).getPath(), step);
109+
match = glue.stepDefinitionMatch(pickleEvent.uri, step);
110110
if (match == null) {
111111
List<String> snippets = new ArrayList<String>();
112112
for (Backend backend : backends) {
@@ -120,9 +120,9 @@ private void addTestStepsForPickleSteps(List<TestStep> testSteps, Pickle pickle)
120120
} catch (AmbiguousStepDefinitionsException e) {
121121
match = new AmbiguousStepDefinitionsMatch(step, e);
122122
} catch (Throwable t) {
123-
match = new FailedStepInstantiationMatch(step, t);
123+
match = new FailedStepInstantiationMatch(pickleEvent.uri, step, t);
124124
}
125-
testSteps.add(new PickleTestStep(step, match));
125+
testSteps.add(new PickleTestStep(pickleEvent.uri, step, match));
126126
}
127127
}
128128

core/src/main/java/cucumber/runtime/FailedStepInstantiationMatch.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
public class FailedStepInstantiationMatch extends StepDefinitionMatch {
99
private final Throwable throwable;
1010

11-
public FailedStepInstantiationMatch(PickleStep step, Throwable throwable) {
12-
super(Collections.<Argument>emptyList(), new NoStepDefinition(), step.getLocations().get(0).getPath(), step, null);
11+
public FailedStepInstantiationMatch(String uri, PickleStep step, Throwable throwable) {
12+
super(Collections.<Argument>emptyList(), new NoStepDefinition(), uri, step, null);
1313
this.throwable = removeFrameworkFramesAndAppendStepLocation(throwable, getStepLocation());
1414
}
1515

core/src/main/java/cucumber/runtime/LinePredicate.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package cucumber.runtime;
22

3-
import gherkin.pickles.Pickle;
3+
import gherkin.events.PickleEvent;
44
import gherkin.pickles.PickleLocation;
55

66
import java.util.List;
@@ -14,13 +14,13 @@ public LinePredicate(Map<String, List<Long>> lineFilters) {
1414
}
1515

1616
@Override
17-
public boolean apply(Pickle pickle) {
18-
String picklePath = pickle.getLocations().get(0).getPath();
17+
public boolean apply(PickleEvent pickleEvent) {
18+
String picklePath = pickleEvent.uri;
1919
if (!lineFilters.containsKey(picklePath)) {
2020
return true;
2121
}
2222
for (Long line : lineFilters.get(picklePath)) {
23-
for (PickleLocation location : pickle.getLocations()) {
23+
for (PickleLocation location : pickleEvent.pickle.getLocations()) {
2424
if (line == location.getLine()) {
2525
return true;
2626
}

core/src/main/java/cucumber/runtime/NamePredicate.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package cucumber.runtime;
22

3-
import gherkin.pickles.Pickle;
3+
import gherkin.events.PickleEvent;
44

55
import java.util.List;
66
import java.util.regex.Pattern;
@@ -13,8 +13,8 @@ public NamePredicate(List<Pattern> patterns) {
1313
}
1414

1515
@Override
16-
public boolean apply(Pickle pickle) {
17-
String name = pickle.getName();
16+
public boolean apply(PickleEvent pickleEvent) {
17+
String name = pickleEvent.pickle.getName();
1818
for (Pattern pattern : patterns) {
1919
if (pattern.matcher(name).find()) {
2020
return true;
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package cucumber.runtime;
22

3-
import gherkin.pickles.Pickle;
3+
import gherkin.events.PickleEvent;
44

55
public interface PicklePredicate {
66

7-
boolean apply(Pickle pickle);
7+
boolean apply(PickleEvent pickleEvent);
88
}

core/src/main/java/cucumber/runtime/Runtime.java

+10-7
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import cucumber.runtime.io.ResourceLoader;
1616
import cucumber.runtime.model.CucumberFeature;
1717
import cucumber.runtime.xstream.LocalizedXStreams;
18+
import gherkin.events.PickleEvent;
1819
import gherkin.pickles.Compiler;
1920
import gherkin.pickles.Pickle;
2021

@@ -157,18 +158,20 @@ public void reportStepDefinitions(StepDefinitionReporter stepDefinitionReporter)
157158
}
158159

159160
public void runFeature(CucumberFeature feature) {
160-
List<Pickle> pickles = new ArrayList<Pickle>();
161-
pickles.addAll(compiler.compile(feature.getGherkinFeature(), feature.getPath()));
162-
for (Pickle pickle : pickles) {
163-
if (matchesFilters(pickle)) {
164-
runner.runPickle(pickle, feature.getLanguage());
161+
List<PickleEvent> pickleEvents = new ArrayList<PickleEvent>();
162+
for (Pickle pickle : compiler.compile(feature.getGherkinFeature())) {
163+
pickleEvents.add(new PickleEvent(feature.getPath(), pickle));
164+
}
165+
for (PickleEvent pickleEvent : pickleEvents) {
166+
if (matchesFilters(pickleEvent)) {
167+
runner.runPickle(pickleEvent, feature.getLanguage());
165168
}
166169
}
167170
}
168171

169-
public boolean matchesFilters(Pickle pickle) {
172+
public boolean matchesFilters(PickleEvent pickleEvent) {
170173
for (PicklePredicate filter : filters) {
171-
if (!filter.apply(pickle)) {
174+
if (!filter.apply(pickleEvent)) {
172175
return false;
173176
}
174177
}

core/src/main/java/cucumber/runtime/TagPredicate.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package cucumber.runtime;
22

3-
import gherkin.pickles.Pickle;
3+
import gherkin.events.PickleEvent;
44
import gherkin.pickles.PickleTag;
55
import io.cucumber.tagexpressions.Expression;
66
import io.cucumber.tagexpressions.TagExpressionParser;
@@ -31,8 +31,8 @@ public TagPredicate(List<String> tagExpressions) {
3131
}
3232

3333
@Override
34-
public boolean apply(Pickle pickle) {
35-
return apply(pickle.getTags());
34+
public boolean apply(PickleEvent pickleEvent) {
35+
return apply(pickleEvent.pickle.getTags());
3636
}
3737

3838
public boolean apply(Collection<PickleTag> pickleTags) {

core/src/main/java/cucumber/runtime/UndefinedStepsTracker.java

+16-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package cucumber.runtime;
22

33
import cucumber.api.Result;
4+
import cucumber.api.TestCase;
45
import cucumber.api.TestStep;
56
import cucumber.api.event.EventHandler;
67
import cucumber.api.event.EventListener;
78
import cucumber.api.event.EventPublisher;
9+
import cucumber.api.event.TestCaseStarted;
810
import cucumber.api.event.TestSourceRead;
911
import cucumber.api.event.TestStepFinished;
1012
import gherkin.AstBuilder;
@@ -32,13 +34,20 @@ public class UndefinedStepsTracker implements EventListener {
3234
private final Map<String, String> pathToSourceMap = new HashMap<String, String>();
3335
private final Map<String, FeatureStepMap> pathToStepMap = new HashMap<String, FeatureStepMap>();
3436
private boolean hasUndefinedSteps = false;
37+
private String currentUri;
3538

3639
private EventHandler<TestSourceRead> testSourceReadHandler = new EventHandler<TestSourceRead>() {
3740
@Override
3841
public void receive(TestSourceRead event) {
3942
pathToSourceMap.put(event.path, event.source);
4043
}
4144
};
45+
private EventHandler<TestCaseStarted> testCaseStartedHandler = new EventHandler<TestCaseStarted>() {
46+
@Override
47+
public void receive(TestCaseStarted event) {
48+
handleTestCaseStarted(event.testCase);
49+
}
50+
};
4251
private EventHandler<TestStepFinished> testStepFinishedHandler = new EventHandler<TestStepFinished>() {
4352
@Override
4453
public void receive(TestStepFinished event) {
@@ -49,6 +58,7 @@ public void receive(TestStepFinished event) {
4958
@Override
5059
public void setEventPublisher(EventPublisher publisher) {
5160
publisher.registerHandlerFor(TestSourceRead.class, testSourceReadHandler);
61+
publisher.registerHandlerFor(TestCaseStarted.class, testCaseStartedHandler);
5262
publisher.registerHandlerFor(TestStepFinished.class, testStepFinishedHandler);
5363
}
5464

@@ -60,6 +70,10 @@ public List<String> getSnippets() {
6070
return snippets;
6171
}
6272

73+
void handleTestCaseStarted(TestCase testCase) {
74+
currentUri = testCase.getPath();
75+
}
76+
6377
void handleTestStepFinished(TestStep step, Result result) {
6478
if (Result.UNDEFINED.equals(result.getStatus())) {
6579
hasUndefinedSteps = true;
@@ -77,9 +91,8 @@ private String givenWhenThenKeyword(PickleStep step) {
7791
String keyword = null;
7892
if (!step.getLocations().isEmpty()) {
7993
List<PickleLocation> stepLocations = step.getLocations();
80-
String path = stepLocations.get(0).getPath();
81-
if (pathToSourceMap.containsKey(path)) {
82-
keyword = getKeywordFromSource(path, stepLocations);
94+
if (pathToSourceMap.containsKey(currentUri)) {
95+
keyword = getKeywordFromSource(currentUri, stepLocations);
8396
}
8497
}
8598
return keyword != null ? keyword : getFirstGivenKeyword(dialectProvider.getDefaultDialect());

core/src/main/java/cucumber/runtime/autocomplete/StepdefGenerator.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public List<MetaStepdef> generate(Collection<StepDefinition> stepDefinitions, Li
3636
metaStepdef.source = stepDefinition.getPattern();
3737
metaStepdef.flags = ""; // TODO = get the flags too
3838
for (CucumberFeature feature : features) {
39-
for (Pickle pickle : compiler.compile(feature.getGherkinFeature(), feature.getPath())) {
39+
for (Pickle pickle : compiler.compile(feature.getGherkinFeature())) {
4040
for (PickleStep step : pickle.getSteps()) {
4141
List<Argument> arguments = stepDefinition.matchedArguments(step);
4242
if (arguments != null) {

core/src/test/java/cucumber/api/TestCaseTest.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import cucumber.api.event.TestCaseFinished;
88
import cucumber.api.event.TestCaseStarted;
99
import cucumber.runner.EventBus;
10+
import gherkin.events.PickleEvent;
1011
import gherkin.pickles.Pickle;
1112
import org.junit.Test;
1213
import org.mockito.InOrder;
@@ -30,7 +31,7 @@ public void run_wraps_execute_in_test_case_started_and_finished_events() throws
3031
TestStep testStep = mock(TestStep.class);
3132
when(testStep.run(eq(bus), eq(language), isA(Scenario.class), anyBoolean())).thenReturn(resultWithStatus(Result.UNDEFINED));
3233

33-
TestCase testCase = new TestCase(Arrays.asList(testStep), mock(Pickle.class));
34+
TestCase testCase = new TestCase(Arrays.asList(testStep), pickleEvent());
3435
testCase.run(bus, language);
3536

3637
InOrder order = inOrder(bus, testStep);
@@ -48,7 +49,7 @@ public void run_all_steps() throws Throwable {
4849
TestStep testStep2 = mock(TestStep.class);
4950
when(testStep2.run(eq(bus), eq(language), isA(Scenario.class), anyBoolean())).thenReturn(resultWithStatus(Result.PASSED));
5051

51-
TestCase testCase = new TestCase(Arrays.asList(testStep1, testStep2), mock(Pickle.class));
52+
TestCase testCase = new TestCase(Arrays.asList(testStep1, testStep2), pickleEvent());
5253
testCase.run(bus, language);
5354

5455
InOrder order = inOrder(testStep1, testStep2);
@@ -65,14 +66,18 @@ public void skip_steps_after_the_first_non_passed_result() throws Throwable {
6566
TestStep testStep2 = mock(TestStep.class);
6667
when(testStep2.run(eq(bus), eq(language), isA(Scenario.class), anyBoolean())).thenReturn(Result.SKIPPED);
6768

68-
TestCase testCase = new TestCase(Arrays.asList(testStep1, testStep2), mock(Pickle.class));
69+
TestCase testCase = new TestCase(Arrays.asList(testStep1, testStep2), pickleEvent());
6970
testCase.run(bus, language);
7071

7172
InOrder order = inOrder(testStep1, testStep2);
7273
order.verify(testStep1).run(eq(bus), eq(language), isA(Scenario.class), eq(false));
7374
order.verify(testStep2).run(eq(bus), eq(language), isA(Scenario.class), eq(true));
7475
}
7576

77+
private PickleEvent pickleEvent() {
78+
return new PickleEvent("uri", mock(Pickle.class));
79+
}
80+
7681
private Result resultWithStatus(String status) {
7782
return new Result(status, null, null);
7883
}

0 commit comments

Comments
 (0)