PageRenderTime 36ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/src/Symfony/Component/VarDumper/Tests/Cloner/VarClonerTest.php

http://github.com/symfony/symfony
PHP | 532 lines | 433 code | 80 blank | 19 comment | 2 complexity | 2695df8c1ab5ac7d5a7bdaee9183a585 MD5 | raw file
  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. use Symfony\Component\VarDumper\Tests\Fixtures\Php74;
  14. /**
  15. * @author Nicolas Grekas <p@tchwork.com>
  16. */
  17. class VarClonerTest extends TestCase
  18. {
  19. public function testMaxIntBoundary()
  20. {
  21. $data = [PHP_INT_MAX => 123];
  22. $cloner = new VarCloner();
  23. $clone = $cloner->cloneVar($data);
  24. $expected = <<<EOTXT
  25. Symfony\Component\VarDumper\Cloner\Data Object
  26. (
  27. [data:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  28. (
  29. [0] => Array
  30. (
  31. [0] => Array
  32. (
  33. [1] => 1
  34. )
  35. )
  36. [1] => Array
  37. (
  38. [%s] => 123
  39. )
  40. )
  41. [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  42. [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  43. [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20
  44. [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  45. [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  46. [context:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  47. (
  48. )
  49. )
  50. EOTXT;
  51. $this->assertSame(sprintf($expected, PHP_INT_MAX), print_r($clone, true));
  52. }
  53. public function testClone()
  54. {
  55. $json = json_decode('{"1":{"var":"val"},"2":{"var":"val"}}');
  56. $cloner = new VarCloner();
  57. $clone = $cloner->cloneVar($json);
  58. $expected = <<<EOTXT
  59. Symfony\Component\VarDumper\Cloner\Data Object
  60. (
  61. [data:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  62. (
  63. [0] => Array
  64. (
  65. [0] => Symfony\Component\VarDumper\Cloner\Stub Object
  66. (
  67. [type] => 4
  68. [class] => stdClass
  69. [value] =>
  70. [cut] => 0
  71. [handle] => %i
  72. [refCount] => 0
  73. [position] => 1
  74. [attr] => Array
  75. (
  76. )
  77. )
  78. )
  79. [1] => Array
  80. (
  81. [\000+\0001] => Symfony\Component\VarDumper\Cloner\Stub Object
  82. (
  83. [type] => 4
  84. [class] => stdClass
  85. [value] =>
  86. [cut] => 0
  87. [handle] => %i
  88. [refCount] => 0
  89. [position] => 2
  90. [attr] => Array
  91. (
  92. )
  93. )
  94. [\000+\0002] => Symfony\Component\VarDumper\Cloner\Stub Object
  95. (
  96. [type] => 4
  97. [class] => stdClass
  98. [value] =>
  99. [cut] => 0
  100. [handle] => %i
  101. [refCount] => 0
  102. [position] => 3
  103. [attr] => Array
  104. (
  105. )
  106. )
  107. )
  108. [2] => Array
  109. (
  110. [\000+\000var] => val
  111. )
  112. [3] => Array
  113. (
  114. [\000+\000var] => val
  115. )
  116. )
  117. [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  118. [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  119. [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20
  120. [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  121. [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  122. [context:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  123. (
  124. )
  125. )
  126. EOTXT;
  127. $this->assertStringMatchesFormat($expected, print_r($clone, true));
  128. }
  129. public function testLimits()
  130. {
  131. // Level 0:
  132. $data = [
  133. // Level 1:
  134. [
  135. // Level 2:
  136. [
  137. // Level 3:
  138. 'Level 3 Item 0',
  139. 'Level 3 Item 1',
  140. 'Level 3 Item 2',
  141. 'Level 3 Item 3',
  142. ],
  143. [
  144. 'Level 3 Item 4',
  145. 'Level 3 Item 5',
  146. 'Level 3 Item 6',
  147. ],
  148. [
  149. 'Level 3 Item 7',
  150. ],
  151. ],
  152. [
  153. [
  154. 'Level 3 Item 8',
  155. ],
  156. 'Level 2 Item 0',
  157. ],
  158. [
  159. 'Level 2 Item 1',
  160. ],
  161. 'Level 1 Item 0',
  162. [
  163. // Test setMaxString:
  164. 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
  165. 'SHORT',
  166. ],
  167. ];
  168. $cloner = new VarCloner();
  169. $cloner->setMinDepth(2);
  170. $cloner->setMaxItems(5);
  171. $cloner->setMaxString(20);
  172. $clone = $cloner->cloneVar($data);
  173. $expected = <<<EOTXT
  174. Symfony\Component\VarDumper\Cloner\Data Object
  175. (
  176. [data:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  177. (
  178. [0] => Array
  179. (
  180. [0] => Array
  181. (
  182. [2] => 1
  183. )
  184. )
  185. [1] => Array
  186. (
  187. [0] => Array
  188. (
  189. [2] => 2
  190. )
  191. [1] => Array
  192. (
  193. [2] => 3
  194. )
  195. [2] => Array
  196. (
  197. [2] => 4
  198. )
  199. [3] => Level 1 Item 0
  200. [4] => Array
  201. (
  202. [2] => 5
  203. )
  204. )
  205. [2] => Array
  206. (
  207. [0] => Array
  208. (
  209. [2] => 6
  210. )
  211. [1] => Array
  212. (
  213. [0] => 2
  214. [2] => 7
  215. )
  216. [2] => Array
  217. (
  218. [0] => 1
  219. [2] => 0
  220. )
  221. )
  222. [3] => Array
  223. (
  224. [0] => Array
  225. (
  226. [0] => 1
  227. [2] => 0
  228. )
  229. [1] => Level 2 Item 0
  230. )
  231. [4] => Array
  232. (
  233. [0] => Level 2 Item 1
  234. )
  235. [5] => Array
  236. (
  237. [0] => Symfony\Component\VarDumper\Cloner\Stub Object
  238. (
  239. [type] => 2
  240. [class] => 2
  241. [value] => ABCDEFGHIJKLMNOPQRST
  242. [cut] => 6
  243. [handle] => 0
  244. [refCount] => 0
  245. [position] => 0
  246. [attr] => Array
  247. (
  248. )
  249. )
  250. [1] => SHORT
  251. )
  252. [6] => Array
  253. (
  254. [0] => Level 3 Item 0
  255. [1] => Level 3 Item 1
  256. [2] => Level 3 Item 2
  257. [3] => Level 3 Item 3
  258. )
  259. [7] => Array
  260. (
  261. [0] => Level 3 Item 4
  262. )
  263. )
  264. [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  265. [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  266. [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20
  267. [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  268. [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  269. [context:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  270. (
  271. )
  272. )
  273. EOTXT;
  274. $this->assertStringMatchesFormat($expected, print_r($clone, true));
  275. }
  276. public function testJsonCast()
  277. {
  278. if (2 == ini_get('xdebug.overload_var_dump')) {
  279. $this->markTestSkipped('xdebug is active');
  280. }
  281. $data = (array) json_decode('{"1":{}}');
  282. $cloner = new VarCloner();
  283. $clone = $cloner->cloneVar($data);
  284. $expected = <<<'EOTXT'
  285. object(Symfony\Component\VarDumper\Cloner\Data)#%d (7) {
  286. ["data":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  287. array(2) {
  288. [0]=>
  289. array(1) {
  290. [0]=>
  291. array(1) {
  292. [1]=>
  293. int(1)
  294. }
  295. }
  296. [1]=>
  297. array(1) {
  298. ["1"]=>
  299. object(Symfony\Component\VarDumper\Cloner\Stub)#%i (8) {
  300. ["type"]=>
  301. int(4)
  302. ["class"]=>
  303. string(8) "stdClass"
  304. ["value"]=>
  305. NULL
  306. ["cut"]=>
  307. int(0)
  308. ["handle"]=>
  309. int(%i)
  310. ["refCount"]=>
  311. int(0)
  312. ["position"]=>
  313. int(0)
  314. ["attr"]=>
  315. array(0) {
  316. }
  317. }
  318. }
  319. }
  320. ["position":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  321. int(0)
  322. ["key":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  323. int(0)
  324. ["maxDepth":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  325. int(20)
  326. ["maxItemsPerDepth":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  327. int(-1)
  328. ["useRefHandles":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  329. int(-1)
  330. ["context":"Symfony\Component\VarDumper\Cloner\Data":private]=>
  331. array(0) {
  332. }
  333. }
  334. EOTXT;
  335. ob_start();
  336. var_dump($clone);
  337. $this->assertStringMatchesFormat(str_replace('"1"', '1', $expected), ob_get_clean());
  338. }
  339. public function testCaster()
  340. {
  341. $cloner = new VarCloner([
  342. '*' => function ($obj, $array) {
  343. return ['foo' => 123];
  344. },
  345. __CLASS__ => function ($obj, $array) {
  346. ++$array['foo'];
  347. return $array;
  348. },
  349. ]);
  350. $clone = $cloner->cloneVar($this);
  351. $expected = <<<EOTXT
  352. Symfony\Component\VarDumper\Cloner\Data Object
  353. (
  354. [data:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  355. (
  356. [0] => Array
  357. (
  358. [0] => Symfony\Component\VarDumper\Cloner\Stub Object
  359. (
  360. [type] => 4
  361. [class] => %s
  362. [value] =>
  363. [cut] => 0
  364. [handle] => %i
  365. [refCount] => 0
  366. [position] => 1
  367. [attr] => Array
  368. (
  369. [file] => %a%eVarClonerTest.php
  370. [line] => 21
  371. )
  372. )
  373. )
  374. [1] => Array
  375. (
  376. [foo] => 124
  377. )
  378. )
  379. [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  380. [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  381. [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20
  382. [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  383. [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  384. [context:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  385. (
  386. )
  387. )
  388. EOTXT;
  389. $this->assertStringMatchesFormat($expected, print_r($clone, true));
  390. }
  391. /**
  392. * @requires PHP 7.4
  393. */
  394. public function testPhp74()
  395. {
  396. $data = new Php74();
  397. $cloner = new VarCloner();
  398. $clone = $cloner->cloneVar($data);
  399. $expected = <<<'EOTXT'
  400. Symfony\Component\VarDumper\Cloner\Data Object
  401. (
  402. [data:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  403. (
  404. [0] => Array
  405. (
  406. [0] => Symfony\Component\VarDumper\Cloner\Stub Object
  407. (
  408. [type] => 4
  409. [class] => Symfony\Component\VarDumper\Tests\Fixtures\Php74
  410. [value] =>
  411. [cut] => 0
  412. [handle] => %i
  413. [refCount] => 0
  414. [position] => 1
  415. [attr] => Array
  416. (
  417. [file] => %s
  418. [line] => 5
  419. )
  420. )
  421. )
  422. [1] => Array
  423. (
  424. [p1] => 123
  425. [p2] => Symfony\Component\VarDumper\Cloner\Stub Object
  426. (
  427. [type] => 4
  428. [class] => stdClass
  429. [value] =>
  430. [cut] => 0
  431. [handle] => %i
  432. [refCount] => 0
  433. [position] => 0
  434. [attr] => Array
  435. (
  436. )
  437. )
  438. )
  439. )
  440. [position:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  441. [key:Symfony\Component\VarDumper\Cloner\Data:private] => 0
  442. [maxDepth:Symfony\Component\VarDumper\Cloner\Data:private] => 20
  443. [maxItemsPerDepth:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  444. [useRefHandles:Symfony\Component\VarDumper\Cloner\Data:private] => -1
  445. [context:Symfony\Component\VarDumper\Cloner\Data:private] => Array
  446. (
  447. )
  448. )
  449. EOTXT;
  450. $this->assertStringMatchesFormat($expected, print_r($clone, true));
  451. }
  452. }