4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\VarDumper\Tests\Dumper;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\VarDumper\Cloner\VarCloner;
16 use Symfony\Component\VarDumper\Dumper\CliDumper;
17 use Symfony\Component\VarDumper\Test\VarDumperTestTrait;
19 use Twig\Loader\FilesystemLoader;
22 * @author Nicolas Grekas <p@tchwork.com>
24 class CliDumperTest extends TestCase
26 use VarDumperTestTrait;
28 public function testGet()
30 require __DIR__.'/../Fixtures/dumb-var.php';
32 $dumper = new CliDumper('php://output');
33 $dumper->setColors(false);
34 $cloner = new VarCloner();
35 $cloner->addCasters(array(
36 ':stream' => function ($res, $a) {
37 unset($a['uri'], $a['wrapper_data']);
42 $data = $cloner->cloneVar($var);
46 $out = ob_get_clean();
47 $out = preg_replace('/[ \t]+$/m', '', $out);
48 $intMax = PHP_INT_MAX;
49 $res = (int) $var['res'];
51 $r = \defined('HHVM_VERSION') ? '' : '#%d';
52 $this->assertStringMatchesFormat(
67 "res" => stream resource {@{$res}
68 %A wrapper_type: "plainfile"
75 "obj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d
79 "closure" => Closure {{$r}
80 class: "Symfony\Component\VarDumper\Tests\Dumper\CliDumperTest"
81 this: Symfony\Component\VarDumper\Tests\Dumper\CliDumperTest {{$r} …}
89 file: "%s%eTests%eFixtures%edumb-var.php"
90 line: "{$var['line']} to {$var['line']}"
92 "line" => {$var['line']}
96 "recurs" => &4 array:1 [
100 "sobj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d}
103 "file" => "{$var['file']}"
114 * @dataProvider provideDumpWithCommaFlagTests
116 public function testDumpWithCommaFlag($expected, $flags)
118 $dumper = new CliDumper(null, null, $flags);
119 $dumper->setColors(false);
120 $cloner = new VarCloner();
123 'array' => array('a', 'b'),
125 'multiline string' => "this\nis\na\multiline\nstring",
128 $dump = $dumper->dump($cloner->cloneVar($var), true);
130 $this->assertSame($expected, $dump);
133 public function testDumpWithCommaFlagsAndExceptionCodeExcerpt()
135 $dumper = new CliDumper(null, null, CliDumper::DUMP_TRAILING_COMMA);
136 $dumper->setColors(false);
137 $cloner = new VarCloner();
139 $ex = new \RuntimeException('foo');
141 $dump = $dumper->dump($cloner->cloneVar($ex)->withRefHandles(false), true);
143 $this->assertStringMatchesFormat(<<<'EOTXT'
147 #file: "%ACliDumperTest.php"
150 %ACliDumperTest.php:%d {
152 › $ex = new \RuntimeException('foo');
163 public function provideDumpWithCommaFlagTests()
165 $expected = <<<'EOTXT'
172 "multiline string" => """
182 yield array($expected, CliDumper::DUMP_COMMA_SEPARATOR);
184 $expected = <<<'EOTXT'
191 "multiline string" => """
201 yield array($expected, CliDumper::DUMP_TRAILING_COMMA);
205 * @requires extension xml
207 public function testXmlResource()
209 $var = xml_parser_create();
211 $this->assertDumpMatchesFormat(
214 current_byte_index: %i
215 current_column_number: %i
216 current_line_number: 1
217 error_code: XML_ERROR_NONE
225 public function testJsonCast()
227 $var = (array) json_decode('{"0":{},"1":null}');
228 foreach ($var as &$v) {
233 if (\PHP_VERSION_ID >= 70200) {
234 $this->assertDumpMatchesFormat(
247 $this->assertDumpMatchesFormat(
262 public function testObjectCast()
264 $var = (object) array(1 => 1);
267 if (\PHP_VERSION_ID >= 70200) {
268 $this->assertDumpMatchesFormat(
278 $this->assertDumpMatchesFormat(
291 public function testClosedResource()
293 if (\defined('HHVM_VERSION') && HHVM_VERSION_ID < 30600) {
294 $this->markTestSkipped();
297 $var = fopen(__FILE__, 'r');
300 $dumper = new CliDumper('php://output');
301 $dumper->setColors(false);
302 $cloner = new VarCloner();
303 $data = $cloner->cloneVar($var);
306 $dumper->dump($data);
307 $out = ob_get_clean();
310 $this->assertStringMatchesFormat(
312 Closed resource @{$res}
320 public function testFlags()
322 putenv('DUMP_LIGHT_ARRAY=1');
323 putenv('DUMP_STRING_LENGTH=1');
327 array('foo', 2 => 'bar'),
330 $this->assertDumpEquals(
348 putenv('DUMP_LIGHT_ARRAY=');
349 putenv('DUMP_STRING_LENGTH=');
353 * @requires function Twig\Template::getSourceContext
355 public function testThrowingCaster()
357 $out = fopen('php://memory', 'r+b');
359 require_once __DIR__.'/../Fixtures/Twig.php';
360 $twig = new \__TwigTemplate_VarDumperFixture_u75a09(new Environment(new FilesystemLoader()));
362 $dumper = new CliDumper();
363 $dumper->setColors(false);
364 $cloner = new VarCloner();
365 $cloner->addCasters(array(
366 ':stream' => function ($res, $a) {
367 unset($a['wrapper_data']);
372 $cloner->addCasters(array(
373 ':stream' => eval('return function () use ($twig) {
375 $twig->render(array());
376 } catch (\Twig\Error\RuntimeError $e) {
377 throw $e->getPrevious();
383 $data = $cloner->cloneVar($out);
384 $dumper->dump($data, $out);
385 $out = stream_get_contents($out, -1, 0);
387 $r = \defined('HHVM_VERSION') ? '' : '#%d';
388 $this->assertStringMatchesFormat(
390 stream resource {@{$ref}
391 ⚠: Symfony\Component\VarDumper\Exception\ThrowingCasterException {{$r}
392 #message: "Unexpected Exception thrown from a caster: Foobar"
399 %s%eTemplate.php:%d { …}
400 %s%eTemplate.php:%d { …}
401 %s%eTemplate.php:%d { …}
402 %s%eTests%eDumper%eCliDumperTest.php:%d { …}
405 %Awrapper_type: "PHP"
406 stream_type: "MEMORY"
420 public function testRefsInProperties()
422 $var = (object) array('foo' => 'foo');
423 $var->bar = &$var->foo;
425 $dumper = new CliDumper();
426 $dumper->setColors(false);
427 $cloner = new VarCloner();
429 $data = $cloner->cloneVar($var);
430 $out = $dumper->dump($data, true);
432 $r = \defined('HHVM_VERSION') ? '' : '#%d';
433 $this->assertStringMatchesFormat(
447 * @runInSeparateProcess
448 * @preserveGlobalState disabled
451 public function testSpecialVars56()
453 $var = $this->getSpecialVars();
455 $this->assertDumpEquals(
464 "GLOBALS" => &2 array:1 [
465 "GLOBALS" => &2 array:1 [&2]
477 * @runInSeparateProcess
478 * @preserveGlobalState disabled
480 public function testGlobalsNoExt()
482 $var = $this->getSpecialVars();
486 $dumper = new CliDumper(function ($line, $depth) use (&$out) {
488 $out .= str_repeat(' ', $depth).$line."\n";
491 $dumper->setColors(false);
492 $cloner = new VarCloner();
494 $refl = new \ReflectionProperty($cloner, 'useExt');
495 $refl->setAccessible(true);
496 $refl->setValue($cloner, false);
498 $data = $cloner->cloneVar($var);
499 $dumper->dump($data);
505 "GLOBALS" => &1 array:1 [
506 "GLOBALS" => &1 array:1 [&1]
519 * @runInSeparateProcess
520 * @preserveGlobalState disabled
522 public function testBuggyRefs()
524 if (\PHP_VERSION_ID >= 50600) {
525 $this->markTestSkipped('PHP 5.6 fixed refs counting');
528 $var = $this->getSpecialVars();
531 $dumper = new CliDumper();
532 $dumper->setColors(false);
533 $cloner = new VarCloner();
535 $data = $cloner->cloneVar($var)->withMaxDepth(3);
537 $dumper->dump($data, function ($line, $depth) use (&$out) {
539 $out .= str_repeat(' ', $depth).$line."\n";
559 public function testIncompleteClass()
561 $unserializeCallbackHandler = ini_set('unserialize_callback_func', null);
562 $var = unserialize('O:8:"Foo\Buzz":0:{}');
563 ini_set('unserialize_callback_func', $unserializeCallbackHandler);
565 $this->assertDumpMatchesFormat(
567 __PHP_Incomplete_Class(Foo\Buzz) {}
574 private function getSpecialVars()
576 foreach (array_keys($GLOBALS) as $var) {
577 if ('GLOBALS' !== $var) {
578 unset($GLOBALS[$var]);
582 $var = function &() {
589 return array($var(), $GLOBALS, &$GLOBALS);