OSDN Git Service

.
[codecoverage/main.git] / CoverageFramework / Embedder / ConditionCoverageEmbedder.cs
1 using System.Collections.Generic;\r
2 using System.Linq;\r
3 using System.Xml.Linq;\r
4 using CoverageFramework.Element.Decorator;\r
5 using CoverageFramework.Element.Selector;\r
6 using CoverageFramework.Model;\r
7 using CoverageFramework.Utility;\r
8 using Paraiba.Linq;\r
9 \r
10 namespace CoverageFramework.Embedder\r
11 {\r
12         public class ConditionCoverageEmbedder\r
13         {\r
14                 private int _iBranch;\r
15 \r
16                 public void Embed(XElement root, IXElementRangeSelector ifRangeSelector, IXElementRangeSelector condRangeSelector, ITaggedXElementDecorator covDec, ITagger tagger, IDictionary<string, CoverageInfomation> covInfos)\r
17                 {\r
18                         ifRangeSelector.Select(root)\r
19                                 .ForEach(ifCondBlock => {\r
20                                         var ifPos = CodePositionUtil.CreateCodePosition(ifCondBlock);\r
21 \r
22                                         ifCondBlock.SelectMany(e_ => condRangeSelector.Select(e_))\r
23                                                 .ForEach((target, iCondition) => {\r
24                                                         var targetList = target.ToList();\r
25                                                         var key = "cond," + (_iBranch++) + ">" + iCondition;\r
26                                                         var pos = CodePositionUtil.CreateCodePosition(targetList);\r
27                                                         covInfos[key] = new CoverageInfomation(ifPos, pos, tagger.Generate(targetList));\r
28 \r
29                                                         // 直前に要素があるかどうか調べる\r
30                                                         var prev = targetList[0].PreviousNode;\r
31                                                         if (prev != null)\r
32                                                         {\r
33                                                                 // 要素の複製防止のために削除して,同じ位置に挿入し直す\r
34                                                                 targetList.Remove();\r
35                                                                 prev.AddAfterSelf(covDec.Generate(targetList, key));\r
36                                                         }\r
37                                                         else\r
38                                                         {\r
39                                                                 var parent = targetList[0].Parent;\r
40                                                                 // 要素の複製防止のために削除して,同じ位置に挿入し直す\r
41                                                                 targetList.Remove();\r
42                                                                 parent.AddFirst(covDec.Generate(targetList, key));\r
43                                                         }\r
44                                                 });\r
45                                 });\r
46                 }\r
47 \r
48                 public void Embed(XElement root, IXElementSelector ifSelector, IXElementSelector condSelector, ITaggedXElementDecorator covDec, ITagger tagger, IDictionary<string, CoverageInfomation> covInfos)\r
49                 {\r
50                         ifSelector.Select(root)\r
51                                 .ForEach(ifCondition => {\r
52                                         var ifPos = CodePositionUtil.CreateCodePosition(ifCondition);\r
53 \r
54                                         condSelector.Select(ifCondition)\r
55                                                 .ForEach((target, iCondition) => {\r
56                                                         var key = "cond," + (_iBranch++) + ">" + iCondition;\r
57                                                         var pos = CodePositionUtil.CreateCodePosition(target);\r
58                                                         covInfos[key] = new CoverageInfomation(ifPos, pos, tagger.Generate(target));\r
59 \r
60                                                         // 直前に要素があるかどうか調べる\r
61                                                         var prev = target.PreviousNode;\r
62                                                         if (prev != null)\r
63                                                         {\r
64                                                                 // 要素の複製防止のために削除して,同じ位置に挿入し直す\r
65                                                                 target.Remove();\r
66                                                                 prev.AddAfterSelf(covDec.Generate(new[] { target }, key));\r
67                                                         }\r
68                                                         else\r
69                                                         {\r
70                                                                 var parent = target.Parent;\r
71                                                                 // 要素の複製防止のために削除して,同じ位置に挿入し直す\r
72                                                                 target.Remove();\r
73                                                                 parent.AddFirst(covDec.Generate(new[] { target }, key));\r
74                                                         }\r
75                                                 });\r
76                                 });\r
77                 }\r
78         }\r
79 }