暫無描述

VarClonerTest.php 8.0KB

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