CoverageConfiguration::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 5
ccs 3
cts 3
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Paraunit\Configuration;
6
7
use Paraunit\Configuration\DependencyInjection\CoverageContainerDefinition;
8
use Paraunit\Coverage\CoverageResult;
9
use Paraunit\Coverage\Processor\Clover;
10
use Paraunit\Coverage\Processor\CoverageProcessorInterface;
11
use Paraunit\Coverage\Processor\Crap4j;
12
use Paraunit\Coverage\Processor\Html;
13
use Paraunit\Coverage\Processor\Php;
14
use Paraunit\Coverage\Processor\Text;
15
use Paraunit\Coverage\Processor\TextSummary;
16
use Paraunit\Coverage\Processor\Xml;
17
use Symfony\Component\Console\Input\InputInterface;
18
use Symfony\Component\Console\Output\OutputInterface;
19
use Symfony\Component\DependencyInjection\ContainerBuilder;
20
use Symfony\Component\DependencyInjection\Definition;
21
use Symfony\Component\DependencyInjection\Reference;
22
23
/**
24
 * Class CoverageConfiguration
25
 * @package Paraunit\Configuration
26
 */
27
class CoverageConfiguration extends ParallelConfiguration
28
{
29 15
    public function __construct(bool $createPublicServiceAliases = false)
30
    {
31 15
        parent::__construct($createPublicServiceAliases);
32 15
        $this->containerDefinition = new CoverageContainerDefinition();
33
    }
34
35 15
    protected function loadCommandLineOptions(ContainerBuilder $container, InputInterface $input): void
36
    {
37 15
        parent::loadCommandLineOptions($container, $input);
38
39 15
        $coverageResult = $container->getDefinition(CoverageResult::class);
40
41 15
        $this->addPathProcessor($coverageResult, $input, Xml::class);
42 15
        $this->addPathProcessor($coverageResult, $input, Html::class);
43
44 15
        $this->addFileProcessor($coverageResult, $input, Clover::class);
45 15
        $this->addFileOrOutputProcessor($coverageResult, $input, Text::class);
46 15
        $this->addFileOrOutputProcessor($coverageResult, $input, TextSummary::class);
47 15
        $this->addFileProcessor($coverageResult, $input, Crap4j::class);
48 15
        $this->addFileProcessor($coverageResult, $input, Php::class);
49
    }
50
51 12
    private function addProcessor(Definition $coverageResult, string $processorClass, array $dependencies): void
52
    {
53 12
        $coverageResult->addMethodCall('addCoverageProcessor', [new Definition($processorClass, $dependencies)]);
54
    }
55
56 15
    private function addFileProcessor(
57
        Definition $coverageResult,
58
        InputInterface $input,
59
        string $processorClass
60
    ): void {
61 15
        $optionName = $this->getOptionName($processorClass);
62
63 15
        if ($input->getOption($optionName)) {
64 3
            $this->addProcessor($coverageResult, $processorClass, [
65 3
                $this->createOutputFileDefinition($input, $optionName),
66 3
                (bool) $input->getOption('ansi'),
67
            ]);
68
        }
69
    }
70
71 15
    private function addFileOrOutputProcessor(
72
        Definition $coverageResult,
73
        InputInterface $input,
74
        string $processorClass
75
    ): void {
76 15
        $optionName = $this->getOptionName($processorClass);
77
78 15
        if ($this->optionIsEnabled($input, $optionName)) {
79 7
            $this->addProcessor($coverageResult, $processorClass, [
80 7
                new Reference(OutputInterface::class),
81 7
                (bool) $input->getOption('ansi'),
82 7
                $this->createOutputFileDefinition($input, $optionName),
83
            ]);
84
        }
85
    }
86
87 15
    private function addPathProcessor(
88
        Definition $coverageResult,
89
        InputInterface $input,
90
        string $processorClass
91
    ): void {
92 15
        $optionName = $this->getOptionName($processorClass);
93
94 15
        if ($this->optionIsEnabled($input, $optionName)) {
95 2
            $this->addProcessor($coverageResult, $processorClass, [
96 2
                new Definition(OutputPath::class, [$input->getOption($optionName)]),
97
            ]);
98
        }
99
    }
100
101 10
    private function createOutputFileDefinition(InputInterface $input, string $optionName): ?Definition
102
    {
103 10
        if ($input->getOption($optionName)) {
104 8
            return new Definition(OutputFile::class, [$input->getOption($optionName)]);
105
        }
106
107 2
        return null;
108
    }
109
110
    /**
111
     * @param string $processorClass
112
     * @return string
113
     * @throws \InvalidArgumentException
114
     */
115 15
    private function getOptionName(string $processorClass): string
116
    {
117 15
        if (! \in_array(CoverageProcessorInterface::class, class_implements($processorClass), true)) {
118
            throw new \InvalidArgumentException('Expecting FQCN of class implementing ' . CoverageProcessorInterface::class . ', got ' . $processorClass);
119
        }
120
121 15
        return $processorClass::getConsoleOptionName();
122
    }
123
124 15
    private function optionIsEnabled(InputInterface $input, string $optionName): bool
125
    {
126 15
        return $input->hasParameterOption('--' . $optionName);
127
    }
128
}
129