/// <summary> /// Creates the class searcher. /// </summary> /// <param name="directory">The directory that should be searched for class files.</param> /// <returns>The class searcher.</returns> internal ClassSearcher CreateClassSearcher(string directory) { if (string.IsNullOrEmpty(directory)) { return new ClassSearcher(null); } var cachedClassSearcher = this.cachedClassSearchers.FirstOrDefault(c => c.Directory != null && directory.StartsWith(c.Directory, StringComparison.OrdinalIgnoreCase)); if (cachedClassSearcher == null) { cachedClassSearcher = new ClassSearcher(directory); this.cachedClassSearchers.Add(cachedClassSearcher); } return cachedClassSearcher; }
/// <summary> /// Creates the class searcher. /// </summary> /// <param name="directory">The directory that should be searched for class files.</param> /// <returns>The class searcher.</returns> public ClassSearcher CreateClassSearcher(string directory) { if (string.IsNullOrEmpty(directory)) { return(new ClassSearcher(null)); } var cachedClassSearcher = this.cachedClassSearchers.FirstOrDefault(c => c.Directory != null && directory.StartsWith(c.Directory, StringComparison.OrdinalIgnoreCase)); if (cachedClassSearcher == null) { cachedClassSearcher = new ClassSearcher(directory); this.cachedClassSearchers.Add(cachedClassSearcher); } return(cachedClassSearcher); }
/// <summary> /// Searches the given source element (e.g. property) and updates the report if element can be found in source code files. /// </summary> /// <param name="sourceElement">The source element.</param> /// <param name="filenameByFileIdDictionary">Dictionary containing all files used in the report by their corresponding id.</param> /// <param name="fileIdsOfClass">The file ids of class.</param> /// <param name="reportElement">The report element.</param> /// <param name="updateReportElement">Action that updates the report element.</param> /// <param name="filesContainer">The files container.</param> /// <returns><c>true</c> if source element has been found.</returns> protected bool SearchElement( SourceElement sourceElement, Dictionary<string, string> filenameByFileIdDictionary, IEnumerable<string> fileIdsOfClass, XContainer reportElement, Action<XContainer, SourceElementPosition, string> updateReportElement, XContainer filesContainer) { Func<bool> searchSourceElement = () => { foreach (var fileId in fileIdsOfClass) { var elementPosition = SourceCodeAnalyzer.FindSourceElement(filenameByFileIdDictionary[fileId], sourceElement); if (elementPosition != null) { updateReportElement(reportElement, elementPosition, fileId); return true; } } return false; }; // Search files from module first if (!searchSourceElement()) { // Property has not been found in classes of module, now search the common directory if (this.ClassSearcher == null) { this.ClassSearcher = this.classSearcherFactory.CreateClassSearcher(CommonDirectorySearcher.GetCommonDirectory(filenameByFileIdDictionary.Values)); } fileIdsOfClass = this.TryToFindFileIdsOfClass( this.ClassSearcher, sourceElement.Classname, filenameByFileIdDictionary, filesContainer); // Property has not been found in common directory, now search the global directory if (!searchSourceElement()) { fileIdsOfClass = this.TryToFindFileIdsOfClass( this.globalClassSearcher, sourceElement.Classname, filenameByFileIdDictionary, filesContainer); return searchSourceElement(); } } return true; }
/// <summary> /// Initializes a new instance of the <see cref="ReportPreprocessorBase"/> class. /// </summary> /// <param name="report">The report.</param> /// <param name="classSearcherFactory">The class searcher factory.</param> /// <param name="globalClassSearcher">The global class searcher.</param> internal ReportPreprocessorBase(XContainer report, ClassSearcherFactory classSearcherFactory, ClassSearcher globalClassSearcher) { this.Report = report; this.classSearcherFactory = classSearcherFactory; this.globalClassSearcher = globalClassSearcher; }
/// <summary> /// Tries to find file ids of class. /// </summary> /// <param name="classSearcher">The class searcher.</param> /// <param name="className">Name of the class.</param> /// <param name="filenameByFileIdDictionary">Dictionary containing all files used in the report by their corresponding id.</param> /// <param name="filesContainer">The files container.</param> /// <returns>The ids of the files the class is defined in.</returns> private IEnumerable<string> TryToFindFileIdsOfClass(ClassSearcher classSearcher, string className, Dictionary<string, string> filenameByFileIdDictionary, XContainer filesContainer) { IEnumerable<string> files = classSearcher.GetFilesOfClass(className.Replace("/", string.Empty)); var fileIds = new List<string>(); foreach (var file in files) { var existingFileId = filenameByFileIdDictionary.Where(kv => kv.Value == file).Select(kv => kv.Key).FirstOrDefault(); if (existingFileId != null) { fileIds.Add(existingFileId); } else { // Update dictionary string newFileId = this.currentFileId.ToString(CultureInfo.InvariantCulture); filenameByFileIdDictionary.Add(newFileId, file); fileIds.Add(newFileId); // Update report this.AddNewFile(filesContainer, newFileId, file); this.currentFileId--; } } return fileIds; }
/// <summary> /// Initializes a new instance of the <see cref="PartCover23ReportPreprocessor"/> class. /// </summary> /// <param name="report">The report.</param> /// <param name="classSearcherFactory">The class searcher factory.</param> /// <param name="globalClassSearcher">The global class searcher.</param> internal PartCover23ReportPreprocessor(XContainer report, ClassSearcherFactory classSearcherFactory, ClassSearcher globalClassSearcher) : base(report, classSearcherFactory, globalClassSearcher) { }
/// <summary> /// Tries to initiate the correct parsers for the given report. An empty list is returned if no parser has been found. /// The report may contain several reports. For every report an extra parser is initiated. /// </summary> /// <param name="reportFile">The report file to parse.</param> /// <param name="classSearcherFactory">The class searcher factory.</param> /// <param name="globalClassSearcher">The global class searcher.</param> /// <returns> /// The IParser instances or an empty list if no matching parser has been found. /// </returns> private static IEnumerable<IParser> GetParsersOfFile(string reportFile, ClassSearcherFactory classSearcherFactory, ClassSearcher globalClassSearcher) { var parsers = new List<IParser>(); XContainer report = null; try { Logger.InfoFormat(Resources.LoadingReport, reportFile); report = XDocument.Load(reportFile); } catch (Exception ex) { Logger.ErrorFormat(" " + Resources.ErrorDuringReadingReport, reportFile, ex.Message); return parsers; } if (report.Descendants("PartCoverReport").Any()) { // PartCover 2.2 and PartCover 2.3 reports differ in version attribute, so use this to determine the correct parser if (report.Descendants("PartCoverReport").First().Attribute("ver") != null) { foreach (var item in report.Descendants("PartCoverReport")) { Logger.Debug(" " + Resources.PreprocessingReport); new PartCover22ReportPreprocessor(item, classSearcherFactory, globalClassSearcher).Execute(); Logger.DebugFormat(" " + Resources.InitiatingParser, "PartCover 2.2"); parsers.Add(new PartCover22Parser(item)); } } else { foreach (var item in report.Descendants("PartCoverReport")) { Logger.Debug(" " + Resources.PreprocessingReport); new PartCover23ReportPreprocessor(item, classSearcherFactory, globalClassSearcher).Execute(); Logger.DebugFormat(" " + Resources.InitiatingParser, "PartCover 2.3"); parsers.Add(new PartCover23Parser(item)); } } } else if (report.Descendants("CoverageSession").Any()) { foreach (var item in report.Descendants("CoverageSession")) { Logger.Debug(" " + Resources.PreprocessingReport); new OpenCoverReportPreprocessor(item, classSearcherFactory, globalClassSearcher).Execute(); Logger.DebugFormat(" " + Resources.InitiatingParser, "OpenCover"); parsers.Add(new OpenCoverParser(item)); } } else if (report.Descendants("coverage").Any()) { foreach (var item in report.Descendants("coverage")) { Logger.DebugFormat(" " + Resources.InitiatingParser, "NCover"); parsers.Add(new NCoverParser(item)); } } else if (report.Descendants("CoverageDSPriv").Any()) { foreach (var item in report.Descendants("CoverageDSPriv")) { Logger.DebugFormat(" " + Resources.InitiatingParser, "Visual Studio"); parsers.Add(new VisualStudioParser(item)); } } else if (report.Descendants("results").Any()) { foreach (var item in report.Descendants("results")) { if (item.Element("modules") != null) { Logger.DebugFormat(" " + Resources.InitiatingParser, "Dynamic Code Coverage"); parsers.Add(new DynamicCodeCoverageParser(item)); } } } return parsers; }
public static void MyClassInitialize(TestContext testContext) { FileManager.CopyTestClasses(); classSearcher = new ClassSearcher("C:\\temp"); }
/// <summary> /// Initializes a new instance of the <see cref="OpenCoverReportPreprocessor"/> class. /// </summary> /// <param name="report">The report.</param> /// <param name="classSearcherFactory">The class searcher factory.</param> /// <param name="globalClassSearcher">The global class searcher.</param> public OpenCoverReportPreprocessor(XContainer report, ClassSearcherFactory classSearcherFactory, ClassSearcher globalClassSearcher) : base(report, classSearcherFactory, globalClassSearcher) { }