Skip to content

Commit 6cd24da

Browse files
committed
crap4j report wip
1 parent 11bc666 commit 6cd24da

File tree

1 file changed

+329
-0
lines changed

1 file changed

+329
-0
lines changed

PHP/CodeCoverage/Report/Crap4j.php

Lines changed: 329 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,329 @@
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+
&lt;init&gt;
61+
</methodName>
62+
<methodSignature>
63+
()V
64+
</methodSignature>
65+
<fullMethod>
66+
public void &lt;init&gt;()
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

Comments
 (0)