菜谱项目

VarClonerTest.php 7.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\VarDumper\Tests\Cloner;
  11. use PHPUnit\Framework\TestCase;
  12. use Symfony\Component\VarDumper\Cloner\VarCloner;
  13. /**
  14. * @author Nicolas Grekas <p@tchwork.com>
  15. */
  16. class VarClonerTest extends TestCase
  17. {
  18. public function testMaxIntBoundary()
  19. {
  20. $data = array(PHP_INT_MAX => 123);
  21. $cloner = new VarCloner();
  22. $clone = $cloner->cloneVar($data);
  23. $expected = <<<EOTXT
  24. Symfony\Component\VarDumper\Cloner\Data Object
  25. (
  26. [data:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  27. (
  28. [0] => Array
  29. (
  30. [0] => Array
  31. (
  32. [1] => 1
  33. )
  34. )
  35. [1] => Array
  36. (
  37. [%s] => 123
  38. )
  39. )
  40. [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  41. [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  42. [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20
  43. [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  44. [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  45. )
  46. EOTXT;
  47. $this->assertSame(sprintf($expected, PHP_INT_MAX), print_r($clone, true));
  48. }
  49. public function testClone()
  50. {
  51. $json = json_decode('{"1":{"var":"val"},"2":{"var":"val"}}');
  52. $cloner = new VarCloner();
  53. $clone = $cloner->cloneVar($json);
  54. $expected = <<<EOTXT
  55. Symfony\Component\VarDumper\Cloner\Data Object
  56. (
  57. [data:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  58. (
  59. [0] => Array
  60. (
  61. [0] => Symfony\Component\VarDumper\Cloner\Stub Object
  62. (
  63. [type] => 4
  64. [class] => stdClass
  65. [value] =>
  66. [cut] => 0
  67. [handle] => %i
  68. [refCount] => 0
  69. [position] => 1
  70. [attr] => Array
  71. (
  72. )
  73. )
  74. )
  75. [1] => Array
  76. (
  77. [\000+\0001] => Symfony\Component\VarDumper\Cloner\Stub Object
  78. (
  79. [type] => 4
  80. [class] => stdClass
  81. [value] =>
  82. [cut] => 0
  83. [handle] => %i
  84. [refCount] => 0
  85. [position] => 2
  86. [attr] => Array
  87. (
  88. )
  89. )
  90. [\000+\0002] => Symfony\Component\VarDumper\Cloner\Stub Object
  91. (
  92. [type] => 4
  93. [class] => stdClass
  94. [value] =>
  95. [cut] => 0
  96. [handle] => %i
  97. [refCount] => 0
  98. [position] => 3
  99. [attr] => Array
  100. (
  101. )
  102. )
  103. )
  104. [2] => Array
  105. (
  106. [\000+\000var] => val
  107. )
  108. [3] => Array
  109. (
  110. [\000+\000var] => val
  111. )
  112. )
  113. [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  114. [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  115. [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20
  116. [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  117. [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  118. )
  119. EOTXT;
  120. $this->assertStringMatchesFormat($expected, print_r($clone, true));
  121. }
  122. public function testJsonCast()
  123. {
  124. if (2 == ini_get('xdebug.overload_var_dump')) {
  125. $this->markTestSkipped('xdebug is active');
  126. }
  127. $data = (array) json_decode('{"1":{}}');
  128. $cloner = new VarCloner();
  129. $clone = $cloner->cloneVar($data);
  130. $expected = <<<'EOTXT'
  131. object(Symfony\Component\VarDumper\Cloner\Data)#%i (6) {
  132. ["data":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  133. array(2) {
  134. [0]=>
  135. array(1) {
  136. [0]=>
  137. array(1) {
  138. [1]=>
  139. int(1)
  140. }
  141. }
  142. [1]=>
  143. array(1) {
  144. ["1"]=>
  145. object(Symfony\Component\VarDumper\Cloner\Stub)#%i (8) {
  146. ["type"]=>
  147. int(4)
  148. ["class"]=>
  149. string(8) "stdClass"
  150. ["value"]=>
  151. NULL
  152. ["cut"]=>
  153. int(0)
  154. ["handle"]=>
  155. int(%i)
  156. ["refCount"]=>
  157. int(0)
  158. ["position"]=>
  159. int(0)
  160. ["attr"]=>
  161. array(0) {
  162. }
  163. }
  164. }
  165. }
  166. ["position":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  167. int(0)
  168. ["key":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  169. int(0)
  170. ["maxDepth":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  171. int(20)
  172. ["maxItemsPerDepth":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  173. int(-1)
  174. ["useRefHandles":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  175. int(-1)
  176. }
  177. EOTXT;
  178. ob_start();
  179. var_dump($clone);
  180. $this->assertStringMatchesFormat(\PHP_VERSION_ID >= 70200 ? str_replace('"1"', '1', $expected) : $expected, ob_get_clean());
  181. }
  182. public function testCaster()
  183. {
  184. $cloner = new VarCloner(array(
  185. '*' => function ($obj, $array) {
  186. return array('foo' => 123);
  187. },
  188. __CLASS__ => function ($obj, $array) {
  189. ++$array['foo'];
  190. return $array;
  191. },
  192. ));
  193. $clone = $cloner->cloneVar($this);
  194. $expected = <<<EOTXT
  195. Symfony\Component\VarDumper\Cloner\Data Object
  196. (
  197. [data:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  198. (
  199. [0] => Array
  200. (
  201. [0] => Symfony\Component\VarDumper\Cloner\Stub Object
  202. (
  203. [type] => 4
  204. [class] => %s
  205. [value] =>
  206. [cut] => 0
  207. [handle] => %i
  208. [refCount] => 0
  209. [position] => 1
  210. [attr] => Array
  211. (
  212. )
  213. )
  214. )
  215. [1] => Array
  216. (
  217. [foo] => 124
  218. )
  219. )
  220. [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  221. [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  222. [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20
  223. [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  224. [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  225. )
  226. EOTXT;
  227. $this->assertStringMatchesFormat($expected, print_r($clone, true));
  228. }
  229. }