![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/framework/Code/Test/Unit/Generator/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Framework\Code\Test\Unit\Generator; use Laminas\Code\Generator\AbstractMemberGenerator; use Laminas\Code\Generator\DocBlock\Tag; use Laminas\Code\Generator\DocBlockGenerator; use Laminas\Code\Generator\MethodGenerator; use Laminas\Code\Generator\ParameterGenerator; use Laminas\Code\Generator\PropertyGenerator; use Laminas\Code\Generator\ValueGenerator; use Magento\Framework\Code\Generator\ClassGenerator; use PHPUnit\Framework\TestCase; /** * Test for Magento\Framework\Code\Generator\ClassGenerator */ class ClassGeneratorTest extends TestCase { /**#@+ * Possible flags for assertion */ const FLAG_CONST = 'const'; const FLAG_STATIC = 'static'; const FLAG_FINAL = 'final'; const FLAG_ABSTRACT = 'abstract'; const FLAG_REFERENCE = 'passedByReference'; const FLAG_VARIADIC = 'variadic'; /**#@-*/ /** * @var ClassGenerator */ protected $_model; /** * Methods to verify flags * * @var array */ protected $_flagVerification = [ self::FLAG_CONST => 'isConst', self::FLAG_STATIC => 'isStatic', self::FLAG_FINAL => 'isFinal', self::FLAG_ABSTRACT => 'isAbstract', self::FLAG_REFERENCE => 'getPassedByReference', self::FLAG_VARIADIC => 'getVariadic', ]; /** * Doc block test data * * @var array */ protected $_docBlockData = [ 'shortDescription' => 'test_short_description', 'longDescription' => 'test_long_description', 'tags' => [ 'tag1' => ['name' => 'tag1', 'description' => 'data1'], 'tag2' => ['name' => 'tag2', 'description' => 'data2'], ], ]; /** * Method test data * * @var array */ protected $_methodData = [ 'testmethod1' => [ 'name' => 'testMethod1', 'final' => true, 'static' => true, 'parameters' => [ [ 'name' => 'data', 'type' => 'array', 'defaultValue' => [], 'passedByReference' => true ], ], 'body' => 'return 1;', 'docblock' => ['shortDescription' => 'test short description'], ], '_testmethod2' => [ 'name' => '_testMethod2', 'visibility' => 'private', 'abstract' => true, 'parameters' => [ ['name' => 'data', 'defaultValue' => 'test_default'], ['name' => 'flag', 'defaultValue' => true], ], 'body' => 'return 2;', 'docblock' => [ 'shortDescription' => 'test short description', 'longDescription' => 'test long description', 'tags' => [ 'tag1' => ['name' => 'tag1', 'description' => 'data1'], 'tag2' => ['name' => 'tag2', 'description' => 'data2'], ], ], ], 'testmethod3' => ['name' => 'testMethod3', 'body' => 'return 3;'], ]; /** * Property test data * * @var array */ protected $_propertyData = [ '_protectedProperty' => [ 'name' => '_protectedProperty', 'visibility' => 'protected', 'static' => 'true', 'docblock' => [ 'shortDescription' => 'Object Manager instance', 'tags' => ['var' => ['name' => 'var', 'description' => 'tag description']], ], ], 'publicProperty' => ['name' => 'publicProperty'], ]; protected function setUp(): void { $this->_model = new ClassGenerator(); } protected function tearDown(): void { unset($this->_model); } public function testSetClassDocBlock() { $this->_model->setClassDocBlock($this->_docBlockData); $actualDocBlock = $this->_model->getDocBlock(); $this->_assertDocBlockData($this->_docBlockData, $actualDocBlock); } /** * @param array $expectedDocBlock * @param DocBlockGenerator $actualDocBlock */ protected function _assertDocBlockData( array $expectedDocBlock, DocBlockGenerator $actualDocBlock ) { $this->markTestSkipped('Skipped in #27500 due to testing protected/private methods and properties'); // assert plain string data foreach ($expectedDocBlock as $propertyName => $propertyData) { if (is_string($propertyData)) { $this->assertAttributeEquals($propertyData, $propertyName, $actualDocBlock); } } // assert tags if (isset($expectedDocBlock['tags'])) { $expectedTagsData = $expectedDocBlock['tags']; $actualTags = $actualDocBlock->getTags(); $this->assertSameSize($expectedTagsData, $actualTags); /** @var Tag $actualTag */ foreach ($actualTags as $actualTag) { $tagName = $actualTag->getName(); $this->assertArrayHasKey($tagName, $expectedTagsData); $this->assertEquals($expectedTagsData[$tagName]['name'], $tagName); $this->assertEquals($expectedTagsData[$tagName]['description'], $actualTag->getDescription()); } } } public function testAddMethods() { $this->_model->addMethods($this->_methodData); $actualMethods = $this->_model->getMethods(); $this->assertSameSize($this->_methodData, $actualMethods); /** @var MethodGenerator $method */ foreach ($actualMethods as $methodName => $method) { $this->assertArrayHasKey($methodName, $this->_methodData); $expectedMethodData = $this->_methodData[$methodName]; $this->assertEquals($expectedMethodData['name'], $method->getName()); $this->assertEquals($expectedMethodData['body'], $method->getBody()); // assert flags $this->_assertFlag(self::FLAG_STATIC, $expectedMethodData, $method); $this->_assertFlag(self::FLAG_FINAL, $expectedMethodData, $method); $this->_assertFlag(self::FLAG_ABSTRACT, $expectedMethodData, $method); // assert visibility $this->_assertVisibility($expectedMethodData, $method); // assert parameters if (isset($expectedMethodData['parameters'])) { $actualParameters = $method->getParameters(); $this->assertSameSize($expectedMethodData['parameters'], $actualParameters); foreach ($expectedMethodData['parameters'] as $parameterData) { $parameterName = $parameterData['name']; $this->assertArrayHasKey($parameterName, $actualParameters); /** @var ParameterGenerator $actualParameter */ $actualParameter = $actualParameters[$parameterName]; $this->assertEquals($parameterName, $actualParameter->getName()); // assert reference flag $this->_assertFlag(self::FLAG_REFERENCE, $parameterData, $actualParameter); // assert parameter type if (isset($parameterData['type'])) { $this->assertEquals($parameterData['type'], $actualParameter->getType()); } // assert default value if (isset($parameterData['defaultValue'])) { /** @var ValueGenerator $actualDefaultValue */ $actualDefaultValue = $actualParameter->getDefaultValue(); $this->assertEquals($parameterData['defaultValue'], $actualDefaultValue->getValue()); } // assert variadic flag $this->_assertFlag(self::FLAG_VARIADIC, $parameterData, $actualParameter); } } // assert docblock if (isset($expectedMethodData['docblock'])) { $actualDocBlock = $method->getDocBlock(); $this->_assertDocBlockData($expectedMethodData['docblock'], $actualDocBlock); } } } /** * @param string $flagType * @param array $expectedData * @param object $actualObject */ protected function _assertFlag($flagType, array $expectedData, $actualObject) { $expectedFlagValue = isset($expectedData[$flagType]) && $expectedData[$flagType]; $flagGetter = $this->_flagVerification[$flagType]; $this->assertEquals($expectedFlagValue, $actualObject->{$flagGetter}()); } /** * @param array $expectedData * @param AbstractMemberGenerator $actualObject */ protected function _assertVisibility( array $expectedData, AbstractMemberGenerator $actualObject ) { $expectedVisibility = isset($expectedData['visibility']) ? $expectedData['visibility'] : 'public'; $this->assertEquals($expectedVisibility, $actualObject->getVisibility()); } public function testAddMethodFromGenerator(): void { $this->expectException('InvalidArgumentException'); $this->expectExceptionMessage('addMethodFromGenerator() expects non-empty string for name'); $invalidMethod = new MethodGenerator(); $this->_model->addMethodFromGenerator($invalidMethod); } public function testAddProperties() { $this->_model->addProperties($this->_propertyData); $actualProperties = $this->_model->getProperties(); $this->assertSameSize($this->_propertyData, $actualProperties); /** @var PropertyGenerator $property */ foreach ($actualProperties as $propertyName => $property) { $this->assertArrayHasKey($propertyName, $this->_propertyData); $expectedPropertyData = $this->_propertyData[$propertyName]; $this->assertEquals($expectedPropertyData['name'], $property->getName()); // assert flags $this->_assertFlag(self::FLAG_CONST, $expectedPropertyData, $property); $this->_assertFlag(self::FLAG_STATIC, $expectedPropertyData, $property); // assert visibility $this->_assertVisibility($expectedPropertyData, $property); // assert default value if (isset($expectedPropertyData['defaultValue'])) { /** @var ValueGenerator $actualDefaultValue */ $actualDefaultValue = $property->getDefaultValue(); $this->assertEquals($expectedPropertyData['defaultValue'], $actualDefaultValue->getValue()); } // assert docblock if (isset($expectedPropertyData['docblock'])) { $actualDocBlock = $property->getDocBlock(); $this->_assertDocBlockData($expectedPropertyData['docblock'], $actualDocBlock); } } } public function testAddPropertyFromGenerator(): void { $this->expectException('InvalidArgumentException'); $this->expectExceptionMessage('addPropertyFromGenerator() expects non-empty string for name'); $invalidProperty = new PropertyGenerator(); $this->_model->addPropertyFromGenerator($invalidProperty); } /** * @dataProvider providerNamespaces * @param string $actualNamespace * @param string $expectedNamespace */ public function testNamespaceName($actualNamespace, $expectedNamespace) { $this->assertEquals( $expectedNamespace, $this->_model->setNamespaceName($actualNamespace) ->getNamespaceName() ); } /** * DataProvider for testNamespaceName * @return array */ public function providerNamespaces() { return [ ['Laminas', 'Laminas'], ['\Laminas', 'Laminas'], ['\Laminas\SomeClass', 'Laminas\SomeClass'], ['', null], ]; } }