-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathCourgetteJUnitRunner.java
107 lines (89 loc) · 3.83 KB
/
CourgetteJUnitRunner.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package courgette.runtime.junit;
import courgette.runtime.CourgetteCallbacks;
import courgette.runtime.CourgetteProperties;
import courgette.runtime.CourgetteRunResult;
import courgette.runtime.CourgetteRunnerInfo;
import courgette.runtime.CourgetteTestFailureException;
import io.cucumber.core.gherkin.Feature;
import io.cucumber.core.gherkin.Pickle;
import org.junit.runner.Description;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.ParentRunner;
import org.junit.runners.model.InitializationError;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
public abstract class CourgetteJUnitRunner extends ParentRunner<Feature> {
protected CourgetteProperties courgetteProperties;
protected List<Feature> features;
protected List<CourgetteRunnerInfo> runnerInfoList;
protected CourgetteCallbacks callbacks;
protected Description description;
private Map<Feature, Description> featureDescriptions = new HashMap<>();
private List<String> featureDescriptionNames = new ArrayList<>();
protected CourgetteJUnitRunner(Class<?> testClass) throws InitializationError {
super(testClass);
}
@Override
protected List<Feature> getChildren() {
return features;
}
@Override
protected Description describeChild(Feature child) {
return description;
}
@Override
public Description getDescription() {
createDescription();
return description;
}
@Override
protected void runChild(Feature child, RunNotifier notifier) {
}
private void createDescription() {
if (description == null) {
description = Description.createSuiteDescription(getName());
}
getChildren()
.stream()
.distinct()
.forEach(feature -> {
if (feature.getName().isPresent() && !featureDescriptionNames.contains(feature.getName().get())) {
Description featureDescription = Description.createTestDescription(this.getClass(), feature.getName().get());
description.addChild(featureDescription);
featureDescriptions.put(feature, featureDescription);
feature.getName().ifPresent(featureDescriptionNames::add);
}
});
}
protected void notifyTestStarted(RunNotifier notifier) {
featureDescriptions.values().forEach(notifier::fireTestStarted);
}
protected void notifyTestSuccess(RunNotifier notifier) {
featureDescriptions.values().forEach(notifier::fireTestFinished);
}
protected void notifyTestFailure(RunNotifier notifier, List<CourgetteRunResult> failures) {
failures.forEach(failure -> {
Feature feature = failure.getFeature();
Description description = featureDescriptions.get(feature);
notifier.fireTestFailure(new Failure(description, createFailureThrowable(feature, failure)));
});
featureDescriptions.keySet().removeAll(failures.stream().map(CourgetteRunResult::getFeature).collect(Collectors.toList()));
}
private Throwable createFailureThrowable(Feature feature, CourgetteRunResult failure) {
String testId = feature.getName().orElse("Test");
if (failure.getLineId() != null) {
Optional<Pickle> scenarioName = feature.getPickles()
.stream().filter(t -> t.getLocation().getLine() == failure.getLineId())
.findFirst();
if (scenarioName.isPresent()) {
testId = testId + " - " + scenarioName.get().getName();
}
}
return new CourgetteTestFailureException(testId + " failed.");
}
}