4 * This file is part of the Behat.
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\Behat\Tester\ServiceContainer;
13 use Behat\Behat\Definition\ServiceContainer\DefinitionExtension;
14 use Behat\Testwork\Call\ServiceContainer\CallExtension;
15 use Behat\Testwork\Cli\ServiceContainer\CliExtension;
16 use Behat\Testwork\Environment\ServiceContainer\EnvironmentExtension;
17 use Behat\Testwork\EventDispatcher\ServiceContainer\EventDispatcherExtension;
18 use Behat\Testwork\Exception\ServiceContainer\ExceptionExtension;
19 use Behat\Testwork\ServiceContainer\ServiceProcessor;
20 use Behat\Testwork\Tester\ServiceContainer\TesterExtension as BaseExtension;
21 use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
22 use Symfony\Component\DependencyInjection\ContainerBuilder;
23 use Symfony\Component\DependencyInjection\Definition;
24 use Symfony\Component\DependencyInjection\Reference;
27 * Provides gherkin testers.
29 * @author Konstantin Kudryashov <ever.zet@gmail.com>
31 class TesterExtension extends BaseExtension
36 const SCENARIO_TESTER_ID = 'tester.scenario';
37 const OUTLINE_TESTER_ID = 'tester.outline';
38 const EXAMPLE_TESTER_ID = 'tester.example';
39 const BACKGROUND_TESTER_ID = 'tester.background';
40 const STEP_TESTER_ID = 'tester.step';
43 * Available extension points
45 const SCENARIO_TESTER_WRAPPER_TAG = 'tester.scenario.wrapper';
46 const OUTLINE_TESTER_WRAPPER_TAG = 'tester.outline.wrapper';
47 const EXAMPLE_TESTER_WRAPPER_TAG = 'tester.example.wrapper';
48 const BACKGROUND_TESTER_WRAPPER_TAG = 'tester.background.wrapper';
49 const STEP_TESTER_WRAPPER_TAG = 'tester.step.wrapper';
52 * @var ServiceProcessor
57 * Initializes extension.
59 * @param null|ServiceProcessor $processor
61 public function __construct(ServiceProcessor $processor = null)
63 $this->processor = $processor ? : new ServiceProcessor();
65 parent::__construct($this->processor);
71 public function configure(ArrayNodeDefinition $builder)
73 parent::configure($builder);
77 ->scalarNode('rerun_cache')
78 ->info('Sets the rerun cache path')
80 is_writable(sys_get_temp_dir())
81 ? sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'behat_rerun_cache'
92 public function load(ContainerBuilder $container, array $config)
94 parent::load($container, $config);
96 $this->loadRerunController($container, $config['rerun_cache']);
97 $this->loadPendingExceptionStringer($container);
103 public function process(ContainerBuilder $container)
105 parent::process($container);
107 $this->processScenarioTesterWrappers($container);
108 $this->processOutlineTesterWrappers($container);
109 $this->processExampleTesterWrappers($container);
110 $this->processBackgroundTesterWrappers($container);
111 $this->processStepTesterWrappers($container);
115 * Loads specification tester.
117 * @param ContainerBuilder $container
119 protected function loadSpecificationTester(ContainerBuilder $container)
121 $definition = new Definition('Behat\Behat\Tester\Runtime\RuntimeFeatureTester', array(
122 new Reference(self::SCENARIO_TESTER_ID),
123 new Reference(self::OUTLINE_TESTER_ID),
124 new Reference(EnvironmentExtension::MANAGER_ID)
126 $container->setDefinition(self::SPECIFICATION_TESTER_ID, $definition);
128 $this->loadScenarioTester($container);
129 $this->loadOutlineTester($container);
130 $this->loadBackgroundTester($container);
131 $this->loadStepTester($container);
135 * Loads scenario tester.
137 * @param ContainerBuilder $container
139 protected function loadScenarioTester(ContainerBuilder $container)
141 $definition = new Definition('Behat\Behat\Tester\StepContainerTester', array(
142 new Reference(self::STEP_TESTER_ID)
144 $container->setDefinition('tester.step_container', $definition);
146 $definition = new Definition('Behat\Behat\Tester\Runtime\RuntimeScenarioTester', array(
147 new Reference('tester.step_container'),
148 new Reference(self::BACKGROUND_TESTER_ID)
150 $container->setDefinition(self::SCENARIO_TESTER_ID, $definition);
152 // Proper isolation for scenarios
153 $definition = new Definition('Behat\Behat\Tester\Runtime\IsolatingScenarioTester', array(
154 new Reference(self::SCENARIO_TESTER_ID),
155 new Reference(EnvironmentExtension::MANAGER_ID)
158 $definition->addTag(self::SCENARIO_TESTER_WRAPPER_TAG, array('priority' => -999999));
159 $container->setDefinition(self::SCENARIO_TESTER_WRAPPER_TAG . '.isolating', $definition);
163 * Loads outline tester.
165 * @param ContainerBuilder $container
167 protected function loadOutlineTester(ContainerBuilder $container)
169 $definition = new Definition('Behat\Behat\Tester\Runtime\RuntimeOutlineTester', array(
170 new Reference(self::EXAMPLE_TESTER_ID)
172 $container->setDefinition(self::OUTLINE_TESTER_ID, $definition);
174 $this->loadExampleTester($container);
178 * Loads example tester.
180 * @param ContainerBuilder $container
182 protected function loadExampleTester(ContainerBuilder $container)
184 $definition = new Definition('Behat\Behat\Tester\StepContainerTester', array(
185 new Reference(self::STEP_TESTER_ID)
187 $container->setDefinition('tester.step_container', $definition);
189 $definition = new Definition('Behat\Behat\Tester\Runtime\RuntimeScenarioTester', array(
190 new Reference('tester.step_container'),
191 new Reference(self::BACKGROUND_TESTER_ID)
193 $container->setDefinition(self::EXAMPLE_TESTER_ID, $definition);
195 // Proper isolation for examples
196 $definition = new Definition('Behat\Behat\Tester\Runtime\IsolatingScenarioTester', array(
197 new Reference(self::EXAMPLE_TESTER_ID),
198 new Reference(EnvironmentExtension::MANAGER_ID)
201 $definition->addTag(self::EXAMPLE_TESTER_WRAPPER_TAG, array('priority' => -999999));
202 $container->setDefinition(self::EXAMPLE_TESTER_WRAPPER_TAG . '.isolating', $definition);
206 * Loads background tester.
208 * @param ContainerBuilder $container
210 protected function loadBackgroundTester(ContainerBuilder $container)
212 $definition = new Definition('Behat\Behat\Tester\StepContainerTester', array(
213 new Reference(self::STEP_TESTER_ID)
215 $container->setDefinition('tester.step_container', $definition);
217 $definition = new Definition('Behat\Behat\Tester\Runtime\RuntimeBackgroundTester', array(
218 new Reference('tester.step_container')
220 $container->setDefinition(self::BACKGROUND_TESTER_ID, $definition);
226 * @param ContainerBuilder $container
228 protected function loadStepTester(ContainerBuilder $container)
230 $definition = new Definition('Behat\Behat\Tester\Runtime\RuntimeStepTester', array(
231 new Reference(DefinitionExtension::FINDER_ID),
232 new Reference(CallExtension::CALL_CENTER_ID)
234 $container->setDefinition(self::STEP_TESTER_ID, $definition);
238 * Loads rerun controller.
240 * @param ContainerBuilder $container
241 * @param null|string $cachePath
243 protected function loadRerunController(ContainerBuilder $container, $cachePath)
245 $definition = new Definition('Behat\Behat\Tester\Cli\RerunController', array(
246 new Reference(EventDispatcherExtension::DISPATCHER_ID),
248 $container->getParameter('paths.base')
250 $definition->addTag(CliExtension::CONTROLLER_TAG, array('priority' => 200));
251 $container->setDefinition(CliExtension::CONTROLLER_TAG . '.rerun', $definition);
255 * Loads pending exception stringer.
257 * @param ContainerBuilder $container
259 protected function loadPendingExceptionStringer(ContainerBuilder $container)
261 $definition = new Definition('Behat\Behat\Tester\Exception\Stringer\PendingExceptionStringer');
262 $definition->addTag(ExceptionExtension::STRINGER_TAG);
263 $container->setDefinition(ExceptionExtension::STRINGER_TAG . '.pending', $definition);
267 * Processes all registered scenario tester wrappers.
269 * @param ContainerBuilder $container
271 protected function processScenarioTesterWrappers(ContainerBuilder $container)
273 $this->processor->processWrapperServices($container, self::SCENARIO_TESTER_ID, self::SCENARIO_TESTER_WRAPPER_TAG);
277 * Processes all registered outline tester wrappers.
279 * @param ContainerBuilder $container
281 protected function processOutlineTesterWrappers(ContainerBuilder $container)
283 $this->processor->processWrapperServices($container, self::OUTLINE_TESTER_ID, self::OUTLINE_TESTER_WRAPPER_TAG);
287 * Processes all registered example tester wrappers.
289 * @param ContainerBuilder $container
291 protected function processExampleTesterWrappers(ContainerBuilder $container)
293 $this->processor->processWrapperServices($container, self::EXAMPLE_TESTER_ID, self::EXAMPLE_TESTER_WRAPPER_TAG);
297 * Processes all registered background tester wrappers.
299 * @param ContainerBuilder $container
301 protected function processBackgroundTesterWrappers(ContainerBuilder $container)
303 $this->processor->processWrapperServices($container, self::BACKGROUND_TESTER_ID, self::BACKGROUND_TESTER_WRAPPER_TAG);
307 * Processes all registered step tester wrappers.
309 * @param ContainerBuilder $container
311 protected function processStepTesterWrappers(ContainerBuilder $container)
313 $this->processor->processWrapperServices($container, self::STEP_TESTER_ID, self::STEP_TESTER_WRAPPER_TAG);