11package io .cucumber .core .plugin ;
22
3+ import io .cucumber .messages .types .Envelope ;
4+ import io .cucumber .messages .types .TestCase ;
5+ import io .cucumber .messages .types .TestRunFinished ;
6+ import io .cucumber .messages .types .TestStep ;
7+ import io .cucumber .messages .types .TestStepFinished ;
8+ import io .cucumber .messages .types .TestStepResultStatus ;
39import io .cucumber .plugin .ColorAware ;
410import io .cucumber .plugin .ConcurrentEventListener ;
511import io .cucumber .plugin .event .EventPublisher ;
6- import io .cucumber .plugin .event .PickleStepTestStep ;
7- import io .cucumber .plugin .event .Status ;
8- import io .cucumber .plugin .event .TestRunFinished ;
9- import io .cucumber .plugin .event .TestStepFinished ;
1012
1113import java .io .OutputStream ;
14+ import java .io .OutputStreamWriter ;
15+ import java .io .PrintWriter ;
16+ import java .nio .charset .StandardCharsets ;
17+ import java .util .EnumMap ;
1218import java .util .HashMap ;
1319import java .util .Map ;
1420
15- public final class ProgressFormatter implements ConcurrentEventListener , ColorAware {
21+ import static io .cucumber .messages .types .TestStepResultStatus .AMBIGUOUS ;
22+ import static io .cucumber .messages .types .TestStepResultStatus .FAILED ;
23+ import static io .cucumber .messages .types .TestStepResultStatus .PASSED ;
24+ import static io .cucumber .messages .types .TestStepResultStatus .PENDING ;
25+ import static io .cucumber .messages .types .TestStepResultStatus .SKIPPED ;
26+ import static io .cucumber .messages .types .TestStepResultStatus .UNDEFINED ;
27+ import static java .util .Objects .requireNonNull ;
1628
17- private static final Map <Status , Character > CHARS = new HashMap <Status , Character >() {
18- {
19- put (Status .PASSED , '.' );
20- put (Status .UNDEFINED , 'U' );
21- put (Status .PENDING , 'P' );
22- put (Status .SKIPPED , '-' );
23- put (Status .FAILED , 'F' );
24- put (Status .AMBIGUOUS , 'A' );
25- }
26- };
27- private static final Map <Status , AnsiEscapes > ANSI_ESCAPES = new HashMap <Status , AnsiEscapes >() {
28- {
29- put (Status .PASSED , AnsiEscapes .GREEN );
30- put (Status .UNDEFINED , AnsiEscapes .YELLOW );
31- put (Status .PENDING , AnsiEscapes .YELLOW );
32- put (Status .SKIPPED , AnsiEscapes .CYAN );
33- put (Status .FAILED , AnsiEscapes .RED );
34- put (Status .AMBIGUOUS , AnsiEscapes .RED );
35- }
36- };
29+ public final class ProgressFormatter implements ConcurrentEventListener , ColorAware {
3730
38- private final UTF8PrintWriter out ;
31+ private final Map <String , TestStep > testStepById = new HashMap <>();
32+ private final Map <TestStepResultStatus , String > chars = new EnumMap <>(TestStepResultStatus .class );
33+ private final Map <TestStepResultStatus , AnsiEscapes > escapes = new EnumMap <>(TestStepResultStatus .class );
34+ private final PrintWriter writer ;
3935 private boolean monochrome = false ;
40-
36+
4137 public ProgressFormatter (OutputStream out ) {
42- this .out = new UTF8PrintWriter (out );
38+ this .writer = createPrintWriter (out );
39+
40+ chars .put (PASSED , "." );
41+ chars .put (UNDEFINED , "U" );
42+ chars .put (PENDING , "P" );
43+ chars .put (SKIPPED , "-" );
44+ chars .put (FAILED , "F" );
45+ chars .put (AMBIGUOUS , "A" );
46+
47+ escapes .put (PASSED , AnsiEscapes .GREEN );
48+ escapes .put (UNDEFINED , AnsiEscapes .YELLOW );
49+ escapes .put (PENDING , AnsiEscapes .YELLOW );
50+ escapes .put (SKIPPED , AnsiEscapes .CYAN );
51+ escapes .put (FAILED , AnsiEscapes .RED );
52+ escapes .put (AMBIGUOUS , AnsiEscapes .RED );
53+ }
54+
55+ private static PrintWriter createPrintWriter (OutputStream out ) {
56+ return new PrintWriter (
57+ new OutputStreamWriter (
58+ requireNonNull (out ),
59+ StandardCharsets .UTF_8
60+ )
61+ );
4362 }
4463
4564 @ Override
@@ -49,32 +68,47 @@ public void setMonochrome(boolean monochrome) {
4968
5069 @ Override
5170 public void setEventPublisher (EventPublisher publisher ) {
52- publisher .registerHandlerFor (TestStepFinished .class , this ::handleTestStepFinished );
53- publisher .registerHandlerFor (TestRunFinished .class , this ::handleTestRunFinished );
71+ publisher .registerHandlerFor (Envelope .class , event -> {
72+ event .getTestCase ().ifPresent (this ::updateTestCase );
73+ event .getTestStepFinished ().ifPresent (this ::handleTestStepFinished );
74+ event .getTestRunFinished ().ifPresent (this ::handleTestRunFinished );
75+ });
76+ }
77+
78+ private void updateTestCase (TestCase event ) {
79+ event .getTestSteps ().forEach (testStep -> testStepById .put (testStep .getId (), testStep ));
5480 }
5581
5682 private void handleTestStepFinished (TestStepFinished event ) {
57- boolean isTestStep = event .getTestStep () instanceof PickleStepTestStep ;
58- boolean isFailedHookOrTestStep = event .getResult ().getStatus ().is (Status .FAILED );
59- if (!(isTestStep || isFailedHookOrTestStep )) {
83+ if (!includeStep (event )) {
6084 return ;
6185 }
86+ TestStepResultStatus status = event .getTestStepResult ().getStatus ();
6287 // Prevent tearing in output when multiple threads write to System.out
6388 StringBuilder buffer = new StringBuilder ();
6489 if (!monochrome ) {
65- ANSI_ESCAPES .get (event . getResult (). getStatus () ).appendTo (buffer );
90+ escapes .get (status ).appendTo (buffer );
6691 }
67- buffer .append (CHARS .get (event . getResult (). getStatus () ));
92+ buffer .append (chars .get (status ));
6893 if (!monochrome ) {
6994 AnsiEscapes .RESET .appendTo (buffer );
7095 }
71- out .append (buffer );
72- out .flush ();
96+ writer .append (buffer );
97+ writer .flush ();
98+ }
99+
100+ private boolean includeStep (TestStepFinished testStepFinished ) {
101+ TestStepResultStatus status = testStepFinished .getTestStepResult ().getStatus ();
102+ if (status == FAILED ) {
103+ return true ;
104+ }
105+ TestStep testStep = testStepById .get (testStepFinished .getTestStepId ());
106+ return testStep != null && testStep .getPickleStepId ().isPresent ();
73107 }
74108
75109 private void handleTestRunFinished (TestRunFinished testRunFinished ) {
76- out .println ();
77- out .close ();
110+ writer .println ();
111+ writer .close ();
78112 }
79113
80114}
0 commit comments