17
17
import static org .junit .platform .commons .util .StringUtils .isNotBlank ;
18
18
import static org .junit .platform .console .tasks .XmlReportData .isFailure ;
19
19
import static org .junit .platform .engine .TestExecutionResult .Status .FAILED ;
20
+ import static org .junit .platform .launcher .LauncherConstants .STDERR_REPORT_ENTRY_KEY ;
21
+ import static org .junit .platform .launcher .LauncherConstants .STDOUT_REPORT_ENTRY_KEY ;
20
22
21
23
import java .io .Writer ;
22
24
import java .net .InetAddress ;
23
25
import java .net .UnknownHostException ;
24
26
import java .text .NumberFormat ;
25
27
import java .time .LocalDateTime ;
28
+ import java .util .ArrayList ;
29
+ import java .util .LinkedHashMap ;
26
30
import java .util .List ;
27
31
import java .util .Locale ;
32
+ import java .util .Map ;
28
33
import java .util .Optional ;
29
34
import java .util .Properties ;
30
35
import java .util .TreeSet ;
@@ -97,7 +102,7 @@ private void writeTestsuite(TestIdentifier testIdentifier, List<TestIdentifier>
97
102
writeTestcase (test , numberFormat , writer );
98
103
}
99
104
100
- writeNonStandardAttributesToSystemOutElement ( testIdentifier , writer );
105
+ writeOutputElement ( "system-out" , formatNonStandardAttributesAsString ( testIdentifier ) , writer );
101
106
102
107
writer .writeEndElement ();
103
108
newLine (writer );
@@ -146,8 +151,13 @@ private void writeTestcase(TestIdentifier testIdentifier, NumberFormat numberFor
146
151
newLine (writer );
147
152
148
153
writeSkippedOrErrorOrFailureElement (testIdentifier , writer );
149
- writeReportEntriesToSystemOutElement (testIdentifier , writer );
150
- writeNonStandardAttributesToSystemOutElement (testIdentifier , writer );
154
+
155
+ List <String > systemOutElements = new ArrayList <>();
156
+ List <String > systemErrElements = new ArrayList <>();
157
+ systemOutElements .add (formatNonStandardAttributesAsString (testIdentifier ));
158
+ collectReportEntries (testIdentifier , systemOutElements , systemErrElements );
159
+ writeOutputElements ("system-out" , systemOutElements , writer );
160
+ writeOutputElements ("system-err" , systemErrElements , writer );
151
161
152
162
writer .writeEndElement ();
153
163
newLine (writer );
@@ -211,28 +221,41 @@ private void writeFailureAttributesAndContent(Throwable throwable, XMLStreamWrit
211
221
writeCDataSafely (writer , readStackTrace (throwable ));
212
222
}
213
223
214
- private void writeReportEntriesToSystemOutElement (TestIdentifier testIdentifier , XMLStreamWriter writer )
215
- throws XMLStreamException {
216
-
224
+ private void collectReportEntries (TestIdentifier testIdentifier , List <String > systemOutElements ,
225
+ List <String > systemErrElements ) {
217
226
List <ReportEntry > entries = this .reportData .getReportEntries (testIdentifier );
218
227
if (!entries .isEmpty ()) {
219
- writer . writeStartElement ( "system-out" );
220
- newLine ( writer );
228
+ List < String > systemOutElementsForCapturedOutput = new ArrayList <>( );
229
+ StringBuilder formattedReportEntries = new StringBuilder ( );
221
230
for (int i = 0 ; i < entries .size (); i ++) {
222
- writer .writeCharacters (buildReportEntryDescription (entries .get (i ), i + 1 ));
231
+ ReportEntry reportEntry = entries .get (i );
232
+ Map <String , String > keyValuePairs = new LinkedHashMap <>(reportEntry .getKeyValuePairs ());
233
+ removeIfPresentAndAddAsSeparateElement (keyValuePairs , STDOUT_REPORT_ENTRY_KEY ,
234
+ systemOutElementsForCapturedOutput );
235
+ removeIfPresentAndAddAsSeparateElement (keyValuePairs , STDERR_REPORT_ENTRY_KEY , systemErrElements );
236
+ if (!keyValuePairs .isEmpty ()) {
237
+ buildReportEntryDescription (reportEntry .getTimestamp (), keyValuePairs , i + 1 ,
238
+ formattedReportEntries );
239
+ }
223
240
}
224
- writer . writeEndElement ( );
225
- newLine ( writer );
241
+ systemOutElements . add ( formattedReportEntries . toString (). trim () );
242
+ systemOutElements . addAll ( systemOutElementsForCapturedOutput );
226
243
}
227
244
}
228
245
229
- private String buildReportEntryDescription (ReportEntry reportEntry , int entryNumber ) {
230
- StringBuilder builder = new StringBuilder (format ("Report Entry #{0} (timestamp: {1})\n " , entryNumber ,
231
- ISO_LOCAL_DATE_TIME .format (reportEntry .getTimestamp ())));
232
-
233
- reportEntry .getKeyValuePairs ().forEach ((key , value ) -> builder .append (format ("\t - {0}: {1}\n " , key , value )));
246
+ private void removeIfPresentAndAddAsSeparateElement (Map <String , String > keyValuePairs , String key ,
247
+ List <String > elements ) {
248
+ String value = keyValuePairs .remove (key );
249
+ if (value != null ) {
250
+ elements .add (value );
251
+ }
252
+ }
234
253
235
- return builder .toString ();
254
+ private void buildReportEntryDescription (LocalDateTime timestamp , Map <String , String > keyValuePairs ,
255
+ int entryNumber , StringBuilder result ) {
256
+ result .append (
257
+ format ("Report Entry #{0} (timestamp: {1})\n " , entryNumber , ISO_LOCAL_DATE_TIME .format (timestamp )));
258
+ keyValuePairs .forEach ((key , value ) -> result .append (format ("\t - {0}: {1}\n " , key , value )));
236
259
}
237
260
238
261
private String getTime (TestIdentifier testIdentifier , NumberFormat numberFormat ) {
@@ -252,14 +275,22 @@ private LocalDateTime getCurrentDateTime() {
252
275
return LocalDateTime .now (this .reportData .getClock ()).withNano (0 );
253
276
}
254
277
255
- private void writeNonStandardAttributesToSystemOutElement (TestIdentifier testIdentifier , XMLStreamWriter writer )
256
- throws XMLStreamException {
278
+ private String formatNonStandardAttributesAsString (TestIdentifier testIdentifier ) {
279
+ return "unique-id: " + testIdentifier .getUniqueId () //
280
+ + "\n display-name: " + testIdentifier .getDisplayName ();
281
+ }
257
282
258
- String cData = "\n unique-id: " + testIdentifier .getUniqueId () //
259
- + "\n display-name: " + testIdentifier .getDisplayName () + "\n " ;
283
+ private void writeOutputElements (String elementName , List <String > elements , XMLStreamWriter writer )
284
+ throws XMLStreamException {
285
+ for (String content : elements ) {
286
+ writeOutputElement (elementName , content , writer );
287
+ }
288
+ }
260
289
261
- writer .writeStartElement ("system-out" );
262
- writeCDataSafely (writer , cData );
290
+ private void writeOutputElement (String elementName , String content , XMLStreamWriter writer )
291
+ throws XMLStreamException {
292
+ writer .writeStartElement (elementName );
293
+ writeCDataSafely (writer , "\n " + content + "\n " );
263
294
writer .writeEndElement ();
264
295
newLine (writer );
265
296
}
0 commit comments