@@ -18,6 +18,8 @@ public string Report(CoverageResult result)
18
18
{
19
19
CoverageSummary summary = new CoverageSummary ( ) ;
20
20
21
+ int totalLines = 0 , coveredLines = 0 , totalBranches = 0 , coveredBranches = 0 ;
22
+
21
23
XDocument xml = new XDocument ( ) ;
22
24
XElement coverage = new XElement ( "coverage" ) ;
23
25
coverage . Add ( new XAttribute ( "line-rate" , summary . CalculateLineCoverage ( result . Modules ) . ToString ( ) ) ) ;
@@ -26,16 +28,14 @@ public string Report(CoverageResult result)
26
28
coverage . Add ( new XAttribute ( "timestamp" , ( ( int ) ( DateTime . UtcNow - new DateTime ( 1970 , 1 , 1 ) ) . TotalSeconds ) . ToString ( ) ) ) ;
27
29
28
30
XElement sources = new XElement ( "sources" ) ;
29
- foreach ( var src in GetSources ( result . Modules ) )
30
- {
31
- XElement source = new XElement ( "source" , src ) ;
32
- sources . Add ( source ) ;
33
- }
31
+ var basePath = GetBasePath ( result . Modules ) ;
32
+ sources . Add ( new XElement ( "source" , basePath ) ) ;
34
33
35
34
XElement packages = new XElement ( "packages" ) ;
36
35
foreach ( var module in result . Modules )
37
36
{
38
37
XElement package = new XElement ( "package" ) ;
38
+ package . Add ( new XAttribute ( "name" , Path . GetFileNameWithoutExtension ( module . Key ) ) ) ;
39
39
package . Add ( new XAttribute ( "line-rate" , summary . CalculateLineCoverage ( module . Value ) . ToString ( ) ) ) ;
40
40
package . Add ( new XAttribute ( "branch-rate" , summary . CalculateBranchCoverage ( module . Value ) . ToString ( ) ) ) ;
41
41
package . Add ( new XAttribute ( "complexity" , "0" ) ) ;
@@ -47,17 +47,19 @@ public string Report(CoverageResult result)
47
47
{
48
48
XElement @class = new XElement ( "class" ) ;
49
49
@class . Add ( new XAttribute ( "name" , cls . Key ) ) ;
50
- @class . Add ( new XAttribute ( "filename" , Path . GetFileName ( document . Key ) ) ) ;
50
+ @class . Add ( new XAttribute ( "filename" , GetRelativePathFromBase ( basePath , document . Key ) ) ) ;
51
51
@class . Add ( new XAttribute ( "line-rate" , summary . CalculateLineCoverage ( cls . Value ) . ToString ( ) ) ) ;
52
52
@class . Add ( new XAttribute ( "branch-rate" , summary . CalculateBranchCoverage ( cls . Value ) . ToString ( ) ) ) ;
53
53
@class . Add ( new XAttribute ( "complexity" , "0" ) ) ;
54
54
55
+ XElement classLines = new XElement ( "lines" ) ;
55
56
XElement methods = new XElement ( "methods" ) ;
57
+
56
58
foreach ( var meth in cls . Value )
57
59
{
58
60
XElement method = new XElement ( "method" ) ;
59
61
method . Add ( new XAttribute ( "name" , meth . Key . Split ( ':' ) [ 2 ] . Split ( '(' ) [ 0 ] ) ) ;
60
- method . Add ( new XAttribute ( "signature" , meth . Key ) ) ;
62
+ method . Add ( new XAttribute ( "signature" , "(" + meth . Key . Split ( ':' ) [ 2 ] . Split ( '(' ) [ 1 ] ) ) ;
61
63
method . Add ( new XAttribute ( "line-rate" , summary . CalculateLineCoverage ( meth . Value ) . ToString ( ) ) ) ;
62
64
method . Add ( new XAttribute ( "branch-rate" , summary . CalculateBranchCoverage ( meth . Value ) . ToString ( ) ) ) ;
63
65
@@ -69,14 +71,37 @@ public string Report(CoverageResult result)
69
71
line . Add ( new XAttribute ( "hits" , ln . Value . Hits . ToString ( ) ) ) ;
70
72
line . Add ( new XAttribute ( "branch" , ln . Value . IsBranchPoint . ToString ( ) ) ) ;
71
73
74
+ totalLines ++ ;
75
+ if ( ln . Value . Hits > 0 ) coveredLines ++ ;
76
+
77
+
78
+ if ( ln . Value . IsBranchPoint )
79
+ {
80
+ line . Add ( new XAttribute ( "condition-coverage" , "100% (1/1)" ) ) ;
81
+ XElement conditions = new XElement ( "conditions" ) ;
82
+ XElement condition = new XElement ( "condition" ) ;
83
+ condition . Add ( new XAttribute ( "number" , "0" ) ) ;
84
+ condition . Add ( new XAttribute ( "type" , "jump" ) ) ;
85
+ condition . Add ( new XAttribute ( "coverage" , "100%" ) ) ;
86
+
87
+ totalBranches ++ ;
88
+ if ( ln . Value . Hits > 0 ) coveredBranches ++ ;
89
+
90
+ conditions . Add ( condition ) ;
91
+ line . Add ( conditions ) ;
92
+ }
93
+
94
+
72
95
lines . Add ( line ) ;
96
+ classLines . Add ( line ) ;
73
97
}
74
98
75
99
method . Add ( lines ) ;
76
100
methods . Add ( method ) ;
77
101
}
78
102
79
103
@class . Add ( methods ) ;
104
+ @class . Add ( classLines ) ;
80
105
classes . Add ( @class ) ;
81
106
}
82
107
}
@@ -85,6 +110,11 @@ public string Report(CoverageResult result)
85
110
packages . Add ( package ) ;
86
111
}
87
112
113
+ coverage . Add ( new XAttribute ( "lines-covered" , coveredLines . ToString ( ) ) ) ;
114
+ coverage . Add ( new XAttribute ( "lines-valid" , totalLines . ToString ( ) ) ) ;
115
+ coverage . Add ( new XAttribute ( "branches-covered" , coveredBranches . ToString ( ) ) ) ;
116
+ coverage . Add ( new XAttribute ( "branches-valid" , totalBranches . ToString ( ) ) ) ;
117
+
88
118
coverage . Add ( sources ) ;
89
119
coverage . Add ( packages ) ;
90
120
xml . Add ( coverage ) ;
@@ -95,16 +125,33 @@ public string Report(CoverageResult result)
95
125
return Encoding . UTF8 . GetString ( stream . ToArray ( ) ) ;
96
126
}
97
127
98
- private string [ ] GetSources ( Modules modules )
128
+ private string GetBasePath ( Modules modules )
99
129
{
100
130
List < string > sources = new List < string > ( ) ;
131
+ string source = string . Empty ;
132
+
101
133
foreach ( var module in modules )
102
134
{
103
135
sources . AddRange (
104
136
module . Value . Select ( d => Path . GetDirectoryName ( d . Key ) ) ) ;
105
137
}
106
138
107
- return sources . Distinct ( ) . ToArray ( ) ;
139
+ sources = sources . Distinct ( ) . ToList ( ) ;
140
+ var segments = sources [ 0 ] . Split ( Path . DirectorySeparatorChar ) ;
141
+
142
+ foreach ( var segment in segments )
143
+ {
144
+ var startsWith = sources . All ( s => s . StartsWith ( source + segment ) ) ;
145
+ if ( ! startsWith )
146
+ break ;
147
+
148
+ source += segment + Path . DirectorySeparatorChar ;
149
+ }
150
+
151
+ return source ;
108
152
}
153
+
154
+ private string GetRelativePathFromBase ( string source , string path )
155
+ => path . Replace ( source , string . Empty ) ;
109
156
}
110
157
}
0 commit comments