Skip to content

Sort complexity results before encoding so that graph is properly populated #1082

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Open
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