annotate vendor/symfony/var-dumper/Tests/Dumper/CliDumperTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
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@17 35 $cloner->addCasters([
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@17 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@17 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@12 89 file: "%s%eTests%eFixtures%edumb-var.php"
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@17 122 $var = [
Chris@17 123 'array' => ['a', 'b'],
Chris@0 124 'string' => 'hello',
Chris@0 125 'multiline string' => "this\nis\na\multiline\nstring",
Chris@17 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@12 150 %ACliDumperTest.php:%d {
Chris@12 151
Chris@12 152 › $ex = new \RuntimeException('foo');
Chris@12 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@17 182 yield [$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@17 201 yield [$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@17 264 $var = (object) [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@17 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@17 325 $var = [
Chris@0 326 range(1, 3),
Chris@17 327 ['foo', 2 => 'bar'],
Chris@17 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@17 365 $cloner->addCasters([
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@17 371 ]);
Chris@17 372 $cloner->addCasters([
Chris@0 373 ':stream' => eval('return function () use ($twig) {
Chris@0 374 try {
Chris@17 375 $twig->render([]);
Chris@0 376 } catch (\Twig\Error\RuntimeError $e) {
Chris@0 377 throw $e->getPrevious();
Chris@0 378 }
Chris@0 379 };'),
Chris@17 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@17 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@12 394 %sTwig.php:2 {
Chris@12 395 › foo bar
Chris@12 396 › twig source
Chris@12 397
Chris@0 398 }
Chris@12 399 %s%eTemplate.php:%d { …}
Chris@12 400 %s%eTemplate.php:%d { …}
Chris@12 401 %s%eTemplate.php:%d { …}
Chris@12 402 %s%eTests%eDumper%eCliDumperTest.php:%d { …}
Chris@12 403 %A }
Chris@0 404 }
Chris@0 405 %Awrapper_type: "PHP"
Chris@0 406 stream_type: "MEMORY"
Chris@0 407 mode: "%s+b"
Chris@0 408 unread_bytes: 0
Chris@0 409 seekable: true
Chris@0 410 uri: "php://memory"
Chris@0 411 %Aoptions: []
Chris@0 412 }
Chris@0 413
Chris@0 414 EOTXT
Chris@0 415 ,
Chris@0 416 $out
Chris@0 417 );
Chris@0 418 }
Chris@0 419
Chris@0 420 public function testRefsInProperties()
Chris@0 421 {
Chris@17 422 $var = (object) ['foo' => 'foo'];
Chris@0 423 $var->bar = &$var->foo;
Chris@0 424
Chris@0 425 $dumper = new CliDumper();
Chris@0 426 $dumper->setColors(false);
Chris@0 427 $cloner = new VarCloner();
Chris@0 428
Chris@0 429 $data = $cloner->cloneVar($var);
Chris@0 430 $out = $dumper->dump($data, true);
Chris@0 431
Chris@17 432 $r = \defined('HHVM_VERSION') ? '' : '#%d';
Chris@0 433 $this->assertStringMatchesFormat(
Chris@0 434 <<<EOTXT
Chris@0 435 {{$r}
Chris@0 436 +"foo": &1 "foo"
Chris@0 437 +"bar": &1 "foo"
Chris@0 438 }
Chris@0 439
Chris@0 440 EOTXT
Chris@0 441 ,
Chris@0 442 $out
Chris@0 443 );
Chris@0 444 }
Chris@0 445
Chris@0 446 /**
Chris@0 447 * @runInSeparateProcess
Chris@0 448 * @preserveGlobalState disabled
Chris@0 449 * @requires PHP 5.6
Chris@0 450 */
Chris@0 451 public function testSpecialVars56()
Chris@0 452 {
Chris@0 453 $var = $this->getSpecialVars();
Chris@0 454
Chris@0 455 $this->assertDumpEquals(
Chris@0 456 <<<'EOTXT'
Chris@0 457 array:3 [
Chris@0 458 0 => array:1 [
Chris@0 459 0 => &1 array:1 [
Chris@0 460 0 => &1 array:1 [&1]
Chris@0 461 ]
Chris@0 462 ]
Chris@0 463 1 => array:1 [
Chris@0 464 "GLOBALS" => &2 array:1 [
Chris@0 465 "GLOBALS" => &2 array:1 [&2]
Chris@0 466 ]
Chris@0 467 ]
Chris@0 468 2 => &2 array:1 [&2]
Chris@0 469 ]
Chris@0 470 EOTXT
Chris@0 471 ,
Chris@0 472 $var
Chris@0 473 );
Chris@0 474 }
Chris@0 475
Chris@0 476 /**
Chris@0 477 * @runInSeparateProcess
Chris@0 478 * @preserveGlobalState disabled
Chris@0 479 */
Chris@0 480 public function testGlobalsNoExt()
Chris@0 481 {
Chris@0 482 $var = $this->getSpecialVars();
Chris@0 483 unset($var[0]);
Chris@0 484 $out = '';
Chris@0 485
Chris@0 486 $dumper = new CliDumper(function ($line, $depth) use (&$out) {
Chris@0 487 if ($depth >= 0) {
Chris@0 488 $out .= str_repeat(' ', $depth).$line."\n";
Chris@0 489 }
Chris@0 490 });
Chris@0 491 $dumper->setColors(false);
Chris@0 492 $cloner = new VarCloner();
Chris@0 493
Chris@0 494 $refl = new \ReflectionProperty($cloner, 'useExt');
Chris@0 495 $refl->setAccessible(true);
Chris@0 496 $refl->setValue($cloner, false);
Chris@0 497
Chris@0 498 $data = $cloner->cloneVar($var);
Chris@0 499 $dumper->dump($data);
Chris@0 500
Chris@0 501 $this->assertSame(
Chris@0 502 <<<'EOTXT'
Chris@0 503 array:2 [
Chris@0 504 1 => array:1 [
Chris@0 505 "GLOBALS" => &1 array:1 [
Chris@0 506 "GLOBALS" => &1 array:1 [&1]
Chris@0 507 ]
Chris@0 508 ]
Chris@0 509 2 => &1 array:1 [&1]
Chris@0 510 ]
Chris@0 511
Chris@0 512 EOTXT
Chris@0 513 ,
Chris@0 514 $out
Chris@0 515 );
Chris@0 516 }
Chris@0 517
Chris@0 518 /**
Chris@0 519 * @runInSeparateProcess
Chris@0 520 * @preserveGlobalState disabled
Chris@0 521 */
Chris@0 522 public function testBuggyRefs()
Chris@0 523 {
Chris@0 524 if (\PHP_VERSION_ID >= 50600) {
Chris@0 525 $this->markTestSkipped('PHP 5.6 fixed refs counting');
Chris@0 526 }
Chris@0 527
Chris@0 528 $var = $this->getSpecialVars();
Chris@0 529 $var = $var[0];
Chris@0 530
Chris@0 531 $dumper = new CliDumper();
Chris@0 532 $dumper->setColors(false);
Chris@0 533 $cloner = new VarCloner();
Chris@0 534
Chris@0 535 $data = $cloner->cloneVar($var)->withMaxDepth(3);
Chris@0 536 $out = '';
Chris@0 537 $dumper->dump($data, function ($line, $depth) use (&$out) {
Chris@0 538 if ($depth >= 0) {
Chris@0 539 $out .= str_repeat(' ', $depth).$line."\n";
Chris@0 540 }
Chris@0 541 });
Chris@0 542
Chris@0 543 $this->assertSame(
Chris@0 544 <<<'EOTXT'
Chris@0 545 array:1 [
Chris@0 546 0 => array:1 [
Chris@0 547 0 => array:1 [
Chris@0 548 0 => array:1 [ …1]
Chris@0 549 ]
Chris@0 550 ]
Chris@0 551 ]
Chris@0 552
Chris@0 553 EOTXT
Chris@0 554 ,
Chris@0 555 $out
Chris@0 556 );
Chris@0 557 }
Chris@0 558
Chris@0 559 public function testIncompleteClass()
Chris@0 560 {
Chris@0 561 $unserializeCallbackHandler = ini_set('unserialize_callback_func', null);
Chris@0 562 $var = unserialize('O:8:"Foo\Buzz":0:{}');
Chris@0 563 ini_set('unserialize_callback_func', $unserializeCallbackHandler);
Chris@0 564
Chris@0 565 $this->assertDumpMatchesFormat(
Chris@0 566 <<<EOTXT
Chris@0 567 __PHP_Incomplete_Class(Foo\Buzz) {}
Chris@0 568 EOTXT
Chris@0 569 ,
Chris@0 570 $var
Chris@0 571 );
Chris@0 572 }
Chris@0 573
Chris@0 574 private function getSpecialVars()
Chris@0 575 {
Chris@0 576 foreach (array_keys($GLOBALS) as $var) {
Chris@0 577 if ('GLOBALS' !== $var) {
Chris@0 578 unset($GLOBALS[$var]);
Chris@0 579 }
Chris@0 580 }
Chris@0 581
Chris@0 582 $var = function &() {
Chris@17 583 $var = [];
Chris@0 584 $var[] = &$var;
Chris@0 585
Chris@0 586 return $var;
Chris@0 587 };
Chris@0 588
Chris@17 589 return [$var(), $GLOBALS, &$GLOBALS];
Chris@0 590 }
Chris@0 591 }