Skip to content
Merged
38 changes: 27 additions & 11 deletions src/Report/Html/Renderer/Dashboard.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
namespace SebastianBergmann\CodeCoverage\Report\Html;

use function array_values;
use function arsort;
use function asort;
use function assert;
use function count;
Expand All @@ -19,6 +18,8 @@
use function json_encode;
use function sprintf;
use function str_replace;
use function uasort;
use function usort;
use SebastianBergmann\CodeCoverage\FileCouldNotBeWrittenException;
use SebastianBergmann\CodeCoverage\Node\AbstractNode;
use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode;
Expand Down Expand Up @@ -105,6 +106,7 @@ private function complexity(array $classes, string $baseLink): array
$method['ccn'],
str_replace($baseLink, '', $method['link']),
$methodName,
$method['crap'],
];
}

Expand All @@ -113,9 +115,13 @@ private function complexity(array $classes, string $baseLink): array
$class['ccn'],
str_replace($baseLink, '', $class['link']),
$className,
$class['crap'],
];
}

usort($result['class'], static fn (mixed $a, mixed $b) => ($a[0] <=> $b[0]));
usort($result['method'], static fn (mixed $a, mixed $b) => ($a[0] <=> $b[0]));

$class = json_encode($result['class']);

assert($class !== false);
Expand Down Expand Up @@ -276,37 +282,47 @@ private function projectRisks(array $classes, string $baseLink): array
$key = $className . '::' . $methodName;
}

$methodRisks[$key] = $method['crap'];
$methodRisks[$key] = $method;
}
}

if ($class['coverage'] < $this->thresholds->highLowerBound() &&
$class['ccn'] > count($class['methods'])) {
$classRisks[$className] = $class['crap'];
$classRisks[$className] = $class;
}
}

arsort($classRisks);
arsort($methodRisks);
uasort($classRisks, static function (array $a, array $b)
{
return ((int) ($a['crap']) <=> (int) ($b['crap'])) * -1;
});
uasort($methodRisks, static function (array $a, array $b)
{
return ((int) ($a['crap']) <=> (int) ($b['crap'])) * -1;
});

foreach ($classRisks as $className => $crap) {
foreach ($classRisks as $className => $class) {
$result['class'] .= sprintf(
' <tr><td><a href="%s">%s</a></td><td class="text-right">%d</td></tr>' . "\n",
' <tr><td><a href="%s">%s</a></td><td class="text-right">%.1f%%</td><td class="text-right">%d</td><td class="text-right">%d</td></tr>' . "\n",
str_replace($baseLink, '', $classes[$className]['link']),
$className,
$crap,
$class['coverage'],
$class['ccn'],
$class['crap'],
);
}

foreach ($methodRisks as $methodName => $crap) {
foreach ($methodRisks as $methodName => $methodVals) {
[$class, $method] = explode('::', $methodName);

$result['method'] .= sprintf(
' <tr><td><a href="%s"><abbr title="%s">%s</abbr></a></td><td class="text-right">%d</td></tr>' . "\n",
' <tr><td><a href="%s"><abbr title="%s">%s</abbr></a></td><td class="text-right">%.1f%%</td><td class="text-right">%d</td><td class="text-right">%d</td></tr>' . "\n",
str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']),
$methodName,
$method,
$crap,
$methodVals['coverage'],
$methodVals['ccn'],
$methodVals['crap'],
);
}

Expand Down
6 changes: 6 additions & 0 deletions src/Report/Html/Renderer/Template/dashboard.html.dist
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@
<thead>
<tr>
<th>Class</th>
<th class="text-right">Coverage</th>
<th class="text-right">Complexity</th>
<th class="text-right"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></th>
</tr>
</thead>
Expand Down Expand Up @@ -120,6 +122,8 @@
<thead>
<tr>
<th>Method</th>
<th class="text-right">Coverage</th>
<th class="text-right">Complexity</th>
<th class="text-right"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></th>
</tr>
</thead>
Expand Down Expand Up @@ -271,10 +275,12 @@
const coverage = Math.round(data[0].x);
const complexity = data[0].value;
const targetName = complexityData[data[0].index][3];
const crap = complexityData[data[0].index][4];
return `<table class="bb-tooltip"><tbody>
<tr><th colspan="2">${targetName}</th></tr>
<tr class="bb-tooltip-name-complexity"><td>Coverage</td><td class="name">${coverage}%</td></tr>
<tr class="bb-tooltip-name-complexity"><td>Complexity</td><td class="value">${complexity}</td></tr>
<tr class="bb-tooltip-name-complexity"><td>Crap</td><td class="value">${crap}</td></tr>
</tbody></table>`;
},
grouped: false,
Expand Down
16 changes: 11 additions & 5 deletions tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -70,11 +70,13 @@ <h3>Project Risks</h3>
<thead>
<tr>
<th>Class</th>
<th class="text-right">Coverage</th>
<th class="text-right">Complexity</th>
<th class="text-right"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></th>
</tr>
</thead>
<tbody>
<tr><td><a href="BankAccount.php.html#2">BankAccount</a></td><td class="text-right">6</td></tr>
<tr><td><a href="BankAccount.php.html#2">BankAccount</a></td><td class="text-right">62.5%</td><td class="text-right">5</td><td class="text-right">6</td></tr>

</tbody>
</table>
Expand Down Expand Up @@ -125,11 +127,13 @@ <h3>Project Risks</h3>
<thead>
<tr>
<th>Method</th>
<th class="text-right">Coverage</th>
<th class="text-right">Complexity</th>
<th class="text-right"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></th>
</tr>
</thead>
<tbody>
<tr><td><a href="BankAccount.php.html#11"><abbr title="BankAccount::setBalance">setBalance</abbr></a></td><td class="text-right">6</td></tr>
<tr><td><a href="BankAccount.php.html#11"><abbr title="BankAccount::setBalance">setBalance</abbr></a></td><td class="text-right">0.0%</td><td class="text-right">2</td><td class="text-right">6</td></tr>

</tbody>
</table>
Expand All @@ -143,9 +147,9 @@ <h3>Project Risks</h3>
</p>
</footer>
</div>
<script src="_js/billboard.pkgd.min.js?v=%s" type="text/javascript"></script>
<script type="application/json" id="complexity_class">[[62.5,5,"BankAccount.php.html#2","BankAccount"]]</script>
<script type="application/json" id="complexity_method">[[100,1,"BankAccount.php.html#6","BankAccount::getBalance"],[0,2,"BankAccount.php.html#11","BankAccount::setBalance"],[100,1,"BankAccount.php.html#20","BankAccount::depositMoney"],[100,1,"BankAccount.php.html#27","BankAccount::withdrawMoney"]]</script>
<script src="_js/billboard.pkgd.min.js?v=12.3.1" type="text/javascript"></script>
<script type="application/json" id="complexity_class">[[62.5,5,"BankAccount.php.html#2","BankAccount","6.32"]]</script>
<script type="application/json" id="complexity_method">[[0,2,"BankAccount.php.html#11","BankAccount::setBalance","6"],[100,1,"BankAccount.php.html#6","BankAccount::getBalance","1"],[100,1,"BankAccount.php.html#20","BankAccount::depositMoney","1"],[100,1,"BankAccount.php.html#27","BankAccount::withdrawMoney","1"]]</script>
<script type="text/javascript" defer>
const barLabels = [
'0%',
Expand Down Expand Up @@ -277,10 +281,12 @@ <h3>Project Risks</h3>
const coverage = Math.round(data[0].x);
const complexity = data[0].value;
const targetName = complexityData[data[0].index][3];
const crap = complexityData[data[0].index][4];
return `<table class="bb-tooltip"><tbody>
<tr><th colspan="2">${targetName}</th></tr>
<tr class="bb-tooltip-name-complexity"><td>Coverage</td><td class="name">${coverage}%</td></tr>
<tr class="bb-tooltip-name-complexity"><td>Complexity</td><td class="value">${complexity}</td></tr>
<tr class="bb-tooltip-name-complexity"><td>Crap</td><td class="value">${crap}</td></tr>
</tbody></table>`;
},
grouped: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ <h3>Project Risks</h3>
<thead>
<tr>
<th>Class</th>
<th class="text-right">Coverage</th>
<th class="text-right">Complexity</th>
<th class="text-right"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></th>
</tr>
</thead>
Expand Down Expand Up @@ -122,6 +124,8 @@ <h3>Project Risks</h3>
<thead>
<tr>
<th>Method</th>
<th class="text-right">Coverage</th>
<th class="text-right">Complexity</th>
<th class="text-right"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></th>
</tr>
</thead>
Expand All @@ -139,9 +143,9 @@ <h3>Project Risks</h3>
</p>
</footer>
</div>
<script src="_js/billboard.pkgd.min.js?v=%s" type="text/javascript"></script>
<script type="application/json" id="complexity_class">[[100,1,"source_with_class_and_anonymous_function.php.html#3","CoveredClassWithAnonymousFunctionInStaticMethod"]]</script>
<script type="application/json" id="complexity_method">[[100,1,"source_with_class_and_anonymous_function.php.html#5","CoveredClassWithAnonymousFunctionInStaticMethod::runAnonymous"]]</script>
<script src="_js/billboard.pkgd.min.js?v=12.3.1" type="text/javascript"></script>
<script type="application/json" id="complexity_class">[[100,1,"source_with_class_and_anonymous_function.php.html#3","CoveredClassWithAnonymousFunctionInStaticMethod","1"]]</script>
<script type="application/json" id="complexity_method">[[100,1,"source_with_class_and_anonymous_function.php.html#5","CoveredClassWithAnonymousFunctionInStaticMethod::runAnonymous","1"]]</script>
<script type="text/javascript" defer>
const barLabels = [
'0%',
Expand Down Expand Up @@ -273,10 +277,12 @@ <h3>Project Risks</h3>
const coverage = Math.round(data[0].x);
const complexity = data[0].value;
const targetName = complexityData[data[0].index][3];
const crap = complexityData[data[0].index][4];
return `<table class="bb-tooltip"><tbody>
<tr><th colspan="2">${targetName}</th></tr>
<tr class="bb-tooltip-name-complexity"><td>Coverage</td><td class="name">${coverage}%</td></tr>
<tr class="bb-tooltip-name-complexity"><td>Complexity</td><td class="value">${complexity}</td></tr>
<tr class="bb-tooltip-name-complexity"><td>Crap</td><td class="value">${crap}</td></tr>
</tbody></table>`;
},
grouped: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ <h3>Project Risks</h3>
<thead>
<tr>
<th>Class</th>
<th class="text-right">Coverage</th>
<th class="text-right">Complexity</th>
<th class="text-right"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></th>
</tr>
</thead>
Expand Down Expand Up @@ -122,6 +124,8 @@ <h3>Project Risks</h3>
<thead>
<tr>
<th>Method</th>
<th class="text-right">Coverage</th>
<th class="text-right">Complexity</th>
<th class="text-right"><abbr title="Change Risk Anti-Patterns (CRAP) Index">CRAP</abbr></th>
</tr>
</thead>
Expand All @@ -139,9 +143,9 @@ <h3>Project Risks</h3>
</p>
</footer>
</div>
<script src="_js/billboard.pkgd.min.js?v=%s" type="text/javascript"></script>
<script type="application/json" id="complexity_class">[[100,1,"source_with_ignore.php.html#11","Foo"],[100,1,"source_with_ignore.php.html#18","Bar"]]</script>
<script type="application/json" id="complexity_method">[[100,1,"source_with_ignore.php.html#13","Foo::bar"],[100,1,"source_with_ignore.php.html#23","Bar::foo"]]</script>
<script src="_js/billboard.pkgd.min.js?v=12.3.1" type="text/javascript"></script>
<script type="application/json" id="complexity_class">[[100,1,"source_with_ignore.php.html#11","Foo","1"],[100,1,"source_with_ignore.php.html#18","Bar","1"]]</script>
<script type="application/json" id="complexity_method">[[100,1,"source_with_ignore.php.html#13","Foo::bar","1"],[100,1,"source_with_ignore.php.html#23","Bar::foo","1"]]</script>
<script type="text/javascript" defer>
const barLabels = [
'0%',
Expand Down Expand Up @@ -273,10 +277,12 @@ <h3>Project Risks</h3>
const coverage = Math.round(data[0].x);
const complexity = data[0].value;
const targetName = complexityData[data[0].index][3];
const crap = complexityData[data[0].index][4];
return `<table class="bb-tooltip"><tbody>
<tr><th colspan="2">${targetName}</th></tr>
<tr class="bb-tooltip-name-complexity"><td>Coverage</td><td class="name">${coverage}%</td></tr>
<tr class="bb-tooltip-name-complexity"><td>Complexity</td><td class="value">${complexity}</td></tr>
<tr class="bb-tooltip-name-complexity"><td>Crap</td><td class="value">${crap}</td></tr>
</tbody></table>`;
},
grouped: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ <h3>Project Risks</h3>
</footer>
</div>
<script src="_js/billboard.pkgd.min.js?v=%s" type="text/javascript"></script>
<script type="application/json" id="complexity_class">[[100,0,"source_without_namespace.php.html#5","Foo"]]</script>
<script type="application/json" id="complexity_class">[[100,0,"source_without_namespace.php.html#5","Foo","0"]]</script>
<script type="application/json" id="complexity_method">[]</script>
<script type="text/javascript" defer>
const barLabels = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ <h3>Project Risks</h3>
</footer>
</div>
<script src="_js/billboard.pkgd.min.js?v=%s" type="text/javascript"></script>
<script type="application/json" id="complexity_class">[[100,0,"source_without_namespace.php.html#5","Foo"]]</script>
<script type="application/json" id="complexity_class">[[100,0,"source_without_namespace.php.html#5","Foo","0"]]</script>
<script type="application/json" id="complexity_method">[]</script>
<script type="text/javascript" defer>
const barLabels = [
Expand Down