22using AventStack . ExtentReports . CLI . Model ;
33using AventStack . ExtentReports . CLI . Parser ;
44using AventStack . ExtentReports . Reporter ;
5+
56using McMaster . Extensions . CommandLineUtils ;
7+
68using System . Collections . Generic ;
79using System . IO ;
810using System . Linq ;
@@ -11,12 +13,13 @@ namespace AventStack.ExtentReports.CLI
1113{
1214 internal class Program
1315 {
14-
1516 private const string DefaultBaseDirectory = "Reports" ;
1617 private Logger _logger ;
18+ private ExtentReports _extent = new ExtentReports ( ) ;
19+ private int _filesProcessed = 0 ;
1720
1821 [ Option ( ShortName = "p" ) ]
19- private TestFramework Parser { get ; set ; } = Model . TestFramework . NUnit ;
22+ private TestFramework Parser { get ; set ; } = TestFramework . NUnit ;
2023
2124 [ Option ( ShortName = "i" ) ]
2225 private string TestRunnerResultsFile { get ; set ; }
@@ -33,6 +36,10 @@ internal class Program
3336 [ Option ( ShortName = "l" ) ]
3437 private LoggingLevel LoggingLevel { get ; set ; } = LoggingLevel . Normal ;
3538
39+ [ Option ( "--merge" ) ]
40+ private bool Merge { get ; set ; } = false ;
41+
42+
3643 private static void Main ( string [ ] args )
3744 {
3845 CommandLineApplication . Execute < Program > ( args ) ;
@@ -41,54 +48,69 @@ private static void Main(string[] args)
4148 private void OnExecute ( )
4249 {
4350 _logger = new Logger ( LoggingLevel ) ;
44-
4551 _logger . WriteLine ( LoggingLevel . Verbose , "extentreports-cli initializing ..." ) ;
4652
4753 string output = string . IsNullOrWhiteSpace ( Output ) ? $ ".\\ { DefaultBaseDirectory } " : Output ;
4854
49- bool foundResultFiles = false ;
50-
5155 if ( ! string . IsNullOrEmpty ( TestRunnerResultsDirectory ) && File . GetAttributes ( TestRunnerResultsDirectory ) == FileAttributes . Directory && Parser . Equals ( TestFramework . NUnit ) )
5256 {
53-
5457 string filePattern = "*." + KnownFileExtensions . GetExtension ( Parser ) ;
5558 _logger . WriteLine ( LoggingLevel . Normal , $ "Getting test runner result files in folder '{ TestRunnerResultsDirectory } ' matching pattern '{ filePattern } ' ...") ;
5659
5760 List < string > files = Directory . GetFiles ( TestRunnerResultsDirectory , filePattern , SearchOption . AllDirectories ) . ToList ( ) ;
5861
59- foreach ( string file in files )
62+ if ( Merge )
63+ {
64+ files . ForEach ( x => ProcessSingle ( x , output , true ) ) ;
65+ }
66+ else
6067 {
61- _logger . WriteLine ( LoggingLevel . Normal , $ "Parsing test runner result file '{ file } ' ...") ;
62- var extent = new ExtentReports ( ) ;
63- var dir = Path . Combine ( output , Path . GetFileNameWithoutExtension ( file ) ) ;
64- InitializeReporter ( extent , dir ) ;
65- new NUnitParser ( extent ) . ParseTestRunnerOutput ( file ) ;
66- extent . Flush ( ) ;
67- _logger . WriteLine ( LoggingLevel . Normal , $ "Report for '{ file } ' is complete.") ;
68- foundResultFiles = true ;
68+ files . ForEach ( x =>
69+ {
70+ var dir = Path . Combine ( output , Path . GetFileNameWithoutExtension ( x ) ) ;
71+ ProcessSingle ( x , dir , false ) ;
72+ } ) ;
6973 }
7074 }
7175
7276 if ( ! string . IsNullOrWhiteSpace ( TestRunnerResultsFile ) )
7377 {
74- _logger . WriteLine ( LoggingLevel . Normal , $ "Parsing test runner result file '{ TestRunnerResultsFile } ' ...") ;
75- var extent = new ExtentReports ( ) ;
76- InitializeReporter ( extent , output ) ;
77- new NUnitParser ( extent ) . ParseTestRunnerOutput ( TestRunnerResultsFile ) ;
78- extent . Flush ( ) ;
79- _logger . WriteLine ( LoggingLevel . Normal , $ "Report for '{ TestRunnerResultsFile } ' is complete.") ;
80- foundResultFiles = true ;
78+ ProcessSingle ( TestRunnerResultsFile , output , true ) ;
8179 }
8280
83- if ( ! foundResultFiles )
81+ if ( _filesProcessed == 0 )
82+ {
8483 _logger . WriteLine ( LoggingLevel . Normal , "Nothing to do!" ) ;
84+ }
8585
8686 _logger . WriteLine ( LoggingLevel . Verbose , "extentreports-cli finished." ) ;
8787 }
8888
89- private void InitializeReporter ( ExtentReports extent , string path )
89+ private void ProcessSingle ( string testResultsFilePath , string output , bool merge = false )
9090 {
91+ _logger . WriteLine ( LoggingLevel . Normal , $ "Parsing test runner result file '{ TestRunnerResultsFile } ' ...") ;
92+
93+ // if a single report is required for each test results file (ie, no merges):
94+ // must instantiate every time to clear pre-existing data
95+ if ( ! merge )
96+ {
97+ _extent = new ExtentReports ( ) ;
98+ }
99+
100+ if ( ( merge && ! _extent . StartedReporterList . Any ( ) ) || ! merge )
101+ {
102+ InitializeReporter ( _extent , output ) ;
103+ }
104+
105+ new NUnitParser ( _extent ) . ParseTestRunnerOutput ( testResultsFilePath ) ;
106+ _extent . Flush ( ) ;
107+ _filesProcessed ++ ;
108+
109+ _logger . WriteLine ( LoggingLevel . Normal , $ "Report for '{ testResultsFilePath } ' is complete.") ;
110+ }
91111
112+ private void InitializeReporter ( ExtentReports extent , string path )
113+ {
92114 if ( Reporters . Contains ( "html" ) )
93115 {
94116 var output = path . EndsWith ( "\\ " ) || path . EndsWith ( "/" ) ? path : path + "\\ " ;
0 commit comments