Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 28
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 2
CoachLevels
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
CoachLevelHelper
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 1
 categorizeCharacterUsage
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace App\Helpers;
4
5class CoachLevels
6{
7  public function __construct(
8    public readonly int $beginner,
9    public readonly int $intermediate,
10    public readonly int $proficient,
11    public readonly int $advanced,
12    public readonly int $expert
13  ) {}
14}
15
16class CoachLevelHelper
17{
18  public static function categorizeCharacterUsage($characterUsages, $usersCount): CoachLevels
19  {
20    $categories = [
21      'beginner' => 0,
22      'intermediate' => 0,
23      'proficient' => 0,
24      'advanced' => 0,
25      'expert' => 0,
26    ];
27
28    foreach ($characterUsages as $usage) {
29      $totalCharacters = $usage->characters_typed;
30
31      $category = match (true) {
32        $totalCharacters < 10000 => 'beginner',
33        $totalCharacters < 25000 => 'intermediate',
34        $totalCharacters < 50000 => 'proficient',
35        $totalCharacters < 100000 => 'advanced',
36        default => 'expert',
37      };
38
39      $categories[$category]++;
40    }
41
42    $diff = $usersCount - count($characterUsages);
43
44    if ($diff > 0) {
45      $categories['beginner'] += $diff;
46    }
47
48    return new CoachLevels(
49      beginner: $categories['beginner'],
50      intermediate: $categories['intermediate'],
51      proficient: $categories['proficient'],
52      advanced: $categories['advanced'],
53      expert: $categories['expert']
54    );
55  }
56}