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