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: }