in junit-platform-testkit/src/main/java/org/junit/platform/testkit/engine/Executions.java [253:300]
private static List<Execution> createExecutions(List<Event> events) {
List<Execution> executions = new ArrayList<>();
Map<TestDescriptor, Instant> executionStarts = new HashMap<>();
for (Event event : events) {
switch (event.getType()) {
case STARTED: {
executionStarts.put(event.getTestDescriptor(), event.getTimestamp());
break;
}
case SKIPPED: {
// Based on the Javadoc for EngineExecutionListener.executionSkipped(...),
// a skipped descriptor must never be reported as started or finished,
// but just in case a TestEngine does not adhere to that contract, we
// make an attempt to remove any tracked "started" event.
executionStarts.remove(event.getTestDescriptor());
// Use the same timestamp for both the start and end Instant values.
Instant timestamp = event.getTimestamp();
Execution skippedEvent = Execution.skipped(event.getTestDescriptor(), timestamp, timestamp,
event.getRequiredPayload(String.class));
executions.add(skippedEvent);
break;
}
case FINISHED: {
Instant startInstant = executionStarts.remove(event.getTestDescriptor());
Instant endInstant = event.getTimestamp();
// If "started" events have already been filtered out, it is no
// longer possible to create a legitimate Execution for the current
// descriptor. So we effectively ignore it in that case.
if (startInstant != null) {
Execution finishedEvent = Execution.finished(event.getTestDescriptor(), startInstant,
endInstant, event.getRequiredPayload(TestExecutionResult.class));
executions.add(finishedEvent);
}
break;
}
default: {
// Ignore other events
break;
}
}
}
return executions;
}