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;
14 use Symfony\Component\VarDumper\Cloner\VarCloner;
15 use Symfony\Component\VarDumper\Dumper\CliDumper;
16 use Symfony\Component\VarDumper\Test\VarDumperTestCase;
18 use Twig\Loader\FilesystemLoader;
21 * @author Nicolas Grekas <p@tchwork.com>
23 class CliDumperTest extends VarDumperTestCase
25 public function testGet()
27 require __DIR__.'/Fixtures/dumb-var.php';
29 $dumper = new CliDumper('php://output');
30 $dumper->setColors(false);
31 $cloner = new VarCloner();
32 $cloner->addCasters(array(
33 ':stream' => function ($res, $a) {
34 unset($a['uri'], $a['wrapper_data']);
39 $data = $cloner->cloneVar($var);
43 $out = ob_get_clean();
44 $out = preg_replace('/[ \t]+$/m', '', $out);
45 $intMax = PHP_INT_MAX;
46 $res = (int) $var['res'];
48 $r = defined('HHVM_VERSION') ? '' : '#%d';
50 if (\PHP_VERSION_ID >= 50400) {
53 class: "Symfony\Component\VarDumper\Tests\CliDumperTest"
54 this: Symfony\Component\VarDumper\Tests\CliDumperTest {{$r} …}
58 $this->assertStringMatchesFormat(
73 "res" => stream resource {@{$res}
74 %A wrapper_type: "plainfile"
81 "obj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d
85 "closure" => Closure {{$r}{$closure54}
93 file: "{$var['file']}"
94 line: "{$var['line']} to {$var['line']}"
96 "line" => {$var['line']}
100 "recurs" => &4 array:1 [
104 "sobj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d}
107 "file" => "{$var['file']}"
118 * @requires extension xml
120 public function testXmlResource()
122 $var = xml_parser_create();
124 $this->assertDumpMatchesFormat(
127 current_byte_index: %i
128 current_column_number: %i
129 current_line_number: 1
130 error_code: XML_ERROR_NONE
138 public function testJsonCast()
140 $var = (array) json_decode('{"0":{},"1":null}');
141 foreach ($var as &$v) {
146 $this->assertDumpMatchesFormat(
160 public function testObjectCast()
162 $var = (object) array(1 => 1);
165 $this->assertDumpMatchesFormat(
177 public function testClosedResource()
179 if (defined('HHVM_VERSION') && HHVM_VERSION_ID < 30600) {
180 $this->markTestSkipped();
183 $var = fopen(__FILE__, 'r');
186 $dumper = new CliDumper('php://output');
187 $dumper->setColors(false);
188 $cloner = new VarCloner();
189 $data = $cloner->cloneVar($var);
192 $dumper->dump($data);
193 $out = ob_get_clean();
196 $this->assertStringMatchesFormat(
198 Closed resource @{$res}
207 * @requires function Twig\Template::getSourceContext
209 public function testThrowingCaster()
211 $out = fopen('php://memory', 'r+b');
213 require_once __DIR__.'/Fixtures/Twig.php';
214 $twig = new \__TwigTemplate_VarDumperFixture_u75a09(new Environment(new FilesystemLoader()));
216 $dumper = new CliDumper();
217 $dumper->setColors(false);
218 $cloner = new VarCloner();
219 $cloner->addCasters(array(
220 ':stream' => function ($res, $a) {
221 unset($a['wrapper_data']);
226 $cloner->addCasters(array(
227 ':stream' => eval('return function () use ($twig) {
229 $twig->render(array());
230 } catch (\Twig\Error\RuntimeError $e) {
231 throw $e->getPrevious();
237 $data = $cloner->cloneVar($out);
238 $dumper->dump($data, $out);
240 $out = stream_get_contents($out);
242 $r = defined('HHVM_VERSION') ? '' : '#%d';
243 $this->assertStringMatchesFormat(
245 stream resource {@{$ref}
246 %Awrapper_type: "PHP"
247 stream_type: "MEMORY"
253 ⚠: Symfony\Component\VarDumper\Exception\ThrowingCasterException {{$r}
254 #message: "Unexpected Exception thrown from a caster: Foobar"
256 %d. __TwigTemplate_VarDumperFixture_u75a09->doDisplay() ==> new Exception(): {
260 throw new \Exception('Foobar');\\n
270 %d. Twig%cTemplate->displayWithErrorHandling() ==> __TwigTemplate_VarDumperFixture_u75a09->doDisplay(): {
272 %sTemplate.php:%d: """
274 \$this->doDisplay(\$context, \$blocks);\\n
275 } catch (Twig%sError \$e) {\\n
279 %d. Twig%cTemplate->display() ==> Twig%cTemplate->displayWithErrorHandling(): {
281 %sTemplate.php:%d: """
283 \$this->displayWithErrorHandling(\$this->env->mergeGlobals(\$context), array_merge(\$this->blocks, \$blocks));\\n
288 %d. Twig%cTemplate->render() ==> Twig%cTemplate->display(): {
290 %sTemplate.php:%d: """
292 \$this->display(\$context);\\n
293 } catch (%s \$e) {\\n
297 %d. %slosure%s() ==> Twig%cTemplate->render(): {
299 %sCliDumperTest.php:%d: """
314 public function testRefsInProperties()
316 $var = (object) array('foo' => 'foo');
317 $var->bar = &$var->foo;
319 $dumper = new CliDumper();
320 $dumper->setColors(false);
321 $cloner = new VarCloner();
323 $out = fopen('php://memory', 'r+b');
324 $data = $cloner->cloneVar($var);
325 $dumper->dump($data, $out);
327 $out = stream_get_contents($out);
329 $r = defined('HHVM_VERSION') ? '' : '#%d';
330 $this->assertStringMatchesFormat(
344 * @runInSeparateProcess
345 * @preserveGlobalState disabled
348 public function testSpecialVars56()
350 $var = $this->getSpecialVars();
352 $this->assertDumpEquals(
361 "GLOBALS" => &2 array:1 [
362 "GLOBALS" => &2 array:1 [&2]
374 * @runInSeparateProcess
375 * @preserveGlobalState disabled
377 public function testGlobalsNoExt()
379 $var = $this->getSpecialVars();
383 $dumper = new CliDumper(function ($line, $depth) use (&$out) {
385 $out .= str_repeat(' ', $depth).$line."\n";
388 $dumper->setColors(false);
389 $cloner = new VarCloner();
391 $refl = new \ReflectionProperty($cloner, 'useExt');
392 $refl->setAccessible(true);
393 $refl->setValue($cloner, false);
395 $data = $cloner->cloneVar($var);
396 $dumper->dump($data);
402 "GLOBALS" => &1 array:1 [
403 "GLOBALS" => &1 array:1 [&1]
416 * @runInSeparateProcess
417 * @preserveGlobalState disabled
419 public function testBuggyRefs()
421 if (\PHP_VERSION_ID >= 50600) {
422 $this->markTestSkipped('PHP 5.6 fixed refs counting');
425 $var = $this->getSpecialVars();
428 $dumper = new CliDumper();
429 $dumper->setColors(false);
430 $cloner = new VarCloner();
432 $data = $cloner->cloneVar($var)->withMaxDepth(3);
434 $dumper->dump($data, function ($line, $depth) use (&$out) {
436 $out .= str_repeat(' ', $depth).$line."\n";
456 private function getSpecialVars()
458 foreach (array_keys($GLOBALS) as $var) {
459 if ('GLOBALS' !== $var) {
460 unset($GLOBALS[$var]);
464 $var = function &() {
471 return array($var(), $GLOBALS, &$GLOBALS);