Пример #1
0
        public async Task <IEnumerable <CoverageFile> > ParseSourceFiles()
        {
            return(await options.MonoCov.SelectMany(ParseFile));

            async Task <IEnumerable <CoverageFile> > ParseFile(string directoryName)
            {
                var directory = fileProvider.GetDirectoryContents(directoryName);

                if (!directory.Exists)
                {
                    throw new PublishCoverallsException($"{directoryName} was not found when parsing monocover report");
                }

                var documents = await LoadXDocuments();

                return(GenerateSourceFiles());

                async Task <Dictionary <string, XDocument> > LoadXDocuments()
                {
                    var result = new Dictionary <string, XDocument>();

                    foreach (var file in directory.Where(f => f.Name.EndsWith(".xml", StringComparison.InvariantCultureIgnoreCase)))
                    {
                        result.Add(file.Name, await file.ReadXml());
                    }

                    return(result);
                }

                IEnumerable <CoverageFile> GenerateSourceFiles() =>
                documents
                .Where(kv => kv.Key.StartsWith("class-") && kv.Key.EndsWith(".xml"))
                .Select(kv => kv.Value.Root?.Element("source"))
                .Where(sourceElement => sourceElement != null)
                .Select(sourceElement =>
                {
                    var coverage = new List <int?>();
                    var source   = new List <string>();
                    var filePath = sourceElement.Attribute("sourceFile").Value;
                    filePath     = pathProcessor.NormalizePath(filePath);

                    foreach (var line in sourceElement.Elements("l"))
                    {
                        if (!int.TryParse(line.Attribute("count").Value, out var coverageCount))
                        {
                            coverage.Add(null);
                        }
                        else
                        {
                            coverage.Add(coverageCount);
                        }
                        source.Add(line.Value);
                    }

                    return(new CoverageFile(filePath, source, coverage.ToArray()));
                });
            }
        }
        public async Task <IEnumerable <CoverageFile> > Build(IEnumerable <FileCoverageData> coverageData)
        {
            return(await coverageData.Select(BuildCoverageFile));

            async Task <CoverageFile> BuildCoverageFile(FileCoverageData coverageFileData)
            {
                var path = coverageFileData.FullPath;

                path = pathProcessor.NormalizePath(path);

                var fileInfo = fileProvider.GetFileInfo(coverageFileData.FullPath);
                var lines    = new List <string>();

                if (fileInfo.Exists)
                {
                    var readAllText = await fileInfo.ReadToEnd();

                    if (!string.IsNullOrWhiteSpace(readAllText))
                    {
                        // this is kind of dumb, but ReadLine will work for any line ending, and string.split
                        // can possibly generate extra blank lines (or have extra line ending chars) depending
                        // on the approach.
                        using (var sr = new StringReader(readAllText))
                        {
                            string nextLine;
                            while ((nextLine = sr.ReadLine()) != null)
                            {
                                lines.Add(nextLine);
                            }
                        }
                    }
                }

                var length   = lines.Count;
                var coverage = coverageFileData.Coverage;

                if (length > coverage.Length)
                {
                    coverage = new int?[length];
                    coverageFileData.Coverage.CopyTo(coverage, 0);
                }

                return(new CoverageFile(path, lines, coverage));
            }
        }