static void WriteOutputFile(IEnumerable <AnalyzedModule> modules, AnalysisDepth depth, string outputFile) { using (FileStream fileStream = new FileStream(outputFile, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { using (StreamWriter streamWriter = new StreamWriter(fileStream)) { // Write header streamWriter.Write("ModuleName,ModuleLinesCovered,ModuleLinesCoveredPct,ModuleLinesPartiallyCovered,ModuleLinesPartiallyCoveredPct,ModuleLinesNotCovered,ModuleLinesNotCoveredPct,ModuleLinesTotal,ModuleBlocksCovered,ModuleBlocksCoveredPct,ModuleBlocksNotCovered,ModuleBlocksNotCoveredPct,ModuleBlocksTotal"); if (depth > AnalysisDepth.Module) { streamWriter.Write(",NamespaceName,NamespaceLinesCovered,NamespaceLinesCoveredPct,NamespaceLinesPartiallyCovered,NamespaceLinesPartiallyCoveredPct,NamespaceLinesNotCovered,NamespaceLinesNotCoveredPct,NamespaceLinesTotal,NamespaceBlocksCovered,NamespaceBlocksCoveredPct,NamespaceBlocksNotCovered,NamespaceBlocksNotCoveredPct,NamespaceBlocksTotal"); if (depth > AnalysisDepth.Namespace) { streamWriter.Write(",ClassName,ClassLinesCovered,ClassLinesCoveredPct,ClassLinesPartiallyCovered,ClassLinesPartiallyCoveredPct,ClassLinesNotCovered,ClassLinesNotCoveredPct,ClassLinesTotal,ClassBlocksCovered,ClassBlocksCoveredPct,ClassBlocksNotCovered,ClassBlocksNotCoveredPct,ClassBlocksTotal"); if (depth > AnalysisDepth.Class) { streamWriter.Write(",MethodName,MethodLinesCovered,MethodLinesCoveredPct,MethodLinesPartiallyCovered,MethodLinesPartiallyCoveredPct,MethodLinesNotCovered,MethodLinesNotCoveredPct,MethodLinesTotal,MethodBlocksCovered,MethodBlocksCoveredPct,MethodBlocksNotCovered,MethodBlocksNotCoveredPct,MethodBlocksTotal"); } } } streamWriter.WriteLine(); // Write contents foreach (AnalyzedModule module in modules) { if (depth > AnalysisDepth.Module) { // Process each namespace in module foreach (AnalyzedNamespace ns in module.Namespaces) { if (depth > AnalysisDepth.Namespace) { // Process each class in namespace foreach (AnalyzedClass cl in ns.Classes) { if (depth > AnalysisDepth.Class) { // Process each method in class foreach (AnalyzedMethod meth in cl.Methods) { streamWriter.Write(GetAnalyzedItemOutput(module)); streamWriter.Write(","); streamWriter.Write(GetAnalyzedItemOutput(ns)); streamWriter.Write(","); streamWriter.Write(GetAnalyzedItemOutput(cl)); streamWriter.Write(","); streamWriter.WriteLine(GetAnalyzedItemOutput(meth)); } } else { streamWriter.Write(GetAnalyzedItemOutput(module)); streamWriter.Write(","); streamWriter.Write(GetAnalyzedItemOutput(ns)); streamWriter.Write(","); streamWriter.WriteLine(GetAnalyzedItemOutput(cl)); } } } else { streamWriter.Write(GetAnalyzedItemOutput(module)); streamWriter.Write(","); streamWriter.WriteLine(GetAnalyzedItemOutput(ns)); } } } else { streamWriter.WriteLine(GetAnalyzedItemOutput(module)); } } // Wrap it up streamWriter.Close(); } fileStream.Close(); } }
static void Main(string[] args) { AnalysisDepth depth = AnalysisDepth.Method; string sourceFile = null; string outputFile = null; bool proceed = true; try { if (args != null && args.Length == 6) { for (int argIndex = 0; argIndex < args.Length; argIndex += 2) { switch (args[argIndex].ToLower()) { case "-d": case "/d": depth = (AnalysisDepth)Enum.Parse(typeof(AnalysisDepth), args[argIndex + 1]); break; case "-x": case "/x": sourceFile = args[argIndex + 1]; if (string.IsNullOrEmpty(sourceFile)) { throw new ArgumentException("No specified coverage XML file"); } else if (!File.Exists(sourceFile)) { throw new ArgumentException("Invalid coverage XML file"); } break; case "-o": case "/o": outputFile = args[argIndex + 1]; if (string.IsNullOrEmpty(outputFile)) { throw new ArgumentException("No specified output CSV file path"); } break; } } if (proceed && !string.IsNullOrEmpty(sourceFile) && !string.IsNullOrEmpty(outputFile)) { // do stuff XDocument coverageXml = ReadCoverageXml(sourceFile); if (coverageXml != null) { IEnumerable <AnalyzedModule> modules = ExtractAnalyzedModules(coverageXml); WriteOutputFile(modules, depth, outputFile); } } else { throw new ArgumentException("Invalid data, or invalid source/output files"); } } else { throw new ArgumentException("Incorrect arguments"); } } catch (Exception ex) { PrintUsage(); Console.WriteLine("Error: " + ex.Message); } }