annotate vendor/symfony/var-dumper/Tests/Dumper/CliDumperTest.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 7a779792577d
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /*
Chris@0 4 * This file is part of the Symfony package.
Chris@0 5 *
Chris@0 6 * (c) Fabien Potencier <fabien@symfony.com>
Chris@0 7 *
Chris@0 8 * For the full copyright and license information, please view the LICENSE
Chris@0 9 * file that was distributed with this source code.
Chris@0 10 */
Chris@0 11
Chris@0 12 namespace Symfony\Component\VarDumper\Tests\Dumper;
Chris@0 13
Chris@0 14 use PHPUnit\Framework\TestCase;
Chris@0 15 use Symfony\Component\VarDumper\Cloner\VarCloner;
Chris@0 16 use Symfony\Component\VarDumper\Dumper\CliDumper;
Chris@0 17 use Symfony\Component\VarDumper\Test\VarDumperTestTrait;
Chris@0 18 use Twig\Environment;
Chris@0 19 use Twig\Loader\FilesystemLoader;
Chris@0 20
Chris@0 21 /**
Chris@0 22 * @author Nicolas Grekas <p@tchwork.com>
Chris@0 23 */
Chris@0 24 class CliDumperTest extends TestCase
Chris@0 25 {
Chris@0 26 use VarDumperTestTrait;
Chris@0 27
Chris@0 28 public function testGet()
Chris@0 29 {
Chris@0 30 require __DIR__.'/../Fixtures/dumb-var.php';
Chris@0 31
Chris@0 32 $dumper = new CliDumper('php://output');
Chris@0 33 $dumper->setColors(false);
Chris@0 34 $cloner = new VarCloner();
Chris@0 35 $cloner->addCasters(array(
Chris@0 36 ':stream' => function ($res, $a) {
Chris@0 37 unset($a['uri'], $a['wrapper_data']);
Chris@0 38
Chris@0 39 return $a;
Chris@0 40 },
Chris@0 41 ));
Chris@0 42 $data = $cloner->cloneVar($var);
Chris@0 43
Chris@0 44 ob_start();
Chris@0 45 $dumper->dump($data);
Chris@0 46 $out = ob_get_clean();
Chris@0 47 $out = preg_replace('/[ \t]+$/m', '', $out);
Chris@0 48 $intMax = PHP_INT_MAX;
Chris@0 49 $res = (int) $var['res'];
Chris@0 50
Chris@0 51 $r = defined('HHVM_VERSION') ? '' : '#%d';
Chris@0 52 $this->assertStringMatchesFormat(
Chris@0 53 <<<EOTXT
Chris@0 54 array:24 [
Chris@0 55 "number" => 1
Chris@0 56 0 => &1 null
Chris@0 57 "const" => 1.1
Chris@0 58 1 => true
Chris@0 59 2 => false
Chris@0 60 3 => NAN
Chris@0 61 4 => INF
Chris@0 62 5 => -INF
Chris@0 63 6 => {$intMax}
Chris@0 64 "str" => "déjà\\n"
Chris@0 65 7 => b"é\\x00"
Chris@0 66 "[]" => []
Chris@0 67 "res" => stream resource {@{$res}
Chris@0 68 %A wrapper_type: "plainfile"
Chris@0 69 stream_type: "STDIO"
Chris@0 70 mode: "r"
Chris@0 71 unread_bytes: 0
Chris@0 72 seekable: true
Chris@0 73 %A options: []
Chris@0 74 }
Chris@0 75 "obj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d
Chris@0 76 +foo: "foo"
Chris@0 77 +"bar": "bar"
Chris@0 78 }
Chris@0 79 "closure" => Closure {{$r}
Chris@0 80 class: "Symfony\Component\VarDumper\Tests\Dumper\CliDumperTest"
Chris@0 81 this: Symfony\Component\VarDumper\Tests\Dumper\CliDumperTest {{$r} …}
Chris@0 82 parameters: {
Chris@0 83 \$a: {}
Chris@0 84 &\$b: {
Chris@0 85 typeHint: "PDO"
Chris@0 86 default: null
Chris@0 87 }
Chris@0 88 }
Chris@0 89 file: "{$var['file']}"
Chris@0 90 line: "{$var['line']} to {$var['line']}"
Chris@0 91 }
Chris@0 92 "line" => {$var['line']}
Chris@0 93 "nobj" => array:1 [
Chris@0 94 0 => &3 {#%d}
Chris@0 95 ]
Chris@0 96 "recurs" => &4 array:1 [
Chris@0 97 0 => &4 array:1 [&4]
Chris@0 98 ]
Chris@0 99 8 => &1 null
Chris@0 100 "sobj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d}
Chris@0 101 "snobj" => &3 {#%d}
Chris@0 102 "snobj2" => {#%d}
Chris@0 103 "file" => "{$var['file']}"
Chris@0 104 b"bin-key-é" => ""
Chris@0 105 ]
Chris@0 106
Chris@0 107 EOTXT
Chris@0 108 ,
Chris@0 109 $out
Chris@0 110 );
Chris@0 111 }
Chris@0 112
Chris@0 113 /**
Chris@0 114 * @dataProvider provideDumpWithCommaFlagTests
Chris@0 115 */
Chris@0 116 public function testDumpWithCommaFlag($expected, $flags)
Chris@0 117 {
Chris@0 118 $dumper = new CliDumper(null, null, $flags);
Chris@0 119 $dumper->setColors(false);
Chris@0 120 $cloner = new VarCloner();
Chris@0 121
Chris@0 122 $var = array(
Chris@0 123 'array' => array('a', 'b'),
Chris@0 124 'string' => 'hello',
Chris@0 125 'multiline string' => "this\nis\na\multiline\nstring",
Chris@0 126 );
Chris@0 127
Chris@0 128 $dump = $dumper->dump($cloner->cloneVar($var), true);
Chris@0 129
Chris@0 130 $this->assertSame($expected, $dump);
Chris@0 131 }
Chris@0 132
Chris@0 133 public function testDumpWithCommaFlagsAndExceptionCodeExcerpt()
Chris@0 134 {
Chris@0 135 $dumper = new CliDumper(null, null, CliDumper::DUMP_TRAILING_COMMA);
Chris@0 136 $dumper->setColors(false);
Chris@0 137 $cloner = new VarCloner();
Chris@0 138
Chris@0 139 $ex = new \RuntimeException('foo');
Chris@0 140
Chris@0 141 $dump = $dumper->dump($cloner->cloneVar($ex)->withRefHandles(false), true);
Chris@0 142
Chris@0 143 $this->assertStringMatchesFormat(<<<'EOTXT'
Chris@0 144 RuntimeException {
Chris@0 145 #message: "foo"
Chris@0 146 #code: 0
Chris@0 147 #file: "%ACliDumperTest.php"
Chris@0 148 #line: %d
Chris@0 149 trace: {
Chris@0 150 %ACliDumperTest.php:%d: {
Chris@0 151 :
Chris@0 152 : $ex = new \RuntimeException('foo');
Chris@0 153 :
Chris@0 154 }
Chris@0 155 %A
Chris@0 156 }
Chris@0 157 }
Chris@0 158
Chris@0 159 EOTXT
Chris@0 160 , $dump);
Chris@0 161 }
Chris@0 162
Chris@0 163 public function provideDumpWithCommaFlagTests()
Chris@0 164 {
Chris@0 165 $expected = <<<'EOTXT'
Chris@0 166 array:3 [
Chris@0 167 "array" => array:2 [
Chris@0 168 0 => "a",
Chris@0 169 1 => "b"
Chris@0 170 ],
Chris@0 171 "string" => "hello",
Chris@0 172 "multiline string" => """
Chris@0 173 this\n
Chris@0 174 is\n
Chris@0 175 a\multiline\n
Chris@0 176 string
Chris@0 177 """
Chris@0 178 ]
Chris@0 179
Chris@0 180 EOTXT;
Chris@0 181
Chris@0 182 yield array($expected, CliDumper::DUMP_COMMA_SEPARATOR);
Chris@0 183
Chris@0 184 $expected = <<<'EOTXT'
Chris@0 185 array:3 [
Chris@0 186 "array" => array:2 [
Chris@0 187 0 => "a",
Chris@0 188 1 => "b",
Chris@0 189 ],
Chris@0 190 "string" => "hello",
Chris@0 191 "multiline string" => """
Chris@0 192 this\n
Chris@0 193 is\n
Chris@0 194 a\multiline\n
Chris@0 195 string
Chris@0 196 """,
Chris@0 197 ]
Chris@0 198
Chris@0 199 EOTXT;
Chris@0 200
Chris@0 201 yield array($expected, CliDumper::DUMP_TRAILING_COMMA);
Chris@0 202 }
Chris@0 203
Chris@0 204 /**
Chris@0 205 * @requires extension xml
Chris@0 206 */
Chris@0 207 public function testXmlResource()
Chris@0 208 {
Chris@0 209 $var = xml_parser_create();
Chris@0 210
Chris@0 211 $this->assertDumpMatchesFormat(
Chris@0 212 <<<'EOTXT'
Chris@0 213 xml resource {
Chris@0 214 current_byte_index: %i
Chris@0 215 current_column_number: %i
Chris@0 216 current_line_number: 1
Chris@0 217 error_code: XML_ERROR_NONE
Chris@0 218 }
Chris@0 219 EOTXT
Chris@0 220 ,
Chris@0 221 $var
Chris@0 222 );
Chris@0 223 }
Chris@0 224
Chris@0 225 public function testJsonCast()
Chris@0 226 {
Chris@0 227 $var = (array) json_decode('{"0":{},"1":null}');
Chris@0 228 foreach ($var as &$v) {
Chris@0 229 }
Chris@0 230 $var[] = &$v;
Chris@0 231 $var[''] = 2;
Chris@0 232
Chris@0 233 if (\PHP_VERSION_ID >= 70200) {
Chris@0 234 $this->assertDumpMatchesFormat(
Chris@0 235 <<<'EOTXT'
Chris@0 236 array:4 [
Chris@0 237 0 => {}
Chris@0 238 1 => &1 null
Chris@0 239 2 => &1 null
Chris@0 240 "" => 2
Chris@0 241 ]
Chris@0 242 EOTXT
Chris@0 243 ,
Chris@0 244 $var
Chris@0 245 );
Chris@0 246 } else {
Chris@0 247 $this->assertDumpMatchesFormat(
Chris@0 248 <<<'EOTXT'
Chris@0 249 array:4 [
Chris@0 250 "0" => {}
Chris@0 251 "1" => &1 null
Chris@0 252 0 => &1 null
Chris@0 253 "" => 2
Chris@0 254 ]
Chris@0 255 EOTXT
Chris@0 256 ,
Chris@0 257 $var
Chris@0 258 );
Chris@0 259 }
Chris@0 260 }
Chris@0 261
Chris@0 262 public function testObjectCast()
Chris@0 263 {
Chris@0 264 $var = (object) array(1 => 1);
Chris@0 265 $var->{1} = 2;
Chris@0 266
Chris@0 267 if (\PHP_VERSION_ID >= 70200) {
Chris@0 268 $this->assertDumpMatchesFormat(
Chris@0 269 <<<'EOTXT'
Chris@0 270 {
Chris@0 271 +"1": 2
Chris@0 272 }
Chris@0 273 EOTXT
Chris@0 274 ,
Chris@0 275 $var
Chris@0 276 );
Chris@0 277 } else {
Chris@0 278 $this->assertDumpMatchesFormat(
Chris@0 279 <<<'EOTXT'
Chris@0 280 {
Chris@0 281 +1: 1
Chris@0 282 +"1": 2
Chris@0 283 }
Chris@0 284 EOTXT
Chris@0 285 ,
Chris@0 286 $var
Chris@0 287 );
Chris@0 288 }
Chris@0 289 }
Chris@0 290
Chris@0 291 public function testClosedResource()
Chris@0 292 {
Chris@0 293 if (defined('HHVM_VERSION') && HHVM_VERSION_ID < 30600) {
Chris@0 294 $this->markTestSkipped();
Chris@0 295 }
Chris@0 296
Chris@0 297 $var = fopen(__FILE__, 'r');
Chris@0 298 fclose($var);
Chris@0 299
Chris@0 300 $dumper = new CliDumper('php://output');
Chris@0 301 $dumper->setColors(false);
Chris@0 302 $cloner = new VarCloner();
Chris@0 303 $data = $cloner->cloneVar($var);
Chris@0 304
Chris@0 305 ob_start();
Chris@0 306 $dumper->dump($data);
Chris@0 307 $out = ob_get_clean();
Chris@0 308 $res = (int) $var;
Chris@0 309
Chris@0 310 $this->assertStringMatchesFormat(
Chris@0 311 <<<EOTXT
Chris@0 312 Closed resource @{$res}
Chris@0 313
Chris@0 314 EOTXT
Chris@0 315 ,
Chris@0 316 $out
Chris@0 317 );
Chris@0 318 }
Chris@0 319
Chris@0 320 public function testFlags()
Chris@0 321 {
Chris@0 322 putenv('DUMP_LIGHT_ARRAY=1');
Chris@0 323 putenv('DUMP_STRING_LENGTH=1');
Chris@0 324
Chris@0 325 $var = array(
Chris@0 326 range(1, 3),
Chris@0 327 array('foo', 2 => 'bar'),
Chris@0 328 );
Chris@0 329
Chris@0 330 $this->assertDumpEquals(
Chris@0 331 <<<EOTXT
Chris@0 332 [
Chris@0 333 [
Chris@0 334 1
Chris@0 335 2
Chris@0 336 3
Chris@0 337 ]
Chris@0 338 [
Chris@0 339 0 => (3) "foo"
Chris@0 340 2 => (3) "bar"
Chris@0 341 ]
Chris@0 342 ]
Chris@0 343 EOTXT
Chris@0 344 ,
Chris@0 345 $var
Chris@0 346 );
Chris@0 347
Chris@0 348 putenv('DUMP_LIGHT_ARRAY=');
Chris@0 349 putenv('DUMP_STRING_LENGTH=');
Chris@0 350 }
Chris@0 351
Chris@0 352 /**
Chris@0 353 * @requires function Twig\Template::getSourceContext
Chris@0 354 */
Chris@0 355 public function testThrowingCaster()
Chris@0 356 {
Chris@0 357 $out = fopen('php://memory', 'r+b');
Chris@0 358
Chris@0 359 require_once __DIR__.'/../Fixtures/Twig.php';
Chris@0 360 $twig = new \__TwigTemplate_VarDumperFixture_u75a09(new Environment(new FilesystemLoader()));
Chris@0 361
Chris@0 362 $dumper = new CliDumper();
Chris@0 363 $dumper->setColors(false);
Chris@0 364 $cloner = new VarCloner();
Chris@0 365 $cloner->addCasters(array(
Chris@0 366 ':stream' => function ($res, $a) {
Chris@0 367 unset($a['wrapper_data']);
Chris@0 368
Chris@0 369 return $a;
Chris@0 370 },
Chris@0 371 ));
Chris@0 372 $cloner->addCasters(array(
Chris@0 373 ':stream' => eval('return function () use ($twig) {
Chris@0 374 try {
Chris@0 375 $twig->render(array());
Chris@0 376 } catch (\Twig\Error\RuntimeError $e) {
Chris@0 377 throw $e->getPrevious();
Chris@0 378 }
Chris@0 379 };'),
Chris@0 380 ));
Chris@0 381 $ref = (int) $out;
Chris@0 382
Chris@0 383 $data = $cloner->cloneVar($out);
Chris@0 384 $dumper->dump($data, $out);
Chris@0 385 $out = stream_get_contents($out, -1, 0);
Chris@0 386
Chris@0 387 $r = defined('HHVM_VERSION') ? '' : '#%d';
Chris@0 388 $this->assertStringMatchesFormat(
Chris@0 389 <<<EOTXT
Chris@0 390 stream resource {@{$ref}
Chris@0 391 ⚠: Symfony\Component\VarDumper\Exception\ThrowingCasterException {{$r}
Chris@0 392 #message: "Unexpected Exception thrown from a caster: Foobar"
Chris@0 393 trace: {
Chris@0 394 %sTwig.php:2: {
Chris@0 395 : foo bar
Chris@0 396 : twig source
Chris@0 397 :
Chris@0 398 }
Chris@0 399 %sTemplate.php:%d: {
Chris@0 400 : try {
Chris@0 401 : \$this->doDisplay(\$context, \$blocks);
Chris@0 402 : } catch (Twig%sError \$e) {
Chris@0 403 }
Chris@0 404 %sTemplate.php:%d: {
Chris@0 405 : {
Chris@0 406 : \$this->displayWithErrorHandling(\$this->env->mergeGlobals(\$context), array_merge(\$this->blocks, \$blocks));
Chris@0 407 : }
Chris@0 408 }
Chris@0 409 %sTemplate.php:%d: {
Chris@0 410 : try {
Chris@0 411 : \$this->display(\$context);
Chris@0 412 : } catch (%s \$e) {
Chris@0 413 }
Chris@0 414 %sCliDumperTest.php:%d: {
Chris@0 415 %A
Chris@0 416 }
Chris@0 417 }
Chris@0 418 }
Chris@0 419 %Awrapper_type: "PHP"
Chris@0 420 stream_type: "MEMORY"
Chris@0 421 mode: "%s+b"
Chris@0 422 unread_bytes: 0
Chris@0 423 seekable: true
Chris@0 424 uri: "php://memory"
Chris@0 425 %Aoptions: []
Chris@0 426 }
Chris@0 427
Chris@0 428 EOTXT
Chris@0 429 ,
Chris@0 430 $out
Chris@0 431 );
Chris@0 432 }
Chris@0 433
Chris@0 434 public function testRefsInProperties()
Chris@0 435 {
Chris@0 436 $var = (object) array('foo' => 'foo');
Chris@0 437 $var->bar = &$var->foo;
Chris@0 438
Chris@0 439 $dumper = new CliDumper();
Chris@0 440 $dumper->setColors(false);
Chris@0 441 $cloner = new VarCloner();
Chris@0 442
Chris@0 443 $data = $cloner->cloneVar($var);
Chris@0 444 $out = $dumper->dump($data, true);
Chris@0 445
Chris@0 446 $r = defined('HHVM_VERSION') ? '' : '#%d';
Chris@0 447 $this->assertStringMatchesFormat(
Chris@0 448 <<<EOTXT
Chris@0 449 {{$r}
Chris@0 450 +"foo": &1 "foo"
Chris@0 451 +"bar": &1 "foo"
Chris@0 452 }
Chris@0 453
Chris@0 454 EOTXT
Chris@0 455 ,
Chris@0 456 $out
Chris@0 457 );
Chris@0 458 }
Chris@0 459
Chris@0 460 /**
Chris@0 461 * @runInSeparateProcess
Chris@0 462 * @preserveGlobalState disabled
Chris@0 463 * @requires PHP 5.6
Chris@0 464 */
Chris@0 465 public function testSpecialVars56()
Chris@0 466 {
Chris@0 467 $var = $this->getSpecialVars();
Chris@0 468
Chris@0 469 $this->assertDumpEquals(
Chris@0 470 <<<'EOTXT'
Chris@0 471 array:3 [
Chris@0 472 0 => array:1 [
Chris@0 473 0 => &1 array:1 [
Chris@0 474 0 => &1 array:1 [&1]
Chris@0 475 ]
Chris@0 476 ]
Chris@0 477 1 => array:1 [
Chris@0 478 "GLOBALS" => &2 array:1 [
Chris@0 479 "GLOBALS" => &2 array:1 [&2]
Chris@0 480 ]
Chris@0 481 ]
Chris@0 482 2 => &2 array:1 [&2]
Chris@0 483 ]
Chris@0 484 EOTXT
Chris@0 485 ,
Chris@0 486 $var
Chris@0 487 );
Chris@0 488 }
Chris@0 489
Chris@0 490 /**
Chris@0 491 * @runInSeparateProcess
Chris@0 492 * @preserveGlobalState disabled
Chris@0 493 */
Chris@0 494 public function testGlobalsNoExt()
Chris@0 495 {
Chris@0 496 $var = $this->getSpecialVars();
Chris@0 497 unset($var[0]);
Chris@0 498 $out = '';
Chris@0 499
Chris@0 500 $dumper = new CliDumper(function ($line, $depth) use (&$out) {
Chris@0 501 if ($depth >= 0) {
Chris@0 502 $out .= str_repeat(' ', $depth).$line."\n";
Chris@0 503 }
Chris@0 504 });
Chris@0 505 $dumper->setColors(false);
Chris@0 506 $cloner = new VarCloner();
Chris@0 507
Chris@0 508 $refl = new \ReflectionProperty($cloner, 'useExt');
Chris@0 509 $refl->setAccessible(true);
Chris@0 510 $refl->setValue($cloner, false);
Chris@0 511
Chris@0 512 $data = $cloner->cloneVar($var);
Chris@0 513 $dumper->dump($data);
Chris@0 514
Chris@0 515 $this->assertSame(
Chris@0 516 <<<'EOTXT'
Chris@0 517 array:2 [
Chris@0 518 1 => array:1 [
Chris@0 519 "GLOBALS" => &1 array:1 [
Chris@0 520 "GLOBALS" => &1 array:1 [&1]
Chris@0 521 ]
Chris@0 522 ]
Chris@0 523 2 => &1 array:1 [&1]
Chris@0 524 ]
Chris@0 525
Chris@0 526 EOTXT
Chris@0 527 ,
Chris@0 528 $out
Chris@0 529 );
Chris@0 530 }
Chris@0 531
Chris@0 532 /**
Chris@0 533 * @runInSeparateProcess
Chris@0 534 * @preserveGlobalState disabled
Chris@0 535 */
Chris@0 536 public function testBuggyRefs()
Chris@0 537 {
Chris@0 538 if (\PHP_VERSION_ID >= 50600) {
Chris@0 539 $this->markTestSkipped('PHP 5.6 fixed refs counting');
Chris@0 540 }
Chris@0 541
Chris@0 542 $var = $this->getSpecialVars();
Chris@0 543 $var = $var[0];
Chris@0 544
Chris@0 545 $dumper = new CliDumper();
Chris@0 546 $dumper->setColors(false);
Chris@0 547 $cloner = new VarCloner();
Chris@0 548
Chris@0 549 $data = $cloner->cloneVar($var)->withMaxDepth(3);
Chris@0 550 $out = '';
Chris@0 551 $dumper->dump($data, function ($line, $depth) use (&$out) {
Chris@0 552 if ($depth >= 0) {
Chris@0 553 $out .= str_repeat(' ', $depth).$line."\n";
Chris@0 554 }
Chris@0 555 });
Chris@0 556
Chris@0 557 $this->assertSame(
Chris@0 558 <<<'EOTXT'
Chris@0 559 array:1 [
Chris@0 560 0 => array:1 [
Chris@0 561 0 => array:1 [
Chris@0 562 0 => array:1 [ …1]
Chris@0 563 ]
Chris@0 564 ]
Chris@0 565 ]
Chris@0 566
Chris@0 567 EOTXT
Chris@0 568 ,
Chris@0 569 $out
Chris@0 570 );
Chris@0 571 }
Chris@0 572
Chris@0 573 public function testIncompleteClass()
Chris@0 574 {
Chris@0 575 $unserializeCallbackHandler = ini_set('unserialize_callback_func', null);
Chris@0 576 $var = unserialize('O:8:"Foo\Buzz":0:{}');
Chris@0 577 ini_set('unserialize_callback_func', $unserializeCallbackHandler);
Chris@0 578
Chris@0 579 $this->assertDumpMatchesFormat(
Chris@0 580 <<<EOTXT
Chris@0 581 __PHP_Incomplete_Class(Foo\Buzz) {}
Chris@0 582 EOTXT
Chris@0 583 ,
Chris@0 584 $var
Chris@0 585 );
Chris@0 586 }
Chris@0 587
Chris@0 588 private function getSpecialVars()
Chris@0 589 {
Chris@0 590 foreach (array_keys($GLOBALS) as $var) {
Chris@0 591 if ('GLOBALS' !== $var) {
Chris@0 592 unset($GLOBALS[$var]);
Chris@0 593 }
Chris@0 594 }
Chris@0 595
Chris@0 596 $var = function &() {
Chris@0 597 $var = array();
Chris@0 598 $var[] = &$var;
Chris@0 599
Chris@0 600 return $var;
Chris@0 601 };
Chris@0 602
Chris@0 603 return array($var(), $GLOBALS, &$GLOBALS);
Chris@0 604 }
Chris@0 605 }