1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\VarExporter\Tests;
use PHPUnit\Framework\TestCase;
use Symfony\Component\VarExporter\Exception\ClassNotFoundException;
use Symfony\Component\VarExporter\Exception\NotInstantiableTypeException;
use Symfony\Component\VarExporter\Instantiator;
class InstantiatorTest extends TestCase
{
public function testNotFoundClass()
{
$this->expectException(ClassNotFoundException::class);
$this->expectExceptionMessage('Class "SomeNotExistingClass" not found.');
Instantiator::instantiate('SomeNotExistingClass');
}
#[\PHPUnit\Framework\Attributes\DataProvider('provideFailingInstantiation')]
public function testFailingInstantiation(string $class)
{
$this->expectException(NotInstantiableTypeException::class);
$this->expectExceptionMessageMatches('/Type ".*" is not instantiable\./');
Instantiator::instantiate($class);
}
public static function provideFailingInstantiation()
{
yield ['ReflectionClass'];
yield ['SplHeap'];
yield ['Throwable'];
yield ['Closure'];
yield ['SplFileInfo'];
}
public function testInstantiate()
{
$this->assertEquals((object) ['p' => 123], Instantiator::instantiate('stdClass', ['p' => 123]));
$this->assertEquals((object) ['p' => 123], Instantiator::instantiate('STDcLASS', ['p' => 123]));
$this->assertEquals(new \ArrayObject([123]), Instantiator::instantiate(\ArrayObject::class, ["\0" => [[123]]]));
$expected = [
"\0*\0prot" => 345,
"\0".__NAMESPACE__."\Bar\0priv" => 123,
"\0".__NAMESPACE__."\Foo\0priv" => 234,
'dyn' => 456,
'ro' => 567,
];
$actual = (array) Instantiator::instantiate(Bar::class, ['dyn' => 456, 'ro' => 567, 'prot' => 345, 'priv' => 123], [Foo::class => ['priv' => 234]]);
ksort($actual);
$this->assertSame($expected, $actual);
$actual = (array) Instantiator::instantiate(Bar::class, $expected);
ksort($actual);
$this->assertSame($expected, $actual);
$e = Instantiator::instantiate('Exception', ['trace' => [234]]);
$this->assertSame([234], $e->getTrace());
}
public function testPhpReferences()
{
$properties = ['p1' => 1];
$properties['p2'] = &$properties['p1'];
$obj = Instantiator::instantiate('stdClass', $properties);
$this->assertSame($properties, (array) $obj);
$properties['p1'] = 2;
$this->assertSame(2, $properties['p2']);
$this->assertSame(2, $obj->p1);
$this->assertSame(2, $obj->p2);
}
}
class Foo
{
protected $prot;
private $priv;
public readonly int $ro;
}
#[\AllowDynamicProperties]
class Bar extends Foo
{
private $priv;
}
|