示例#1
0
        private static void InsertIntoBnrachAndComparison(
            CoverageInfo info, XElement root, LanguageSupport support, string relativePath)
        {
            var analyzer                  = support.AstAnalyzer;
            var branchNodes               = analyzer.FindBranches(root);
            var startBranchIndex          = info.Targets.Count;
            var startBranchConditionIndex = info.TargetGroups.Count;

            foreach (var branchNode in branchNodes.ToList())
            {
                // 全ての論理項を列挙
                var condNodeList = analyzer.FindConditions(branchNode).ToList();
                // 論理項に測定用コードを埋め込み,カバレッジ情報を生成
                var condElements = InsertIntoConditionCoverage(info, condNodeList, support,
                                                               relativePath);

                // 条件分岐のカバレッジ情報を生成
                var element = new CoverageElement(relativePath, branchNode, support.Tagger);
                // 条件分岐と論理項のカバレッジ情報をまとめる
                var elementGroup = new CoverageElementGroup(element, condElements);
                info.TargetGroups.Add(elementGroup);

                // 論理項を含む条件式か否かを判断
                support.AstTransformer.InsertPredicate(
                    branchNode, info.Targets.Count,
                    elementGroup.Targets.Count > 0
                                ? ElementType.Decision
                                : ElementType.DecisionAndCondition);
                info.Targets.Add(element);
            }
            info.BranchConditionRanges.Add(Tuple.Create(startBranchConditionIndex,
                                                        info.TargetGroups.Count));
            info.BranchRanges.Add(Tuple.Create(startBranchIndex, info.Targets.Count));
        }
示例#2
0
        private static void InsertIntoSwitchCase(
            CoverageInfo info, XElement node, LanguageSupport support, string relativePath)
        {
            var analyzer         = support.AstAnalyzer;
            var startSwitchIndex = info.TargetGroups.Count;
            var switchNodes      = analyzer.FindSwitches(node);

            foreach (var switchNode in switchNodes.ToList())
            {
                var caseElements = new List <CoverageElement>();
                var caseNodes    = analyzer.FindCaseLabelTails(switchNode);
                foreach (var caseNode in caseNodes.ToList())
                {
                    // ステートメントに測定用コードを埋め込む
                    support.AstTransformer.InsertStatementAfter(
                        caseNode, info.Targets.Count, Done, ElementType.SwitchCase);
                    // カバレッジ情報を生成
                    var covElem = new CoverageElement(relativePath, caseNode, support.Tagger);
                    info.Targets.Add(covElem);
                    caseElements.Add(covElem);
                }
                // switchのカバレッジ情報を生成
                var element = new CoverageElement(relativePath, switchNode, support.Tagger);
                // 条件分岐と論理項のカバレッジ情報をまとめる
                var elementGroup = new CoverageElementGroup(element, caseElements);
                info.TargetGroups.Add(elementGroup);
            }
            info.SwitchRanges.Add(Tuple.Create(startSwitchIndex, info.TargetGroups.Count));
        }
示例#3
0
        private static List <CoverageElement> InsertIntoConditionCoverage(
            CoverageInfo info, ICollection <XElement> condNodeList, LanguageSupport support,
            string relativePath)
        {
            return(condNodeList.SelectToList(
                       node => {
                support.AstTransformer.InsertPredicate(node, info.Targets.Count,
                                                       ElementType.Condition);

                var covElem = new CoverageElement(relativePath, node, support.Tagger);
                info.Targets.Add(covElem);
                return covElem;
            }));
        }
示例#4
0
        private static List <CoverageElement> InsertIntoConditionAndComparison(
            CoverageInfo info, ICollection <XElement> condNodeList, LanguageSupport support,
            string relativePath)
        {
            return(condNodeList.SelectToList(
                       node => {
                var elemsAndType = support.AstAnalyzer.GetComparedElements(node);
                if (elemsAndType != null)
                {
                    var leftElement = elemsAndType.Item1;
                    var rightElement = elemsAndType.Item2;
                    var type = elemsAndType.Item3;
                    switch (type)
                    {
                    case ComparatorType.Equal:
                        support.AstTransformer.InsertEqual(node, leftElement, rightElement,
                                                           info.Targets.Count, ElementType.Condition);
                        break;

                    case ComparatorType.NotEqual:
                        support.AstTransformer.InsertNotEqual(node, leftElement,
                                                              rightElement, info.Targets.Count, ElementType.Condition);
                        break;

                    case ComparatorType.LessThan:
                        support.AstTransformer.InsertLessThan(node, leftElement,
                                                              rightElement, info.Targets.Count, ElementType.Condition);
                        break;

                    case ComparatorType.GraterThan:
                        support.AstTransformer.InsertGraterThan(node, leftElement,
                                                                rightElement, info.Targets.Count, ElementType.Condition);
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
                else
                {
                    support.AstTransformer.InsertPredicate(node, info.Targets.Count,
                                                           ElementType.Condition);
                }

                var covElem = new CoverageElement(relativePath, node, support.Tagger);
                info.Targets.Add(covElem);
                return covElem;
            }));
        }
示例#5
0
        private static void InsertIntoBranch(
            CoverageInfo info, XElement node, LanguageSupport support, string relativePath)
        {
            var branchNodes      = support.AstAnalyzer.FindBranches(node);
            var startBranchIndex = info.Targets.Count;

            foreach (var branchNode in branchNodes.ToList())
            {
                support.AstTransformer.InsertPredicate(branchNode, info.Targets.Count,
                                                       ElementType.Decision);

                // 条件分岐のカバレッジ情報を生成
                var element = new CoverageElement(relativePath, branchNode, support.Tagger);
                info.Targets.Add(element);
            }
            info.BranchRanges.Add(Tuple.Create(startBranchIndex, info.Targets.Count));
        }
示例#6
0
        private static void InsertIntoVariableInitializer(
            CoverageInfo info, XElement root, LanguageSupport support, string relativePath)
        {
            var statemetIndex = info.Targets.Count;
            var nodes         = support.AstAnalyzer.FindVariableInitializers(root);

            foreach (var node in nodes.ToList())
            {
                // ステートメントに測定用コードを埋め込む
                support.AstTransformer.InsertInitializer(node, info.Targets.Count,
                                                         ElementType.Statement);
                // カバレッジ情報を生成
                var covElem = new CoverageElement(relativePath, node, support.Tagger);
                info.Targets.Add(covElem);
            }
            info.StatementRanges.Add(Tuple.Create(statemetIndex, info.Targets.Count));
        }
示例#7
0
        private static void InsertIntoStatement(
            CoverageInfo info, XElement root, LanguageSupport support, string relativePath)
        {
            var statemetIndex = info.Targets.Count;
            var nodes         = support.AstAnalyzer.FindStatements(root);

            foreach (var node in nodes.ToList())
            {
                // ステートメントに測定用コードを埋め込む
                var posNode = support.AstAnalyzer.GetBaseElementForStatement(node);
                support.AstTransformer.InsertStatementBefore(
                    posNode, info.Targets.Count, Done, ElementType.Statement);
                // カバレッジ情報を生成
                var covElem = new CoverageElement(relativePath, node, support.Tagger);
                info.Targets.Add(covElem);
            }
            info.StatementRanges.Add(Tuple.Create(statemetIndex, info.Targets.Count));
        }