178 lines
7.1 KiB
PHP
Executable File
178 lines
7.1 KiB
PHP
Executable File
<?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\Tests\Component\DependencyInjection;
|
|
|
|
use Symfony\Component\DependencyInjection\InterfaceInjector;
|
|
use Symfony\Component\DependencyInjection\Definition;
|
|
|
|
class InterfaceInjectorTest extends \PHPUnit_Framework_TestCase
|
|
{
|
|
/**
|
|
* @covers Symfony\Component\DependencyInjection\InterfaceInjector::addMethodCall
|
|
* @covers Symfony\Component\DependencyInjection\InterfaceInjector::hasMethodCall
|
|
* @covers Symfony\Component\DependencyInjection\InterfaceInjector::removeMethodCall
|
|
* @covers Symfony\Component\DependencyInjection\InterfaceInjector::getMethodCalls
|
|
*
|
|
* @dataProvider getMethodCalls
|
|
*
|
|
* @param string $method
|
|
* @param array $arguments
|
|
*/
|
|
public function testAddRemoveGetMethodCalls($method, array $arguments = array())
|
|
{
|
|
$injector = new InterfaceInjector('stdClass');
|
|
|
|
$injector->addMethodCall($method, $arguments);
|
|
$this->assertTrue($injector->hasMethodCall($method), '->hasMethodCall() returns true for methods that were added on InterfaceInjector');
|
|
|
|
$methodCalls = $injector->getMethodCalls();
|
|
$this->assertEquals(1, count($methodCalls), '->getMethodCalls() returns array, where each entry is a method call');
|
|
$this->assertEquals(array($method, $arguments), $methodCalls[0], '->getMethodCalls() has all methods added to InterfaceInjector instance');
|
|
|
|
$injector->removeMethodCall($method);
|
|
$this->assertFalse($injector->hasMethodCall($method), '->removeMethodClass() deletes the method call from InterfaceInjector');
|
|
}
|
|
|
|
/**
|
|
* @covers Symfony\Component\DependencyInjection\InterfaceInjector::processDefinition
|
|
*
|
|
* @dataProvider getInjectorsAndDefinitions
|
|
*
|
|
* @param InterfaceInjector $injector
|
|
* @param Definition $definition
|
|
* @param int $expectedMethodsCount
|
|
*/
|
|
public function testProcessDefinition(InterfaceInjector $injector, Definition $definition)
|
|
{
|
|
$injector->processDefinition($definition);
|
|
}
|
|
|
|
/**
|
|
* @covers Symfony\Component\DependencyInjection\InterfaceInjector::supports
|
|
*
|
|
* @dataProvider getInjectorsAndClasses
|
|
*
|
|
* @param InterfaceInjector $injector
|
|
* @param string $class
|
|
* @param string $expectedResult
|
|
*/
|
|
public function testSupports(InterfaceInjector $injector, $class, $expectedResult)
|
|
{
|
|
$this->assertEquals($expectedResult, $injector->supports($class), '->supports() must return true if injector is to be used on a class, false otherwise');
|
|
}
|
|
|
|
/**
|
|
* @covers Symfony\Component\DependencyInjection\InterfaceInjector::processDefinition
|
|
*/
|
|
public function testProcessesDefinitionOnlyOnce()
|
|
{
|
|
$injector = new InterfaceInjector('Symfony\Tests\Component\DependencyInjection\Service');
|
|
$injector->addMethodCall('method');
|
|
|
|
$definition = $this->getMockDefinition('Symfony\Tests\Component\DependencyInjection\Service', 1);
|
|
|
|
$injector->processDefinition($definition);
|
|
$injector->processDefinition($definition);
|
|
}
|
|
|
|
/**
|
|
* @covers Symfony\Component\DependencyInjection\InterfaceInjector::merge
|
|
*/
|
|
public function testMerge()
|
|
{
|
|
$injector1 = new InterfaceInjector('Symfony\Tests\Component\DependencyInjection\Service');
|
|
$injector1->addMethodCall('method_one');
|
|
|
|
$injector2 = new InterfaceInjector('Symfony\Tests\Component\DependencyInjection\Service');
|
|
$injector2->addMethodCall('method_two');
|
|
|
|
$injector1->merge($injector2);
|
|
|
|
$methodCalls = $injector1->getMethodCalls();
|
|
$this->assertEquals(2, count($methodCalls));
|
|
$this->assertEquals(array(
|
|
array('method_one', array()),
|
|
array('method_two', array()),
|
|
), $methodCalls);
|
|
}
|
|
|
|
/**
|
|
* @expectedException Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
|
|
*/
|
|
public function testSupportsThrowsExceptionOnInvalidArgument()
|
|
{
|
|
$injector = new InterfaceInjector('Symfony\Tests\Component\DependencyInjection\Service');
|
|
$injector->supports(array());
|
|
}
|
|
|
|
public function getMethodCalls()
|
|
{
|
|
return array(
|
|
array('method', array()),
|
|
array('method2', array('one', 'two')),
|
|
array('method3', array('single')),
|
|
);
|
|
}
|
|
|
|
public function getInjectorsAndDefinitions()
|
|
{
|
|
$injector = new InterfaceInjector('Symfony\Tests\Component\DependencyInjection\Service');
|
|
$injector->addMethodCall('method');
|
|
$injector->addMethodCall('method');
|
|
$injector->addMethodCall('method');
|
|
$injector->addMethodCall('method');
|
|
|
|
$definition1 = $this->getMockDefinition('stdClass', 0);
|
|
$definition2 = $this->getMockDefinition('Symfony\Tests\Component\DependencyInjection\Service', 4);
|
|
|
|
return array(
|
|
array($injector, $definition1),
|
|
array($injector, $definition2),
|
|
);
|
|
}
|
|
|
|
public function getInjectorsAndClasses()
|
|
{
|
|
return array(
|
|
array(new InterfaceInjector('Symfony\Tests\Component\DependencyInjection\Service'), 'Symfony\Tests\Component\DependencyInjection\Service', true),
|
|
array(new InterfaceInjector('Symfony\Tests\Component\DependencyInjection\SubService'), 'Symfony\Tests\Component\DependencyInjection\Service', false),
|
|
array(new InterfaceInjector('Symfony\Tests\Component\DependencyInjection\Service'), 'Symfony\Tests\Component\DependencyInjection\SubService', true),
|
|
array(new InterfaceInjector('Symfony\Tests\Component\DependencyInjection\SubService'), 'Symfony\Tests\Component\DependencyInjection\SubService', true),
|
|
array(new InterfaceInjector('Symfony\Tests\Component\DependencyInjection\FooInterface'), 'Symfony\Tests\Component\DependencyInjection\SubService', true),
|
|
array(new InterfaceInjector('Symfony\Tests\Component\DependencyInjection\FooInterface'), 'Symfony\Tests\Component\DependencyInjection\Service', false),
|
|
array(new InterfaceInjector('Symfony\Tests\Component\DependencyInjection\FooInterface'), 'Symfony\Tests\Component\DependencyInjection\ServiceWithConstructor', false),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param string $class
|
|
* @param int $methodCount
|
|
* @return Symfony\Component\DependencyInjection\Definition
|
|
*/
|
|
private function getMockDefinition($class, $methodCount)
|
|
{
|
|
$definition = $this->getMock('Symfony\Component\DependencyInjection\Definition');
|
|
$definition->expects($this->once())
|
|
->method('getClass')
|
|
->will($this->returnValue($class))
|
|
;
|
|
$definition->expects($this->exactly($methodCount))
|
|
->method('addMethodCall')
|
|
;
|
|
return $definition;
|
|
}
|
|
}
|
|
|
|
class ServiceWithConstructor { public function __construct(\DateTime $required) {} }
|
|
class Service {}
|
|
class SubService extends Service implements FooInterface {}
|
|
interface FooInterface {} |