示例#1
0
        private void ProcessSequencePoints(List <LineCoverageInfo> coveredLines, Module module,
                                           IEnumerable <TrackedMethod> tests, Class modelClass, Method method, string fileName)
        {
            List <SequencePoint> sequencePoints = method.SequencePoints;
            List <BranchPoint>   branchPoints   = method.BranchPoints;

            foreach (SequencePoint sequencePoint in sequencePoints)
            {
                var branchPoint = branchPoints.FirstOrDefault(x => x.StartLine == sequencePoint.StartLine);
                var coveredLine = new LineCoverageInfo
                {
                    IsCode     = true,
                    LineNumber = sequencePoint.StartLine,
                    IsCovered  = (sequencePoint.VisitCount > 0),
                    ModuleName = module.ModuleName,
                    ClassName  = modelClass.FullName,
                    MethodName = method.Name,
                    FileName   = fileName,
                    UnitTests  = new List <UnitTest>(),
                    IsBranch   = branchPoint != null
                };

                if (tests.Any())
                {
                    foreach (var trackedMethodRef in sequencePoint.TrackedMethodRefs)
                    {
                        TrackedMethod trackedMethod =
                            tests.FirstOrDefault(y => y.UniqueId.Equals(trackedMethodRef.UniqueId));

                        coveredLine.IsCode = true;

                        coveredLine.IsCovered = (sequencePoint.VisitCount > 0);
                        coveredLine.FileName  = fileName;

                        coveredLine.TrackedMethods.Add(new Poco.TrackedMethod
                        {
                            UniqueId      = (int)trackedMethod.UniqueId,
                            UnitTestId    = trackedMethod.UnitTestId,
                            Strategy      = trackedMethod.Strategy,
                            Name          = trackedMethod.Name,
                            MetadataToken = trackedMethod.MetadataToken
                        });
                    }
                }

                coveredLines.Add(coveredLine);
            }
        }
示例#2
0
        public List <LineCoverageInfo> GetRetestedLinesFromCoverageSession(CoverageSession coverageSession,
                                                                           string projectAssemblyName, List <int> uniqueIds)
        {
            /// todo need to figure out how to remove a CoveredLine if an Edit has made it uncovered,
            /// without removing all lines that were not covered by the subset of tests that were run
            /// One option: check all previously covered lines from this group of tests with the current covered lines list from this group.
            ///
            //todo Handle case where a line that was "Code" and was covered is now not "Code"
            var coveredLines = new List <LineCoverageInfo>();

            List <Module> sessionModules      = coverageSession.Modules;
            Module        module              = sessionModules.FirstOrDefault(x => x.ModuleName.Equals(projectAssemblyName));
            Module        testModule          = sessionModules.FirstOrDefault(x => x.ModuleName.Equals(projectAssemblyName + ".Test"));
            IEnumerable <TrackedMethod> tests =
                sessionModules.Where(x => x.TrackedMethods.Any()).SelectMany(y => y.TrackedMethods);
            var testsRun      = tests.Where(x => uniqueIds.Contains((int)x.UniqueId));
            var methodsTested = module.Classes.SelectMany(m => m.Methods).Where(x => x.SequenceCoverage > 0);

            if (module != null)
            {
                var codeModule = new CodeModule
                {
                    Name    = module.FullName,
                    Summary = new Summary(module.Summary)
                };

                List <Class> classes = module.Classes;

                _log.DebugFormat("First Module Name: {0}", module.ModuleName);
                _log.DebugFormat("Number of Classes: {0}", classes.Count());


                foreach (Method method in methodsTested)
                {
                    string methodName = method.Name.ToString();
                    if (!methodName.Contains("_") &&
                        !methodName.StartsWith("get_") &&
                        !methodName.StartsWith("set_"))
                    {
                        var codeMethod = new CodeMethod
                        {
                            Name    = method.Name,
                            Summary = new Summary(method.Summary)
                        };
                        string modifiedMethodName = methodName;
                        if (method.IsConstructor)
                        {
                            modifiedMethodName = ConvertTrackedMethodFormatToUnitTestFormat(methodName);
                            modifiedMethodName = modifiedMethodName.Replace("..", "::.");
                        }



                        var modelClass = module.Classes.FirstOrDefault(x => x.Methods.Any(y => y.Name.Contains(modifiedMethodName)));



                        var codeClass = new CodeClass
                        {
                            Name    = modelClass.FullName,
                            Summary = new Summary(modelClass.Summary)
                        };

                        List <SequencePoint> sequencePoints = method.SequencePoints;
                        foreach (SequencePoint sequencePoint in sequencePoints)
                        {
                            if (testsRun.Any())
                            {
                                var coveredLine = new LineCoverageInfo
                                {
                                    IsCode     = true,
                                    LineNumber = sequencePoint.StartLine,
                                    IsCovered  = (sequencePoint.VisitCount > 0),
                                    Module     = codeModule,
                                    Class      = codeClass,
                                    ClassName  = modelClass.FullName,
                                    Method     = codeMethod,
                                    FileName   = module.Files.FirstOrDefault(x => x.UniqueId == method.FileRef.UniqueId).FullPath,
                                    MethodName = method.Name
                                                 //   UnitTests = testsRun.ToList()
                                };

                                foreach (TrackedMethodRef trackedMethodRef in sequencePoint.TrackedMethodRefs)
                                {
                                    IEnumerable <TrackedMethod> testsThatCoverLine =
                                        testsRun.Where(y => y.UniqueId.Equals(trackedMethodRef.UniqueId));
                                    var fileNames = module.Files.Where(x => x.UniqueId == method.FileRef.UniqueId).ToList();
                                    foreach (TrackedMethod test in testsThatCoverLine)
                                    {
                                        coveredLine.IsCode = true;

                                        coveredLine.IsCovered = (sequencePoint.VisitCount > 0);

                                        coveredLine.TrackedMethods.Add(new Poco.TrackedMethod
                                        {
                                            UniqueId      = (int)test.UniqueId,
                                            MetadataToken = method.MetadataToken,
                                            Strategy      = test.Strategy,
                                            Name          = test.Name
                                        });
                                    }
                                }
                                if (coveredLine.Class == null)
                                {
                                    _log.ErrorFormat("CoveredLine.Class is null for method:{0}", method.Name);
                                }
                                coveredLines.Add(coveredLine);
                            }
                        }
                    }
                }
            }

            return(coveredLines);
        }