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;
19 * @author Nicolas Grekas <p@tchwork.com>
21 class CliDumperTest extends VarDumperTestCase
23 public function testGet()
25 require __DIR__.'/Fixtures/dumb-var.php';
27 $dumper = new CliDumper('php://output');
28 $dumper->setColors(false);
29 $cloner = new VarCloner();
30 $cloner->addCasters(array(
31 ':stream' => function ($res, $a) {
32 unset($a['uri'], $a['wrapper_data']);
37 $data = $cloner->cloneVar($var);
41 $out = ob_get_clean();
42 $out = preg_replace('/[ \t]+$/m', '', $out);
43 $intMax = PHP_INT_MAX;
44 $res = (int) $var['res'];
46 $r = defined('HHVM_VERSION') ? '' : '#%d';
48 if (PHP_VERSION_ID >= 50400) {
51 class: "Symfony\Component\VarDumper\Tests\CliDumperTest"
52 this: Symfony\Component\VarDumper\Tests\CliDumperTest {{$r} …}
56 $this->assertStringMatchesFormat(
71 "res" => stream resource {@{$res}
72 %A wrapper_type: "plainfile"
79 "obj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d
83 "closure" => Closure {{$r}{$closure54}
91 file: "{$var['file']}"
92 line: "{$var['line']} to {$var['line']}"
94 "line" => {$var['line']}
98 "recurs" => &4 array:1 [
102 "sobj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d}
105 "file" => "{$var['file']}"
116 * @requires extension xml
118 public function testXmlResource()
120 $var = xml_parser_create();
122 $this->assertDumpMatchesFormat(
125 current_byte_index: %i
126 current_column_number: %i
127 current_line_number: 1
128 error_code: XML_ERROR_NONE
136 public function testJsonCast()
138 $var = (array) json_decode('{"0":{},"1":null}');
139 foreach ($var as &$v) {
144 $this->assertDumpMatchesFormat(
158 public function testObjectCast()
160 $var = (object) array(1 => 1);
163 $this->assertDumpMatchesFormat(
175 public function testClosedResource()
177 if (defined('HHVM_VERSION') && HHVM_VERSION_ID < 30600) {
178 $this->markTestSkipped();
181 $var = fopen(__FILE__, 'r');
184 $dumper = new CliDumper('php://output');
185 $dumper->setColors(false);
186 $cloner = new VarCloner();
187 $data = $cloner->cloneVar($var);
190 $dumper->dump($data);
191 $out = ob_get_clean();
194 $this->assertStringMatchesFormat(
196 Closed resource @{$res}
205 * @requires function Twig_Template::getSourceContext
207 public function testThrowingCaster()
209 $out = fopen('php://memory', 'r+b');
211 require_once __DIR__.'/Fixtures/Twig.php';
212 $twig = new \__TwigTemplate_VarDumperFixture_u75a09(new \Twig_Environment(new \Twig_Loader_Filesystem()));
214 $dumper = new CliDumper();
215 $dumper->setColors(false);
216 $cloner = new VarCloner();
217 $cloner->addCasters(array(
218 ':stream' => function ($res, $a) {
219 unset($a['wrapper_data']);
224 $cloner->addCasters(array(
225 ':stream' => eval('return function () use ($twig) {
227 $twig->render(array());
228 } catch (\Twig_Error_Runtime $e) {
229 throw $e->getPrevious();
233 $line = __LINE__ - 2;
236 $data = $cloner->cloneVar($out);
237 $dumper->dump($data, $out);
239 $out = stream_get_contents($out);
241 $r = defined('HHVM_VERSION') ? '' : '#%d';
242 $this->assertStringMatchesFormat(
244 stream resource {@{$ref}
245 %Awrapper_type: "PHP"
246 stream_type: "MEMORY"
252 ⚠: Symfony\Component\VarDumper\Exception\ThrowingCasterException {{$r}
253 #message: "Unexpected Exception thrown from a caster: Foobar"
255 %d. __TwigTemplate_VarDumperFixture_u75a09->doDisplay() ==> new Exception(): {
259 throw new \Exception('Foobar');\\n
269 %d. Twig_Template->displayWithErrorHandling() ==> __TwigTemplate_VarDumperFixture_u75a09->doDisplay(): {
271 %sTemplate.php:%d: """
273 \$this->doDisplay(\$context, \$blocks);\\n
274 } catch (Twig_Error \$e) {\\n
278 %d. Twig_Template->display() ==> Twig_Template->displayWithErrorHandling(): {
280 %sTemplate.php:%d: """
282 \$this->displayWithErrorHandling(\$this->env->mergeGlobals(\$context), array_merge(\$this->blocks, \$blocks));\\n
287 %d. Twig_Template->render() ==> Twig_Template->display(): {
289 %sTemplate.php:%d: """
291 \$this->display(\$context);\\n
292 } catch (%s \$e) {\\n
296 %d. %slosure%s() ==> Twig_Template->render(): {
298 %sCliDumperTest.php:{$line}: """
315 public function testRefsInProperties()
317 $var = (object) array('foo' => 'foo');
318 $var->bar = &$var->foo;
320 $dumper = new CliDumper();
321 $dumper->setColors(false);
322 $cloner = new VarCloner();
324 $out = fopen('php://memory', 'r+b');
325 $data = $cloner->cloneVar($var);
326 $dumper->dump($data, $out);
328 $out = stream_get_contents($out);
330 $r = defined('HHVM_VERSION') ? '' : '#%d';
331 $this->assertStringMatchesFormat(
345 * @runInSeparateProcess
346 * @preserveGlobalState disabled
349 public function testSpecialVars56()
351 $var = $this->getSpecialVars();
353 $this->assertDumpEquals(
362 "GLOBALS" => &2 array:1 [
363 "GLOBALS" => &2 array:1 [&2]
375 * @runInSeparateProcess
376 * @preserveGlobalState disabled
378 public function testGlobalsNoExt()
380 $var = $this->getSpecialVars();
384 $dumper = new CliDumper(function ($line, $depth) use (&$out) {
386 $out .= str_repeat(' ', $depth).$line."\n";
389 $dumper->setColors(false);
390 $cloner = new VarCloner();
392 $refl = new \ReflectionProperty($cloner, 'useExt');
393 $refl->setAccessible(true);
394 $refl->setValue($cloner, false);
396 $data = $cloner->cloneVar($var);
397 $dumper->dump($data);
403 "GLOBALS" => &1 array:1 [
404 "GLOBALS" => &1 array:1 [&1]
417 * @runInSeparateProcess
418 * @preserveGlobalState disabled
420 public function testBuggyRefs()
422 if (PHP_VERSION_ID >= 50600) {
423 $this->markTestSkipped('PHP 5.6 fixed refs counting');
426 $var = $this->getSpecialVars();
429 $dumper = new CliDumper();
430 $dumper->setColors(false);
431 $cloner = new VarCloner();
433 $data = $cloner->cloneVar($var)->withMaxDepth(3);
435 $dumper->dump($data, function ($line, $depth) use (&$out) {
437 $out .= str_repeat(' ', $depth).$line."\n";
457 private function getSpecialVars()
459 foreach (array_keys($GLOBALS) as $var) {
460 if ('GLOBALS' !== $var) {
461 unset($GLOBALS[$var]);
465 $var = function &() {
472 return array($var(), $GLOBALS, &$GLOBALS);