171 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\Framework\ObjectManager;
 | 
						|
 | 
						|
use ReflectionClass;
 | 
						|
 | 
						|
class ObjectManagerTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /**#@+
 | 
						|
     * Test class with type error
 | 
						|
     */
 | 
						|
    public const TEST_CLASS_WITH_TYPE_ERROR =
 | 
						|
        \Magento\Framework\ObjectManager\TestAsset\ConstructorWithTypeError::class;
 | 
						|
 | 
						|
    /**#@+
 | 
						|
     * Test classes for basic instantiation
 | 
						|
     */
 | 
						|
    public const TEST_CLASS = \Magento\Framework\ObjectManager\TestAsset\Basic::class;
 | 
						|
 | 
						|
    public const TEST_CLASS_INJECTION = \Magento\Framework\ObjectManager\TestAsset\BasicInjection::class;
 | 
						|
 | 
						|
    /**#@-*/
 | 
						|
 | 
						|
    /**#@+
 | 
						|
     * Test classes and interface to test preferences
 | 
						|
     */
 | 
						|
    public const TEST_INTERFACE = \Magento\Framework\ObjectManager\TestAsset\TestAssetInterface::class;
 | 
						|
 | 
						|
    public const TEST_INTERFACE_IMPLEMENTATION =
 | 
						|
        \Magento\Framework\ObjectManager\TestAsset\InterfaceImplementation::class;
 | 
						|
 | 
						|
    public const TEST_CLASS_WITH_INTERFACE = \Magento\Framework\ObjectManager\TestAsset\InterfaceInjection::class;
 | 
						|
 | 
						|
    /**#@-*/
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var \Magento\Framework\ObjectManagerInterface
 | 
						|
     */
 | 
						|
    protected static $_objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * List of classes with different number of arguments
 | 
						|
     *
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected $_numerableClasses = [
 | 
						|
        0 => \Magento\Framework\ObjectManager\TestAsset\ConstructorNoArguments::class,
 | 
						|
        1 => \Magento\Framework\ObjectManager\TestAsset\ConstructorOneArgument::class,
 | 
						|
        2 => \Magento\Framework\ObjectManager\TestAsset\ConstructorTwoArguments::class,
 | 
						|
        3 => \Magento\Framework\ObjectManager\TestAsset\ConstructorThreeArguments::class,
 | 
						|
        4 => \Magento\Framework\ObjectManager\TestAsset\ConstructorFourArguments::class,
 | 
						|
        5 => \Magento\Framework\ObjectManager\TestAsset\ConstructorFiveArguments::class,
 | 
						|
        6 => \Magento\Framework\ObjectManager\TestAsset\ConstructorSixArguments::class,
 | 
						|
        7 => \Magento\Framework\ObjectManager\TestAsset\ConstructorSevenArguments::class,
 | 
						|
        8 => \Magento\Framework\ObjectManager\TestAsset\ConstructorEightArguments::class,
 | 
						|
        9 => \Magento\Framework\ObjectManager\TestAsset\ConstructorNineArguments::class,
 | 
						|
        10 => \Magento\Framework\ObjectManager\TestAsset\ConstructorTenArguments::class,
 | 
						|
    ];
 | 
						|
 | 
						|
    /**
 | 
						|
     * Names of properties
 | 
						|
     *
 | 
						|
     * @var array
 | 
						|
     */
 | 
						|
    protected $_numerableProperties = [
 | 
						|
        1 => '_one',
 | 
						|
        2 => '_two',
 | 
						|
        3 => '_three',
 | 
						|
        4 => '_four',
 | 
						|
        5 => '_five',
 | 
						|
        6 => '_six',
 | 
						|
        7 => '_seven',
 | 
						|
        8 => '_eight',
 | 
						|
        9 => '_nine',
 | 
						|
        10 => '_ten',
 | 
						|
    ];
 | 
						|
 | 
						|
    public static function setUpBeforeClass(): void
 | 
						|
    {
 | 
						|
        $config = new \Magento\Framework\ObjectManager\Config\Config();
 | 
						|
        $factory = new Factory\Dynamic\Developer($config);
 | 
						|
 | 
						|
        self::$_objectManager = new \Magento\Framework\ObjectManager\ObjectManager($factory, $config);
 | 
						|
        self::$_objectManager->configure(
 | 
						|
            ['preferences' => [self::TEST_INTERFACE => self::TEST_INTERFACE_IMPLEMENTATION]]
 | 
						|
        );
 | 
						|
        $factory->setObjectManager(self::$_objectManager);
 | 
						|
    }
 | 
						|
 | 
						|
    public static function tearDownAfterClass(): void
 | 
						|
    {
 | 
						|
        self::$_objectManager = null;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Data provider for testNewInstance
 | 
						|
     *
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    public function newInstanceDataProvider()
 | 
						|
    {
 | 
						|
        $data = [
 | 
						|
            'basic model' => [
 | 
						|
                '$actualClassName' => self::TEST_CLASS_INJECTION,
 | 
						|
                '$properties' => ['_object' => self::TEST_CLASS],
 | 
						|
            ],
 | 
						|
            'model with interface' => [
 | 
						|
                '$actualClassName' => self::TEST_CLASS_WITH_INTERFACE,
 | 
						|
                '$properties' => ['_object' => self::TEST_INTERFACE_IMPLEMENTATION],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
 | 
						|
        foreach ($this->_numerableClasses as $number => $className) {
 | 
						|
            $properties = [];
 | 
						|
            for ($i = 1; $i <= $number; $i++) {
 | 
						|
                $propertyName = $this->_numerableProperties[$i];
 | 
						|
                $properties[$propertyName] = self::TEST_CLASS;
 | 
						|
            }
 | 
						|
            $data[$number . ' arguments'] = ['$actualClassName' => $className, '$properties' => $properties];
 | 
						|
        }
 | 
						|
 | 
						|
        return $data;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string $actualClassName
 | 
						|
     * @param array $properties
 | 
						|
     * @param string|null $expectedClassName
 | 
						|
     *
 | 
						|
     * @dataProvider newInstanceDataProvider
 | 
						|
     */
 | 
						|
    public function testNewInstance($actualClassName, array $properties = [], $expectedClassName = null)
 | 
						|
    {
 | 
						|
        if (!$expectedClassName) {
 | 
						|
            $expectedClassName = $actualClassName;
 | 
						|
        }
 | 
						|
 | 
						|
        $testObject = self::$_objectManager->create($actualClassName);
 | 
						|
        $this->assertInstanceOf($expectedClassName, $testObject);
 | 
						|
        $object = new ReflectionClass($actualClassName);
 | 
						|
        if ($properties) {
 | 
						|
            foreach ($properties as $propertyName => $propertyClass) {
 | 
						|
                $this->assertIsObject($testObject);
 | 
						|
                $this->assertTrue(property_exists($testObject, $propertyName));
 | 
						|
                $attribute = $object->getProperty($propertyName);
 | 
						|
                $attribute->setAccessible(true);
 | 
						|
                $propertyObject = $attribute->getValue($testObject);
 | 
						|
                $attribute->setAccessible(false);
 | 
						|
                $this->assertInstanceOf($propertyClass, $propertyObject);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test creating an object and passing incorrect type of arguments to the constructor.
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testNewInstanceWithTypeError()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\RuntimeException::class);
 | 
						|
        $this->expectExceptionMessage('Error occurred when creating object');
 | 
						|
 | 
						|
        self::$_objectManager->create(self::TEST_CLASS_WITH_TYPE_ERROR, [
 | 
						|
            'testArgument' => new \stdClass()
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
}
 |