Completed
Pull Request — master (#94)
by Alessandro
04:59
created

ParallelConfiguration::injectOutput()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 7
cts 7
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 7
nc 1
nop 2
crap 1
1
<?php
2
declare(strict_types=1);
3
4
namespace Paraunit\Configuration;
5
6
use Paraunit\Printer\OutputFactory;
7
use Symfony\Component\Config\FileLocator;
8
use Symfony\Component\Console\Input\InputInterface;
9
use Symfony\Component\Console\Output\OutputInterface;
10
use Symfony\Component\DependencyInjection\ContainerBuilder;
11
use Symfony\Component\DependencyInjection\Definition;
12
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
13
use Symfony\Component\DependencyInjection\Reference;
14
use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
15
use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher;
16
use Symfony\Component\EventDispatcher\EventDispatcher;
17
18
/**
19
 * Class Paraunit
20
 * @package Paraunit\Configuration
21
 */
22
class ParallelConfiguration
23
{
24
    /**
25
     * @param InputInterface $input
26
     * @param OutputInterface $output
27
     * @return ContainerBuilder
28
     * @throws \Symfony\Component\DependencyInjection\Exception\BadMethodCallException
29
     * @throws \Exception
30
     */
31 55
    public function buildContainer(InputInterface $input, OutputInterface $output): ContainerBuilder
32
    {
33 55
        $containerBuilder = new ContainerBuilder();
34
35 55
        $this->injectOutput($containerBuilder, $output);
36 55
        $this->loadYamlConfiguration($containerBuilder);
37 55
        $this->registerEventDispatcher($containerBuilder);
38 55
        $this->loadCommandLineOptions($containerBuilder, $input);
39
40 55
        $containerBuilder->compile();
41
42 55
        $this->loadPostCompileSettings($containerBuilder, $input);
43
44 55
        return $containerBuilder;
45
    }
46
47
    /**
48
     * @param ContainerBuilder $containerBuilder
49
     * @return YamlFileLoader
50
     * @throws \Exception
51
     */
52 55
    protected function loadYamlConfiguration(ContainerBuilder $containerBuilder): YamlFileLoader
53
    {
54 55
        $loader = new YamlFileLoader($containerBuilder, new FileLocator(__DIR__ . '/../Resources/config/'));
55 55
        $loader->load('configuration.yml');
56 55
        $loader->load('file.yml');
57 55
        $loader->load('parser.yml');
58 55
        $loader->load('printer.yml');
59 55
        $loader->load('process.yml');
60 55
        $loader->load('runner.yml');
61 55
        $loader->load('services.yml');
62 55
        $loader->load('test_result.yml');
63 55
        $loader->load('test_result_container.yml');
64 55
        $loader->load('test_result_format.yml');
65
66 55
        return $loader;
67
    }
68
69
    /**
70
     * @param ContainerBuilder $containerBuilder
71
     * @throws \Symfony\Component\DependencyInjection\Exception\BadMethodCallException
72
     */
73 55
    private function registerEventDispatcher(ContainerBuilder $containerBuilder)
74
    {
75 55
        $containerBuilder->addCompilerPass(new RegisterListenersPass());
76
77 55
        $containerBuilder->setDefinition('event_dispatcher', new Definition(EventDispatcher::class));
78
    }
79
80 55
    protected function loadCommandLineOptions(ContainerBuilder $containerBuilder, InputInterface $input)
81
    {
82 55
        $containerBuilder->setParameter('paraunit.max_process_count', $input->getOption('parallel'));
83 55
        $containerBuilder->setParameter('paraunit.phpunit_config_filename', $input->getOption('configuration') ?? '.');
84 55
        $containerBuilder->setParameter('paraunit.testsuite', $input->getOption('testsuite'));
85 55
        $containerBuilder->setParameter('paraunit.string_filter', $input->getArgument('stringFilter'));
86
    }
87
88
    protected function loadPostCompileSettings(ContainerBuilder $container, InputInterface $input)
89
    {
90
    }
91
92 55
    private function injectOutput(ContainerBuilder $containerBuilder, OutputInterface $output)
93
    {
94 55
        OutputFactory::setOutput($output);
95 55
        $factoryClass = OutputFactory::class;
96 55
        $factoryMethod = 'getOutput';
97
98 55
        $definition = new Definition(OutputInterface::class);
99 55
        $definition->setFactory([$factoryClass, $factoryMethod]);
100
101 55
        $containerBuilder->setDefinition('output', $definition);
102
    }
103
}
104