Merge branch '2.8' into 3.4

* 2.8:
  [Bridge\PhpUnit] Exit as late as possible
  Update Repository Symlink Helper
  Document explicitly that dotfiles and vcs files are ignored by default
  do not mock the container builder in tests
This commit is contained in:
Nicolas Grekas 2018-02-11 18:15:12 +01:00
commit 8ed107d09c
11 changed files with 252 additions and 269 deletions

7
link
View File

@ -37,7 +37,12 @@ if (!is_dir("$argv[1]/vendor/symfony")) {
$sfPackages = array('symfony/symfony' => __DIR__); $sfPackages = array('symfony/symfony' => __DIR__);
$filesystem = new Filesystem(); $filesystem = new Filesystem();
foreach (glob(__DIR__.'/src/Symfony/{Bundle,Bridge,Component,Component/Security}/*', GLOB_BRACE | GLOB_ONLYDIR | GLOB_NOSORT) as $dir) { $braces = array('Bundle', 'Bridge', 'Component', 'Component/Security');
$directories = call_user_func_array('array_merge', array_values(array_map(function ($part) {
return glob(__DIR__.'/src/Symfony/'.$part.'/*', GLOB_ONLYDIR | GLOB_NOSORT);
}, $braces)));
foreach ($directories as $dir) {
if ($filesystem->exists($composer = "$dir/composer.json")) { if ($filesystem->exists($composer = "$dir/composer.json")) {
$sfPackages[json_decode(file_get_contents($composer))->name] = $dir; $sfPackages[json_decode(file_get_contents($composer))->name] = $dir;
} }

View File

@ -215,41 +215,62 @@ class DeprecationErrorHandler
return $b['count'] - $a['count']; return $b['count'] - $a['count'];
}; };
$groups = array('unsilenced', 'remaining'); $displayDeprecations = function ($deprecations) use ($colorize, $cmp) {
if (DeprecationErrorHandler::MODE_WEAK_VENDORS === $mode) { $groups = array('unsilenced', 'remaining');
$groups[] = 'remaining vendor'; if (DeprecationErrorHandler::MODE_WEAK_VENDORS === $mode) {
} $groups[] = 'remaining vendor';
array_push($groups, 'legacy', 'other'); }
array_push($groups, 'legacy', 'other');
foreach ($groups as $group) { foreach ($groups as $group) {
if ($deprecations[$group.'Count']) { if ($deprecations[$group.'Count']) {
echo "\n", $colorize( echo "\n", $colorize(
sprintf('%s deprecation notices (%d)', ucfirst($group), $deprecations[$group.'Count']), sprintf('%s deprecation notices (%d)', ucfirst($group), $deprecations[$group.'Count']),
'legacy' !== $group && 'remaining vendor' !== $group 'legacy' !== $group && 'remaining vendor' !== $group
), "\n"; ), "\n";
uasort($deprecations[$group], $cmp); uasort($deprecations[$group], $cmp);
foreach ($deprecations[$group] as $msg => $notices) { foreach ($deprecations[$group] as $msg => $notices) {
echo "\n ", $notices['count'], 'x: ', $msg, "\n"; echo "\n ", $notices['count'], 'x: ', $msg, "\n";
arsort($notices); arsort($notices);
foreach ($notices as $method => $count) { foreach ($notices as $method => $count) {
if ('count' !== $method) { if ('count' !== $method) {
echo ' ', $count, 'x in ', preg_replace('/(.*)\\\\(.*?::.*?)$/', '$2 from $1', $method), "\n"; echo ' ', $count, 'x in ', preg_replace('/(.*)\\\\(.*?::.*?)$/', '$2 from $1', $method), "\n";
}
} }
} }
} }
} }
} if (!empty($notices)) {
if (!empty($notices)) { echo "\n";
echo "\n"; }
};
$displayDeprecations($deprecations);
// store failing status
$isFailing = DeprecationErrorHandler::MODE_WEAK !== $mode && $mode < $deprecations['unsilencedCount'] + $deprecations['remainingCount'] + $deprecations['otherCount'];
// reset deprecations array
foreach ($deprecations as $group => $arrayOrInt) {
$deprecations[$group] = is_int($arrayOrInt) ? 0 : array();
} }
if (DeprecationErrorHandler::MODE_WEAK !== $mode && $mode < $deprecations['unsilencedCount'] + $deprecations['remainingCount'] + $deprecations['otherCount']) { register_shutdown_function(function () use (&$deprecations, $isFailing, $displayDeprecations, $mode) {
exit(1); foreach ($deprecations as $group => $arrayOrInt) {
} if (0 < (is_int($arrayOrInt) ? $arrayOrInt : count($arrayOrInt))) {
echo "Shutdown-time deprecations:\n";
break;
}
}
$displayDeprecations($deprecations);
if ($isFailing || DeprecationErrorHandler::MODE_WEAK !== $mode && $mode < $deprecations['unsilencedCount'] + $deprecations['remainingCount'] + $deprecations['otherCount']) {
exit(1);
}
});
}); });
} }
} }

View File

@ -59,6 +59,10 @@ $foo = new FooTestCase();
$foo->testLegacyFoo(); $foo->testLegacyFoo();
$foo->testNonLegacyBar(); $foo->testNonLegacyBar();
register_shutdown_function(function () {
exit('I get precedence over any exit statements inside the deprecation error handler.');
});
?> ?>
--EXPECTF-- --EXPECTF--
Unsilenced deprecation notices (3) Unsilenced deprecation notices (3)
@ -80,3 +84,4 @@ Other deprecation notices (1)
1x: root deprecation 1x: root deprecation
I get precedence over any exit statements inside the deprecation error handler.

View File

@ -0,0 +1,91 @@
--TEST--
Test DeprecationErrorHandler in default mode
--FILE--
<?php
putenv('SYMFONY_DEPRECATIONS_HELPER');
putenv('ANSICON');
putenv('ConEmuANSI');
putenv('TERM');
$vendor = __DIR__;
while (!file_exists($vendor.'/vendor')) {
$vendor = dirname($vendor);
}
define('PHPUNIT_COMPOSER_INSTALL', $vendor.'/vendor/autoload.php');
require PHPUNIT_COMPOSER_INSTALL;
require_once __DIR__.'/../../bootstrap.php';
@trigger_error('root deprecation', E_USER_DEPRECATED);
eval(<<<'EOPHP'
namespace PHPUnit\Util;
class Test
{
public static function getGroups()
{
return array();
}
}
EOPHP
);
class PHPUnit_Util_Test
{
public static function getGroups()
{
return array();
}
}
class FooTestCase
{
public function testLegacyFoo()
{
@trigger_error('silenced foo deprecation', E_USER_DEPRECATED);
trigger_error('unsilenced foo deprecation', E_USER_DEPRECATED);
trigger_error('unsilenced foo deprecation', E_USER_DEPRECATED);
}
public function testNonLegacyBar()
{
@trigger_error('silenced bar deprecation', E_USER_DEPRECATED);
trigger_error('unsilenced bar deprecation', E_USER_DEPRECATED);
}
}
$foo = new FooTestCase();
$foo->testLegacyFoo();
$foo->testNonLegacyBar();
register_shutdown_function(function () {
@trigger_error('root deprecation during shutdown', E_USER_DEPRECATED);
});
?>
--EXPECTF--
Unsilenced deprecation notices (3)
2x: unsilenced foo deprecation
2x in FooTestCase::testLegacyFoo
1x: unsilenced bar deprecation
1x in FooTestCase::testNonLegacyBar
Remaining deprecation notices (1)
1x: silenced bar deprecation
1x in FooTestCase::testNonLegacyBar
Legacy deprecation notices (1)
Other deprecation notices (1)
1x: root deprecation
Shutdown-time deprecations:
Other deprecation notices (1)
1x: root deprecation during shutdown

View File

@ -24,8 +24,7 @@ class AddCacheWarmerPassTest extends TestCase
public function testThatCacheWarmersAreProcessedInPriorityOrder() public function testThatCacheWarmersAreProcessedInPriorityOrder()
{ {
$container = new ContainerBuilder(); $container = new ContainerBuilder();
$cacheWarmerDefinition = $container->register('cache_warmer')->addArgument(array());
$definition = $container->register('cache_warmer')->addArgument(null);
$container->register('my_cache_warmer_service1')->addTag('kernel.cache_warmer', array('priority' => 100)); $container->register('my_cache_warmer_service1')->addTag('kernel.cache_warmer', array('priority' => 100));
$container->register('my_cache_warmer_service2')->addTag('kernel.cache_warmer', array('priority' => 200)); $container->register('my_cache_warmer_service2')->addTag('kernel.cache_warmer', array('priority' => 200));
$container->register('my_cache_warmer_service3')->addTag('kernel.cache_warmer'); $container->register('my_cache_warmer_service3')->addTag('kernel.cache_warmer');
@ -33,48 +32,35 @@ class AddCacheWarmerPassTest extends TestCase
$addCacheWarmerPass = new AddCacheWarmerPass(); $addCacheWarmerPass = new AddCacheWarmerPass();
$addCacheWarmerPass->process($container); $addCacheWarmerPass->process($container);
$expected = array( $this->assertEquals(
new Reference('my_cache_warmer_service2'), array(
new Reference('my_cache_warmer_service1'), new Reference('my_cache_warmer_service2'),
new Reference('my_cache_warmer_service3'), new Reference('my_cache_warmer_service1'),
new Reference('my_cache_warmer_service3'),
),
$cacheWarmerDefinition->getArgument(0)
); );
$this->assertEquals($expected, $definition->getArgument(0));
} }
public function testThatCompilerPassIsIgnoredIfThereIsNoCacheWarmerDefinition() public function testThatCompilerPassIsIgnoredIfThereIsNoCacheWarmerDefinition()
{ {
$definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock(); $container = new ContainerBuilder();
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'findTaggedServiceIds', 'getDefinition'))->getMock();
$container->expects($this->never())->method('findTaggedServiceIds');
$container->expects($this->never())->method('getDefinition');
$container->expects($this->atLeastOnce())
->method('hasDefinition')
->with('cache_warmer')
->will($this->returnValue(false));
$definition->expects($this->never())->method('replaceArgument');
$addCacheWarmerPass = new AddCacheWarmerPass(); $addCacheWarmerPass = new AddCacheWarmerPass();
$addCacheWarmerPass->process($container); $addCacheWarmerPass->process($container);
// we just check that the pass does not break if no cache warmer is registered
$this->addToAssertionCount(1);
} }
public function testThatCacheWarmersMightBeNotDefined() public function testThatCacheWarmersMightBeNotDefined()
{ {
$definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock(); $container = new ContainerBuilder();
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'findTaggedServiceIds', 'getDefinition'))->getMock(); $cacheWarmerDefinition = $container->register('cache_warmer')->addArgument(array());
$container->expects($this->atLeastOnce())
->method('findTaggedServiceIds')
->will($this->returnValue(array()));
$container->expects($this->never())->method('getDefinition');
$container->expects($this->atLeastOnce())
->method('hasDefinition')
->with('cache_warmer')
->will($this->returnValue(true));
$definition->expects($this->never())->method('replaceArgument');
$addCacheWarmerPass = new AddCacheWarmerPass(); $addCacheWarmerPass = new AddCacheWarmerPass();
$addCacheWarmerPass->process($container); $addCacheWarmerPass->process($container);
$this->assertSame(array(), $cacheWarmerDefinition->getArgument(0));
} }
} }

View File

@ -66,18 +66,10 @@ class AddConstraintValidatorsPassTest extends TestCase
public function testThatCompilerPassIsIgnoredIfThereIsNoConstraintValidatorFactoryDefinition() public function testThatCompilerPassIsIgnoredIfThereIsNoConstraintValidatorFactoryDefinition()
{ {
$definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock();
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'findTaggedServiceIds', 'getDefinition'))->getMock();
$container->expects($this->never())->method('findTaggedServiceIds');
$container->expects($this->never())->method('getDefinition');
$container->expects($this->atLeastOnce())
->method('hasDefinition')
->with('validator.validator_factory')
->will($this->returnValue(false));
$definition->expects($this->never())->method('replaceArgument');
$addConstraintValidatorsPass = new AddConstraintValidatorsPass(); $addConstraintValidatorsPass = new AddConstraintValidatorsPass();
$addConstraintValidatorsPass->process($container); $addConstraintValidatorsPass->process(new ContainerBuilder());
// we just check that the pass does not fail if no constraint validator factory is registered
$this->addToAssertionCount(1);
} }
} }

View File

@ -12,18 +12,11 @@
namespace Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Compiler; namespace Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Compiler;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ProfilerPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ProfilerPass;
class ProfilerPassTest extends TestCase class ProfilerPassTest extends TestCase
{ {
private $profilerDefinition;
protected function setUp()
{
$this->profilerDefinition = new Definition('ProfilerClass');
}
/** /**
* Tests that collectors that specify a template but no "id" will throw * Tests that collectors that specify a template but no "id" will throw
* an exception (both are needed if the template is specified). * an exception (both are needed if the template is specified).
@ -31,17 +24,15 @@ class ProfilerPassTest extends TestCase
* Thus, a fully-valid tag looks something like this: * Thus, a fully-valid tag looks something like this:
* *
* <tag name="data_collector" template="YourBundle:Collector:templatename" id="your_collector_name" /> * <tag name="data_collector" template="YourBundle:Collector:templatename" id="your_collector_name" />
*
* @expectedException \InvalidArgumentException
*/ */
public function testTemplateNoIdThrowsException() public function testTemplateNoIdThrowsException()
{ {
// one service, with a template key, but no id $builder = new ContainerBuilder();
$services = array( $builder->register('profiler', 'ProfilerClass');
'my_collector_service' => array(0 => array('template' => 'foo')), $builder->register('my_collector_service')
); ->addTag('data_collector', array('template' => 'foo'));
$builder = $this->createContainerMock($services);
$this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('InvalidArgumentException');
$profilerPass = new ProfilerPass(); $profilerPass = new ProfilerPass();
$profilerPass->process($builder); $profilerPass->process($builder);
@ -49,45 +40,19 @@ class ProfilerPassTest extends TestCase
public function testValidCollector() public function testValidCollector()
{ {
// one service, with a template key, but no id $container = new ContainerBuilder();
$services = array( $profilerDefinition = $container->register('profiler', 'ProfilerClass');
'my_collector_service' => array(0 => array('template' => 'foo', 'id' => 'my_collector')), $container->register('my_collector_service')
); ->addTag('data_collector', array('template' => 'foo', 'id' => 'my_collector'));
$container = $this->createContainerMock($services);
// fake the getDefinition() to return a Profiler definition
$container->expects($this->atLeastOnce())
->method('getDefinition');
// assert that the data_collector.templates parameter should be set
$container->expects($this->once())
->method('setParameter')
->with('data_collector.templates', array('my_collector_service' => array('my_collector', 'foo')));
$profilerPass = new ProfilerPass(); $profilerPass = new ProfilerPass();
$profilerPass->process($container); $profilerPass->process($container);
$this->assertSame(array('my_collector_service' => array('my_collector', 'foo')), $container->getParameter('data_collector.templates'));
// grab the method calls off of the "profiler" definition // grab the method calls off of the "profiler" definition
$methodCalls = $this->profilerDefinition->getMethodCalls(); $methodCalls = $profilerDefinition->getMethodCalls();
$this->assertCount(1, $methodCalls); $this->assertCount(1, $methodCalls);
$this->assertEquals('add', $methodCalls[0][0]); // grab the method part of the first call $this->assertEquals('add', $methodCalls[0][0]); // grab the method part of the first call
} }
private function createContainerMock($services)
{
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'getDefinition', 'findTaggedServiceIds', 'setParameter'))->getMock();
$container->expects($this->any())
->method('hasDefinition')
->with($this->equalTo('profiler'))
->will($this->returnValue(true));
$container->expects($this->any())
->method('getDefinition')
->will($this->returnValue($this->profilerDefinition));
$container->expects($this->atLeastOnce())
->method('findTaggedServiceIds')
->will($this->returnValue($services));
return $container;
}
} }

View File

@ -13,13 +13,14 @@ namespace Symfony\Bundle\TwigBundle\Tests\DependencyInjection\Compiler;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\Alias; use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Definition;
use Symfony\Bundle\TwigBundle\DependencyInjection\Compiler\TwigLoaderPass; use Symfony\Bundle\TwigBundle\DependencyInjection\Compiler\TwigLoaderPass;
class TwigLoaderPassTest extends TestCase class TwigLoaderPassTest extends TestCase
{ {
/** /**
* @var \PHPUnit_Framework_MockObject_MockObject * @var ContainerBuilder
*/ */
private $builder; private $builder;
/** /**
@ -33,64 +34,33 @@ class TwigLoaderPassTest extends TestCase
protected function setUp() protected function setUp()
{ {
$this->builder = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')->setMethods(array('hasDefinition', 'findTaggedServiceIds', 'setAlias', 'getDefinition'))->getMock(); $this->builder = new ContainerBuilder();
$this->builder->register('twig');
$this->chainLoader = new Definition('loader'); $this->chainLoader = new Definition('loader');
$this->pass = new TwigLoaderPass(); $this->pass = new TwigLoaderPass();
} }
public function testMapperPassWithOneTaggedLoaders() public function testMapperPassWithOneTaggedLoader()
{ {
$serviceIds = array( $this->builder->register('test_loader_1')
'test_loader_1' => array( ->addTag('twig.loader');
array(),
),
);
$this->builder->expects($this->once())
->method('hasDefinition')
->with('twig')
->will($this->returnValue(true));
$this->builder->expects($this->once())
->method('findTaggedServiceIds')
->with('twig.loader')
->will($this->returnValue($serviceIds));
$this->builder->expects($this->once())
->method('setAlias')
->with('twig.loader', 'test_loader_1')
->will($this->returnValue(new Alias('test_loader_1')));
$this->pass->process($this->builder); $this->pass->process($this->builder);
$this->assertSame('test_loader_1', (string) $this->builder->getAlias('twig.loader'));
} }
public function testMapperPassWithTwoTaggedLoaders() public function testMapperPassWithTwoTaggedLoaders()
{ {
$serviceIds = array( $this->builder->setDefinition('twig.loader.chain', $this->chainLoader);
'test_loader_1' => array( $this->builder->register('test_loader_1')
array(), ->addTag('twig.loader');
), $this->builder->register('test_loader_2')
'test_loader_2' => array( ->addTag('twig.loader');
array(),
),
);
$this->builder->expects($this->once())
->method('hasDefinition')
->with('twig')
->will($this->returnValue(true));
$this->builder->expects($this->once())
->method('findTaggedServiceIds')
->with('twig.loader')
->will($this->returnValue($serviceIds));
$this->builder->expects($this->once())
->method('getDefinition')
->with('twig.loader.chain')
->will($this->returnValue($this->chainLoader));
$this->builder->expects($this->once())
->method('setAlias')
->with('twig.loader', 'twig.loader.chain')
->will($this->returnValue(new Alias('twig.loader.chain')));
$this->pass->process($this->builder); $this->pass->process($this->builder);
$this->assertSame('twig.loader.chain', (string) $this->builder->getAlias('twig.loader'));
$calls = $this->chainLoader->getMethodCalls(); $calls = $this->chainLoader->getMethodCalls();
$this->assertCount(2, $calls); $this->assertCount(2, $calls);
$this->assertEquals('addLoader', $calls[0][0]); $this->assertEquals('addLoader', $calls[0][0]);
@ -101,33 +71,15 @@ class TwigLoaderPassTest extends TestCase
public function testMapperPassWithTwoTaggedLoadersWithPriority() public function testMapperPassWithTwoTaggedLoadersWithPriority()
{ {
$serviceIds = array( $this->builder->setDefinition('twig.loader.chain', $this->chainLoader);
'test_loader_1' => array( $this->builder->register('test_loader_1')
array('priority' => 100), ->addTag('twig.loader', array('priority' => 100));
), $this->builder->register('test_loader_2')
'test_loader_2' => array( ->addTag('twig.loader', array('priority' => 200));
array('priority' => 200),
),
);
$this->builder->expects($this->once())
->method('hasDefinition')
->with('twig')
->will($this->returnValue(true));
$this->builder->expects($this->once())
->method('findTaggedServiceIds')
->with('twig.loader')
->will($this->returnValue($serviceIds));
$this->builder->expects($this->once())
->method('getDefinition')
->with('twig.loader.chain')
->will($this->returnValue($this->chainLoader));
$this->builder->expects($this->once())
->method('setAlias')
->with('twig.loader', 'twig.loader.chain')
->will($this->returnValue(new Alias('twig.loader.chain')));
$this->pass->process($this->builder); $this->pass->process($this->builder);
$this->assertSame('twig.loader.chain', (string) $this->builder->getAlias('twig.loader'));
$calls = $this->chainLoader->getMethodCalls(); $calls = $this->chainLoader->getMethodCalls();
$this->assertCount(2, $calls); $this->assertCount(2, $calls);
$this->assertEquals('addLoader', $calls[0][0]); $this->assertEquals('addLoader', $calls[0][0]);
@ -141,15 +93,6 @@ class TwigLoaderPassTest extends TestCase
*/ */
public function testMapperPassWithZeroTaggedLoaders() public function testMapperPassWithZeroTaggedLoaders()
{ {
$this->builder->expects($this->once())
->method('hasDefinition')
->with('twig')
->will($this->returnValue(true));
$this->builder->expects($this->once())
->method('findTaggedServiceIds')
->with('twig.loader')
->will($this->returnValue(array()));
$this->pass->process($this->builder); $this->pass->process($this->builder);
} }
} }

View File

@ -12,6 +12,8 @@
namespace Symfony\Component\DependencyInjection\Tests\Extension; namespace Symfony\Component\DependencyInjection\Tests\Extension;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
class ExtensionTest extends TestCase class ExtensionTest extends TestCase
{ {
@ -20,36 +22,8 @@ class ExtensionTest extends TestCase
*/ */
public function testIsConfigEnabledReturnsTheResolvedValue($enabled) public function testIsConfigEnabledReturnsTheResolvedValue($enabled)
{ {
$pb = $this->getMockBuilder('Symfony\Component\DependencyInjection\ParameterBag\ParameterBag') $extension = new EnableableExtension();
->setMethods(array('resolveValue')) $this->assertSame($enabled, $extension->isConfigEnabled(new ContainerBuilder(), array('enabled' => $enabled)));
->getMock()
;
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder')
->setMethods(array('getParameterBag'))
->getMock()
;
$pb->expects($this->once())
->method('resolveValue')
->with($this->equalTo($enabled))
->will($this->returnValue($enabled))
;
$container->expects($this->once())
->method('getParameterBag')
->will($this->returnValue($pb))
;
$extension = $this->getMockBuilder('Symfony\Component\DependencyInjection\Extension\Extension')
->setMethods(array())
->getMockForAbstractClass()
;
$r = new \ReflectionMethod('Symfony\Component\DependencyInjection\Extension\Extension', 'isConfigEnabled');
$r->setAccessible(true);
$r->invoke($extension, $container, array('enabled' => $enabled));
} }
public function getResolvedEnabledFixtures() public function getResolvedEnabledFixtures()
@ -66,18 +40,20 @@ class ExtensionTest extends TestCase
*/ */
public function testIsConfigEnabledOnNonEnableableConfig() public function testIsConfigEnabledOnNonEnableableConfig()
{ {
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerBuilder') $extension = new EnableableExtension();
->getMock()
;
$extension = $this->getMockBuilder('Symfony\Component\DependencyInjection\Extension\Extension') $extension->isConfigEnabled(new ContainerBuilder(), array());
->setMethods(array()) }
->getMockForAbstractClass() }
;
class EnableableExtension extends Extension
$r = new \ReflectionMethod('Symfony\Component\DependencyInjection\Extension\Extension', 'isConfigEnabled'); {
$r->setAccessible(true); public function load(array $configs, ContainerBuilder $container)
{
$r->invoke($extension, $container, array()); }
public function isConfigEnabled(ContainerBuilder $container, array $config)
{
return parent::isConfigEnabled($container, $config);
} }
} }

View File

@ -313,6 +313,8 @@ class Finder implements \IteratorAggregate, \Countable
/** /**
* Excludes "hidden" directories and files (starting with a dot). * Excludes "hidden" directories and files (starting with a dot).
* *
* This option is enabled by default.
*
* @param bool $ignoreDotFiles Whether to exclude "hidden" files or not * @param bool $ignoreDotFiles Whether to exclude "hidden" files or not
* *
* @return $this * @return $this
@ -333,6 +335,8 @@ class Finder implements \IteratorAggregate, \Countable
/** /**
* Forces the finder to ignore version control directories. * Forces the finder to ignore version control directories.
* *
* This option is enabled by default.
*
* @param bool $ignoreVCS Whether to exclude VCS files or not * @param bool $ignoreVCS Whether to exclude VCS files or not
* *
* @return $this * @return $this

View File

@ -12,44 +12,39 @@
namespace Symfony\Component\HttpKernel\Tests\DependencyInjection; namespace Symfony\Component\HttpKernel\Tests\DependencyInjection;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfigurationPass; use Symfony\Component\HttpKernel\DependencyInjection\MergeExtensionConfigurationPass;
class MergeExtensionConfigurationPassTest extends TestCase class MergeExtensionConfigurationPassTest extends TestCase
{ {
public function testAutoloadMainExtension() public function testAutoloadMainExtension()
{ {
$container = $this->getMockBuilder('Symfony\\Component\\DependencyInjection\\ContainerBuilder')->setMethods(array('getExtensionConfig', 'loadFromExtension', 'getParameterBag', 'getDefinitions', 'getAliases', 'getExtensions'))->getMock(); $container = new ContainerBuilder();
$params = $this->getMockBuilder('Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag')->getMock(); $container->registerExtension(new LoadedExtension());
$container->registerExtension(new NotLoadedExtension());
$container->loadFromExtension('loaded', array());
$container->expects($this->at(0)) $configPass = new MergeExtensionConfigurationPass(array('loaded', 'not_loaded'));
->method('getExtensionConfig')
->with('loaded')
->will($this->returnValue(array(array())));
$container->expects($this->at(1))
->method('getExtensionConfig')
->with('notloaded')
->will($this->returnValue(array()));
$container->expects($this->once())
->method('loadFromExtension')
->with('notloaded', array());
$container->expects($this->any())
->method('getParameterBag')
->will($this->returnValue($params));
$params->expects($this->any())
->method('all')
->will($this->returnValue(array()));
$container->expects($this->any())
->method('getDefinitions')
->will($this->returnValue(array()));
$container->expects($this->any())
->method('getAliases')
->will($this->returnValue(array()));
$container->expects($this->any())
->method('getExtensions')
->will($this->returnValue(array()));
$configPass = new MergeExtensionConfigurationPass(array('loaded', 'notloaded'));
$configPass->process($container); $configPass->process($container);
$this->assertTrue($container->hasDefinition('loaded.foo'));
$this->assertTrue($container->hasDefinition('not_loaded.bar'));
}
}
class LoadedExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$container->register('loaded.foo');
}
}
class NotLoadedExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$container->register('not_loaded.bar');
} }
} }