2018-11-23 12:29:20 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\DependencyInjection\Tests\Compiler ;
use PHPUnit\Framework\TestCase ;
use Symfony\Component\DependencyInjection\Compiler\ResolveNamedArgumentsPass ;
use Symfony\Component\DependencyInjection\ContainerBuilder ;
use Symfony\Component\DependencyInjection\Reference ;
use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass ;
2019-01-24 08:00:03 +00:00
use Symfony\Component\DependencyInjection\Tests\Fixtures\FactoryDummyWithoutReturnTypes ;
2018-11-23 12:29:20 +00:00
use Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsDummy ;
use Symfony\Component\DependencyInjection\Tests\Fixtures\SimilarArgumentsDummy ;
2019-01-24 08:00:03 +00:00
use Symfony\Component\DependencyInjection\Tests\Fixtures\TestDefinition1 ;
2018-11-23 12:29:20 +00:00
/**
* @ author Kévin Dunglas < dunglas @ gmail . com >
*/
class ResolveNamedArgumentsPassTest extends TestCase
{
public function testProcess ()
{
$container = new ContainerBuilder ();
$definition = $container -> register ( NamedArgumentsDummy :: class , NamedArgumentsDummy :: class );
$definition -> setArguments ( array (
2 => 'http://api.example.com' ,
'$apiKey' => '123' ,
0 => new Reference ( 'foo' ),
));
$definition -> addMethodCall ( 'setApiKey' , array ( '$apiKey' => '123' ));
$pass = new ResolveNamedArgumentsPass ();
$pass -> process ( $container );
$this -> assertEquals ( array ( 0 => new Reference ( 'foo' ), 1 => '123' , 2 => 'http://api.example.com' ), $definition -> getArguments ());
$this -> assertEquals ( array ( array ( 'setApiKey' , array ( '123' ))), $definition -> getMethodCalls ());
}
public function testWithFactory ()
{
$container = new ContainerBuilder ();
$container -> register ( 'factory' , NoConstructor :: class );
$definition = $container -> register ( 'foo' , NoConstructor :: class )
-> setFactory ( array ( new Reference ( 'factory' ), 'create' ))
-> setArguments ( array ( '$apiKey' => '123' ));
$pass = new ResolveNamedArgumentsPass ();
$pass -> process ( $container );
$this -> assertSame ( array ( 0 => '123' ), $definition -> getArguments ());
}
/**
* @ expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
*/
public function testClassNull ()
{
$container = new ContainerBuilder ();
$definition = $container -> register ( NamedArgumentsDummy :: class );
$definition -> setArguments ( array ( '$apiKey' => '123' ));
$pass = new ResolveNamedArgumentsPass ();
$pass -> process ( $container );
}
/**
* @ expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
*/
public function testClassNotExist ()
{
$container = new ContainerBuilder ();
$definition = $container -> register ( NotExist :: class , NotExist :: class );
$definition -> setArguments ( array ( '$apiKey' => '123' ));
$pass = new ResolveNamedArgumentsPass ();
$pass -> process ( $container );
}
/**
* @ expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
*/
public function testClassNoConstructor ()
{
$container = new ContainerBuilder ();
$definition = $container -> register ( NoConstructor :: class , NoConstructor :: class );
$definition -> setArguments ( array ( '$apiKey' => '123' ));
$pass = new ResolveNamedArgumentsPass ();
$pass -> process ( $container );
}
/**
* @ expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
2019-01-24 08:00:03 +00:00
* @ expectedExceptionMessage Invalid service " Symfony \ Component \ DependencyInjection \T ests \ Fixtures \N amedArgumentsDummy " : method " __construct() " has no argument named " $notFound " . Check your service definition .
2018-11-23 12:29:20 +00:00
*/
public function testArgumentNotFound ()
{
$container = new ContainerBuilder ();
$definition = $container -> register ( NamedArgumentsDummy :: class , NamedArgumentsDummy :: class );
$definition -> setArguments ( array ( '$notFound' => '123' ));
$pass = new ResolveNamedArgumentsPass ();
$pass -> process ( $container );
}
2019-01-24 08:00:03 +00:00
/**
* @ expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
* @ expectedExceptionMessage Invalid service " Symfony \ Component \ DependencyInjection \T ests \ Fixtures \T estDefinition1 " : method " Symfony \ Component \ DependencyInjection \T ests \ Fixtures \ FactoryDummyWithoutReturnTypes::createTestDefinition1() " has no argument named " $notFound " . Check your service definition .
*/
public function testCorrectMethodReportedInException ()
{
$container = new ContainerBuilder ();
$container -> register ( FactoryDummyWithoutReturnTypes :: class , FactoryDummyWithoutReturnTypes :: class );
$definition = $container -> register ( TestDefinition1 :: class , TestDefinition1 :: class );
$definition -> setFactory ( array ( FactoryDummyWithoutReturnTypes :: class , 'createTestDefinition1' ));
$definition -> setArguments ( array ( '$notFound' => '123' ));
$pass = new ResolveNamedArgumentsPass ();
$pass -> process ( $container );
}
2018-11-23 12:29:20 +00:00
public function testTypedArgument ()
{
$container = new ContainerBuilder ();
$definition = $container -> register ( NamedArgumentsDummy :: class , NamedArgumentsDummy :: class );
$definition -> setArguments ( array ( '$apiKey' => '123' , CaseSensitiveClass :: class => new Reference ( 'foo' )));
$pass = new ResolveNamedArgumentsPass ();
$pass -> process ( $container );
$this -> assertEquals ( array ( new Reference ( 'foo' ), '123' ), $definition -> getArguments ());
}
public function testResolvesMultipleArgumentsOfTheSameType ()
{
$container = new ContainerBuilder ();
$definition = $container -> register ( SimilarArgumentsDummy :: class , SimilarArgumentsDummy :: class );
$definition -> setArguments ( array ( CaseSensitiveClass :: class => new Reference ( 'foo' ), '$token' => 'qwerty' ));
$pass = new ResolveNamedArgumentsPass ();
$pass -> process ( $container );
$this -> assertEquals ( array ( new Reference ( 'foo' ), 'qwerty' , new Reference ( 'foo' )), $definition -> getArguments ());
}
public function testResolvePrioritizeNamedOverType ()
{
$container = new ContainerBuilder ();
$definition = $container -> register ( SimilarArgumentsDummy :: class , SimilarArgumentsDummy :: class );
$definition -> setArguments ( array ( CaseSensitiveClass :: class => new Reference ( 'foo' ), '$token' => 'qwerty' , '$class1' => new Reference ( 'bar' )));
$pass = new ResolveNamedArgumentsPass ();
$pass -> process ( $container );
$this -> assertEquals ( array ( new Reference ( 'bar' ), 'qwerty' , new Reference ( 'foo' )), $definition -> getArguments ());
}
}
class NoConstructor
{
public static function create ( $apiKey )
{
}
}