1
+ <?php
2
+
3
+ /**
4
+ * PHP_CodeCoverage_Report_Crap4j
5
+ *
6
+ * @author oker <[email protected] >
7
+ */
8
+ class PHP_CodeCoverage_Report_Crap4j
9
+ {
10
+ /**
11
+ * @param PHP_CodeCoverage $coverage
12
+ * @param string $target
13
+ * @param string $name
14
+ * @return string
15
+ */
16
+ public function process (PHP_CodeCoverage $ coverage , $ target = NULL , $ name = NULL )
17
+ {
18
+ $ document = new DOMDocument ('1.0 ' , 'UTF-8 ' );
19
+ $ document ->formatOutput = TRUE ;
20
+
21
+ $ root = $ document ->createElement ('crap_result ' );
22
+
23
+ $ document ->appendChild ($ root );
24
+
25
+ $ project = $ document ->createElement ('project ' , is_string ($ name ) ? $ name : '' );
26
+
27
+ $ root ->appendChild ($ project );
28
+
29
+ $ root ->appendChild ($ document ->createElement ('timestamp ' , date ('Y-m-d H:i:s ' , (int )$ _SERVER ['REQUEST_TIME ' ])));
30
+
31
+ $ methodsNode = $ document ->createElement ('methods ' );
32
+
33
+ $ files = $ coverage ->getSummary ();
34
+ $ packages = array ();
35
+
36
+ $ projectStatistics = array (
37
+ 'files ' => 0 ,
38
+ 'loc ' => 0 ,
39
+ 'ncloc ' => 0 ,
40
+ 'classes ' => 0 ,
41
+ 'methods ' => 0 ,
42
+ 'coveredMethods ' => 0 ,
43
+ 'conditionals ' => 0 ,
44
+ 'coveredConditionals ' => 0 ,
45
+ 'statements ' => 0 ,
46
+ 'coveredStatements ' => 0
47
+ );
48
+
49
+
50
+ /**
51
+ * <methods>
52
+ <method>
53
+ <package>
54
+ bancoagitar
55
+ </package>
56
+ <className>
57
+ BancoAgitar
58
+ </className>
59
+ <methodName>
60
+ <init>
61
+ </methodName>
62
+ <methodSignature>
63
+ ()V
64
+ </methodSignature>
65
+ <fullMethod>
66
+ public void <init>()
67
+ </fullMethod>
68
+ <crap>
69
+ 1.00
70
+ </crap>
71
+ <complexity>
72
+ 1
73
+ </complexity>
74
+ <coverage>
75
+ 100.00
76
+ </coverage>
77
+ <crapLoad>
78
+ 0
79
+ </crapLoad>
80
+ </method>
81
+ */
82
+
83
+ foreach ($ files as $ filename => $ data ) {
84
+
85
+ $ namespace = 'global ' ;
86
+
87
+ if (file_exists ($ filename )) {
88
+ $ fileStatistics = array (
89
+ 'classes ' => 0 ,
90
+ 'methods ' => 0 ,
91
+ 'coveredMethods ' => 0 ,
92
+ 'conditionals ' => 0 ,
93
+ 'coveredConditionals ' => 0 ,
94
+ 'statements ' => 0 ,
95
+ 'coveredStatements ' => 0
96
+ );
97
+
98
+ $ file = $ document ->createElement ('file ' );
99
+ $ file ->setAttribute ('name ' , $ filename );
100
+
101
+ $ tokens = PHP_Token_Stream_CachingFactory::get ($ filename );
102
+ $ classesInFile = $ tokens ->getClasses ();
103
+ $ linesOfCode = $ tokens ->getLinesOfCode ();
104
+
105
+ $ ignoredLines = PHP_CodeCoverage_Util::getLinesToBeIgnored (
106
+ $ filename
107
+ );
108
+
109
+ PHP_Token_Stream_CachingFactory::unsetFromCache ($ filename );
110
+ unset($ tokens );
111
+
112
+ $ lines = array ();
113
+
114
+ foreach ($ classesInFile as $ className => $ _class ) {
115
+ $ package = PHP_CodeCoverage_Util::getPackageInformation (
116
+ $ className , $ _class ['docblock ' ]
117
+ );
118
+
119
+ if (!empty ($ package ['namespace ' ])) {
120
+ $ namespace = $ package ['namespace ' ];
121
+ }
122
+
123
+ $ classStatistics = array (
124
+ 'methods ' => 0 ,
125
+ 'coveredMethods ' => 0 ,
126
+ 'conditionals ' => 0 ,
127
+ 'coveredConditionals ' => 0 ,
128
+ 'statements ' => 0 ,
129
+ 'coveredStatements ' => 0
130
+ );
131
+
132
+ foreach ($ _class ['methods ' ] as $ methodName => $ method ) {
133
+
134
+
135
+ $ methodCount = 0 ;
136
+ $ methodLines = 0 ;
137
+ $ methodLinesCovered = 0 ;
138
+
139
+ for ($ i = $ method ['startLine ' ];
140
+ $ i <= $ method ['endLine ' ];
141
+ $ i ++) {
142
+ if (isset ($ ignoredLines [$ i ])) {
143
+ continue ;
144
+ }
145
+
146
+ $ add = TRUE ;
147
+ $ count = 0 ;
148
+
149
+ if (isset ($ files [$ filename ][$ i ])) {
150
+ if ($ files [$ filename ][$ i ] != -2 ) {
151
+ $ classStatistics ['statements ' ]++;
152
+ $ methodLines ++;
153
+ }
154
+
155
+ if (is_array ($ files [$ filename ][$ i ])) {
156
+ $ classStatistics ['coveredStatements ' ]++;
157
+ $ methodLinesCovered ++;
158
+ $ count = count ($ files [$ filename ][$ i ]);
159
+ }
160
+
161
+ else if ($ files [$ filename ][$ i ] == -2 ) {
162
+ $ add = FALSE ;
163
+ }
164
+ } else {
165
+ $ add = FALSE ;
166
+ }
167
+
168
+ $ methodCount = max ($ methodCount , $ count );
169
+
170
+ if ($ add ) {
171
+ $ lines [$ i ] = array (
172
+ 'count ' => $ count ,
173
+ 'type ' => 'stmt '
174
+ );
175
+ }
176
+ }
177
+
178
+
179
+ $ coveragePercent = PHP_CodeCoverage_Util::percent (
180
+ $ methodLinesCovered ,
181
+ $ methodLines
182
+ );
183
+ $ crap = PHP_CodeCoverage_Util::crap ($ method ['ccn ' ], $ coveragePercent );
184
+
185
+
186
+ $ methodNode = $ document ->createElement ('method ' );
187
+
188
+ $ methodNode ->appendChild ($ document ->createElement ('package ' , '' ));
189
+ $ methodNode ->appendChild ($ document ->createElement ('className ' , $ className ));
190
+ $ methodNode ->appendChild ($ document ->createElement ('methodName ' , $ methodName ));
191
+ $ methodNode ->appendChild ($ document ->createElement ('methodSignature ' , $ method ['signature ' ]));
192
+ $ methodNode ->appendChild ($ document ->createElement ('fullMethod ' , sprintf ('%s(%s) ' , $ methodName , $ method ['signature ' ])));
193
+ $ methodNode ->appendChild ($ document ->createElement ('crap ' , $ crap ));
194
+ $ methodNode ->appendChild ($ document ->createElement ('complexity ' , $ method ['ccn ' ]));
195
+ $ methodNode ->appendChild ($ document ->createElement ('coverage ' , $ coveragePercent ));
196
+ $ methodNode ->appendChild ($ document ->createElement ('crapLoad ' , 0 ));
197
+
198
+ /*
199
+ * public int getCrapLoad(float crapThreshold) {
200
+ int crapLoad = 0;
201
+ if (getCrap() >= crapThreshold) {
202
+ int complexity = getComplexity();
203
+ float coverage = getCoverage();
204
+ crapLoad += complexity * (1.0 - coverage);
205
+ crapLoad += complexity / crapThreshold;
206
+ }
207
+ return crapLoad;
208
+ }*/
209
+
210
+ $ methodsNode ->appendChild ($ methodNode );
211
+
212
+ $ classStatistics ['methods ' ]++;
213
+
214
+ if ($ methodCount > 0 ) {
215
+ $ classStatistics ['coveredMethods ' ]++;
216
+ }
217
+ }
218
+
219
+ /*if (!empty($package['fullPackage'])) {
220
+ $class->setAttribute(
221
+ 'fullPackage', $package['fullPackage']
222
+ );
223
+ }
224
+
225
+ if (!empty($package['category'])) {
226
+ $class->setAttribute(
227
+ 'category', $package['category']
228
+ );
229
+ }
230
+
231
+ if (!empty($package['package'])) {
232
+ $class->setAttribute(
233
+ 'package', $package['package']
234
+ );
235
+ }
236
+
237
+ if (!empty($package['subpackage'])) {
238
+ $class->setAttribute(
239
+ 'subpackage', $package['subpackage']
240
+ );
241
+ }*/
242
+ }
243
+ }
244
+ }
245
+
246
+ $ root ->appendChild ($ methodsNode );
247
+
248
+ $ stats = $ document ->createElement ('stats ' );
249
+
250
+ $ stats ->appendChild ($ document ->createElement ('name ' , 'Method Crap Stats ' ));
251
+
252
+ $ stats ->appendChild ($ document ->createElement ('totalCrap ' , 0 ));
253
+ $ stats ->appendChild ($ document ->createElement ('crap ' , 0 ));
254
+ $ stats ->appendChild ($ document ->createElement ('median ' , 0 ));
255
+ $ stats ->appendChild ($ document ->createElement ('average ' , 0 ));
256
+ $ stats ->appendChild ($ document ->createElement ('stdDev ' , 0 ));
257
+ $ stats ->appendChild ($ document ->createElement ('methodCount ' , 0 ));
258
+ $ stats ->appendChild ($ document ->createElement ('crapMethodCount ' , 0 ));
259
+ $ stats ->appendChild ($ document ->createElement ('crapMethodPercent ' , 0 ));
260
+ $ stats ->appendChild ($ document ->createElement ('crapLoad ' , 0 ));
261
+ $ stats ->appendChild ($ document ->createElement ('crapThreshold ' , 0 ));
262
+ $ stats ->appendChild ($ document ->createElement ('crapLoad ' , 0 ));
263
+ $ stats ->appendChild ($ document ->createElement ('globalCraploadAverage ' , 0 ));
264
+ $ stats ->appendChild ($ document ->createElement ('globalCrapMethodAverage ' , 0 ));
265
+ $ stats ->appendChild ($ document ->createElement ('globalTotalMethodAverage ' , 0 ));
266
+ $ stats ->appendChild ($ document ->createElement ('globalAverageDiff ' , 0 ));
267
+ $ stats ->appendChild ($ document ->createElement ('globalCraploadAverageDiff ' , 0 ));
268
+ $ stats ->appendChild ($ document ->createElement ('globalCrapMethodAverageDiff ' , 0 ));
269
+ $ stats ->appendChild ($ document ->createElement ('globalTotalMethodAverageDiff ' , 0 ));
270
+
271
+ $ root ->appendChild ($ stats );
272
+
273
+ /*
274
+
275
+ $metrics = $document->createElement('metrics');
276
+
277
+ $metrics->setAttribute('files', $projectStatistics['files']);
278
+ $metrics->setAttribute('loc', $projectStatistics['loc']);
279
+ $metrics->setAttribute('ncloc', $projectStatistics['ncloc']);
280
+ $metrics->setAttribute('classes', $projectStatistics['classes']);
281
+ $metrics->setAttribute('methods', $projectStatistics['methods']);
282
+
283
+ $metrics->setAttribute(
284
+ 'coveredmethods', $projectStatistics['coveredMethods']
285
+ );
286
+
287
+ $metrics->setAttribute(
288
+ 'conditionals', $projectStatistics['conditionals']
289
+ );
290
+
291
+ $metrics->setAttribute(
292
+ 'coveredconditionals', $projectStatistics['coveredConditionals']
293
+ );
294
+
295
+ $metrics->setAttribute(
296
+ 'statements', $projectStatistics['statements']
297
+ );
298
+
299
+ $metrics->setAttribute(
300
+ 'coveredstatements', $projectStatistics['coveredStatements']
301
+ );
302
+
303
+ $metrics->setAttribute(
304
+ 'elements',
305
+ $projectStatistics['conditionals'] +
306
+ $projectStatistics['statements'] +
307
+ $projectStatistics['methods']
308
+ );
309
+
310
+ $metrics->setAttribute(
311
+ 'coveredelements',
312
+ $projectStatistics['coveredConditionals'] +
313
+ $projectStatistics['coveredStatements'] +
314
+ $projectStatistics['coveredMethods']
315
+ );
316
+
317
+ $project->appendChild($metrics);*/
318
+
319
+ if ($ target !== NULL ) {
320
+ if (!is_dir (dirname ($ target ))) {
321
+ mkdir (dirname ($ target ), 0777 , TRUE );
322
+ }
323
+
324
+ return $ document ->save ($ target );
325
+ } else {
326
+ return $ document ->saveXML ();
327
+ }
328
+ }
329
+ }
0 commit comments