* * 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\Caster\ExceptionCaster; use Symfony\Component\VarDumper\Caster\FrameStub; use Symfony\Component\VarDumper\Cloner\VarCloner; use Symfony\Component\VarDumper\Dumper\HtmlDumper; use Symfony\Component\VarDumper\Test\VarDumperTestTrait; class ExceptionCasterTest extends TestCase { use VarDumperTestTrait; private function getTestException($msg, &$ref = null) { return new \Exception(''.$msg); } protected function tearDown(): void { ExceptionCaster::$srcContext = 1; ExceptionCaster::$traceArgs = true; } public function testDefaultSettings() { $ref = ['foo']; $e = $this->getTestException('foo', $ref); $expectedDump = <<<'EODUMP' Exception { #message: "foo" #code: 0 #file: "%sExceptionCasterTest.php" #line: 28 trace: { %s%eTests%eCaster%eExceptionCasterTest.php:28 { › { › return new \Exception(''.$msg); › } } %s%eTests%eCaster%eExceptionCasterTest.php:40 { …} %A EODUMP; $this->assertDumpMatchesFormat($expectedDump, $e); $this->assertSame(['foo'], $ref); } public function testSeek() { $e = $this->getTestException(2); $expectedDump = <<<'EODUMP' { %s%eTests%eCaster%eExceptionCasterTest.php:28 { › { › return new \Exception(''.$msg); › } } %s%eTests%eCaster%eExceptionCasterTest.php:64 { …} %A EODUMP; $this->assertStringMatchesFormat($expectedDump, $this->getDump($e, 'trace')); } public function testNoArgs() { $e = $this->getTestException(1); ExceptionCaster::$traceArgs = false; $expectedDump = <<<'EODUMP' Exception { #message: "1" #code: 0 #file: "%sExceptionCasterTest.php" #line: 28 trace: { %sExceptionCasterTest.php:28 { › { › return new \Exception(''.$msg); › } } %s%eTests%eCaster%eExceptionCasterTest.php:82 { …} %A EODUMP; $this->assertDumpMatchesFormat($expectedDump, $e); } public function testNoSrcContext() { $e = $this->getTestException(1); ExceptionCaster::$srcContext = -1; $expectedDump = <<<'EODUMP' Exception { #message: "1" #code: 0 #file: "%sExceptionCasterTest.php" #line: 28 trace: { %s%eTests%eCaster%eExceptionCasterTest.php:28 %s%eTests%eCaster%eExceptionCasterTest.php:%d %A EODUMP; $this->assertDumpMatchesFormat($expectedDump, $e); } public function testHtmlDump() { if (ini_get('xdebug.file_link_format') || get_cfg_var('xdebug.file_link_format')) { $this->markTestSkipped('A custom file_link_format is defined.'); } $e = $this->getTestException(1); ExceptionCaster::$srcContext = -1; $cloner = new VarCloner(); $cloner->setMaxItems(1); $dumper = new HtmlDumper(); $dumper->setDumpHeader(''); $dumper->setDumpBoundaries('', ''); $dump = $dumper->dump($cloner->cloneVar($e)->withRefHandles(false), true); $expectedDump = <<<'EODUMP' Exception { #message: "1" #code: 0 #file: "%s%eVarDumper%eTests%eCaster%eExceptionCasterTest.php" #line: 28 trace: { %s%eVarDumper%eTests%eCaster%eExceptionCasterTest.php:28 …%d } } EODUMP; $this->assertStringMatchesFormat($expectedDump, $dump); } /** * @requires function Twig\Template::getSourceContext */ public function testFrameWithTwig() { require_once \dirname(__DIR__).'/Fixtures/Twig.php'; $f = [ new FrameStub([ 'file' => \dirname(__DIR__).'/Fixtures/Twig.php', 'line' => 20, 'class' => '__TwigTemplate_VarDumperFixture_u75a09', ]), new FrameStub([ 'file' => \dirname(__DIR__).'/Fixtures/Twig.php', 'line' => 21, 'class' => '__TwigTemplate_VarDumperFixture_u75a09', 'object' => new \__TwigTemplate_VarDumperFixture_u75a09(null, __FILE__), ]), ]; $expectedDump = <<<'EODUMP' array:2 [ 0 => { class: "__TwigTemplate_VarDumperFixture_u75a09" src: { %sTwig.php:1 { › › foo bar › twig source } } } 1 => { class: "__TwigTemplate_VarDumperFixture_u75a09" object: __TwigTemplate_VarDumperFixture_u75a09 { %A } src: { %sExceptionCasterTest.php:2 { › foo bar › twig source › } } } ] EODUMP; $this->assertDumpMatchesFormat($expectedDump, $f); } public function testExcludeVerbosity() { $e = $this->getTestException('foo'); $expectedDump = <<<'EODUMP' Exception { #message: "foo" #code: 0 #file: "%sExceptionCasterTest.php" #line: 28 } EODUMP; $this->assertDumpMatchesFormat($expectedDump, $e, Caster::EXCLUDE_VERBOSE); } public function testAnonymous() { $e = new \Exception(sprintf('Boo "%s" ba.', \get_class(new class('Foo') extends \Exception { }))); $expectedDump = <<<'EODUMP' Exception { #message: "Boo "Exception@anonymous" ba." #code: 0 #file: "%sExceptionCasterTest.php" #line: %d } EODUMP; $this->assertDumpMatchesFormat($expectedDump, $e, Caster::EXCLUDE_VERBOSE); } }