Completed
Push — master ( eb1422...7130a7 )
by Geza
02:42
created

Config::shouldRecordAllSteps()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace Bex\Behat\ScreenshotExtension\ServiceContainer;
4
5
use Bex\Behat\ExtensionDriverLocator\DriverLocator;
6
use Bex\Behat\ScreenshotExtension\Driver\ImageDriverInterface;
7
use Symfony\Component\Config\FileLocator;
8
use Symfony\Component\DependencyInjection\ContainerBuilder;
9
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
10
11
class Config
12
{
13
    const EXTENSION_CONFIG_KEY = 'screenshot';
14
    const CONFIG_CONTAINER_ID = 'bex.screenshot_extension.config';
15
16
    const IMAGE_DRIVER_NAMESPACE = 'Bex\\Behat\\ScreenshotExtension\\Driver';
17
    const IMAGE_DRIVER_PARENT = 'Bex\\Behat\\ScreenshotExtension\\Driver\\ImageDriverInterface';
18
19
    const CONFIG_PARAM_EXTENSTION_ENABLED = 'enabled';
20
    const CONFIG_PARAM_ACTIVE_IMAGE_DRIVERS = 'active_image_drivers';
21
    const CONFIG_PARAM_IMAGE_DRIVER_CONFIGS = 'image_drivers';
22
    const CONFIG_PARAM_SCREENSHOT_TAKING_MODE = 'screenshot_taking_mode';
23
24
    const SCREENSHOT_TAKING_MODE_FAILED_STEPS = 'failed_steps';
25
    const SCREENSHOT_TAKING_MODE_FAILED_SCENARIOS = 'failed_scenarios';
26
    const SCREENSHOT_TAKING_MODE_ALL_SCENARIOS = 'all_scenarios';
27
28
    const DEFAULT_IMAGE_DRIVER_KEY = 'local';
29
    const DEFAULT_SCREENSHOT_TAKING_MODE = self::SCREENSHOT_TAKING_MODE_FAILED_STEPS;
30
31
    const ERROR_MESSAGE_IMAGICK_NOT_FOUND = 'Imagemagick PHP extension is required, but not installed.';
32
    
33
    /**
34
     * @var DriverLocator
35
     */
36
    private $driverLocator;
37
38
    /**
39
     * @var array
40
     */
41
    private $imageDrivers;
42
43
    /**
44
     * @var boolean
45
     */
46
    private $enabled;
47
48
    /**
49
     * @var string
50
     */
51
    private $screenshotTakingMode;
52
53
    /**
54
     * @var string[]
55
     */
56
    private $imageDriverKeys;
57
58
    /**
59
     * @var array
60
     */
61
    private $imageDriverConfigs;
62
63
    /**
64
     * @param array $config
65
     */
66
    public function __construct(array $config)
67
    {
68
        $this->driverLocator = DriverLocator::getInstance(self::IMAGE_DRIVER_NAMESPACE, self::IMAGE_DRIVER_PARENT);
69
        $this->enabled = $config[self::CONFIG_PARAM_EXTENSTION_ENABLED];
70
        $this->screenshotTakingMode = $config[self::CONFIG_PARAM_SCREENSHOT_TAKING_MODE];
71
        $this->imageDriverKeys = $config[self::CONFIG_PARAM_ACTIVE_IMAGE_DRIVERS];
72
        $this->imageDriverConfigs = $config[self::CONFIG_PARAM_IMAGE_DRIVER_CONFIGS];
73
    }
74
75
    /**
76
     * @return boolean
77
     */
78
    public function isEnabled()
79
    {
80
        return $this->enabled;
81
    }
82
83
    /**
84
     * @return array
85
     */
86
    public function getImageDrivers()
87
    {
88
        return $this->imageDrivers;
89
    }
90
91
    /**
92
     * @return boolean
93
     */
94
    public function shouldCombineImages()
95
    {
96
        return $this->screenshotTakingMode !== self::SCREENSHOT_TAKING_MODE_FAILED_STEPS;
97
    }
98
99
    /**
100
     * @return boolean
101
     */
102
    public function shouldRecordAllScenarios()
103
    {
104
        return $this->screenshotTakingMode == self::SCREENSHOT_TAKING_MODE_ALL_SCENARIOS;
105
    }
106
107
    /**
108
     * @return boolean
109
     */
110
    public function shouldRecordAllSteps()
111
    {
112
        return $this->screenshotTakingMode != self::SCREENSHOT_TAKING_MODE_FAILED_STEPS;
113
    }
114
115
    /**
116
     * Init service container and load image drivers
117
     * 
118
     * @param  ContainerBuilder $container
119
     */
120
    public function loadServices(ContainerBuilder $container)
121
    {
122
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/config'));
123
        $loader->load('services.xml');
124
        $this->imageDrivers = $this->driverLocator->findDrivers(
125
            $container,
126
            $this->imageDriverKeys,
127
            $this->imageDriverConfigs
128
        );
129
    }
130
131
    /**
132
     * @return string[]
133
     */
134
    public static function getScreenshotTakingModes()
135
    {
136
        return [
137
            self::SCREENSHOT_TAKING_MODE_FAILED_STEPS,
138
            self::SCREENSHOT_TAKING_MODE_FAILED_SCENARIOS,
139
            self::SCREENSHOT_TAKING_MODE_ALL_SCENARIOS
140
        ];
141
    }
142
143
    /**
144
     * @return \Closure
145
     */
146
    public static function getScreenshotTakingModeValidator()
147
    {
148
        return function ($mode) {
149
            return ($mode !== 'failed_steps') && !class_exists('\Imagick');
150
        };
151
    }
152
}
153