Merge branch '2.8'

* 2.8:
  [2.8] Silence newest deprecations
  [FrameworkBundle] Reuse PropertyAccessor service for ObjectNormalizer
  [VarDumper] Fix dump output for better readability
  [PhpUnitBridge] Enforce @-silencing of deprecation notices according to new policy

Conflicts:
	src/Symfony/Bundle/FrameworkBundle/Tests/Console/Descriptor/AbstractDescriptorTest.php
	src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/LegacyTemplatingAssetHelperPassTest.php
	src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php
	src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/AssetsHelperTest.php
	src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php
	src/Symfony/Bundle/TwigBundle/Tests/Extension/LegacyAssetsExtensionTest.php
	src/Symfony/Bundle/TwigBundle/Tests/TokenParser/LegacyRenderTokenParserTest.php
	src/Symfony/Component/ClassLoader/Tests/LegacyUniversalClassLoaderTest.php
	src/Symfony/Component/Console/Tests/ApplicationTest.php
	src/Symfony/Component/Console/Tests/Command/CommandTest.php
	src/Symfony/Component/Console/Tests/Helper/LegacyDialogHelperTest.php
	src/Symfony/Component/Console/Tests/Helper/LegacyProgressHelperTest.php
	src/Symfony/Component/Console/Tests/Helper/LegacyTableHelperTest.php
	src/Symfony/Component/Console/Tests/Input/InputDefinitionTest.php
	src/Symfony/Component/Console/Tests/Input/StringInputTest.php
	src/Symfony/Component/Debug/Tests/ErrorHandlerTest.php
	src/Symfony/Component/Debug/Tests/FatalErrorHandler/ClassNotFoundFatalErrorHandlerTest.php
	src/Symfony/Component/DependencyInjection/Tests/Compiler/CheckDefinitionValidityPassTest.php
	src/Symfony/Component/DependencyInjection/Tests/Compiler/LegacyResolveParameterPlaceHoldersPassTest.php
	src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php
	src/Symfony/Component/DependencyInjection/Tests/DefinitionDecoratorTest.php
	src/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php
	src/Symfony/Component/DependencyInjection/Tests/Dumper/GraphvizDumperTest.php
	src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php
	src/Symfony/Component/DependencyInjection/Tests/Dumper/XmlDumperTest.php
	src/Symfony/Component/DependencyInjection/Tests/Dumper/YamlDumperTest.php
	src/Symfony/Component/DependencyInjection/Tests/LegacyContainerBuilderTest.php
	src/Symfony/Component/DependencyInjection/Tests/LegacyDefinitionTest.php
	src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php
	src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php
	src/Symfony/Component/EventDispatcher/Tests/AbstractEventDispatcherTest.php
	src/Symfony/Component/EventDispatcher/Tests/EventTest.php
	src/Symfony/Component/Form/Tests/Extension/HttpFoundation/EventListener/LegacyBindRequestListenerTest.php
	src/Symfony/Component/HttpFoundation/Tests/Session/Flash/FlashBagTest.php
	src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Handler/LegacyPdoSessionHandlerTest.php
	src/Symfony/Component/HttpKernel/Tests/DependencyInjection/FragmentRendererPassTest.php
	src/Symfony/Component/HttpKernel/Tests/EventListener/ProfilerListenerTest.php
	src/Symfony/Component/HttpKernel/Tests/KernelTest.php
	src/Symfony/Component/Locale/Tests/LocaleTest.php
	src/Symfony/Component/Locale/Tests/Stub/StubLocaleTest.php
	src/Symfony/Component/OptionsResolver/Tests/LegacyOptionsResolverTest.php
	src/Symfony/Component/OptionsResolver/Tests/LegacyOptionsTest.php
	src/Symfony/Component/Process/Tests/AbstractProcessTest.php
	src/Symfony/Component/Routing/Tests/Annotation/RouteTest.php
	src/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php
	src/Symfony/Component/Routing/Tests/Loader/XmlFileLoaderTest.php
	src/Symfony/Component/Routing/Tests/Loader/YamlFileLoaderTest.php
	src/Symfony/Component/Routing/Tests/Matcher/Dumper/LegacyApacheMatcherDumperTest.php
	src/Symfony/Component/Routing/Tests/Matcher/LegacyApacheUrlMatcherTest.php
	src/Symfony/Component/Routing/Tests/RouteTest.php
	src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php
	src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php
	src/Symfony/Component/Serializer/Tests/Normalizer/PropertyNormalizerTest.php
	src/Symfony/Component/Templating/Tests/Helper/LegacyAssetsHelperTest.php
	src/Symfony/Component/Templating/Tests/Helper/LegacyCoreAssetsHelperTest.php
	src/Symfony/Component/Templating/Tests/Loader/LoaderTest.php
	src/Symfony/Component/Yaml/Tests/YamlTest.php
This commit is contained in:
Nicolas Grekas 2015-06-19 17:19:52 +02:00
commit 4eaa4bffd2
32 changed files with 145 additions and 136 deletions

View File

@ -12,7 +12,7 @@
namespace Symfony\Bridge\PhpUnit; namespace Symfony\Bridge\PhpUnit;
/** /**
* Catch deprecation notices and print a summary report at the end of the test suite * Catch deprecation notices and print a summary report at the end of the test suite.
* *
* @author Nicolas Grekas <p@tchwork.com> * @author Nicolas Grekas <p@tchwork.com>
*/ */
@ -26,9 +26,11 @@ class DeprecationErrorHandler
return; return;
} }
$deprecations = array( $deprecations = array(
'unsilencedCount' => 0,
'remainingCount' => 0, 'remainingCount' => 0,
'legacyCount' => 0, 'legacyCount' => 0,
'otherCount' => 0, 'otherCount' => 0,
'unsilenced' => array(),
'remaining' => array(), 'remaining' => array(),
'legacy' => array(), 'legacy' => array(),
'other' => array(), 'other' => array(),
@ -45,21 +47,25 @@ class DeprecationErrorHandler
// No-op // No-op
} }
if (isset($trace[$i]['object']) || isset($trace[$i]['class'])) { if (0 !== error_reporting()) {
$group = 'unsilenced';
$ref = &$deprecations[$group][$msg]['count'];
++$ref;
} elseif (isset($trace[$i]['object']) || isset($trace[$i]['class'])) {
$class = isset($trace[$i]['object']) ? get_class($trace[$i]['object']) : $trace[$i]['class']; $class = isset($trace[$i]['object']) ? get_class($trace[$i]['object']) : $trace[$i]['class'];
$method = $trace[$i]['function']; $method = $trace[$i]['function'];
$group = 0 === strpos($method, 'testLegacy') || 0 === strpos($method, 'provideLegacy') || 0 === strpos($method, 'getLegacy') || strpos($class, '\Legacy') || in_array('legacy', \PHPUnit_Util_Test::getGroups($class, $method), true) ? 'legacy' : 'remaining'; $group = 0 === strpos($method, 'testLegacy') || 0 === strpos($method, 'provideLegacy') || 0 === strpos($method, 'getLegacy') || strpos($class, '\Legacy') || in_array('legacy', \PHPUnit_Util_Test::getGroups($class, $method), true) ? 'legacy' : 'remaining';
if ('legacy' !== $group && 'weak' !== $mode) { if ('legacy' !== $group && 'weak' !== $mode) {
$ref =& $deprecations[$group][$msg]['count']; $ref = &$deprecations[$group][$msg]['count'];
++$ref; ++$ref;
$ref =& $deprecations[$group][$msg][$class.'::'.$method]; $ref = &$deprecations[$group][$msg][$class.'::'.$method];
++$ref; ++$ref;
} }
} else { } else {
$group = 'other'; $group = 'other';
$ref =& $deprecations[$group][$msg]['count']; $ref = &$deprecations[$group][$msg]['count'];
++$ref; ++$ref;
} }
++$deprecations[$group.'Count']; ++$deprecations[$group.'Count'];
@ -95,7 +101,7 @@ class DeprecationErrorHandler
return $b['count'] - $a['count']; return $b['count'] - $a['count'];
}; };
foreach (array('remaining', 'legacy', 'other') as $group) { foreach (array('unsilenced', 'remaining', 'legacy', 'other') as $group) {
if ($deprecations[$group.'Count']) { if ($deprecations[$group.'Count']) {
echo "\n", $colorize(sprintf('%s deprecation notices (%d)', ucfirst($group), $deprecations[$group.'Count']), 'legacy' !== $group), "\n"; echo "\n", $colorize(sprintf('%s deprecation notices (%d)', ucfirst($group), $deprecations[$group.'Count']), 'legacy' !== $group), "\n";
@ -117,7 +123,7 @@ class DeprecationErrorHandler
if (!empty($notices)) { if (!empty($notices)) {
echo "\n"; echo "\n";
} }
if ('weak' !== $mode && ($deprecations['remaining'] || $deprecations['other'])) { if ('weak' !== $mode && ($deprecations['unsilenced'] || $deprecations['remaining'] || $deprecations['other'])) {
exit(1); exit(1);
} }
}); });

View File

@ -9,7 +9,8 @@ It comes with the following features:
* auto-register `class_exists` to load Doctrine annotations; * auto-register `class_exists` to load Doctrine annotations;
* print a user deprecation notices summary at the end of the test suite. * print a user deprecation notices summary at the end of the test suite.
By default any non-legacy-tagged deprecation notice will make tests fail. By default any non-legacy-tagged or any non-@-silenced deprecation notices will
make tests fail.
This can be changed by setting the SYMFONY_DEPRECATIONS_HELPER environment This can be changed by setting the SYMFONY_DEPRECATIONS_HELPER environment
variable to `weak`. This will make the bridge ignore deprecation notices and variable to `weak`. This will make the bridge ignore deprecation notices and
is useful to projects that must use deprecated interfaces for backward is useful to projects that must use deprecated interfaces for backward
@ -17,6 +18,8 @@ compatibility reasons.
A summary of deprecation notices is displayed at the end of the test suite: A summary of deprecation notices is displayed at the end of the test suite:
* **Unsilenced** reports deprecation notices that were triggered without the
recommended @-silencing operator;
* **Legacy** deprecation notices denote tests that explicitly test some legacy * **Legacy** deprecation notices denote tests that explicitly test some legacy
interfaces. There are four ways to mark a test as legacy: interfaces. There are four ways to mark a test as legacy:
- make its class start with the `Legacy` prefix; - make its class start with the `Legacy` prefix;
@ -35,6 +38,12 @@ Add this bridge to the `require-dev` section of your composer.json file
When running `phpunit`, you will see a summary of deprecation notices at the end When running `phpunit`, you will see a summary of deprecation notices at the end
of the test suite. of the test suite.
Deprecation notices in the **Unsilenced** section should just be @-silenced:
`@trigger_error('...', E_USER_DEPRECATED);`. Without the @-silencing operator,
users would need to opt-out from deprecation notices. Silencing by default swaps
this behavior and allows users to opt-in when they are ready to cope with them
(by adding a custom error handler like the one provided by this bridge.)
Deprecation notices in the **Remaining/Other** section need some thought. Deprecation notices in the **Remaining/Other** section need some thought.
You have to decide either to: You have to decide either to:

View File

@ -46,8 +46,10 @@
</service> </service>
<!-- CoreExtension --> <!-- CoreExtension -->
<service id="form.property_accessor" alias="property_accessor" public="false" />
<service id="form.type.form" class="Symfony\Component\Form\Extension\Core\Type\FormType"> <service id="form.type.form" class="Symfony\Component\Form\Extension\Core\Type\FormType">
<argument type="service" id="property_accessor"/> <argument type="service" id="form.property_accessor" />
<tag name="form.type" alias="form" /> <tag name="form.type" alias="form" />
</service> </service>
<service id="form.type.birthday" class="Symfony\Component\Form\Extension\Core\Type\BirthdayType"> <service id="form.type.birthday" class="Symfony\Component\Form\Extension\Core\Type\BirthdayType">

View File

@ -14,9 +14,13 @@
<argument type="collection" /> <argument type="collection" />
</service> </service>
<service id="serializer.property_accessor" alias="property_accessor" public="false" />
<!-- Normalizer --> <!-- Normalizer -->
<service id="serializer.normalizer.object" class="Symfony\Component\Serializer\Normalizer\ObjectNormalizer" public="false"> <service id="serializer.normalizer.object" class="Symfony\Component\Serializer\Normalizer\ObjectNormalizer" public="false">
<argument type="service" id="serializer.mapping.class_metadata_factory" /> <argument type="service" id="serializer.mapping.class_metadata_factory" />
<argument>null</argument>
<argument type="service" id="serializer.property_accessor" />
<!-- Run after all custom serializers --> <!-- Run after all custom serializers -->
<tag name="serializer.normalizer" priority="-1000" /> <tag name="serializer.normalizer" priority="-1000" />

View File

@ -20,11 +20,6 @@ use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\FragmentRenderer
*/ */
class LegacyFragmentRendererPassTest extends \PHPUnit_Framework_TestCase class LegacyFragmentRendererPassTest extends \PHPUnit_Framework_TestCase
{ {
protected function setUp()
{
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
}
/** /**
* Tests that content rendering not implementing FragmentRendererInterface * Tests that content rendering not implementing FragmentRendererInterface
* trigger an exception. * trigger an exception.

View File

@ -312,8 +312,6 @@ abstract class FrameworkExtensionTest extends TestCase
*/ */
public function testLegacyFullyConfiguredValidationService() public function testLegacyFullyConfiguredValidationService()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
if (!extension_loaded('apc')) { if (!extension_loaded('apc')) {
$this->markTestSkipped('The apc extension is not available.'); $this->markTestSkipped('The apc extension is not available.');
} }
@ -415,8 +413,6 @@ abstract class FrameworkExtensionTest extends TestCase
*/ */
public function testLegacyFormCsrfFieldNameCanBeSetUnderCsrfSettings() public function testLegacyFormCsrfFieldNameCanBeSetUnderCsrfSettings()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$container = $this->createContainerFromFile('form_csrf_sets_field_name'); $container = $this->createContainerFromFile('form_csrf_sets_field_name');
$this->assertTrue($container->getParameter('form.type_extension.csrf.enabled')); $this->assertTrue($container->getParameter('form.type_extension.csrf.enabled'));
@ -428,8 +424,6 @@ abstract class FrameworkExtensionTest extends TestCase
*/ */
public function testLegacyFormCsrfFieldNameUnderFormSettingsTakesPrecedence() public function testLegacyFormCsrfFieldNameUnderFormSettingsTakesPrecedence()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$container = $this->createContainerFromFile('form_csrf_under_form_sets_field_name'); $container = $this->createContainerFromFile('form_csrf_under_form_sets_field_name');
$this->assertTrue($container->getParameter('form.type_extension.csrf.enabled')); $this->assertTrue($container->getParameter('form.type_extension.csrf.enabled'));

View File

@ -22,8 +22,6 @@ class LegacyContainerAwareHIncludeFragmentRendererTest extends TestCase
{ {
public function testRender() public function testRender()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface'); $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
$container->expects($this->once()) $container->expects($this->once())
->method('get') ->method('get')

View File

@ -31,8 +31,6 @@ class GlobalVariablesTest extends TestCase
*/ */
public function testLegacyGetSecurity() public function testLegacyGetSecurity()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$securityContext = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface'); $securityContext = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
$this->assertNull($this->globals->getSecurity()); $this->assertNull($this->globals->getSecurity());

View File

@ -45,8 +45,6 @@ class SecurityDataCollectorTest extends \PHPUnit_Framework_TestCase
*/ */
public function testLegacyCollectWhenAuthenticationTokenIsNull() public function testLegacyCollectWhenAuthenticationTokenIsNull()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$tokenStorage = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface'); $tokenStorage = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
$collector = new SecurityDataCollector($tokenStorage, $this->getRoleHierarchy()); $collector = new SecurityDataCollector($tokenStorage, $this->getRoleHierarchy());
$collector->collect($this->getRequest(), $this->getResponse()); $collector->collect($this->getRequest(), $this->getResponse());

View File

@ -651,7 +651,7 @@ class ApplicationTest extends \PHPUnit_Framework_TestCase
} }
/** /**
* Issue #9285 * Issue #9285.
* *
* If the "verbose" option is just before an argument in ArgvInput, * If the "verbose" option is just before an argument in ArgvInput,
* an argument value should not be treated as verbosity value. * an argument value should not be treated as verbosity value.

View File

@ -376,7 +376,7 @@ class InputDefinitionTest extends \PHPUnit_Framework_TestCase
array(new InputDefinition(array(new InputOption('foo'), new InputArgument('foo', InputArgument::REQUIRED))), '[--foo] [--] <foo>', 'puts [--] between options and arguments'), array(new InputDefinition(array(new InputOption('foo'), new InputArgument('foo', InputArgument::REQUIRED))), '[--foo] [--] <foo>', 'puts [--] between options and arguments'),
); );
} }
public function testGetShortSynopsis() public function testGetShortSynopsis()
{ {
$definition = new InputDefinition(array(new InputOption('foo'), new InputOption('bar'), new InputArgument('cat'))); $definition = new InputDefinition(array(new InputOption('foo'), new InputOption('bar'), new InputArgument('cat')));

View File

@ -169,8 +169,6 @@ class ErrorHandlerTest extends \PHPUnit_Framework_TestCase
public function testHandleError() public function testHandleError()
{ {
$this->iniSet('error_reporting', -1);
try { try {
$handler = ErrorHandler::register(); $handler = ErrorHandler::register();
$handler->throwAt(0, true); $handler->throwAt(0, true);

View File

@ -195,7 +195,7 @@ class FormType extends BaseType
$readOnlyNormalizer = function (Options $options, $readOnly) { $readOnlyNormalizer = function (Options $options, $readOnly) {
if (null !== $readOnly) { if (null !== $readOnly) {
trigger_error('The form option "read_only" is deprecated since version 2.8 and will be removed in 3.0. Use "attr[\'readonly\']" instead.', E_USER_DEPRECATED); @trigger_error('The form option "read_only" is deprecated since version 2.8 and will be removed in 3.0. Use "attr[\'readonly\']" instead.', E_USER_DEPRECATED);
return $readOnly; return $readOnly;
} }

View File

@ -23,8 +23,6 @@ class LegacySessionCsrfProviderTest extends \PHPUnit_Framework_TestCase
protected function setUp() protected function setUp()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$this->session = $this->getMock( $this->session = $this->getMock(
'Symfony\Component\HttpFoundation\Session\Session', 'Symfony\Component\HttpFoundation\Session\Session',
array(), array(),

View File

@ -26,8 +26,6 @@ class LegacySecurityContextTest extends \PHPUnit_Framework_TestCase
protected function setUp() protected function setUp()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$this->tokenStorage = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface'); $this->tokenStorage = $this->getMock('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface');
$this->authorizationChecker = $this->getMock('Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface'); $this->authorizationChecker = $this->getMock('Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface');
$this->securityContext = new SecurityContext($this->tokenStorage, $this->authorizationChecker); $this->securityContext = new SecurityContext($this->tokenStorage, $this->authorizationChecker);

View File

@ -24,8 +24,6 @@ class LegacySecurityContextInterfaceTest extends \PHPUnit_Framework_TestCase
*/ */
public function testConstantSync() public function testConstantSync()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$this->assertSame(Security::ACCESS_DENIED_ERROR, SecurityContextInterface::ACCESS_DENIED_ERROR); $this->assertSame(Security::ACCESS_DENIED_ERROR, SecurityContextInterface::ACCESS_DENIED_ERROR);
$this->assertSame(Security::AUTHENTICATION_ERROR, SecurityContextInterface::AUTHENTICATION_ERROR); $this->assertSame(Security::AUTHENTICATION_ERROR, SecurityContextInterface::AUTHENTICATION_ERROR);
$this->assertSame(Security::LAST_USERNAME, SecurityContextInterface::LAST_USERNAME); $this->assertSame(Security::LAST_USERNAME, SecurityContextInterface::LAST_USERNAME);

View File

@ -276,7 +276,7 @@ class Translator implements TranslatorInterface, TranslatorBagInterface
*/ */
public function getMessages($locale = null) public function getMessages($locale = null)
{ {
trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use TranslatorBagInterface::getCatalogue() method instead.', E_USER_DEPRECATED); @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use TranslatorBagInterface::getCatalogue() method instead.', E_USER_DEPRECATED);
$catalogue = $this->getCatalogue($locale); $catalogue = $this->getCatalogue($locale);
$messages = $catalogue->all(); $messages = $catalogue->all();

View File

@ -51,10 +51,6 @@ abstract class AbstractConstraintValidatorTest extends \PHPUnit_Framework_TestCa
protected function setUp() protected function setUp()
{ {
if (Validation::API_VERSION_2_5 !== $this->getApiVersion()) {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
}
$this->group = 'MyGroup'; $this->group = 'MyGroup';
$this->metadata = null; $this->metadata = null;
$this->object = null; $this->object = null;

View File

@ -191,8 +191,6 @@ class CallbackValidatorTest extends AbstractConstraintValidatorTest
*/ */
public function testLegacySingleMethodBc() public function testLegacySingleMethodBc()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$object = new CallbackValidatorTest_Object(); $object = new CallbackValidatorTest_Object();
$constraint = new Callback(array('validate')); $constraint = new Callback(array('validate'));
@ -209,8 +207,6 @@ class CallbackValidatorTest extends AbstractConstraintValidatorTest
*/ */
public function testLegacySingleMethodBcExplicitName() public function testLegacySingleMethodBcExplicitName()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$object = new CallbackValidatorTest_Object(); $object = new CallbackValidatorTest_Object();
$constraint = new Callback(array('methods' => array('validate'))); $constraint = new Callback(array('methods' => array('validate')));
@ -227,8 +223,6 @@ class CallbackValidatorTest extends AbstractConstraintValidatorTest
*/ */
public function testLegacyMultipleMethodsBc() public function testLegacyMultipleMethodsBc()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$object = new CallbackValidatorTest_Object(); $object = new CallbackValidatorTest_Object();
$constraint = new Callback(array('validate', 'validateStatic')); $constraint = new Callback(array('validate', 'validateStatic'));
@ -247,8 +241,6 @@ class CallbackValidatorTest extends AbstractConstraintValidatorTest
*/ */
public function testLegacyMultipleMethodsBcExplicitName() public function testLegacyMultipleMethodsBcExplicitName()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$object = new CallbackValidatorTest_Object(); $object = new CallbackValidatorTest_Object();
$constraint = new Callback(array( $constraint = new Callback(array(
'methods' => array('validate', 'validateStatic'), 'methods' => array('validate', 'validateStatic'),
@ -269,8 +261,6 @@ class CallbackValidatorTest extends AbstractConstraintValidatorTest
*/ */
public function testLegacySingleStaticMethodBc() public function testLegacySingleStaticMethodBc()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$object = new CallbackValidatorTest_Object(); $object = new CallbackValidatorTest_Object();
$constraint = new Callback(array( $constraint = new Callback(array(
array(__CLASS__.'_Class', 'validateCallback'), array(__CLASS__.'_Class', 'validateCallback'),
@ -289,8 +279,6 @@ class CallbackValidatorTest extends AbstractConstraintValidatorTest
*/ */
public function testLegacySingleStaticMethodBcExplicitName() public function testLegacySingleStaticMethodBcExplicitName()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$object = new CallbackValidatorTest_Object(); $object = new CallbackValidatorTest_Object();
$constraint = new Callback(array( $constraint = new Callback(array(
'methods' => array(array(__CLASS__.'_Class', 'validateCallback')), 'methods' => array(array(__CLASS__.'_Class', 'validateCallback')),
@ -329,8 +317,6 @@ class CallbackValidatorTest extends AbstractConstraintValidatorTest
*/ */
public function testLegacyExpectEitherCallbackOrMethods() public function testLegacyExpectEitherCallbackOrMethods()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$object = new CallbackValidatorTest_Object(); $object = new CallbackValidatorTest_Object();
$this->validator->validate($object, new Callback(array( $this->validator->validate($object, new Callback(array(

View File

@ -37,8 +37,6 @@ class GroupSequenceTest extends \PHPUnit_Framework_TestCase
*/ */
public function testLegacyIterate() public function testLegacyIterate()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$sequence = new GroupSequence(array('Group 1', 'Group 2')); $sequence = new GroupSequence(array('Group 1', 'Group 2'));
$this->assertSame(array('Group 1', 'Group 2'), iterator_to_array($sequence)); $this->assertSame(array('Group 1', 'Group 2'), iterator_to_array($sequence));
@ -49,8 +47,6 @@ class GroupSequenceTest extends \PHPUnit_Framework_TestCase
*/ */
public function testLegacyCount() public function testLegacyCount()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$sequence = new GroupSequence(array('Group 1', 'Group 2')); $sequence = new GroupSequence(array('Group 1', 'Group 2'));
$this->assertCount(2, $sequence); $this->assertCount(2, $sequence);
@ -61,8 +57,6 @@ class GroupSequenceTest extends \PHPUnit_Framework_TestCase
*/ */
public function testLegacyArrayAccess() public function testLegacyArrayAccess()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$sequence = new GroupSequence(array('Group 1', 'Group 2')); $sequence = new GroupSequence(array('Group 1', 'Group 2'));
$this->assertSame('Group 1', $sequence[0]); $this->assertSame('Group 1', $sequence[0]);
@ -85,8 +79,6 @@ class GroupSequenceTest extends \PHPUnit_Framework_TestCase
*/ */
public function testLegacyGetExpectsExistingKey() public function testLegacyGetExpectsExistingKey()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$sequence = new GroupSequence(array('Group 1', 'Group 2')); $sequence = new GroupSequence(array('Group 1', 'Group 2'));
$sequence[2]; $sequence[2];
@ -97,8 +89,6 @@ class GroupSequenceTest extends \PHPUnit_Framework_TestCase
*/ */
public function testLegacyUnsetIgnoresNonExistingKeys() public function testLegacyUnsetIgnoresNonExistingKeys()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$sequence = new GroupSequence(array('Group 1', 'Group 2')); $sequence = new GroupSequence(array('Group 1', 'Group 2'));
// should not fail // should not fail

View File

@ -41,8 +41,6 @@ class LegacyExecutionContextTest extends \PHPUnit_Framework_TestCase
protected function setUp() protected function setUp()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$this->visitor = $this->getMockBuilder('Symfony\Component\Validator\ValidationVisitor') $this->visitor = $this->getMockBuilder('Symfony\Component\Validator\ValidationVisitor')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();

View File

@ -20,8 +20,6 @@ class LegacyApcCacheTest extends \PHPUnit_Framework_TestCase
{ {
protected function setUp() protected function setUp()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
if (!extension_loaded('apc') || !ini_get('apc.enable_cli')) { if (!extension_loaded('apc') || !ini_get('apc.enable_cli')) {
$this->markTestSkipped('APC is not loaded.'); $this->markTestSkipped('APC is not loaded.');
} }

View File

@ -24,8 +24,6 @@ class LegacyElementMetadataTest extends \PHPUnit_Framework_TestCase
protected function setUp() protected function setUp()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$this->metadata = new TestElementMetadata(); $this->metadata = new TestElementMetadata();
} }

View File

@ -40,8 +40,6 @@ class MemberMetadataTest extends \PHPUnit_Framework_TestCase
*/ */
public function testLegacyAddValidSetsMemberToCascaded() public function testLegacyAddValidSetsMemberToCascaded()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$result = $this->metadata->addConstraint(new Valid()); $result = $this->metadata->addConstraint(new Valid());
$this->assertEquals(array(), $this->metadata->getConstraints()); $this->assertEquals(array(), $this->metadata->getConstraints());
@ -54,8 +52,6 @@ class MemberMetadataTest extends \PHPUnit_Framework_TestCase
*/ */
public function testLegacyAddOtherConstraintDoesNotSetMemberToCascaded() public function testLegacyAddOtherConstraintDoesNotSetMemberToCascaded()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$result = $this->metadata->addConstraint($constraint = new ConstraintA()); $result = $this->metadata->addConstraint($constraint = new ConstraintA());
$this->assertEquals(array($constraint), $this->metadata->getConstraints()); $this->assertEquals(array($constraint), $this->metadata->getConstraints());

View File

@ -570,8 +570,6 @@ abstract class Abstract2Dot5ApiTest extends AbstractValidatorTest
*/ */
public function testLegacyPropertyMetadataMustImplementPropertyMetadataInterface() public function testLegacyPropertyMetadataMustImplementPropertyMetadataInterface()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
$entity = new Entity(); $entity = new Entity();
// Legacy interface // Legacy interface

View File

@ -42,8 +42,6 @@ abstract class AbstractLegacyApiTest extends AbstractValidatorTest
protected function setUp() protected function setUp()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
parent::setUp(); parent::setUp();
$this->validator = $this->createValidator($this->metadataFactory); $this->validator = $this->createValidator($this->metadataFactory);

View File

@ -827,8 +827,6 @@ abstract class AbstractValidatorTest extends \PHPUnit_Framework_TestCase
*/ */
public function testLegacyValidatePropertyFailsIfPropertiesNotSupported() public function testLegacyValidatePropertyFailsIfPropertiesNotSupported()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
// $metadata does not implement PropertyMetadataContainerInterface // $metadata does not implement PropertyMetadataContainerInterface
$metadata = $this->getMock('Symfony\Component\Validator\MetadataInterface'); $metadata = $this->getMock('Symfony\Component\Validator\MetadataInterface');
@ -957,8 +955,6 @@ abstract class AbstractValidatorTest extends \PHPUnit_Framework_TestCase
*/ */
public function testLegacyValidatePropertyValueFailsIfPropertiesNotSupported() public function testLegacyValidatePropertyValueFailsIfPropertiesNotSupported()
{ {
$this->iniSet('error_reporting', -1 & ~E_USER_DEPRECATED);
// $metadata does not implement PropertyMetadataContainerInterface // $metadata does not implement PropertyMetadataContainerInterface
$metadata = $this->getMock('Symfony\Component\Validator\MetadataInterface'); $metadata = $this->getMock('Symfony\Component\Validator\MetadataInterface');

View File

@ -31,7 +31,6 @@ class CliDumper extends AbstractDumper
'num' => '1;38;5;38', 'num' => '1;38;5;38',
'const' => '1;38;5;208', 'const' => '1;38;5;208',
'str' => '1;38;5;113', 'str' => '1;38;5;113',
'cchr' => '7',
'note' => '38;5;38', 'note' => '38;5;38',
'ref' => '38;5;247', 'ref' => '38;5;247',
'public' => '', 'public' => '',
@ -42,7 +41,15 @@ class CliDumper extends AbstractDumper
'index' => '38;5;38', 'index' => '38;5;38',
); );
protected static $controlCharsRx = '/[\x00-\x1F\x7F]/'; protected static $controlCharsRx = '/[\x00-\x1F\x7F]+/';
protected static $controlCharsMap = array(
"\t" => '\t',
"\n" => '\n',
"\v" => '\v',
"\f" => '\f',
"\r" => '\r',
"\033" => '\e',
);
/** /**
* {@inheritdoc} * {@inheritdoc}
@ -146,7 +153,7 @@ class CliDumper extends AbstractDumper
$this->line .= $this->style($style, $value, $attr); $this->line .= $this->style($style, $value, $attr);
$this->dumpLine($cursor->depth); $this->dumpLine($cursor->depth, true);
} }
/** /**
@ -161,13 +168,17 @@ class CliDumper extends AbstractDumper
} }
if ('' === $str) { if ('' === $str) {
$this->line .= '""'; $this->line .= '""';
$this->dumpLine($cursor->depth); $this->dumpLine($cursor->depth, true);
} else { } else {
$attr = array( $attr = array(
'length' => function_exists('iconv_strlen') && 0 <= $cut ? iconv_strlen($str, 'UTF-8') + $cut : 0, 'length' => 0 <= $cut && function_exists('iconv_strlen') ? iconv_strlen($str, 'UTF-8') + $cut : 0,
'binary' => $bin, 'binary' => $bin,
); );
$str = explode("\n", $str); $str = explode("\n", $str);
if (isset($str[1]) && !isset($str[2]) && !isset($str[1][0])) {
unset($str[1]);
$str[0] .= "\n";
}
$m = count($str) - 1; $m = count($str) - 1;
$i = $lineCut = 0; $i = $lineCut = 0;
@ -183,20 +194,30 @@ class CliDumper extends AbstractDumper
} }
foreach ($str as $str) { foreach ($str as $str) {
if ($i < $m) {
$str .= "\n";
}
if (0 < $this->maxStringWidth && $this->maxStringWidth < $len = iconv_strlen($str, 'UTF-8')) { if (0 < $this->maxStringWidth && $this->maxStringWidth < $len = iconv_strlen($str, 'UTF-8')) {
$str = iconv_substr($str, 0, $this->maxStringWidth, 'UTF-8'); $str = iconv_substr($str, 0, $this->maxStringWidth, 'UTF-8');
$lineCut = $len - $this->maxStringWidth; $lineCut = $len - $this->maxStringWidth;
} }
if ($m && 0 < $cursor->depth) {
if ($m) {
$this->line .= $this->indentPad; $this->line .= $this->indentPad;
} }
$this->line .= $this->style('str', $str, $attr); if ('' !== $str) {
$this->line .= $this->style('str', $str, $attr);
}
if ($i++ == $m) { if ($i++ == $m) {
$this->line .= '"';
if ($m) { if ($m) {
$this->line .= '""'; if ('' !== $str) {
$this->dumpLine($cursor->depth);
if (0 < $cursor->depth) {
$this->line .= $this->indentPad;
}
}
$this->line .= '"""';
} else {
$this->line .= '"';
} }
if ($cut < 0) { if ($cut < 0) {
$this->line .= '…'; $this->line .= '…';
@ -210,7 +231,7 @@ class CliDumper extends AbstractDumper
$lineCut = 0; $lineCut = 0;
} }
$this->dumpLine($cursor->depth); $this->dumpLine($cursor->depth, $i > $m);
} }
} }
} }
@ -228,7 +249,7 @@ class CliDumper extends AbstractDumper
if (Cursor::HASH_OBJECT === $type) { if (Cursor::HASH_OBJECT === $type) {
$prefix = 'stdClass' !== $class ? $this->style('note', $class).' {' : '{'; $prefix = 'stdClass' !== $class ? $this->style('note', $class).' {' : '{';
} elseif (Cursor::HASH_RESOURCE === $type) { } elseif (Cursor::HASH_RESOURCE === $type) {
$prefix = $this->style('note', ':'.$class).' {'; $prefix = $this->style('note', $class.' resource').($hasChild ? ' {' : ' ');
} else { } else {
$prefix = $class ? $this->style('note', 'array:'.$class).' [' : '['; $prefix = $class ? $this->style('note', 'array:'.$class).' [' : '[';
} }
@ -237,6 +258,8 @@ class CliDumper extends AbstractDumper
$prefix .= $this->style('ref', (Cursor::HASH_RESOURCE === $type ? '@' : '#').(0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->softRefTo), array('count' => $cursor->softRefCount)); $prefix .= $this->style('ref', (Cursor::HASH_RESOURCE === $type ? '@' : '#').(0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->softRefTo), array('count' => $cursor->softRefCount));
} elseif ($cursor->hardRefTo && !$cursor->refIndex && $class) { } elseif ($cursor->hardRefTo && !$cursor->refIndex && $class) {
$prefix .= $this->style('ref', '&'.$cursor->hardRefTo, array('count' => $cursor->hardRefCount)); $prefix .= $this->style('ref', '&'.$cursor->hardRefTo, array('count' => $cursor->hardRefCount));
} elseif (!$hasChild && Cursor::HASH_RESOURCE === $type) {
$prefix = substr($prefix, 0, -1);
} }
$this->line .= $prefix; $this->line .= $prefix;
@ -252,8 +275,8 @@ class CliDumper extends AbstractDumper
public function leaveHash(Cursor $cursor, $type, $class, $hasChild, $cut) public function leaveHash(Cursor $cursor, $type, $class, $hasChild, $cut)
{ {
$this->dumpEllipsis($cursor, $hasChild, $cut); $this->dumpEllipsis($cursor, $hasChild, $cut);
$this->line .= Cursor::HASH_OBJECT === $type || Cursor::HASH_RESOURCE === $type ? '}' : ']'; $this->line .= Cursor::HASH_OBJECT === $type ? '}' : (Cursor::HASH_RESOURCE !== $type ? ']' : ($hasChild ? '}' : ''));
$this->dumpLine($cursor->depth); $this->dumpLine($cursor->depth, true);
} }
/** /**
@ -360,12 +383,34 @@ class CliDumper extends AbstractDumper
} }
$style = $this->styles[$style]; $style = $this->styles[$style];
$cchr = $this->colors ? "\033[m\033[{$style};{$this->styles['cchr']}m%s\033[m\033[{$style}m" : '%s';
$value = preg_replace_callback(self::$controlCharsRx, function ($r) use ($cchr) {
return sprintf($cchr, "\x7F" === $r[0] ? '?' : chr(64 + ord($r[0])));
}, $value);
return $this->colors ? sprintf("\033[%sm%s\033[m\033[%sm", $style, $value, $this->styles['default']) : $value; $map = static::$controlCharsMap;
$startCchr = $this->colors ? "\033[m\033[{$this->styles['default']}m" : '';
$endCchr = $this->colors ? "\033[m\033[{$style}m" : '';
$value = preg_replace_callback(static::$controlCharsRx, function ($c) use ($map, $startCchr, $endCchr) {
$s = $startCchr;
$c = $c[$i = 0];
do {
$s .= isset($map[$c[$i]]) ? $map[$c[$i]] : sprintf('\x%02X', ord($c[$i]));
} while (isset($c[++$i]));
return $s.$endCchr;
}, $value, -1, $cchrCount);
if ($this->colors) {
if ($cchrCount && "\033" === $value[0]) {
$value = substr($value, strlen($startCchr));
} else {
$value = "\033[{$style}m".$value;
}
if ($cchrCount && $endCchr === substr($value, -strlen($endCchr))) {
$value = substr($value, 0, -strlen($endCchr));
} else {
$value .= "\033[{$this->styles['default']}m";
}
}
return $value;
} }
/** /**
@ -418,7 +463,7 @@ class CliDumper extends AbstractDumper
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
protected function dumpLine($depth) protected function dumpLine($depth, $endOfValue = false)
{ {
if ($this->colors) { if ($this->colors) {
$this->line = sprintf("\033[%sm%s\033[m", $this->styles['default'], $this->line); $this->line = sprintf("\033[%sm%s\033[m", $this->styles['default'], $this->line);

View File

@ -35,7 +35,6 @@ class HtmlDumper extends CliDumper
'num' => 'font-weight:bold; color:#1299DA', 'num' => 'font-weight:bold; color:#1299DA',
'const' => 'font-weight:bold', 'const' => 'font-weight:bold',
'str' => 'font-weight:bold; color:#56DB3A', 'str' => 'font-weight:bold; color:#56DB3A',
'cchr' => 'color:#FF8400',
'note' => 'color:#1299DA', 'note' => 'color:#1299DA',
'ref' => 'color:#A0A0A0', 'ref' => 'color:#A0A0A0',
'public' => 'color:#FFFFFF', 'public' => 'color:#FFFFFF',
@ -376,10 +375,6 @@ EOHTML;
} }
$v = htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); $v = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
$v = preg_replace_callback(self::$controlCharsRx, function ($r) {
// Use Unicode Control Pictures - see http://www.unicode.org/charts/PDF/U2400.pdf
return sprintf('<span class=sf-dump-cchr title=\\x%02X>&#%d;</span>', ord($r[0]), "\x7F" !== $r[0] ? 0x2400 + ord($r[0]) : 0x2421);
}, $v);
if ('ref' === $style) { if ('ref' === $style) {
if (empty($attr['count'])) { if (empty($attr['count'])) {
@ -396,25 +391,44 @@ EOHTML;
$style .= sprintf(' title="%s"', empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property'); $style .= sprintf(' title="%s"', empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property');
} elseif ('str' === $style && 1 < $attr['length']) { } elseif ('str' === $style && 1 < $attr['length']) {
$style .= sprintf(' title="%s%s characters"', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : ''); $style .= sprintf(' title="%s%s characters"', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : '');
} elseif ('note' === $style) { } elseif ('note' === $style && false !== $c = strrpos($v, '\\')) {
if (false !== $c = strrpos($v, '\\')) { return sprintf('<abbr title="%s" class=sf-dump-%s>%s</abbr>', $v, $style, substr($v, $c + 1));
return sprintf('<abbr title="%s" class=sf-dump-%s>%s</abbr>', $v, $style, substr($v, $c + 1));
} elseif (':' === $v[0]) {
return sprintf('<abbr title="`%s` resource" class=sf-dump-%s>%s</abbr>', substr($v, 1), $style, $v);
}
} elseif ('protected' === $style) { } elseif ('protected' === $style) {
$style .= ' title="Protected property"'; $style .= ' title="Protected property"';
} elseif ('private' === $style) { } elseif ('private' === $style) {
$style .= sprintf(' title="Private property defined in class:&#10;`%s`"', $attr['class']); $style .= sprintf(' title="Private property defined in class:&#10;`%s`"', $attr['class']);
} }
return "<span class=sf-dump-$style>$v</span>"; $map = static::$controlCharsMap;
$style = "<span class=sf-dump-{$style}>";
$v = preg_replace_callback(static::$controlCharsRx, function ($c) use ($map, $style) {
$s = '</span>';
$c = $c[$i = 0];
do {
$s .= isset($map[$c[$i]]) ? $map[$c[$i]] : sprintf('\x%02X', ord($c[$i]));
} while (isset($c[++$i]));
return $s.$style;
}, $v, -1, $cchrCount);
if ($cchrCount && '<' === $v[0]) {
$v = substr($v, 7);
} else {
$v = $style.$v;
}
if ($cchrCount && '>' === substr($v, -1)) {
$v = substr($v, 0, -strlen($style));
} else {
$v .= '</span>';
}
return $v;
} }
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
protected function dumpLine($depth) protected function dumpLine($depth, $endOfValue = false)
{ {
if (-1 === $this->lastDepth) { if (-1 === $this->lastDepth) {
$this->line = sprintf($this->dumpPrefix, $this->dumpId, $this->indentPad).$this->line; $this->line = sprintf($this->dumpPrefix, $this->dumpId, $this->indentPad).$this->line;

View File

@ -56,10 +56,10 @@ array:25 [
4 => INF 4 => INF
5 => -INF 5 => -INF
6 => {$intMax} 6 => {$intMax}
"str" => "déjà" "str" => "déjà\\n"
7 => b"é@" 7 => b"é\\x00"
"[]" => [] "[]" => []
"res" => :stream {@{$res1} "res" => stream resource {@{$res1}
wrapper_type: "plainfile" wrapper_type: "plainfile"
stream_type: "STDIO" stream_type: "STDIO"
mode: "r" mode: "r"
@ -70,7 +70,7 @@ array:25 [
eof: false eof: false
options: [] options: []
} }
8 => :Unknown {@{$res2}} 8 => Unknown resource @{$res2}
"obj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d "obj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d
+foo: "foo" +foo: "foo"
+"bar": "bar" +"bar": "bar"
@ -119,7 +119,7 @@ EOTXT
$this->assertDumpEquals( $this->assertDumpEquals(
<<<EOTXT <<<EOTXT
:xml { xml resource {
current_byte_index: 0 current_byte_index: 0
current_column_number: 1 current_column_number: 1
current_line_number: 1 current_line_number: 1
@ -154,7 +154,7 @@ EOTXT
$this->assertStringMatchesFormat( $this->assertStringMatchesFormat(
<<<EOTXT <<<EOTXT
:stream {@{$ref} stream resource {@{$ref}
wrapper_type: "PHP" wrapper_type: "PHP"
stream_type: "MEMORY" stream_type: "MEMORY"
mode: "w+b" mode: "w+b"
@ -185,7 +185,7 @@ EOTXT
public function testRefsInProperties() public function testRefsInProperties()
{ {
$var = (object) array('foo' => 'foo'); $var = (object) array('foo' => 'foo');
$var->bar =& $var->foo; $var->bar = &$var->foo;
$dumper = new CliDumper(); $dumper = new CliDumper();
$dumper->setColors(false); $dumper->setColors(false);
@ -336,7 +336,7 @@ EOTXT
$var = function &() { $var = function &() {
$var = array(); $var = array();
$var[] =& $var; $var[] = &$var;
return $var; return $var;
}; };

View File

@ -19,7 +19,7 @@ fclose($h);
$var = array( $var = array(
'number' => 1, null, 'number' => 1, null,
'const' => 1.1, true, false, NAN, INF, -INF, PHP_INT_MAX, 'const' => 1.1, true, false, NAN, INF, -INF, PHP_INT_MAX,
'str' => "déjà", "\xE9\x00", 'str' => "déjà\n", "\xE9\x00",
'[]' => array(), '[]' => array(),
'res' => $g, 'res' => $g,
$h, $h,
@ -30,14 +30,14 @@ $var = array(
); );
$r = array(); $r = array();
$r[] =& $r; $r[] = &$r;
$var['recurs'] =& $r; $var['recurs'] = &$r;
$var[] =& $var[0]; $var[] = &$var[0];
$var['sobj'] = $var['obj']; $var['sobj'] = $var['obj'];
$var['snobj'] =& $var['nobj'][0]; $var['snobj'] = &$var['nobj'][0];
$var['snobj2'] = $var['nobj'][0]; $var['snobj2'] = $var['nobj'][0];
$var['file'] = __FILE__; $var['file'] = __FILE__;
$var["bin-key-\xE9"] = ""; $var["bin-key-\xE9"] = '';
unset($g, $h, $r); unset($g, $h, $r);

View File

@ -59,10 +59,10 @@ class HtmlDumperTest extends \PHPUnit_Framework_TestCase
<span class=sf-dump-key>4</span> => <span class=sf-dump-num>INF</span> <span class=sf-dump-key>4</span> => <span class=sf-dump-num>INF</span>
<span class=sf-dump-key>5</span> => <span class=sf-dump-num>-INF</span> <span class=sf-dump-key>5</span> => <span class=sf-dump-num>-INF</span>
<span class=sf-dump-key>6</span> => <span class=sf-dump-num>{$intMax}</span> <span class=sf-dump-key>6</span> => <span class=sf-dump-num>{$intMax}</span>
"<span class=sf-dump-key>str</span>" => "<span class=sf-dump-str title="4 characters">d&#233;j&#224;</span>" "<span class=sf-dump-key>str</span>" => "<span class=sf-dump-str title="5 characters">d&#233;j&#224;</span>\\n"
<span class=sf-dump-key>7</span> => b"<span class=sf-dump-str title="2 binary or non-UTF-8 characters">&#233;<span class=sf-dump-cchr title=\\x00>&#9216;</span></span>" <span class=sf-dump-key>7</span> => b"<span class=sf-dump-str title="2 binary or non-UTF-8 characters">&#233;</span>\\x00"
"<span class=sf-dump-key>[]</span>" => [] "<span class=sf-dump-key>[]</span>" => []
"<span class=sf-dump-key>res</span>" => <abbr title="`stream` resource" class=sf-dump-note>:stream</abbr> {<a class=sf-dump-ref>@{$res1}</a><samp> "<span class=sf-dump-key>res</span>" => <span class=sf-dump-note>stream resource</span> <a class=sf-dump-ref>@{$res1}</a><samp>
<span class=sf-dump-meta>wrapper_type</span>: "<span class=sf-dump-str title="9 characters">plainfile</span>" <span class=sf-dump-meta>wrapper_type</span>: "<span class=sf-dump-str title="9 characters">plainfile</span>"
<span class=sf-dump-meta>stream_type</span>: "<span class=sf-dump-str title="5 characters">STDIO</span>" <span class=sf-dump-meta>stream_type</span>: "<span class=sf-dump-str title="5 characters">STDIO</span>"
<span class=sf-dump-meta>mode</span>: "<span class=sf-dump-str>r</span>" <span class=sf-dump-meta>mode</span>: "<span class=sf-dump-str>r</span>"
@ -73,7 +73,7 @@ class HtmlDumperTest extends \PHPUnit_Framework_TestCase
<span class=sf-dump-meta>eof</span>: <span class=sf-dump-const>false</span> <span class=sf-dump-meta>eof</span>: <span class=sf-dump-const>false</span>
<span class=sf-dump-meta>options</span>: [] <span class=sf-dump-meta>options</span>: []
</samp>} </samp>}
<span class=sf-dump-key>8</span> => <abbr title="`Unknown` resource" class=sf-dump-note>:Unknown</abbr> {<a class=sf-dump-ref>@{$res2}</a>} <span class=sf-dump-key>8</span> => <span class=sf-dump-note>Unknown resource</span> <a class=sf-dump-ref>@{$res2}</a>
"<span class=sf-dump-key>obj</span>" => <abbr title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo" class=sf-dump-note>DumbFoo</abbr> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="2 occurrences">#%d</a><samp id={$dumpId}-ref2%d> "<span class=sf-dump-key>obj</span>" => <abbr title="Symfony\Component\VarDumper\Tests\Fixture\DumbFoo" class=sf-dump-note>DumbFoo</abbr> {<a class=sf-dump-ref href=#{$dumpId}-ref2%d title="2 occurrences">#%d</a><samp id={$dumpId}-ref2%d>
+<span class=sf-dump-public title="Public property">foo</span>: "<span class=sf-dump-str title="3 characters">foo</span>" +<span class=sf-dump-public title="Public property">foo</span>: "<span class=sf-dump-str title="3 characters">foo</span>"
+"<span class=sf-dump-public title="Runtime added dynamic property">bar</span>": "<span class=sf-dump-str title="3 characters">bar</span>" +"<span class=sf-dump-public title="Runtime added dynamic property">bar</span>": "<span class=sf-dump-str title="3 characters">bar</span>"