255 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			255 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| 
 | ||
| /*
 | ||
|  * This file is part of the Symfony package.
 | ||
|  *
 | ||
|  * (c) Fabien Potencier <fabien@symfony.com>
 | ||
|  *
 | ||
|  * For the full copyright and license information, please view the LICENSE
 | ||
|  * file that was distributed with this source code.
 | ||
|  */
 | ||
| 
 | ||
| namespace Symfony\Component\VarDumper\Tests\Caster;
 | ||
| 
 | ||
| use PHPUnit\Framework\TestCase;
 | ||
| use Symfony\Component\VarDumper\Caster\Caster;
 | ||
| use Symfony\Component\VarDumper\Test\VarDumperTestTrait;
 | ||
| use Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo;
 | ||
| use Symfony\Component\VarDumper\Tests\Fixtures\NotLoadableClass;
 | ||
| 
 | ||
| /**
 | ||
|  * @author Nicolas Grekas <p@tchwork.com>
 | ||
|  */
 | ||
| class ReflectionCasterTest extends TestCase
 | ||
| {
 | ||
|     use VarDumperTestTrait;
 | ||
| 
 | ||
|     public function testReflectionCaster()
 | ||
|     {
 | ||
|         $var = new \ReflectionClass('ReflectionClass');
 | ||
| 
 | ||
|         $this->assertDumpMatchesFormat(
 | ||
|             <<<'EOTXT'
 | ||
| ReflectionClass {
 | ||
|   +name: "ReflectionClass"
 | ||
| %Aimplements: array:%d [
 | ||
|     0 => "Reflector"
 | ||
| %A]
 | ||
|   constants: array:3 [
 | ||
|     "IS_IMPLICIT_ABSTRACT" => 16
 | ||
|     "IS_EXPLICIT_ABSTRACT" => 32
 | ||
|     "IS_FINAL" => %d
 | ||
|   ]
 | ||
|   properties: array:%d [
 | ||
|     "name" => ReflectionProperty {
 | ||
| %A    +name: "name"
 | ||
|       +class: "ReflectionClass"
 | ||
| %A    modifiers: "public"
 | ||
|     }
 | ||
| %A]
 | ||
|   methods: array:%d [
 | ||
| %A
 | ||
|     "export" => ReflectionMethod {
 | ||
|       +name: "export"
 | ||
|       +class: "ReflectionClass"
 | ||
| %A    parameters: {
 | ||
|         $%s: ReflectionParameter {
 | ||
| %A         position: 0
 | ||
| %A
 | ||
| }
 | ||
| EOTXT
 | ||
|             , $var
 | ||
|         );
 | ||
|     }
 | ||
| 
 | ||
|     public function testClosureCaster()
 | ||
|     {
 | ||
|         $a = $b = 123;
 | ||
|         $var = function ($x) use ($a, &$b) {};
 | ||
| 
 | ||
|         $this->assertDumpMatchesFormat(
 | ||
|             <<<'EOTXT'
 | ||
| Closure($x) {
 | ||
| %Aparameters: {
 | ||
|     $x: {}
 | ||
|   }
 | ||
|   use: {
 | ||
|     $a: 123
 | ||
|     $b: & 123
 | ||
|   }
 | ||
|   file: "%sReflectionCasterTest.php"
 | ||
|   line: "68 to 68"
 | ||
| }
 | ||
| EOTXT
 | ||
|             , $var
 | ||
|         );
 | ||
|     }
 | ||
| 
 | ||
|     public function testFromCallableClosureCaster()
 | ||
|     {
 | ||
|         if (\defined('HHVM_VERSION_ID')) {
 | ||
|             $this->markTestSkipped('Not for HHVM.');
 | ||
|         }
 | ||
|         $var = array(
 | ||
|             (new \ReflectionMethod($this, __FUNCTION__))->getClosure($this),
 | ||
|             (new \ReflectionMethod(__CLASS__, 'tearDownAfterClass'))->getClosure(),
 | ||
|         );
 | ||
| 
 | ||
|         $this->assertDumpMatchesFormat(
 | ||
|             <<<EOTXT
 | ||
| array:2 [
 | ||
|   0 => Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest::testFromCallableClosureCaster() {
 | ||
|     this: Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest { …}
 | ||
|     file: "%sReflectionCasterTest.php"
 | ||
|     line: "%d to %d"
 | ||
|   }
 | ||
|   1 => %sTestCase::tearDownAfterClass() {
 | ||
|     file: "%sTestCase.php"
 | ||
|     line: "%d to %d"
 | ||
|   }
 | ||
| ]
 | ||
| EOTXT
 | ||
|             , $var
 | ||
|         );
 | ||
|     }
 | ||
| 
 | ||
|     public function testClosureCasterExcludingVerbosity()
 | ||
|     {
 | ||
|         $var = function &($a = 5) {};
 | ||
| 
 | ||
|         $this->assertDumpEquals('Closure&($a = 5) { …6}', $var, Caster::EXCLUDE_VERBOSE);
 | ||
|     }
 | ||
| 
 | ||
|     public function testReflectionParameter()
 | ||
|     {
 | ||
|         $var = new \ReflectionParameter(__NAMESPACE__.'\reflectionParameterFixture', 0);
 | ||
| 
 | ||
|         $this->assertDumpMatchesFormat(
 | ||
|             <<<'EOTXT'
 | ||
| ReflectionParameter {
 | ||
|   +name: "arg1"
 | ||
|   position: 0
 | ||
|   typeHint: "Symfony\Component\VarDumper\Tests\Fixtures\NotLoadableClass"
 | ||
|   default: null
 | ||
| }
 | ||
| EOTXT
 | ||
|             , $var
 | ||
|         );
 | ||
|     }
 | ||
| 
 | ||
|     public function testReflectionParameterScalar()
 | ||
|     {
 | ||
|         $f = eval('return function (int $a) {};');
 | ||
|         $var = new \ReflectionParameter($f, 0);
 | ||
| 
 | ||
|         $this->assertDumpMatchesFormat(
 | ||
|             <<<'EOTXT'
 | ||
| ReflectionParameter {
 | ||
|   +name: "a"
 | ||
|   position: 0
 | ||
|   typeHint: "int"
 | ||
| }
 | ||
| EOTXT
 | ||
|             , $var
 | ||
|         );
 | ||
|     }
 | ||
| 
 | ||
|     public function testReturnType()
 | ||
|     {
 | ||
|         $f = eval('return function ():int {};');
 | ||
|         $line = __LINE__ - 1;
 | ||
| 
 | ||
|         $this->assertDumpMatchesFormat(
 | ||
|             <<<EOTXT
 | ||
| Closure(): int {
 | ||
|   returnType: "int"
 | ||
|   class: "Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest"
 | ||
|   this: Symfony\Component\VarDumper\Tests\Caster\ReflectionCasterTest { …}
 | ||
|   file: "%sReflectionCasterTest.php($line) : eval()'d code"
 | ||
|   line: "1 to 1"
 | ||
| }
 | ||
| EOTXT
 | ||
|             , $f
 | ||
|         );
 | ||
|     }
 | ||
| 
 | ||
|     public function testGenerator()
 | ||
|     {
 | ||
|         if (\extension_loaded('xdebug')) {
 | ||
|             $this->markTestSkipped('xdebug is active');
 | ||
|         }
 | ||
| 
 | ||
|         $generator = new GeneratorDemo();
 | ||
|         $generator = $generator->baz();
 | ||
| 
 | ||
|         $expectedDump = <<<'EODUMP'
 | ||
| Generator {
 | ||
|   this: Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo { …}
 | ||
|   executing: {
 | ||
|     Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo->baz() {
 | ||
|       %sGeneratorDemo.php:14 {
 | ||
|         › {
 | ||
|         ›     yield from bar();
 | ||
|         › }
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
|   closed: false
 | ||
| }
 | ||
| EODUMP;
 | ||
| 
 | ||
|         $this->assertDumpMatchesFormat($expectedDump, $generator);
 | ||
| 
 | ||
|         foreach ($generator as $v) {
 | ||
|             break;
 | ||
|         }
 | ||
| 
 | ||
|         $expectedDump = <<<'EODUMP'
 | ||
| array:2 [
 | ||
|   0 => ReflectionGenerator {
 | ||
|     this: Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo { …}
 | ||
|     trace: {
 | ||
|       %s%eTests%eFixtures%eGeneratorDemo.php:9 {
 | ||
|         › {
 | ||
|         ›     yield 1;
 | ||
|         › }
 | ||
|       }
 | ||
|       %s%eTests%eFixtures%eGeneratorDemo.php:20 { …}
 | ||
|       %s%eTests%eFixtures%eGeneratorDemo.php:14 { …}
 | ||
|     }
 | ||
|     closed: false
 | ||
|   }
 | ||
|   1 => Generator {
 | ||
|     executing: {
 | ||
|       Symfony\Component\VarDumper\Tests\Fixtures\GeneratorDemo::foo() {
 | ||
|         %sGeneratorDemo.php:10 {
 | ||
|           ›     yield 1;
 | ||
|           › }
 | ||
|           › 
 | ||
|         }
 | ||
|       }
 | ||
|     }
 | ||
|     closed: false
 | ||
|   }
 | ||
| ]
 | ||
| EODUMP;
 | ||
| 
 | ||
|         $r = new \ReflectionGenerator($generator);
 | ||
|         $this->assertDumpMatchesFormat($expectedDump, array($r, $r->getExecutingGenerator()));
 | ||
| 
 | ||
|         foreach ($generator as $v) {
 | ||
|         }
 | ||
| 
 | ||
|         $expectedDump = <<<'EODUMP'
 | ||
| Generator {
 | ||
|   closed: true
 | ||
| }
 | ||
| EODUMP;
 | ||
|         $this->assertDumpMatchesFormat($expectedDump, $generator);
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| function reflectionParameterFixture(NotLoadableClass $arg1 = null, $arg2)
 | ||
| {
 | ||
| }
 | 
