DumperTest.php 4.37 KB
Newer Older
1 2
<?php

Michael Moravec's avatar
Michael Moravec committed
3 4
declare(strict_types=1);

5
namespace Doctrine\DBAL\Tests\Tools;
6 7 8 9 10 11 12

use ArrayIterator;
use ArrayObject;
use DateTime;
use DateTimeImmutable;
use DateTimeZone;
use Doctrine\DBAL\Tools\Dumper;
13
use PHPUnit\Framework\TestCase;
Sergei Morozov's avatar
Sergei Morozov committed
14
use stdClass;
15 16 17 18
use function print_r;
use function strpos;
use function substr;

19
class DumperTest extends TestCase
20
{
21
    public function testExportObject() : void
22
    {
Sergei Morozov's avatar
Sergei Morozov committed
23
        $obj      = new stdClass();
24 25 26 27 28 29 30
        $obj->foo = 'bar';
        $obj->bar = 1234;

        $var = Dumper::export($obj, 2);
        self::assertEquals('stdClass', $var->__CLASS__);
    }

31
    public function testExportObjectWithReference() : void
32 33 34 35 36 37 38 39 40 41 42 43
    {
        $foo = 'bar';
        $bar = ['foo' => & $foo];
        $baz = (object) $bar;

        $var      = Dumper::export($baz, 2);
        $baz->foo = 'tab';

        self::assertEquals('bar', $var->foo);
        self::assertEquals('tab', $bar['foo']);
    }

44
    public function testExportArray() : void
45 46 47 48 49 50 51 52
    {
        $array              = ['a' => 'b', 'b' => ['c', 'd' => ['e', 'f']]];
        $var                = Dumper::export($array, 2);
        $expected           = $array;
        $expected['b']['d'] = 'Array(2)';
        self::assertEquals($expected, $var);
    }

53
    public function testExportDateTime() : void
54 55 56 57 58 59 60 61
    {
        $obj = new DateTime('2010-10-10 10:10:10', new DateTimeZone('UTC'));

        $var = Dumper::export($obj, 2);
        self::assertEquals('DateTime', $var->__CLASS__);
        self::assertEquals('2010-10-10T10:10:10+00:00', $var->date);
    }

62
    public function testExportDateTimeImmutable() : void
63 64 65 66 67 68 69 70
    {
        $obj = new DateTimeImmutable('2010-10-10 10:10:10', new DateTimeZone('UTC'));

        $var = Dumper::export($obj, 2);
        self::assertEquals('DateTimeImmutable', $var->__CLASS__);
        self::assertEquals('2010-10-10T10:10:10+00:00', $var->date);
    }

71
    public function testExportDateTimeZone() : void
72 73 74 75 76 77 78 79
    {
        $obj = new DateTimeImmutable('2010-10-10 12:34:56', new DateTimeZone('Europe/Rome'));

        $var = Dumper::export($obj, 2);
        self::assertEquals('DateTimeImmutable', $var->__CLASS__);
        self::assertEquals('2010-10-10T12:34:56+02:00', $var->date);
    }

80
    public function testExportArrayTraversable() : void
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
    {
        $obj = new ArrayObject(['foobar']);

        $var = Dumper::export($obj, 2);
        self::assertContains('foobar', $var->__STORAGE__);

        $it = new ArrayIterator(['foobar']);

        $var = Dumper::export($it, 5);
        self::assertContains('foobar', $var->__STORAGE__);
    }

    /**
     * @param string[] $expected
     *
     * @dataProvider provideAttributesCases
     */
98
    public function testExportParentAttributes(TestAsset\ParentClass $class, array $expected) : void
99
    {
100 101
        $printedClass    = print_r($class, true);
        $printedExpected = print_r($expected, true);
102

103 104
        $printedClass    = substr($printedClass, (int) strpos($printedClass, '('));
        $printedExpected = substr($printedExpected, (int) strpos($printedExpected, '('));
105

106
        self::assertSame($printedClass, $printedExpected);
107 108 109 110 111 112 113 114

        $var = Dumper::export($class, 3);
        $var = (array) $var;
        unset($var['__CLASS__']);

        self::assertSame($expected, $var);
    }

115 116 117 118
    /**
     * @return mixed[][]
     */
    public static function provideAttributesCases() : iterable
119 120 121 122 123 124 125
    {
        return [
            'different-attributes' => [
                new TestAsset\ChildClass(),
                [
                    'childPublicAttribute' => 4,
                    'childProtectedAttribute:protected' => 5,
126
                    'childPrivateAttribute:Doctrine\DBAL\Tests\Tools\TestAsset\ChildClass:private' => 6,
127 128
                    'parentPublicAttribute' => 1,
                    'parentProtectedAttribute:protected' => 2,
129
                    'parentPrivateAttribute:Doctrine\DBAL\Tests\Tools\TestAsset\ParentClass:private' => 3,
130 131 132 133 134 135 136
                ],
            ],
            'same-attributes' => [
                new TestAsset\ChildWithSameAttributesClass(),
                [
                    'parentPublicAttribute' => 4,
                    'parentProtectedAttribute:protected' => 5,
137 138
                    'parentPrivateAttribute:Doctrine\DBAL\Tests\Tools\TestAsset\ChildWithSameAttributesClass:private' => 6,
                    'parentPrivateAttribute:Doctrine\DBAL\Tests\Tools\TestAsset\ParentClass:private' => 3,
139 140 141 142 143
                ],
            ],
        ];
    }
}