Passed
Pull Request — master (#1)
by ANTHONIUS
03:02
created

CodeCoverage::createContainer()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
cc 2
eloc 8
nc 2
nop 1
dl 0
loc 14
ccs 0
cts 9
cp 0
crap 6
rs 10
c 0
b 0
f 0
1
<?php
2
3
4
namespace Doyo\Bridge\CodeCoverage;
5
6
use Doyo\Bridge\CodeCoverage\Console\ConsoleIO;
7
use Doyo\Bridge\CodeCoverage\DependencyInjection\CodeCoverageExtension;
8
use Doyo\Bridge\CodeCoverage\Environment\RuntimeInterface;
9
use Doyo\Bridge\CodeCoverage\Event\CoverageEvent;
10
use Doyo\Symfony\Bridge\EventDispatcher\EventDispatcher;
11
use Symfony\Component\Config\ConfigCache;
12
use Symfony\Component\DependencyInjection\ContainerBuilder;
13
use Symfony\Component\DependencyInjection\ContainerInterface;
14
use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
15
16
/**
17
 * A main code coverage actions that contain main processor
18
 * for collecting code coverage
19
 */
20
class CodeCoverage extends EventDispatcher
21
{
22
    const CONTAINER_CLASS = 'CodeCoverageContainer';
23
24
    /**
25
     * @var CoverageEvent
26
     */
27
    private $coverageEvent;
28
29 5
    public function __construct(
30
        ProcessorInterface $processor,
31
        ConsoleIO $consoleIO,
32
        RuntimeInterface $runtime
33
    )
34
    {
35 5
        $this->coverageEvent = new CoverageEvent($processor, $consoleIO, $runtime);
36 5
        parent::__construct();
37
    }
38
39 1
    public function refresh()
40
    {
41 1
        $coverageEvent = $this->coverageEvent;
42
43 1
        if($coverageEvent->canCollectCodeCoverage()){
44 1
            $coverageEvent->getProcessor()->clear();
45 1
            $this->dispatch($coverageEvent, CoverageEvent::refresh);
46
        }
47
48 1
        return $coverageEvent;
49
    }
50
51 78
    public function start(TestCase $testCase)
52
    {
53 1
        $coverageEvent = $this->coverageEvent;
54
55 1
        if($coverageEvent->canCollectCodeCoverage()){
56 1
            $coverageEvent->getProcessor()->start($testCase);
57 78
            $this->dispatch($coverageEvent, CoverageEvent::beforeStart);
58 78
            $this->dispatch($coverageEvent, CoverageEvent::start);
59
        }
60
61 78
        return $coverageEvent;
62
    }
63
64 80
    public function stop()
65
    {
66 80
        $coverageEvent = $this->coverageEvent;
67 80
        if($coverageEvent->canCollectCodeCoverage()){
68 80
            $coverageEvent->getProcessor()->stop();
69 1
            $this->dispatch($coverageEvent, CoverageEvent::stop);
70
        }
71
72 1
        return $coverageEvent;
73
    }
74
75 1
    public function complete()
76
    {
77 1
        $coverageEvent = $this->coverageEvent;
78 1
        $consoleIO = $coverageEvent->getConsoleIO();
79
80 1
        if($coverageEvent->canCollectCodeCoverage()){
81 1
            $coverageEvent->getProcessor()->complete();
82 1
            $this->dispatch($coverageEvent, CoverageEvent::complete);
83 1
            $this->dispatch($coverageEvent, CoverageEvent::report);
84
        }else{
85
            $consoleIO->coverageError('Can not create coverage report. No code coverage driver available');
86
        }
87
88 1
        return $coverageEvent;
89
    }
90
91 80
    public function setResult(int $result)
92
    {
93 80
        $coverageEvent = $this->coverageEvent;
94 80
        if($coverageEvent->canCollectCodeCoverage()){
95 80
            $coverageEvent->getProcessor()->getCurrentTestCase()->setResult($result);
96
        }
97
    }
98
99
    /**
100
     * Create container
101
     *
102
     * @param array $config
103
     * @return ContainerInterface
104
     */
105
    public static function createContainer(array $config = []): ContainerInterface
106
    {
107
        $id = md5(serialize($config));
108
        $cacheFile = sys_get_temp_dir().'/doyo/coverage/container_'.$id;
109
110
        $configCache = new ConfigCache($cacheFile, false);
111
112
        if(!$configCache->isFresh()){
113
            static::compileConfig($configCache, $config);
114
        }
115
116
        require_once $cacheFile;
117
        $class = static::CONTAINER_CLASS;
118
        return new $class();
119
    }
120
121
    private static function compileConfig(ConfigCache $configCache, array $config)
122
    {
123
        $builder = new ContainerBuilder();
124
        $builder->getParameterBag()->set('config', $config);
125
126
        $builder->registerExtension(new CodeCoverageExtension());
127
        $builder->compile();
128
129
        $dumper = new PhpDumper($builder);
130
        $configCache->write(
131
            $dumper->dump([
0 ignored issues
show
Bug introduced by
It seems like $dumper->dump(array('cla...atic::CONTAINER_CLASS)) can also be of type array; however, parameter $content of Symfony\Component\Config...kerConfigCache::write() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

131
            /** @scrutinizer ignore-type */ $dumper->dump([
Loading history...
132
                'class' => static::CONTAINER_CLASS
133
            ]),
134
            $builder->getResources()
135
        );
136
    }
137
}
138