4 * This file is part of the Behat Testwork.
5 * (c) Konstantin Kudryashov <ever.zet@gmail.com>
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
11 namespace Behat\Testwork\Suite\ServiceContainer;
13 use Behat\Testwork\Cli\ServiceContainer\CliExtension;
14 use Behat\Testwork\ServiceContainer\Extension;
15 use Behat\Testwork\ServiceContainer\ExtensionManager;
16 use Behat\Testwork\ServiceContainer\ServiceProcessor;
17 use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
18 use Symfony\Component\DependencyInjection\ContainerBuilder;
19 use Symfony\Component\DependencyInjection\Definition;
20 use Symfony\Component\DependencyInjection\Reference;
23 * Extends testwork with suite-related services.
25 * @author Konstantin Kudryashov <ever.zet@gmail.com>
27 final class SuiteExtension implements Extension
32 const REGISTRY_ID = 'suite.registry';
33 const BOOTSTRAPPER_ID = 'suite.bootstrapper';
36 * Available extension points
38 const GENERATOR_TAG = 'suite.generator';
39 const SETUP_TAG = 'suite.setup';
42 * @var ServiceProcessor
47 * Initializes extension.
49 * @param null|ServiceProcessor $processor
51 public function __construct(ServiceProcessor $processor = null)
53 $this->processor = $processor ? : new ServiceProcessor();
59 public function getConfigKey()
67 public function initialize(ExtensionManager $extensionManager)
74 public function configure(ArrayNodeDefinition $builder)
77 ->defaultValue(array('default' => array(
82 ->treatNullLike(array())
83 ->treatFalseLike(array())
84 ->useAttributeAsKey('name')
85 ->normalizeKeys(false)
87 ->beforeNormalization()
88 ->ifTrue(function ($suite) {
89 return is_array($suite) && count($suite);
91 ->then(function ($suite) {
92 $suite['settings'] = isset($suite['settings'])
96 foreach ($suite as $key => $val) {
97 $suiteKeys = array('enabled', 'type', 'settings');
98 if (!in_array($key, $suiteKeys)) {
99 $suite['settings'][$key] = $val;
107 ->normalizeKeys(false)
108 ->addDefaultsIfNotSet()
109 ->treatTrueLike(array('enabled' => true))
110 ->treatNullLike(array('enabled' => true))
111 ->treatFalseLike(array('enabled' => false))
113 ->booleanNode('enabled')
114 ->info('Enables/disables suite')
118 ->info('Specifies suite type')
121 ->arrayNode('settings')
122 ->info('Specifies suite extra settings')
123 ->defaultValue(array())
124 ->useAttributeAsKey('name')
125 ->prototype('variable')->end()
135 public function load(ContainerBuilder $container, array $config)
137 $this->setSuiteConfigurations($container, $config);
138 $this->loadRegistryController($container);
139 $this->loadBootstrapController($container);
140 $this->loadRegistry($container);
141 $this->loadBootstrapper($container);
142 $this->loadGenericSuiteGenerator($container);
148 public function process(ContainerBuilder $container)
150 $this->processGenerators($container);
151 $this->processSetups($container);
155 * Generates and sets suites parameter to container.
157 * @param ContainerBuilder $container
158 * @param array $suites
160 private function setSuiteConfigurations(ContainerBuilder $container, array $suites)
162 $configuredSuites = array();
163 foreach ($suites as $name => $config) {
164 if (!$config['enabled']) {
168 $configuredSuites[$name] = array(
169 'type' => $config['type'],
170 'settings' => $config['settings'],
174 $container->setParameter('suite.configurations', $configuredSuites);
178 * Loads suite registry controller.
180 * @param ContainerBuilder $container
182 private function loadRegistryController(ContainerBuilder $container)
184 $definition = new Definition('Behat\Testwork\Suite\Cli\SuiteController', array(
185 new Reference(self::REGISTRY_ID),
186 '%suite.configurations%'
188 $definition->addTag(CliExtension::CONTROLLER_TAG, array('priority' => 1100));
189 $container->setDefinition(CliExtension::CONTROLLER_TAG . '.suite', $definition);
193 * Loads suite bootstrap controller.
195 * @param ContainerBuilder $container
197 private function loadBootstrapController(ContainerBuilder $container)
199 $definition = new Definition('Behat\Testwork\Suite\Cli\InitializationController', array(
200 new Reference(self::REGISTRY_ID),
201 new Reference(self::BOOTSTRAPPER_ID)
203 $definition->addTag(CliExtension::CONTROLLER_TAG, array('priority' => 900));
204 $container->setDefinition(CliExtension::CONTROLLER_TAG . '.initialization', $definition);
208 * Loads suite registry.
210 * @param ContainerBuilder $container
212 private function loadRegistry(ContainerBuilder $container)
214 $definition = new Definition('Behat\Testwork\Suite\SuiteRegistry');
215 $container->setDefinition(self::REGISTRY_ID, $definition);
219 * Loads suite bootstrapper.
221 * @param ContainerBuilder $container
223 private function loadBootstrapper(ContainerBuilder $container)
225 $definition = new Definition('Behat\Testwork\Suite\SuiteBootstrapper');
226 $container->setDefinition(self::BOOTSTRAPPER_ID, $definition);
230 * Loads generic suite generator.
232 * @param ContainerBuilder $container
234 private function loadGenericSuiteGenerator(ContainerBuilder $container)
236 $container->setParameter('suite.generic.default_settings', array());
238 $definition = new Definition('Behat\Testwork\Suite\Generator\GenericSuiteGenerator', array(
239 '%suite.generic.default_settings%'
241 $definition->addTag(SuiteExtension::GENERATOR_TAG, array('priority' => 50));
242 $container->setDefinition(SuiteExtension::GENERATOR_TAG . '.generic', $definition);
246 * Processes suite generators.
248 * @param ContainerBuilder $container
250 private function processGenerators(ContainerBuilder $container)
252 $references = $this->processor->findAndSortTaggedServices($container, self::GENERATOR_TAG);
253 $definition = $container->getDefinition(self::REGISTRY_ID);
255 foreach ($references as $reference) {
256 $definition->addMethodCall('registerSuiteGenerator', array($reference));
261 * Processes suite setups.
263 * @param ContainerBuilder $container
265 private function processSetups(ContainerBuilder $container)
267 $references = $this->processor->findAndSortTaggedServices($container, self::SETUP_TAG);
268 $definition = $container->getDefinition(self::BOOTSTRAPPER_ID);
270 foreach ($references as $reference) {
271 $definition->addMethodCall('registerSuiteSetup', array($reference));