ResolveDefinitionTemplatesPassTest.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace Symfony\Tests\Component\DependencyInjection\Compiler;
  3. use Symfony\Component\DependencyInjection\ContainerInterface;
  4. use Symfony\Component\DependencyInjection\DefinitionDecorator;
  5. use Symfony\Component\DependencyInjection\Compiler\ResolveDefinitionTemplatesPass;
  6. use Symfony\Component\DependencyInjection\ContainerBuilder;
  7. class ResolveDefinitionTemplatesPassTest extends \PHPUnit_Framework_TestCase
  8. {
  9. public function testProcess()
  10. {
  11. $container = new ContainerBuilder();
  12. $container->register('parent', 'foo')->setArguments(array('moo', 'b'))->setProperty('foo', 'moo');
  13. $container->setDefinition('child', new DefinitionDecorator('parent'))
  14. ->replaceArgument(0, 'a')
  15. ->setProperty('foo', 'bar')
  16. ->setClass('bar')
  17. ;
  18. $this->process($container);
  19. $def = $container->getDefinition('child');
  20. $this->assertNotInstanceOf('Symfony\Component\DependencyInjection\DefinitionDecorator', $def);
  21. $this->assertEquals('bar', $def->getClass());
  22. $this->assertEquals(array('a', 'b'), $def->getArguments());
  23. $this->assertEquals(array('foo' => 'bar'), $def->getProperties());
  24. }
  25. public function testProcessAppendsMethodCallsAlways()
  26. {
  27. $container = new ContainerBuilder();
  28. $container
  29. ->register('parent')
  30. ->addMethodCall('foo', array('bar'))
  31. ;
  32. $container
  33. ->setDefinition('child', new DefinitionDecorator('parent'))
  34. ->addMethodCall('bar', array('foo'))
  35. ;
  36. $this->process($container);
  37. $def = $container->getDefinition('child');
  38. $this->assertEquals(array(
  39. array('foo', array('bar')),
  40. array('bar', array('foo')),
  41. ), $def->getMethodCalls());
  42. }
  43. public function testProcessDoesNotCopyAbstract()
  44. {
  45. $container = new ContainerBuilder();
  46. $container
  47. ->register('parent')
  48. ->setAbstract(true)
  49. ;
  50. $container
  51. ->setDefinition('child', new DefinitionDecorator('parent'))
  52. ;
  53. $this->process($container);
  54. $def = $container->getDefinition('child');
  55. $this->assertFalse($def->isAbstract());
  56. }
  57. public function testProcessDoesNotCopyScope()
  58. {
  59. $container = new ContainerBuilder();
  60. $container
  61. ->register('parent')
  62. ->setScope('foo')
  63. ;
  64. $container
  65. ->setDefinition('child', new DefinitionDecorator('parent'))
  66. ;
  67. $this->process($container);
  68. $def = $container->getDefinition('child');
  69. $this->assertEquals(ContainerInterface::SCOPE_CONTAINER, $def->getScope());
  70. }
  71. public function testProcessDoesNotCopyTags()
  72. {
  73. $container = new ContainerBuilder();
  74. $container
  75. ->register('parent')
  76. ->addTag('foo')
  77. ;
  78. $container
  79. ->setDefinition('child', new DefinitionDecorator('parent'))
  80. ;
  81. $this->process($container);
  82. $def = $container->getDefinition('child');
  83. $this->assertEquals(array(), $def->getTags());
  84. }
  85. public function testProcessHandlesMultipleInheritance()
  86. {
  87. $container = new ContainerBuilder();
  88. $container
  89. ->register('parent', 'foo')
  90. ->setArguments(array('foo', 'bar', 'c'))
  91. ;
  92. $container
  93. ->setDefinition('child2', new DefinitionDecorator('child1'))
  94. ->replaceArgument(1, 'b')
  95. ;
  96. $container
  97. ->setDefinition('child1', new DefinitionDecorator('parent'))
  98. ->replaceArgument(0, 'a')
  99. ;
  100. $this->process($container);
  101. $def = $container->getDefinition('child2');
  102. $this->assertEquals(array('a', 'b', 'c'), $def->getArguments());
  103. $this->assertEquals('foo', $def->getClass());
  104. }
  105. protected function process(ContainerBuilder $container)
  106. {
  107. $pass = new ResolveDefinitionTemplatesPass();
  108. $pass->process($container);
  109. }
  110. }