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\Dumper;
|
Chris@0
|
13
|
Chris@0
|
14 use PHPUnit\Framework\TestCase;
|
Chris@0
|
15 use Symfony\Component\VarDumper\Cloner\VarCloner;
|
Chris@0
|
16 use Symfony\Component\VarDumper\Dumper\CliDumper;
|
Chris@0
|
17 use Symfony\Component\VarDumper\Test\VarDumperTestTrait;
|
Chris@0
|
18 use Twig\Environment;
|
Chris@0
|
19 use Twig\Loader\FilesystemLoader;
|
Chris@0
|
20
|
Chris@0
|
21 /**
|
Chris@0
|
22 * @author Nicolas Grekas <p@tchwork.com>
|
Chris@0
|
23 */
|
Chris@0
|
24 class CliDumperTest extends TestCase
|
Chris@0
|
25 {
|
Chris@0
|
26 use VarDumperTestTrait;
|
Chris@0
|
27
|
Chris@0
|
28 public function testGet()
|
Chris@0
|
29 {
|
Chris@0
|
30 require __DIR__.'/../Fixtures/dumb-var.php';
|
Chris@0
|
31
|
Chris@0
|
32 $dumper = new CliDumper('php://output');
|
Chris@0
|
33 $dumper->setColors(false);
|
Chris@0
|
34 $cloner = new VarCloner();
|
Chris@17
|
35 $cloner->addCasters([
|
Chris@0
|
36 ':stream' => function ($res, $a) {
|
Chris@0
|
37 unset($a['uri'], $a['wrapper_data']);
|
Chris@0
|
38
|
Chris@0
|
39 return $a;
|
Chris@0
|
40 },
|
Chris@17
|
41 ]);
|
Chris@0
|
42 $data = $cloner->cloneVar($var);
|
Chris@0
|
43
|
Chris@0
|
44 ob_start();
|
Chris@0
|
45 $dumper->dump($data);
|
Chris@0
|
46 $out = ob_get_clean();
|
Chris@0
|
47 $out = preg_replace('/[ \t]+$/m', '', $out);
|
Chris@0
|
48 $intMax = PHP_INT_MAX;
|
Chris@0
|
49 $res = (int) $var['res'];
|
Chris@0
|
50
|
Chris@17
|
51 $r = \defined('HHVM_VERSION') ? '' : '#%d';
|
Chris@0
|
52 $this->assertStringMatchesFormat(
|
Chris@0
|
53 <<<EOTXT
|
Chris@0
|
54 array:24 [
|
Chris@0
|
55 "number" => 1
|
Chris@0
|
56 0 => &1 null
|
Chris@0
|
57 "const" => 1.1
|
Chris@0
|
58 1 => true
|
Chris@0
|
59 2 => false
|
Chris@0
|
60 3 => NAN
|
Chris@0
|
61 4 => INF
|
Chris@0
|
62 5 => -INF
|
Chris@0
|
63 6 => {$intMax}
|
Chris@0
|
64 "str" => "déjà\\n"
|
Chris@0
|
65 7 => b"é\\x00"
|
Chris@0
|
66 "[]" => []
|
Chris@0
|
67 "res" => stream resource {@{$res}
|
Chris@0
|
68 %A wrapper_type: "plainfile"
|
Chris@0
|
69 stream_type: "STDIO"
|
Chris@0
|
70 mode: "r"
|
Chris@0
|
71 unread_bytes: 0
|
Chris@0
|
72 seekable: true
|
Chris@0
|
73 %A options: []
|
Chris@0
|
74 }
|
Chris@0
|
75 "obj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d
|
Chris@0
|
76 +foo: "foo"
|
Chris@0
|
77 +"bar": "bar"
|
Chris@0
|
78 }
|
Chris@0
|
79 "closure" => Closure {{$r}
|
Chris@0
|
80 class: "Symfony\Component\VarDumper\Tests\Dumper\CliDumperTest"
|
Chris@0
|
81 this: Symfony\Component\VarDumper\Tests\Dumper\CliDumperTest {{$r} …}
|
Chris@0
|
82 parameters: {
|
Chris@0
|
83 \$a: {}
|
Chris@0
|
84 &\$b: {
|
Chris@0
|
85 typeHint: "PDO"
|
Chris@0
|
86 default: null
|
Chris@0
|
87 }
|
Chris@0
|
88 }
|
Chris@12
|
89 file: "%s%eTests%eFixtures%edumb-var.php"
|
Chris@0
|
90 line: "{$var['line']} to {$var['line']}"
|
Chris@0
|
91 }
|
Chris@0
|
92 "line" => {$var['line']}
|
Chris@0
|
93 "nobj" => array:1 [
|
Chris@0
|
94 0 => &3 {#%d}
|
Chris@0
|
95 ]
|
Chris@0
|
96 "recurs" => &4 array:1 [
|
Chris@0
|
97 0 => &4 array:1 [&4]
|
Chris@0
|
98 ]
|
Chris@0
|
99 8 => &1 null
|
Chris@0
|
100 "sobj" => Symfony\Component\VarDumper\Tests\Fixture\DumbFoo {#%d}
|
Chris@0
|
101 "snobj" => &3 {#%d}
|
Chris@0
|
102 "snobj2" => {#%d}
|
Chris@0
|
103 "file" => "{$var['file']}"
|
Chris@0
|
104 b"bin-key-é" => ""
|
Chris@0
|
105 ]
|
Chris@0
|
106
|
Chris@0
|
107 EOTXT
|
Chris@0
|
108 ,
|
Chris@0
|
109 $out
|
Chris@0
|
110 );
|
Chris@0
|
111 }
|
Chris@0
|
112
|
Chris@0
|
113 /**
|
Chris@0
|
114 * @dataProvider provideDumpWithCommaFlagTests
|
Chris@0
|
115 */
|
Chris@0
|
116 public function testDumpWithCommaFlag($expected, $flags)
|
Chris@0
|
117 {
|
Chris@0
|
118 $dumper = new CliDumper(null, null, $flags);
|
Chris@0
|
119 $dumper->setColors(false);
|
Chris@0
|
120 $cloner = new VarCloner();
|
Chris@0
|
121
|
Chris@17
|
122 $var = [
|
Chris@17
|
123 'array' => ['a', 'b'],
|
Chris@0
|
124 'string' => 'hello',
|
Chris@0
|
125 'multiline string' => "this\nis\na\multiline\nstring",
|
Chris@17
|
126 ];
|
Chris@0
|
127
|
Chris@0
|
128 $dump = $dumper->dump($cloner->cloneVar($var), true);
|
Chris@0
|
129
|
Chris@0
|
130 $this->assertSame($expected, $dump);
|
Chris@0
|
131 }
|
Chris@0
|
132
|
Chris@0
|
133 public function testDumpWithCommaFlagsAndExceptionCodeExcerpt()
|
Chris@0
|
134 {
|
Chris@0
|
135 $dumper = new CliDumper(null, null, CliDumper::DUMP_TRAILING_COMMA);
|
Chris@0
|
136 $dumper->setColors(false);
|
Chris@0
|
137 $cloner = new VarCloner();
|
Chris@0
|
138
|
Chris@0
|
139 $ex = new \RuntimeException('foo');
|
Chris@0
|
140
|
Chris@0
|
141 $dump = $dumper->dump($cloner->cloneVar($ex)->withRefHandles(false), true);
|
Chris@0
|
142
|
Chris@0
|
143 $this->assertStringMatchesFormat(<<<'EOTXT'
|
Chris@0
|
144 RuntimeException {
|
Chris@0
|
145 #message: "foo"
|
Chris@0
|
146 #code: 0
|
Chris@0
|
147 #file: "%ACliDumperTest.php"
|
Chris@0
|
148 #line: %d
|
Chris@0
|
149 trace: {
|
Chris@12
|
150 %ACliDumperTest.php:%d {
|
Chris@12
|
151 ›
|
Chris@12
|
152 › $ex = new \RuntimeException('foo');
|
Chris@12
|
153 ›
|
Chris@0
|
154 }
|
Chris@0
|
155 %A
|
Chris@0
|
156 }
|
Chris@0
|
157 }
|
Chris@0
|
158
|
Chris@0
|
159 EOTXT
|
Chris@0
|
160 , $dump);
|
Chris@0
|
161 }
|
Chris@0
|
162
|
Chris@0
|
163 public function provideDumpWithCommaFlagTests()
|
Chris@0
|
164 {
|
Chris@0
|
165 $expected = <<<'EOTXT'
|
Chris@0
|
166 array:3 [
|
Chris@0
|
167 "array" => array:2 [
|
Chris@0
|
168 0 => "a",
|
Chris@0
|
169 1 => "b"
|
Chris@0
|
170 ],
|
Chris@0
|
171 "string" => "hello",
|
Chris@0
|
172 "multiline string" => """
|
Chris@0
|
173 this\n
|
Chris@0
|
174 is\n
|
Chris@0
|
175 a\multiline\n
|
Chris@0
|
176 string
|
Chris@0
|
177 """
|
Chris@0
|
178 ]
|
Chris@0
|
179
|
Chris@0
|
180 EOTXT;
|
Chris@0
|
181
|
Chris@17
|
182 yield [$expected, CliDumper::DUMP_COMMA_SEPARATOR];
|
Chris@0
|
183
|
Chris@0
|
184 $expected = <<<'EOTXT'
|
Chris@0
|
185 array:3 [
|
Chris@0
|
186 "array" => array:2 [
|
Chris@0
|
187 0 => "a",
|
Chris@0
|
188 1 => "b",
|
Chris@0
|
189 ],
|
Chris@0
|
190 "string" => "hello",
|
Chris@0
|
191 "multiline string" => """
|
Chris@0
|
192 this\n
|
Chris@0
|
193 is\n
|
Chris@0
|
194 a\multiline\n
|
Chris@0
|
195 string
|
Chris@0
|
196 """,
|
Chris@0
|
197 ]
|
Chris@0
|
198
|
Chris@0
|
199 EOTXT;
|
Chris@0
|
200
|
Chris@17
|
201 yield [$expected, CliDumper::DUMP_TRAILING_COMMA];
|
Chris@0
|
202 }
|
Chris@0
|
203
|
Chris@0
|
204 /**
|
Chris@0
|
205 * @requires extension xml
|
Chris@0
|
206 */
|
Chris@0
|
207 public function testXmlResource()
|
Chris@0
|
208 {
|
Chris@0
|
209 $var = xml_parser_create();
|
Chris@0
|
210
|
Chris@0
|
211 $this->assertDumpMatchesFormat(
|
Chris@0
|
212 <<<'EOTXT'
|
Chris@0
|
213 xml resource {
|
Chris@0
|
214 current_byte_index: %i
|
Chris@0
|
215 current_column_number: %i
|
Chris@0
|
216 current_line_number: 1
|
Chris@0
|
217 error_code: XML_ERROR_NONE
|
Chris@0
|
218 }
|
Chris@0
|
219 EOTXT
|
Chris@0
|
220 ,
|
Chris@0
|
221 $var
|
Chris@0
|
222 );
|
Chris@0
|
223 }
|
Chris@0
|
224
|
Chris@0
|
225 public function testJsonCast()
|
Chris@0
|
226 {
|
Chris@0
|
227 $var = (array) json_decode('{"0":{},"1":null}');
|
Chris@0
|
228 foreach ($var as &$v) {
|
Chris@0
|
229 }
|
Chris@0
|
230 $var[] = &$v;
|
Chris@0
|
231 $var[''] = 2;
|
Chris@0
|
232
|
Chris@0
|
233 if (\PHP_VERSION_ID >= 70200) {
|
Chris@0
|
234 $this->assertDumpMatchesFormat(
|
Chris@0
|
235 <<<'EOTXT'
|
Chris@0
|
236 array:4 [
|
Chris@0
|
237 0 => {}
|
Chris@0
|
238 1 => &1 null
|
Chris@0
|
239 2 => &1 null
|
Chris@0
|
240 "" => 2
|
Chris@0
|
241 ]
|
Chris@0
|
242 EOTXT
|
Chris@0
|
243 ,
|
Chris@0
|
244 $var
|
Chris@0
|
245 );
|
Chris@0
|
246 } else {
|
Chris@0
|
247 $this->assertDumpMatchesFormat(
|
Chris@0
|
248 <<<'EOTXT'
|
Chris@0
|
249 array:4 [
|
Chris@0
|
250 "0" => {}
|
Chris@0
|
251 "1" => &1 null
|
Chris@0
|
252 0 => &1 null
|
Chris@0
|
253 "" => 2
|
Chris@0
|
254 ]
|
Chris@0
|
255 EOTXT
|
Chris@0
|
256 ,
|
Chris@0
|
257 $var
|
Chris@0
|
258 );
|
Chris@0
|
259 }
|
Chris@0
|
260 }
|
Chris@0
|
261
|
Chris@0
|
262 public function testObjectCast()
|
Chris@0
|
263 {
|
Chris@17
|
264 $var = (object) [1 => 1];
|
Chris@0
|
265 $var->{1} = 2;
|
Chris@0
|
266
|
Chris@0
|
267 if (\PHP_VERSION_ID >= 70200) {
|
Chris@0
|
268 $this->assertDumpMatchesFormat(
|
Chris@0
|
269 <<<'EOTXT'
|
Chris@0
|
270 {
|
Chris@0
|
271 +"1": 2
|
Chris@0
|
272 }
|
Chris@0
|
273 EOTXT
|
Chris@0
|
274 ,
|
Chris@0
|
275 $var
|
Chris@0
|
276 );
|
Chris@0
|
277 } else {
|
Chris@0
|
278 $this->assertDumpMatchesFormat(
|
Chris@0
|
279 <<<'EOTXT'
|
Chris@0
|
280 {
|
Chris@0
|
281 +1: 1
|
Chris@0
|
282 +"1": 2
|
Chris@0
|
283 }
|
Chris@0
|
284 EOTXT
|
Chris@0
|
285 ,
|
Chris@0
|
286 $var
|
Chris@0
|
287 );
|
Chris@0
|
288 }
|
Chris@0
|
289 }
|
Chris@0
|
290
|
Chris@0
|
291 public function testClosedResource()
|
Chris@0
|
292 {
|
Chris@17
|
293 if (\defined('HHVM_VERSION') && HHVM_VERSION_ID < 30600) {
|
Chris@0
|
294 $this->markTestSkipped();
|
Chris@0
|
295 }
|
Chris@0
|
296
|
Chris@0
|
297 $var = fopen(__FILE__, 'r');
|
Chris@0
|
298 fclose($var);
|
Chris@0
|
299
|
Chris@0
|
300 $dumper = new CliDumper('php://output');
|
Chris@0
|
301 $dumper->setColors(false);
|
Chris@0
|
302 $cloner = new VarCloner();
|
Chris@0
|
303 $data = $cloner->cloneVar($var);
|
Chris@0
|
304
|
Chris@0
|
305 ob_start();
|
Chris@0
|
306 $dumper->dump($data);
|
Chris@0
|
307 $out = ob_get_clean();
|
Chris@0
|
308 $res = (int) $var;
|
Chris@0
|
309
|
Chris@0
|
310 $this->assertStringMatchesFormat(
|
Chris@0
|
311 <<<EOTXT
|
Chris@0
|
312 Closed resource @{$res}
|
Chris@0
|
313
|
Chris@0
|
314 EOTXT
|
Chris@0
|
315 ,
|
Chris@0
|
316 $out
|
Chris@0
|
317 );
|
Chris@0
|
318 }
|
Chris@0
|
319
|
Chris@0
|
320 public function testFlags()
|
Chris@0
|
321 {
|
Chris@0
|
322 putenv('DUMP_LIGHT_ARRAY=1');
|
Chris@0
|
323 putenv('DUMP_STRING_LENGTH=1');
|
Chris@0
|
324
|
Chris@17
|
325 $var = [
|
Chris@0
|
326 range(1, 3),
|
Chris@17
|
327 ['foo', 2 => 'bar'],
|
Chris@17
|
328 ];
|
Chris@0
|
329
|
Chris@0
|
330 $this->assertDumpEquals(
|
Chris@0
|
331 <<<EOTXT
|
Chris@0
|
332 [
|
Chris@0
|
333 [
|
Chris@0
|
334 1
|
Chris@0
|
335 2
|
Chris@0
|
336 3
|
Chris@0
|
337 ]
|
Chris@0
|
338 [
|
Chris@0
|
339 0 => (3) "foo"
|
Chris@0
|
340 2 => (3) "bar"
|
Chris@0
|
341 ]
|
Chris@0
|
342 ]
|
Chris@0
|
343 EOTXT
|
Chris@0
|
344 ,
|
Chris@0
|
345 $var
|
Chris@0
|
346 );
|
Chris@0
|
347
|
Chris@0
|
348 putenv('DUMP_LIGHT_ARRAY=');
|
Chris@0
|
349 putenv('DUMP_STRING_LENGTH=');
|
Chris@0
|
350 }
|
Chris@0
|
351
|
Chris@0
|
352 /**
|
Chris@0
|
353 * @requires function Twig\Template::getSourceContext
|
Chris@0
|
354 */
|
Chris@0
|
355 public function testThrowingCaster()
|
Chris@0
|
356 {
|
Chris@0
|
357 $out = fopen('php://memory', 'r+b');
|
Chris@0
|
358
|
Chris@0
|
359 require_once __DIR__.'/../Fixtures/Twig.php';
|
Chris@0
|
360 $twig = new \__TwigTemplate_VarDumperFixture_u75a09(new Environment(new FilesystemLoader()));
|
Chris@0
|
361
|
Chris@0
|
362 $dumper = new CliDumper();
|
Chris@0
|
363 $dumper->setColors(false);
|
Chris@0
|
364 $cloner = new VarCloner();
|
Chris@17
|
365 $cloner->addCasters([
|
Chris@0
|
366 ':stream' => function ($res, $a) {
|
Chris@0
|
367 unset($a['wrapper_data']);
|
Chris@0
|
368
|
Chris@0
|
369 return $a;
|
Chris@0
|
370 },
|
Chris@17
|
371 ]);
|
Chris@17
|
372 $cloner->addCasters([
|
Chris@0
|
373 ':stream' => eval('return function () use ($twig) {
|
Chris@0
|
374 try {
|
Chris@17
|
375 $twig->render([]);
|
Chris@0
|
376 } catch (\Twig\Error\RuntimeError $e) {
|
Chris@0
|
377 throw $e->getPrevious();
|
Chris@0
|
378 }
|
Chris@0
|
379 };'),
|
Chris@17
|
380 ]);
|
Chris@0
|
381 $ref = (int) $out;
|
Chris@0
|
382
|
Chris@0
|
383 $data = $cloner->cloneVar($out);
|
Chris@0
|
384 $dumper->dump($data, $out);
|
Chris@0
|
385 $out = stream_get_contents($out, -1, 0);
|
Chris@0
|
386
|
Chris@17
|
387 $r = \defined('HHVM_VERSION') ? '' : '#%d';
|
Chris@0
|
388 $this->assertStringMatchesFormat(
|
Chris@0
|
389 <<<EOTXT
|
Chris@0
|
390 stream resource {@{$ref}
|
Chris@0
|
391 ⚠: Symfony\Component\VarDumper\Exception\ThrowingCasterException {{$r}
|
Chris@0
|
392 #message: "Unexpected Exception thrown from a caster: Foobar"
|
Chris@0
|
393 trace: {
|
Chris@12
|
394 %sTwig.php:2 {
|
Chris@12
|
395 › foo bar
|
Chris@12
|
396 › twig source
|
Chris@12
|
397 ›
|
Chris@0
|
398 }
|
Chris@12
|
399 %s%eTemplate.php:%d { …}
|
Chris@12
|
400 %s%eTemplate.php:%d { …}
|
Chris@12
|
401 %s%eTemplate.php:%d { …}
|
Chris@12
|
402 %s%eTests%eDumper%eCliDumperTest.php:%d { …}
|
Chris@12
|
403 %A }
|
Chris@0
|
404 }
|
Chris@0
|
405 %Awrapper_type: "PHP"
|
Chris@0
|
406 stream_type: "MEMORY"
|
Chris@0
|
407 mode: "%s+b"
|
Chris@0
|
408 unread_bytes: 0
|
Chris@0
|
409 seekable: true
|
Chris@0
|
410 uri: "php://memory"
|
Chris@0
|
411 %Aoptions: []
|
Chris@0
|
412 }
|
Chris@0
|
413
|
Chris@0
|
414 EOTXT
|
Chris@0
|
415 ,
|
Chris@0
|
416 $out
|
Chris@0
|
417 );
|
Chris@0
|
418 }
|
Chris@0
|
419
|
Chris@0
|
420 public function testRefsInProperties()
|
Chris@0
|
421 {
|
Chris@17
|
422 $var = (object) ['foo' => 'foo'];
|
Chris@0
|
423 $var->bar = &$var->foo;
|
Chris@0
|
424
|
Chris@0
|
425 $dumper = new CliDumper();
|
Chris@0
|
426 $dumper->setColors(false);
|
Chris@0
|
427 $cloner = new VarCloner();
|
Chris@0
|
428
|
Chris@0
|
429 $data = $cloner->cloneVar($var);
|
Chris@0
|
430 $out = $dumper->dump($data, true);
|
Chris@0
|
431
|
Chris@17
|
432 $r = \defined('HHVM_VERSION') ? '' : '#%d';
|
Chris@0
|
433 $this->assertStringMatchesFormat(
|
Chris@0
|
434 <<<EOTXT
|
Chris@0
|
435 {{$r}
|
Chris@0
|
436 +"foo": &1 "foo"
|
Chris@0
|
437 +"bar": &1 "foo"
|
Chris@0
|
438 }
|
Chris@0
|
439
|
Chris@0
|
440 EOTXT
|
Chris@0
|
441 ,
|
Chris@0
|
442 $out
|
Chris@0
|
443 );
|
Chris@0
|
444 }
|
Chris@0
|
445
|
Chris@0
|
446 /**
|
Chris@0
|
447 * @runInSeparateProcess
|
Chris@0
|
448 * @preserveGlobalState disabled
|
Chris@0
|
449 * @requires PHP 5.6
|
Chris@0
|
450 */
|
Chris@0
|
451 public function testSpecialVars56()
|
Chris@0
|
452 {
|
Chris@0
|
453 $var = $this->getSpecialVars();
|
Chris@0
|
454
|
Chris@0
|
455 $this->assertDumpEquals(
|
Chris@0
|
456 <<<'EOTXT'
|
Chris@0
|
457 array:3 [
|
Chris@0
|
458 0 => array:1 [
|
Chris@0
|
459 0 => &1 array:1 [
|
Chris@0
|
460 0 => &1 array:1 [&1]
|
Chris@0
|
461 ]
|
Chris@0
|
462 ]
|
Chris@0
|
463 1 => array:1 [
|
Chris@0
|
464 "GLOBALS" => &2 array:1 [
|
Chris@0
|
465 "GLOBALS" => &2 array:1 [&2]
|
Chris@0
|
466 ]
|
Chris@0
|
467 ]
|
Chris@0
|
468 2 => &2 array:1 [&2]
|
Chris@0
|
469 ]
|
Chris@0
|
470 EOTXT
|
Chris@0
|
471 ,
|
Chris@0
|
472 $var
|
Chris@0
|
473 );
|
Chris@0
|
474 }
|
Chris@0
|
475
|
Chris@0
|
476 /**
|
Chris@0
|
477 * @runInSeparateProcess
|
Chris@0
|
478 * @preserveGlobalState disabled
|
Chris@0
|
479 */
|
Chris@0
|
480 public function testGlobalsNoExt()
|
Chris@0
|
481 {
|
Chris@0
|
482 $var = $this->getSpecialVars();
|
Chris@0
|
483 unset($var[0]);
|
Chris@0
|
484 $out = '';
|
Chris@0
|
485
|
Chris@0
|
486 $dumper = new CliDumper(function ($line, $depth) use (&$out) {
|
Chris@0
|
487 if ($depth >= 0) {
|
Chris@0
|
488 $out .= str_repeat(' ', $depth).$line."\n";
|
Chris@0
|
489 }
|
Chris@0
|
490 });
|
Chris@0
|
491 $dumper->setColors(false);
|
Chris@0
|
492 $cloner = new VarCloner();
|
Chris@0
|
493
|
Chris@0
|
494 $refl = new \ReflectionProperty($cloner, 'useExt');
|
Chris@0
|
495 $refl->setAccessible(true);
|
Chris@0
|
496 $refl->setValue($cloner, false);
|
Chris@0
|
497
|
Chris@0
|
498 $data = $cloner->cloneVar($var);
|
Chris@0
|
499 $dumper->dump($data);
|
Chris@0
|
500
|
Chris@0
|
501 $this->assertSame(
|
Chris@0
|
502 <<<'EOTXT'
|
Chris@0
|
503 array:2 [
|
Chris@0
|
504 1 => array:1 [
|
Chris@0
|
505 "GLOBALS" => &1 array:1 [
|
Chris@0
|
506 "GLOBALS" => &1 array:1 [&1]
|
Chris@0
|
507 ]
|
Chris@0
|
508 ]
|
Chris@0
|
509 2 => &1 array:1 [&1]
|
Chris@0
|
510 ]
|
Chris@0
|
511
|
Chris@0
|
512 EOTXT
|
Chris@0
|
513 ,
|
Chris@0
|
514 $out
|
Chris@0
|
515 );
|
Chris@0
|
516 }
|
Chris@0
|
517
|
Chris@0
|
518 /**
|
Chris@0
|
519 * @runInSeparateProcess
|
Chris@0
|
520 * @preserveGlobalState disabled
|
Chris@0
|
521 */
|
Chris@0
|
522 public function testBuggyRefs()
|
Chris@0
|
523 {
|
Chris@0
|
524 if (\PHP_VERSION_ID >= 50600) {
|
Chris@0
|
525 $this->markTestSkipped('PHP 5.6 fixed refs counting');
|
Chris@0
|
526 }
|
Chris@0
|
527
|
Chris@0
|
528 $var = $this->getSpecialVars();
|
Chris@0
|
529 $var = $var[0];
|
Chris@0
|
530
|
Chris@0
|
531 $dumper = new CliDumper();
|
Chris@0
|
532 $dumper->setColors(false);
|
Chris@0
|
533 $cloner = new VarCloner();
|
Chris@0
|
534
|
Chris@0
|
535 $data = $cloner->cloneVar($var)->withMaxDepth(3);
|
Chris@0
|
536 $out = '';
|
Chris@0
|
537 $dumper->dump($data, function ($line, $depth) use (&$out) {
|
Chris@0
|
538 if ($depth >= 0) {
|
Chris@0
|
539 $out .= str_repeat(' ', $depth).$line."\n";
|
Chris@0
|
540 }
|
Chris@0
|
541 });
|
Chris@0
|
542
|
Chris@0
|
543 $this->assertSame(
|
Chris@0
|
544 <<<'EOTXT'
|
Chris@0
|
545 array:1 [
|
Chris@0
|
546 0 => array:1 [
|
Chris@0
|
547 0 => array:1 [
|
Chris@0
|
548 0 => array:1 [ …1]
|
Chris@0
|
549 ]
|
Chris@0
|
550 ]
|
Chris@0
|
551 ]
|
Chris@0
|
552
|
Chris@0
|
553 EOTXT
|
Chris@0
|
554 ,
|
Chris@0
|
555 $out
|
Chris@0
|
556 );
|
Chris@0
|
557 }
|
Chris@0
|
558
|
Chris@0
|
559 public function testIncompleteClass()
|
Chris@0
|
560 {
|
Chris@0
|
561 $unserializeCallbackHandler = ini_set('unserialize_callback_func', null);
|
Chris@0
|
562 $var = unserialize('O:8:"Foo\Buzz":0:{}');
|
Chris@0
|
563 ini_set('unserialize_callback_func', $unserializeCallbackHandler);
|
Chris@0
|
564
|
Chris@0
|
565 $this->assertDumpMatchesFormat(
|
Chris@0
|
566 <<<EOTXT
|
Chris@0
|
567 __PHP_Incomplete_Class(Foo\Buzz) {}
|
Chris@0
|
568 EOTXT
|
Chris@0
|
569 ,
|
Chris@0
|
570 $var
|
Chris@0
|
571 );
|
Chris@0
|
572 }
|
Chris@0
|
573
|
Chris@0
|
574 private function getSpecialVars()
|
Chris@0
|
575 {
|
Chris@0
|
576 foreach (array_keys($GLOBALS) as $var) {
|
Chris@0
|
577 if ('GLOBALS' !== $var) {
|
Chris@0
|
578 unset($GLOBALS[$var]);
|
Chris@0
|
579 }
|
Chris@0
|
580 }
|
Chris@0
|
581
|
Chris@0
|
582 $var = function &() {
|
Chris@17
|
583 $var = [];
|
Chris@0
|
584 $var[] = &$var;
|
Chris@0
|
585
|
Chris@0
|
586 return $var;
|
Chris@0
|
587 };
|
Chris@0
|
588
|
Chris@17
|
589 return [$var(), $GLOBALS, &$GLOBALS];
|
Chris@0
|
590 }
|
Chris@0
|
591 }
|