TestChunker::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 1
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace PHPChunkit;
6
7
/**
8
 * @testClass PHPChunkit\Test\TestChunkerTest
9
 */
10
class TestChunker
11
{
12
    /**
13
     * @var TestCounter
14
     */
15
    private $testCounter;
16
17 1
    public function __construct(TestCounter $testCounter)
18
    {
19 1
        $this->testCounter = $testCounter;
20 1
    }
21
22 1
    public function chunkTestFiles(ChunkedTests $chunkedTests, array $testFiles)
23
    {
24 1
        $chunk = $chunkedTests->getChunk();
25 1
        $numChunks = $chunkedTests->getNumChunks();
26
27 1
        $fileTestCounts = $this->getTestFileCounts($testFiles);
28
29 1
        $totalTests = array_sum($fileTestCounts);
30 1
        $testsPerChunk = (int) round($totalTests / $numChunks, 0);
31
32 1
        $chunks = [[]];
33
34 1
        $numTestsInChunk = 0;
35 1
        foreach ($testFiles as $file) {
36 1
            $numTestsInFile = $fileTestCounts[$file];
37
38
            $chunkFile = [
39 1
                'file' => $file,
40 1
                'numTests' => $numTestsInFile,
41
            ];
42
43
            // start a new chunk
44 1
            if ($numTestsInChunk >= $testsPerChunk) {
45 1
                $chunks[] = [$chunkFile];
46 1
                $numTestsInChunk = $numTestsInFile;
47
48
            // add file to current chunk
49
            } else {
50 1
                $chunks[count($chunks) - 1][] = $chunkFile;
51 1
                $numTestsInChunk += $numTestsInFile;
52
            }
53
        }
54
55 1
        if ($chunk) {
56
            $chunkOffset = $chunk - 1;
57
58
            if (isset($chunks[$chunkOffset]) && $chunks[$chunkOffset]) {
59
                $chunks = [$chunkOffset => $chunks[$chunkOffset]];
60
            } else {
61
                $chunks = [];
62
            }
63
        }
64
65 1
        $chunkedTests->setChunks($chunks);
66 1
        $chunkedTests->setTotalTests($totalTests);
67 1
        $chunkedTests->setTestsPerChunk($testsPerChunk);
68 1
    }
69
70 1
    private function getTestFileCounts(array $testFiles) : array
71
    {
72 1
        $fileTestCounts = [];
73
74 1
        foreach ($testFiles as $file) {
75 1
            $fileTestCounts[$file] = $this->testCounter->countNumTestsInFile($file);
76
        }
77
78 1
        return $fileTestCounts;
79
    }
80
}
81