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\Cloner; Chris@0: Chris@0: use PHPUnit\Framework\TestCase; Chris@0: use Symfony\Component\VarDumper\Cloner\VarCloner; Chris@0: Chris@0: /** Chris@0: * @author Nicolas Grekas Chris@0: */ Chris@0: class VarClonerTest extends TestCase Chris@0: { Chris@0: public function testMaxIntBoundary() Chris@0: { Chris@17: $data = [PHP_INT_MAX => 123]; Chris@0: Chris@0: $cloner = new VarCloner(); Chris@0: $clone = $cloner->cloneVar($data); Chris@0: Chris@0: $expected = << Array Chris@0: ( Chris@0: [0] => Array Chris@0: ( Chris@0: [0] => Array Chris@0: ( Chris@0: [1] => 1 Chris@0: ) Chris@0: Chris@0: ) Chris@0: Chris@0: [1] => Array Chris@0: ( Chris@0: [%s] => 123 Chris@0: ) Chris@0: Chris@0: ) Chris@0: Chris@0: [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0 Chris@0: [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0 Chris@0: [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20 Chris@0: [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1 Chris@0: [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1 Chris@0: ) Chris@0: Chris@0: EOTXT; Chris@0: $this->assertSame(sprintf($expected, PHP_INT_MAX), print_r($clone, true)); Chris@0: } Chris@0: Chris@0: public function testClone() Chris@0: { Chris@0: $json = json_decode('{"1":{"var":"val"},"2":{"var":"val"}}'); Chris@0: Chris@0: $cloner = new VarCloner(); Chris@0: $clone = $cloner->cloneVar($json); Chris@0: Chris@0: $expected = << Array Chris@0: ( Chris@0: [0] => Array Chris@0: ( Chris@0: [0] => Symfony\Component\VarDumper\Cloner\Stub Object Chris@0: ( Chris@0: [type] => 4 Chris@0: [class] => stdClass Chris@0: [value] => Chris@0: [cut] => 0 Chris@0: [handle] => %i Chris@0: [refCount] => 0 Chris@0: [position] => 1 Chris@0: [attr] => Array Chris@0: ( Chris@0: ) Chris@0: Chris@0: ) Chris@0: Chris@0: ) Chris@0: Chris@0: [1] => Array Chris@0: ( Chris@0: [\000+\0001] => Symfony\Component\VarDumper\Cloner\Stub Object Chris@0: ( Chris@0: [type] => 4 Chris@0: [class] => stdClass Chris@0: [value] => Chris@0: [cut] => 0 Chris@0: [handle] => %i Chris@0: [refCount] => 0 Chris@0: [position] => 2 Chris@0: [attr] => Array Chris@0: ( Chris@0: ) Chris@0: Chris@0: ) Chris@0: Chris@0: [\000+\0002] => Symfony\Component\VarDumper\Cloner\Stub Object Chris@0: ( Chris@0: [type] => 4 Chris@0: [class] => stdClass Chris@0: [value] => Chris@0: [cut] => 0 Chris@0: [handle] => %i Chris@0: [refCount] => 0 Chris@0: [position] => 3 Chris@0: [attr] => Array Chris@0: ( Chris@0: ) Chris@0: Chris@0: ) Chris@0: Chris@0: ) Chris@0: Chris@0: [2] => Array Chris@0: ( Chris@0: [\000+\000var] => val Chris@0: ) Chris@0: Chris@0: [3] => Array Chris@0: ( Chris@0: [\000+\000var] => val Chris@0: ) Chris@0: Chris@0: ) Chris@0: Chris@0: [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0 Chris@0: [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0 Chris@0: [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20 Chris@0: [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1 Chris@0: [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1 Chris@0: ) Chris@0: Chris@0: EOTXT; Chris@0: $this->assertStringMatchesFormat($expected, print_r($clone, true)); Chris@0: } Chris@0: Chris@12: public function testLimits() Chris@12: { Chris@12: // Level 0: Chris@17: $data = [ Chris@12: // Level 1: Chris@17: [ Chris@12: // Level 2: Chris@17: [ Chris@12: // Level 3: Chris@12: 'Level 3 Item 0', Chris@12: 'Level 3 Item 1', Chris@12: 'Level 3 Item 2', Chris@12: 'Level 3 Item 3', Chris@17: ], Chris@17: [ Chris@12: 'Level 3 Item 4', Chris@12: 'Level 3 Item 5', Chris@12: 'Level 3 Item 6', Chris@17: ], Chris@17: [ Chris@12: 'Level 3 Item 7', Chris@17: ], Chris@17: ], Chris@17: [ Chris@17: [ Chris@12: 'Level 3 Item 8', Chris@17: ], Chris@12: 'Level 2 Item 0', Chris@17: ], Chris@17: [ Chris@12: 'Level 2 Item 1', Chris@17: ], Chris@12: 'Level 1 Item 0', Chris@17: [ Chris@12: // Test setMaxString: Chris@12: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', Chris@12: 'SHORT', Chris@17: ], Chris@17: ]; Chris@12: Chris@12: $cloner = new VarCloner(); Chris@12: $cloner->setMinDepth(2); Chris@12: $cloner->setMaxItems(5); Chris@12: $cloner->setMaxString(20); Chris@12: $clone = $cloner->cloneVar($data); Chris@12: Chris@12: $expected = << Array Chris@12: ( Chris@12: [0] => Array Chris@12: ( Chris@12: [0] => Array Chris@12: ( Chris@12: [2] => 1 Chris@12: ) Chris@12: Chris@12: ) Chris@12: Chris@12: [1] => Array Chris@12: ( Chris@12: [0] => Array Chris@12: ( Chris@12: [2] => 2 Chris@12: ) Chris@12: Chris@12: [1] => Array Chris@12: ( Chris@12: [2] => 3 Chris@12: ) Chris@12: Chris@12: [2] => Array Chris@12: ( Chris@12: [2] => 4 Chris@12: ) Chris@12: Chris@12: [3] => Level 1 Item 0 Chris@12: [4] => Array Chris@12: ( Chris@12: [2] => 5 Chris@12: ) Chris@12: Chris@12: ) Chris@12: Chris@12: [2] => Array Chris@12: ( Chris@12: [0] => Array Chris@12: ( Chris@12: [2] => 6 Chris@12: ) Chris@12: Chris@12: [1] => Array Chris@12: ( Chris@12: [0] => 2 Chris@12: [2] => 7 Chris@12: ) Chris@12: Chris@12: [2] => Array Chris@12: ( Chris@12: [0] => 1 Chris@12: [2] => 0 Chris@12: ) Chris@12: Chris@12: ) Chris@12: Chris@12: [3] => Array Chris@12: ( Chris@12: [0] => Array Chris@12: ( Chris@12: [0] => 1 Chris@12: [2] => 0 Chris@12: ) Chris@12: Chris@12: [1] => Level 2 Item 0 Chris@12: ) Chris@12: Chris@12: [4] => Array Chris@12: ( Chris@12: [0] => Level 2 Item 1 Chris@12: ) Chris@12: Chris@12: [5] => Array Chris@12: ( Chris@12: [0] => Symfony\Component\VarDumper\Cloner\Stub Object Chris@12: ( Chris@12: [type] => 2 Chris@12: [class] => 2 Chris@12: [value] => ABCDEFGHIJKLMNOPQRST Chris@12: [cut] => 6 Chris@12: [handle] => 0 Chris@12: [refCount] => 0 Chris@12: [position] => 0 Chris@12: [attr] => Array Chris@12: ( Chris@12: ) Chris@12: Chris@12: ) Chris@12: Chris@12: [1] => SHORT Chris@12: ) Chris@12: Chris@12: [6] => Array Chris@12: ( Chris@12: [0] => Level 3 Item 0 Chris@12: [1] => Level 3 Item 1 Chris@12: [2] => Level 3 Item 2 Chris@12: [3] => Level 3 Item 3 Chris@12: ) Chris@12: Chris@12: [7] => Array Chris@12: ( Chris@12: [0] => Level 3 Item 4 Chris@12: ) Chris@12: Chris@12: ) Chris@12: Chris@12: [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0 Chris@12: [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0 Chris@12: [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20 Chris@12: [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1 Chris@12: [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1 Chris@12: ) Chris@12: Chris@12: EOTXT; Chris@12: $this->assertStringMatchesFormat($expected, print_r($clone, true)); Chris@12: } Chris@12: Chris@0: public function testJsonCast() Chris@0: { Chris@0: if (2 == ini_get('xdebug.overload_var_dump')) { Chris@0: $this->markTestSkipped('xdebug is active'); Chris@0: } Chris@0: Chris@0: $data = (array) json_decode('{"1":{}}'); Chris@0: Chris@0: $cloner = new VarCloner(); Chris@0: $clone = $cloner->cloneVar($data); Chris@0: Chris@0: $expected = <<<'EOTXT' Chris@0: object(Symfony\Component\VarDumper\Cloner\Data)#%i (6) { Chris@0: ["data":"Symfony\Component\VarDumper\Cloner\Data":private]=> Chris@0: array(2) { Chris@0: [0]=> Chris@0: array(1) { Chris@0: [0]=> Chris@0: array(1) { Chris@0: [1]=> Chris@0: int(1) Chris@0: } Chris@0: } Chris@0: [1]=> Chris@0: array(1) { Chris@0: ["1"]=> Chris@0: object(Symfony\Component\VarDumper\Cloner\Stub)#%i (8) { Chris@0: ["type"]=> Chris@0: int(4) Chris@0: ["class"]=> Chris@0: string(8) "stdClass" Chris@0: ["value"]=> Chris@0: NULL Chris@0: ["cut"]=> Chris@0: int(0) Chris@0: ["handle"]=> Chris@0: int(%i) Chris@0: ["refCount"]=> Chris@0: int(0) Chris@0: ["position"]=> Chris@0: int(0) Chris@0: ["attr"]=> Chris@0: array(0) { Chris@0: } Chris@0: } Chris@0: } Chris@0: } Chris@0: ["position":"Symfony\Component\VarDumper\Cloner\Data":private]=> Chris@0: int(0) Chris@0: ["key":"Symfony\Component\VarDumper\Cloner\Data":private]=> Chris@0: int(0) Chris@0: ["maxDepth":"Symfony\Component\VarDumper\Cloner\Data":private]=> Chris@0: int(20) Chris@0: ["maxItemsPerDepth":"Symfony\Component\VarDumper\Cloner\Data":private]=> Chris@0: int(-1) Chris@0: ["useRefHandles":"Symfony\Component\VarDumper\Cloner\Data":private]=> Chris@0: int(-1) Chris@0: } Chris@0: Chris@0: EOTXT; Chris@0: ob_start(); Chris@0: var_dump($clone); Chris@0: $this->assertStringMatchesFormat(\PHP_VERSION_ID >= 70200 ? str_replace('"1"', '1', $expected) : $expected, ob_get_clean()); Chris@0: } Chris@0: Chris@0: public function testCaster() Chris@0: { Chris@17: $cloner = new VarCloner([ Chris@0: '*' => function ($obj, $array) { Chris@17: return ['foo' => 123]; Chris@0: }, Chris@0: __CLASS__ => function ($obj, $array) { Chris@0: ++$array['foo']; Chris@0: Chris@0: return $array; Chris@0: }, Chris@17: ]); Chris@0: $clone = $cloner->cloneVar($this); Chris@0: Chris@0: $expected = << Array Chris@0: ( Chris@0: [0] => Array Chris@0: ( Chris@0: [0] => Symfony\Component\VarDumper\Cloner\Stub Object Chris@0: ( Chris@0: [type] => 4 Chris@0: [class] => %s Chris@0: [value] => Chris@0: [cut] => 0 Chris@0: [handle] => %i Chris@0: [refCount] => 0 Chris@0: [position] => 1 Chris@0: [attr] => Array Chris@0: ( Chris@0: ) Chris@0: Chris@0: ) Chris@0: Chris@0: ) Chris@0: Chris@0: [1] => Array Chris@0: ( Chris@0: [foo] => 124 Chris@0: ) Chris@0: Chris@0: ) Chris@0: Chris@0: [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0 Chris@0: [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0 Chris@0: [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20 Chris@0: [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1 Chris@0: [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1 Chris@0: ) Chris@0: Chris@0: EOTXT; Chris@0: $this->assertStringMatchesFormat($expected, print_r($clone, true)); Chris@0: } Chris@0: }