1
1
package io .cucumber .core .plugin ;
2
2
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 ;
3
9
import io .cucumber .plugin .ColorAware ;
4
10
import io .cucumber .plugin .ConcurrentEventListener ;
5
11
import 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 ;
10
12
11
13
import java .io .OutputStream ;
14
+ import java .io .OutputStreamWriter ;
15
+ import java .io .PrintWriter ;
16
+ import java .nio .charset .StandardCharsets ;
17
+ import java .util .EnumMap ;
12
18
import java .util .HashMap ;
13
19
import java .util .Map ;
14
20
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 ;
16
28
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 {
37
30
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 ;
39
35
private boolean monochrome = false ;
40
-
36
+
41
37
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
+ );
43
62
}
44
63
45
64
@ Override
@@ -49,32 +68,47 @@ public void setMonochrome(boolean monochrome) {
49
68
50
69
@ Override
51
70
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 ));
54
80
}
55
81
56
82
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 )) {
60
84
return ;
61
85
}
86
+ TestStepResultStatus status = event .getTestStepResult ().getStatus ();
62
87
// Prevent tearing in output when multiple threads write to System.out
63
88
StringBuilder buffer = new StringBuilder ();
64
89
if (!monochrome ) {
65
- ANSI_ESCAPES .get (event . getResult (). getStatus () ).appendTo (buffer );
90
+ escapes .get (status ).appendTo (buffer );
66
91
}
67
- buffer .append (CHARS .get (event . getResult (). getStatus () ));
92
+ buffer .append (chars .get (status ));
68
93
if (!monochrome ) {
69
94
AnsiEscapes .RESET .appendTo (buffer );
70
95
}
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 ();
73
107
}
74
108
75
109
private void handleTestRunFinished (TestRunFinished testRunFinished ) {
76
- out .println ();
77
- out .close ();
110
+ writer .println ();
111
+ writer .close ();
78
112
}
79
113
80
114
}
0 commit comments