11package io .cucumber .testngxmlformatter ;
22
3+ import io .cucumber .compatibilitykit .MessageOrderer ;
34import io .cucumber .messages .NdjsonToMessageIterable ;
45import io .cucumber .messages .types .Envelope ;
56import org .junit .jupiter .api .Disabled ;
1516import java .nio .file .Files ;
1617import java .nio .file .Path ;
1718import java .nio .file .Paths ;
19+ import java .util .ArrayList ;
1820import java .util .Comparator ;
1921import java .util .List ;
2022import java .util .Objects ;
23+ import java .util .Random ;
24+ import java .util .function .Consumer ;
2125import java .util .stream .Collectors ;
2226import java .util .stream .Stream ;
2327
2428import static io .cucumber .testngxmlformatter .Jackson .OBJECT_MAPPER ;
29+ import static java .nio .charset .StandardCharsets .UTF_8 ;
2530import static org .xmlunit .assertj .XmlAssert .assertThat ;
2631
2732class MessagesToTestngXmlWriterAcceptanceTest {
2833 private static final NdjsonToMessageIterable .Deserializer deserializer = (json ) -> OBJECT_MAPPER .readValue (json , Envelope .class );
34+ private static final Random random = new Random (202509282040L );
35+ private static final MessageOrderer messageOrderer = new MessageOrderer (random );
2936
3037 static List <TestCase > acceptance () throws IOException {
3138 try (Stream <Path > paths = Files .list (Paths .get ("../testdata/src" ))) {
@@ -40,31 +47,49 @@ static List<TestCase> acceptance() throws IOException {
4047 @ ParameterizedTest
4148 @ MethodSource ("acceptance" )
4249 void test (TestCase testCase ) throws IOException {
43- ByteArrayOutputStream bytes = writeTestngXmlReport (testCase , new ByteArrayOutputStream ());
50+ ByteArrayOutputStream bytes = writeTestngXmlReport (testCase , messageOrderer . originalOrder ());
4451 Source expected = Input .fromPath (testCase .expected ).build ();
4552 Source actual = Input .fromByteArray (bytes .toByteArray ()).build ();
4653 assertThat (actual ).and (expected ).ignoreWhitespace ().areIdentical ();
4754 }
4855
56+ @ ParameterizedTest
57+ @ MethodSource ("acceptance" )
58+ void testWithSimulatedParallelExecution (TestCase testCase ) throws IOException {
59+ ByteArrayOutputStream actual = writeTestngXmlReport (testCase , messageOrderer .simulateParallelExecution ());
60+ byte [] expected = Files .readAllBytes (testCase .expected );
61+ assertThat (actual ).and (expected ).ignoreWhitespace ().areIdentical ();
62+ }
63+
4964 @ ParameterizedTest
5065 @ MethodSource ("acceptance" )
5166 @ Disabled
5267 void updateExpectedFiles (TestCase testCase ) throws IOException {
5368 try (OutputStream out = Files .newOutputStream (testCase .expected )) {
54- writeTestngXmlReport (testCase , out );
69+ writeTestngXmlReport (testCase , out , messageOrderer . originalOrder () );
5570 }
5671 }
5772
58- private static <T extends OutputStream > T writeTestngXmlReport (TestCase testCase , T out ) throws IOException {
73+ private static ByteArrayOutputStream writeTestngXmlReport (TestCase testCase , Consumer <List <Envelope >> orderer ) throws IOException {
74+ return writeTestngXmlReport (testCase , new ByteArrayOutputStream (), orderer );
75+ }
76+
77+ private static <T extends OutputStream > T writeTestngXmlReport (TestCase testCase , T out , Consumer <List <Envelope >> orderer ) throws IOException {
78+ List <Envelope > messages = new ArrayList <>();
5979 try (InputStream in = Files .newInputStream (testCase .source )) {
6080 try (NdjsonToMessageIterable envelopes = new NdjsonToMessageIterable (in , deserializer )) {
61- try (MessagesToTestngXmlWriter writer = new MessagesToTestngXmlWriter (out )) {
62- for (Envelope envelope : envelopes ) {
63- writer .write (envelope );
64- }
81+ for (Envelope envelope : envelopes ) {
82+ messages .add (envelope );
6583 }
6684 }
6785 }
86+ orderer .accept (messages );
87+
88+ try (MessagesToTestngXmlWriter writer = new MessagesToTestngXmlWriter (out )) {
89+ for (Envelope envelope : messages ) {
90+ writer .write (envelope );
91+ }
92+ }
6893 return out ;
6994 }
7095
0 commit comments