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