| <?php
/*
 * This file is part of Chevere.
 *
 * (c) Rodolfo Berrios <[email protected] >
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
declare(strict_types=1);
namespace Chevere\Tests;
use Chevere\VarDump\Formats\HtmlFormat;
use Chevere\VarDump\Formats\PlainFormat;
use Chevere\VarDump\Interfaces\VarDumpInterface;
use Chevere\VarDump\Outputs\PlainOutput;
use Chevere\VarDump\VarDump;
use Chevere\Writer\StreamWriter;
use PHPUnit\Framework\TestCase;
use stdClass;
use function Chevere\Writer\streamTemp;
final class VarDumpTest extends TestCase
{
    public function testConstruct(): void
    {
        $varDump = $this->getVarDump();
        $this->assertSame(0, $varDump->shift());
        $this->assertSame([], $varDump->variables());
    }
    public function testWithVariables(): void
    {
        $stream = streamTemp('');
        $writer = new StreamWriter($stream);
        $var = new stdClass();
        $varDump = $this->getVarDump();
        $varDumpWithVariables = $varDump->withVariables($var);
        $this->assertNotSame($varDump, $varDumpWithVariables);
        $this->assertEqualsCanonicalizing(
            [$var],
            $varDumpWithVariables->variables()
        );
        $varDumpWithVariables->process($writer);
        $line = strval(__LINE__ - 1);
        $className = $varDump::class;
        $fileLine = __FILE__ . ':' . $line;
        $objectId = spl_object_id($var);
        $expectedString = <<<PLAIN
        {$className}->process()
        ------------------------------------------------------------
        {$fileLine}
        1: stdClass#{$objectId}
        ------------------------------------------------------------
        PLAIN;
        $this->assertSame($expectedString, $writer->__toString());
    }
    public function testCircularReferenceArguments(): void
    {
        $var = new stdClass();
        $var->circular = $var;
        $var->string = 'test';
        $varDump = $this->getVarDump();
        $with = $varDump->withVariables($var, [$var]);
        $stream = streamTemp('');
        $writer = new StreamWriter($stream);
        $with->process($writer);
        $line = strval(__LINE__ - 1);
        $className = $varDump::class;
        $fileLine = __FILE__ . ':' . $line;
        $objectId = spl_object_id($var);
        $expectedString = <<<PLAIN
        {$className}->process()
        ------------------------------------------------------------
        {$fileLine}
        1: stdClass#{$objectId}
         public circular stdClass#{$objectId} (circular reference #{$objectId})
         public string string test (length=4)
        2: array (size=1)
         0 => stdClass#{$objectId}
          public circular stdClass#{$objectId} (circular reference #{$objectId})
          public string string test (length=4)
        ------------------------------------------------------------
        PLAIN;
        $this->assertSame($expectedString, $writer->__toString());
    }
    public function testWithShift(): void
    {
        $stream = streamTemp('');
        $writer = new StreamWriter($stream);
        $varDump = $this->getVarDump();
        $varDumpWithShift = $varDump->withShift(1);
        $this->assertNotSame($varDump, $varDumpWithShift);
        $this->assertSame(1, $varDumpWithShift->shift());
        $varDumpWithShift->process($writer);
    }
    public function testWithArrayNeedsPullUp(): void
    {
        $vars = [
            0 => [],
            1 => [0, 1],
            2 => [
                0 => [1],
                1 => null,
                3 => [[[5]]],
                2 => [2],
            ],
            3 => [
                'key' => 'value',
            ],
            4 => null,
        ];
        $stream = streamTemp('');
        $writer = new StreamWriter($stream);
        $varDump = $this->getVarDump();
        $with = $varDump->withVariables(...$vars);
        $with->process($writer);
        $line = strval(__LINE__ - 1);
        $className = $varDump::class;
        $fileLine = __FILE__ . ':' . $line;
        $expectedString = <<<PLAIN
        {$className}->process()
        ------------------------------------------------------------
        {$fileLine}
        1: array [] (size=0)
        2: array (size=2)
         0 => int 0 (length=1)
         1 => int 1 (length=1)
        3: array (size=4)
         0 => array (size=1)
          0 => int 1 (length=1)
         1 => null
         3 => array (size=1)
          0 => array (size=1)
           0 => array (size=1)
            0 => int 5 (length=1)
         2 => array (size=1)
          0 => int 2 (length=1)
        4: array (size=1)
         key => string value (length=5)
        5: null
        ------------------------------------------------------------
        PLAIN;
        $this->assertSame($expectedString, $writer->__toString());
        $stream = streamTemp('');
        $writer = new StreamWriter($stream);
        $varDump = new VarDump(new HtmlFormat(), new PlainOutput());
        $with = $varDump->withVariables(...$vars);
        $with->process($writer);
        $line = strval(__LINE__ - 1);
        $className = $varDump::class;
        $fileLine = __FILE__ . ':' . $line;
        $expectedString = <<<PLAIN
        {$className}->process()
        ------------------------------------------------------------
        <span class="chv-dump-file">{$fileLine}</span>
        1: <span class="chv-dump-array">array</span> [] <em><span class="chv-dump-emphasis">(size=0)</span></em>
        2: <span class="chv-dump-array">array</span> <em><span class="chv-dump-emphasis">(size=2)</span></em><details class="chv-dump-details" open><summary class="chv-dump-summary"></summary> 0 <span class="chv-dump-operator">=></span> <span class="chv-dump-int">int</span> 0 <em><span class="chv-dump-emphasis">(length=1)</span></em>
         1 <span class="chv-dump-operator">=></span> <span class="chv-dump-int">int</span> 1 <em><span class="chv-dump-emphasis">(length=1)</span></em></details>
        3: <span class="chv-dump-array">array</span> <em><span class="chv-dump-emphasis">(size=4)</span></em><details class="chv-dump-details" open><summary class="chv-dump-summary"></summary> 0 <span class="chv-dump-operator">=></span> <span class="chv-dump-array">array</span> <em><span class="chv-dump-emphasis">(size=1)</span></em><details class="chv-dump-details"><summary class="chv-dump-summary"></summary>  <span class="chv-dump-inline"></span> 0 <span class="chv-dump-operator">=></span> <span class="chv-dump-int">int</span> 1 <em><span class="chv-dump-emphasis">(length=1)</span></em></details>
         1 <span class="chv-dump-operator">=></span> <span class="chv-dump-null">null</span>
         3 <span class="chv-dump-operator">=></span> <span class="chv-dump-array">array</span> <em><span class="chv-dump-emphasis">(size=1)</span></em><details class="chv-dump-details"><summary class="chv-dump-summary"></summary>  <span class="chv-dump-inline"></span> 0 <span class="chv-dump-operator">=></span> <span class="chv-dump-array">array</span> <em><span class="chv-dump-emphasis">(size=1)</span></em><details class="chv-dump-details"><summary class="chv-dump-summary"></summary>  <span class="chv-dump-inline"></span>  <span class="chv-dump-inline"></span> 0 <span class="chv-dump-operator">=></span> <span class="chv-dump-array">array</span> <em><span class="chv-dump-emphasis">(size=1)</span></em><details class="chv-dump-details"><summary class="chv-dump-summary"></summary>  <span class="chv-dump-inline"></span>  <span class="chv-dump-inline"></span>  <span class="chv-dump-inline"></span> 0 <span class="chv-dump-operator">=></span> <span class="chv-dump-int">int</span> 5 <em><span class="chv-dump-emphasis">(length=1)</span></em></details></details></details>
         2 <span class="chv-dump-operator">=></span> <span class="chv-dump-array">array</span> <em><span class="chv-dump-emphasis">(size=1)</span></em><details class="chv-dump-details"><summary class="chv-dump-summary"></summary>  <span class="chv-dump-inline"></span> 0 <span class="chv-dump-operator">=></span> <span class="chv-dump-int">int</span> 2 <em><span class="chv-dump-emphasis">(length=1)</span></em></details></details>
        4: <span class="chv-dump-array">array</span> <em><span class="chv-dump-emphasis">(size=1)</span></em><details class="chv-dump-details" open><summary class="chv-dump-summary"></summary> key <span class="chv-dump-operator">=></span> <span class="chv-dump-string">string</span> value <em><span class="chv-dump-emphasis">(length=5)</span></em></details>
        5: <span class="chv-dump-null">null</span>
        ------------------------------------------------------------
        PLAIN;
        $this->assertSame($expectedString, $writer->__toString());
    }
    public function testWithObjectNeedsPullUp(): void
    {
        $one = new stdClass();
        $two = new stdClass();
        $two->zero = 0;
        $two->one = 1;
        $nested = new stdClass();
        $three = new stdClass();
        $three->nested = $nested;
        $three->two = $two;
        $three->three = false;
        $vars = [
            0 => $one,
            1 => $two,
            2 => $three,
        ];
        $oneId = spl_object_id($one);
        $twoId = spl_object_id($two);
        $threeId = spl_object_id($three);
        $nestedId = spl_object_id($nested);
        $stream = streamTemp('');
        $writer = new StreamWriter($stream);
        $varDump = $this->getVarDump();
        $with = $varDump->withVariables(...$vars);
        $with->process($writer);
        $line = strval(__LINE__ - 1);
        $className = $varDump::class;
        $fileLine = __FILE__ . ':' . $line;
        $expectedString = <<<PLAIN
        {$className}->process()
        ------------------------------------------------------------
        {$fileLine}
        1: stdClass#{$oneId}
        2: stdClass#{$twoId}
         public zero int 0 (length=1)
         public one int 1 (length=1)
        3: stdClass#{$threeId}
         public nested stdClass#{$nestedId}
         public two stdClass#{$twoId}
          public zero int 0 (length=1)
          public one int 1 (length=1)
         public three bool false
        ------------------------------------------------------------
        PLAIN;
        $this->assertSame($expectedString, $writer->__toString());
        $stream = streamTemp('');
        $writer = new StreamWriter($stream);
        $varDump = new VarDump(new HtmlFormat(), new PlainOutput());
        $with = $varDump->withVariables(...$vars);
        $with->process($writer);
        $line = strval(__LINE__ - 1);
        $className = $varDump::class;
        $fileLine = __FILE__ . ':' . $line;
        $expectedString = <<<PLAIN
        {$className}->process()
        ------------------------------------------------------------
        <span class="chv-dump-file">{$fileLine}</span>
        1: <span class="chv-dump-class">stdClass</span><span class="chv-dump-operator">#{$oneId}</span>
        2: <span class="chv-dump-class">stdClass</span><span class="chv-dump-operator">#{$twoId}</span><details class="chv-dump-details" open><summary class="chv-dump-summary"></summary> <span class="chv-dump-modifier">public</span> <span class="chv-dump-variable">zero</span> <span class="chv-dump-int">int</span> 0 <em><span class="chv-dump-emphasis">(length=1)</span></em>
         <span class="chv-dump-modifier">public</span> <span class="chv-dump-variable">one</span> <span class="chv-dump-int">int</span> 1 <em><span class="chv-dump-emphasis">(length=1)</span></em></details>
        3: <span class="chv-dump-class">stdClass</span><span class="chv-dump-operator">#{$threeId}</span><details class="chv-dump-details" open><summary class="chv-dump-summary"></summary> <span class="chv-dump-modifier">public</span> <span class="chv-dump-variable">nested</span> <span class="chv-dump-class">stdClass</span><span class="chv-dump-operator">#{$nestedId}</span>
         <span class="chv-dump-modifier">public</span> <span class="chv-dump-variable">two</span> <span class="chv-dump-class">stdClass</span><span class="chv-dump-operator">#{$twoId}</span><details class="chv-dump-details"><summary class="chv-dump-summary"></summary>  <span class="chv-dump-inline"></span> <span class="chv-dump-modifier">public</span> <span class="chv-dump-variable">zero</span> <span class="chv-dump-int">int</span> 0 <em><span class="chv-dump-emphasis">(length=1)</span></em>
          <span class="chv-dump-inline"></span> <span class="chv-dump-modifier">public</span> <span class="chv-dump-variable">one</span> <span class="chv-dump-int">int</span> 1 <em><span class="chv-dump-emphasis">(length=1)</span></em></details>
         <span class="chv-dump-modifier">public</span> <span class="chv-dump-variable">three</span> <span class="chv-dump-bool">bool</span> false</details>
        ------------------------------------------------------------
        PLAIN;
        $this->assertSame($expectedString, $writer->__toString());
    }
    private function getVarDump(): VarDumpInterface
    {
        return new VarDump(new PlainFormat(), new PlainOutput());
    }
}
 |