user_saml/tests/integration/vendor/behat/behat/src/Behat/Behat/Context/ContextFactory.php
Arthur Schiwon 3435d5093a
update behat and deps
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
2022-04-07 17:00:47 +02:00

151 lines
4.1 KiB
PHP

<?php
/*
* This file is part of the Behat.
* (c) Konstantin Kudryashov <ever.zet@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Behat\Behat\Context;
use Behat\Testwork\Argument\Validator;
use Behat\Behat\Context\Argument\ArgumentResolver;
use Behat\Behat\Context\Initializer\ContextInitializer;
use Behat\Testwork\Argument\ArgumentOrganiser;
use ReflectionClass;
/**
* Instantiates contexts using registered argument resolvers and context initializers.
*
* @author Konstantin Kudryashov <ever.zet@gmail.com>
*/
final class ContextFactory
{
/**
* @var ArgumentOrganiser
*/
private $argumentOrganiser;
/**
* @var ArgumentResolver[]
*/
private $argumentResolvers = array();
/**
* @var ContextInitializer[]
*/
private $contextInitializers = array();
/**
* @var Validator
*/
private $validator;
/**
* Initialises factory.
*
* @param ArgumentOrganiser $argumentOrganiser
*/
public function __construct(ArgumentOrganiser $argumentOrganiser)
{
$this->argumentOrganiser = $argumentOrganiser;
$this->validator = new Validator();
}
/**
* Registers context argument resolver.
*
* @param ArgumentResolver $resolver
*/
public function registerArgumentResolver(ArgumentResolver $resolver)
{
$this->argumentResolvers[] = $resolver;
}
/**
* Registers context initializer.
*
* @param ContextInitializer $initializer
*/
public function registerContextInitializer(ContextInitializer $initializer)
{
$this->contextInitializers[] = $initializer;
}
/**
* Creates and initializes context class.
*
* @param string $class
* @param array $arguments
* @param ArgumentResolver[] $singleUseResolvers
*
* @return Context
*/
public function createContext($class, array $arguments = array(), array $singleUseResolvers = array())
{
$reflection = new ReflectionClass($class);
$resolvers = array_merge($singleUseResolvers, $this->argumentResolvers);
$resolvedArguments = $this->resolveArguments($reflection, $arguments, $resolvers);
$context = $this->createInstance($reflection, $resolvedArguments);
$this->initializeInstance($context);
return $context;
}
/**
* Resolves arguments for a specific class using registered argument resolvers.
*
* @param ReflectionClass $reflection
* @param array $arguments
* @param ArgumentResolver[] $resolvers
*
* @return mixed[]
*/
private function resolveArguments(ReflectionClass $reflection, array $arguments, array $resolvers)
{
$newArguments = $arguments;
foreach ($resolvers as $resolver) {
$newArguments = $resolver->resolveArguments($reflection, $newArguments);
}
if (!$reflection->hasMethod('__construct')) {
return $newArguments;
}
$constructor = $reflection->getConstructor();
$newArguments = $this->argumentOrganiser->organiseArguments($constructor, $newArguments);
$this->validator->validateArguments($constructor, $newArguments);
return $newArguments;
}
/**
* Creates context instance.
*
* @param ReflectionClass $reflection
* @param array $arguments
*
* @return mixed
*/
private function createInstance(ReflectionClass $reflection, array $arguments)
{
if (count($arguments)) {
return $reflection->newInstanceArgs(array_values($arguments));
}
return $reflection->newInstance();
}
/**
* Initializes context class and returns new context instance.
*
* @param Context $context
*/
private function initializeInstance(Context $context)
{
foreach ($this->contextInitializers as $initializer) {
$initializer->initializeContext($context);
}
}
}