From ee53f8dece9d7e8a40a30352764cc88d0e15f981 Mon Sep 17 00:00:00 2001 From: Harry Mustoe-Playfair Date: Wed, 23 Jul 2025 15:27:19 +0100 Subject: [PATCH 1/8] Sort complexity results before encoding so that graph is properly populated --- src/Report/Html/Renderer/Dashboard.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Report/Html/Renderer/Dashboard.php b/src/Report/Html/Renderer/Dashboard.php index 8a122a0a2..2206099bb 100644 --- a/src/Report/Html/Renderer/Dashboard.php +++ b/src/Report/Html/Renderer/Dashboard.php @@ -116,6 +116,8 @@ private function complexity(array $classes, string $baseLink): array ]; } + usort($result['class'], fn($a, $b) => intval($a[0] - $b[0])); + $class = json_encode($result['class']); assert($class !== false); From 31c6319701099bdc2ccabbada2d2633ee4a26fc7 Mon Sep 17 00:00:00 2001 From: Harry Mustoe-Playfair Date: Wed, 23 Jul 2025 20:41:24 +0100 Subject: [PATCH 2/8] Use PHP <=> operator instead of intval subtraction for comparison --- src/Report/Html/Renderer/Dashboard.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Report/Html/Renderer/Dashboard.php b/src/Report/Html/Renderer/Dashboard.php index 2206099bb..2e4614edc 100644 --- a/src/Report/Html/Renderer/Dashboard.php +++ b/src/Report/Html/Renderer/Dashboard.php @@ -116,7 +116,7 @@ private function complexity(array $classes, string $baseLink): array ]; } - usort($result['class'], fn($a, $b) => intval($a[0] - $b[0])); + usort($result['class'], fn($a, $b) => ($a[0] <=> $b[0])); $class = json_encode($result['class']); From c2a6cf542584f1cf5294a467c15a59b03ffcff48 Mon Sep 17 00:00:00 2001 From: Harry Mustoe-Playfair Date: Wed, 23 Jul 2025 21:04:59 +0100 Subject: [PATCH 3/8] Sort method results before using for graph so tooltips display correctly. --- src/Report/Html/Renderer/Dashboard.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Report/Html/Renderer/Dashboard.php b/src/Report/Html/Renderer/Dashboard.php index 2e4614edc..e060a3251 100644 --- a/src/Report/Html/Renderer/Dashboard.php +++ b/src/Report/Html/Renderer/Dashboard.php @@ -117,6 +117,7 @@ private function complexity(array $classes, string $baseLink): array } usort($result['class'], fn($a, $b) => ($a[0] <=> $b[0])); + usort($result['method'], fn($a, $b) => ($a[0] <=> $b[0])); $class = json_encode($result['class']); From 218f11eb5b2c142f5b84ed0b0b8df831058a34f4 Mon Sep 17 00:00:00 2001 From: Harry Mustoe-Playfair Date: Wed, 23 Jul 2025 21:06:21 +0100 Subject: [PATCH 4/8] Add coverage and complexity columns to class and method complexity tables. --- src/Report/Html/Renderer/Dashboard.php | 28 ++++++++++++------- .../Renderer/Template/dashboard.html.dist | 4 +++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/Report/Html/Renderer/Dashboard.php b/src/Report/Html/Renderer/Dashboard.php index e060a3251..267962146 100644 --- a/src/Report/Html/Renderer/Dashboard.php +++ b/src/Report/Html/Renderer/Dashboard.php @@ -279,37 +279,45 @@ 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, function($a, $b) { + return (intval($a['crap']) <=> intval($b['crap'])) * -1; + }); + uasort($methodRisks, function($a, $b) { + return (intval($a['crap']) <=> intval($b['crap'])) * -1; + }); - foreach ($classRisks as $className => $crap) { + foreach ($classRisks as $className => $class) { $result['class'] .= sprintf( - ' %s%d' . "\n", + ' %s%d%.1f%%%d' . "\n", str_replace($baseLink, '', $classes[$className]['link']), $className, - $crap, + $class['ccn'], + $class['coverage'], + $class['crap'] ); } - foreach ($methodRisks as $methodName => $crap) { + foreach ($methodRisks as $methodName => $methodVals) { [$class, $method] = explode('::', $methodName); $result['method'] .= sprintf( - ' %s%d' . "\n", + ' %s%d%.1f%%%d' . "\n", str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), $methodName, $method, - $crap, + $methodVals['ccn'], + $methodVals['coverage'], + $methodVals['crap'] ); } diff --git a/src/Report/Html/Renderer/Template/dashboard.html.dist b/src/Report/Html/Renderer/Template/dashboard.html.dist index d7fb3b97a..2aec0cccb 100644 --- a/src/Report/Html/Renderer/Template/dashboard.html.dist +++ b/src/Report/Html/Renderer/Template/dashboard.html.dist @@ -67,6 +67,8 @@ Class + Complexity + Coverage CRAP @@ -120,6 +122,8 @@ Method + Complexity + Coverage CRAP From 5c802204d8de14df2c4724ec6e7402e4402dd866 Mon Sep 17 00:00:00 2001 From: Harry Mustoe-Playfair Date: Wed, 23 Jul 2025 21:06:30 +0100 Subject: [PATCH 5/8] Add CRAP to graph tooltip --- src/Report/Html/Renderer/Dashboard.php | 2 ++ src/Report/Html/Renderer/Template/dashboard.html.dist | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/Report/Html/Renderer/Dashboard.php b/src/Report/Html/Renderer/Dashboard.php index 267962146..3003007a0 100644 --- a/src/Report/Html/Renderer/Dashboard.php +++ b/src/Report/Html/Renderer/Dashboard.php @@ -105,6 +105,7 @@ private function complexity(array $classes, string $baseLink): array $method['ccn'], str_replace($baseLink, '', $method['link']), $methodName, + $method['crap'], ]; } @@ -113,6 +114,7 @@ private function complexity(array $classes, string $baseLink): array $class['ccn'], str_replace($baseLink, '', $class['link']), $className, + $class['crap'], ]; } diff --git a/src/Report/Html/Renderer/Template/dashboard.html.dist b/src/Report/Html/Renderer/Template/dashboard.html.dist index 2aec0cccb..dfd167e18 100644 --- a/src/Report/Html/Renderer/Template/dashboard.html.dist +++ b/src/Report/Html/Renderer/Template/dashboard.html.dist @@ -275,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 ` +
${targetName}
Coverage${coverage}%
Complexity${complexity}
Crap${crap}
`; }, grouped: false, From f936c6a9c7e539fdc51b5664568fa1493bc54be2 Mon Sep 17 00:00:00 2001 From: Harry Mustoe-Playfair Date: Wed, 23 Jul 2025 21:09:51 +0100 Subject: [PATCH 6/8] Reorder complexity and coverage columns to match tooltip --- src/Report/Html/Renderer/Dashboard.php | 8 ++++---- src/Report/Html/Renderer/Template/dashboard.html.dist | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Report/Html/Renderer/Dashboard.php b/src/Report/Html/Renderer/Dashboard.php index 3003007a0..d3e14dc32 100644 --- a/src/Report/Html/Renderer/Dashboard.php +++ b/src/Report/Html/Renderer/Dashboard.php @@ -300,11 +300,11 @@ private function projectRisks(array $classes, string $baseLink): array foreach ($classRisks as $className => $class) { $result['class'] .= sprintf( - ' %s%d%.1f%%%d' . "\n", + ' %s%.1f%%%d%d' . "\n", str_replace($baseLink, '', $classes[$className]['link']), $className, - $class['ccn'], $class['coverage'], + $class['ccn'], $class['crap'] ); } @@ -313,12 +313,12 @@ private function projectRisks(array $classes, string $baseLink): array [$class, $method] = explode('::', $methodName); $result['method'] .= sprintf( - ' %s%d%.1f%%%d' . "\n", + ' %s%.1f%%%d%d' . "\n", str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), $methodName, $method, - $methodVals['ccn'], $methodVals['coverage'], + $methodVals['ccn'], $methodVals['crap'] ); } diff --git a/src/Report/Html/Renderer/Template/dashboard.html.dist b/src/Report/Html/Renderer/Template/dashboard.html.dist index dfd167e18..a5d5a236e 100644 --- a/src/Report/Html/Renderer/Template/dashboard.html.dist +++ b/src/Report/Html/Renderer/Template/dashboard.html.dist @@ -67,8 +67,8 @@ Class - Complexity Coverage + Complexity CRAP @@ -122,8 +122,8 @@ Method - Complexity Coverage + Complexity CRAP From 5f9790ff57028fbe25b18cdbc6c2d1906ec6324f Mon Sep 17 00:00:00 2001 From: Harry Mustoe-Playfair Date: Mon, 28 Jul 2025 13:44:17 +0100 Subject: [PATCH 7/8] Fix type coverage and code style --- src/Report/Html/Renderer/Dashboard.php | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/Report/Html/Renderer/Dashboard.php b/src/Report/Html/Renderer/Dashboard.php index d3e14dc32..305c7fa10 100644 --- a/src/Report/Html/Renderer/Dashboard.php +++ b/src/Report/Html/Renderer/Dashboard.php @@ -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; @@ -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; @@ -118,8 +119,8 @@ private function complexity(array $classes, string $baseLink): array ]; } - usort($result['class'], fn($a, $b) => ($a[0] <=> $b[0])); - usort($result['method'], fn($a, $b) => ($a[0] <=> $b[0])); + 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']); @@ -291,11 +292,13 @@ private function projectRisks(array $classes, string $baseLink): array } } - uasort($classRisks, function($a, $b) { - return (intval($a['crap']) <=> intval($b['crap'])) * -1; + uasort($classRisks, static function (array $a, array $b) + { + return ((int) ($a['crap']) <=> (int) ($b['crap'])) * -1; }); - uasort($methodRisks, function($a, $b) { - return (intval($a['crap']) <=> intval($b['crap'])) * -1; + uasort($methodRisks, static function (array $a, array $b) + { + return ((int) ($a['crap']) <=> (int) ($b['crap'])) * -1; }); foreach ($classRisks as $className => $class) { @@ -305,7 +308,7 @@ private function projectRisks(array $classes, string $baseLink): array $className, $class['coverage'], $class['ccn'], - $class['crap'] + $class['crap'], ); } @@ -319,7 +322,7 @@ private function projectRisks(array $classes, string $baseLink): array $method, $methodVals['coverage'], $methodVals['ccn'], - $methodVals['crap'] + $methodVals['crap'], ); } From 3fad2a5cc4de16d518e90df28f9a37534d8885b1 Mon Sep 17 00:00:00 2001 From: Harry Mustoe-Playfair Date: Mon, 28 Jul 2025 13:46:03 +0100 Subject: [PATCH 8/8] Update failing tests --- .../HTML/CoverageForBankAccount/dashboard.html | 16 +++++++++++----- .../dashboard.html | 12 +++++++++--- .../dashboard.html | 12 +++++++++--- .../PathCoverageForBankAccount/dashboard.html | 2 +- .../dashboard.html | 2 +- 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html b/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html index a875e86ae..3c35f086e 100644 --- a/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html +++ b/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html @@ -70,11 +70,13 @@

Project Risks

Class + Coverage + Complexity CRAP - BankAccount6 + BankAccount62.5%56 @@ -125,11 +127,13 @@

Project Risks

Method + Coverage + Complexity CRAP - setBalance6 + setBalance0.0%26 @@ -143,9 +147,9 @@

Project Risks

- - - + + + - - + + + - - + + + - + - +