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