Skip to content

Support for non-FQN classes on web-API interfaces. #17424

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses;

class SampleOne
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleOne;

class SampleThree
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses;

class SampleTwo
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleTwo;

class SampleFour
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);

namespace Magento\Framework\Reflection\Test\Unit\Fixture;

use Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleOne;
use Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleTwo as Sample2;

class UseSample
{
// ...
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@

use Magento\Framework\Exception\SerializationException;
use Magento\Framework\Reflection\Test\Unit\Fixture\TSample;
use Magento\Framework\Reflection\Test\Unit\Fixture\TSampleInterface;
use Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleOne;
use Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleOne\SampleThree;
use Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleTwo;
use Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleTwo\SampleFour;
use Magento\Framework\Reflection\Test\Unit\Fixture\UseSample;
use Magento\Framework\Reflection\TypeProcessor;
use Zend\Code\Reflection\ClassReflection;

Expand Down Expand Up @@ -278,7 +284,7 @@ public function arrayParamTypeDataProvider()
{
return [
['method name' => 'addData', 'type' => 'array[]'],
['method name' => 'addObjectList', 'type' => 'TSampleInterface[]']
['method name' => 'addObjectList', 'type' => '\\' . TSampleInterface::class . '[]']
];
}

Expand Down Expand Up @@ -354,4 +360,182 @@ public function testGetReturnTypeWithoutReturnTag()
$methodReflection = $classReflection->getMethod('getName');
$this->typeProcessor->getGetterReturnType($methodReflection);
}

/**
* Simple and complex data provider
*
* @return array
*/
public function simpleAndComplexDataProvider(): array
{
return [
['string', true],
['array', true],
['int', true],
['SomeClass', false],
['\\My\\Namespace\\Model\\Class', false],
['Some\\Other\\Class', false],
];
}

/**
* Test simple type detection method
*
* @dataProvider simpleAndComplexDataProvider
* @param string $type
* @param bool $expectedValue
*/
public function testIsSimpleType(string $type, bool $expectedValue)
{
self::assertEquals($expectedValue, $this->typeProcessor->isSimpleType($type));
}

/**
* Simple and complex data provider
*
* @return array
*/
public function basicClassNameProvider(): array
{
return [
['SomeClass[]', 'SomeClass'],
['\\My\\Namespace\\Model\\Class[]', '\\My\\Namespace\\Model\\Class'],
['Some\\Other\\Class[]', 'Some\\Other\\Class'],
['SomeClass', 'SomeClass'],
['\\My\\Namespace\\Model\\Class', '\\My\\Namespace\\Model\\Class'],
['Some\\Other\\Class', 'Some\\Other\\Class'],
];
}

/**
* Extract basic class name
*
* @dataProvider basicClassNameProvider
* @param string $type
* @param string $expectedValue
*/
public function testBasicClassName(string $type, string $expectedValue)
{
self::assertEquals($expectedValue, $this->typeProcessor->getBasicClassName($type));
}

/**
* Fully qualified class names data provider
*
* @return array
*/
public function isFullyQualifiedClassNamesDataProvider(): array
{
return [
['SomeClass', false],
['\\My\\Namespace\\Model\\Class', true],
['Some\\Other\\Class', false],
];
}

/**
* Test fully qualified class name detector
*
* @dataProvider isFullyQualifiedClassNamesDataProvider
* @param string $type
* @param bool $expectedValue
*/
public function testIsFullyQualifiedClassName(string $type, bool $expectedValue)
{
self::assertEquals($expectedValue, $this->typeProcessor->isFullyQualifiedClassName($type));
}

/**
* Test alias mapping
*/
public function testGetAliasMapping()
{
$sourceClass = new ClassReflection(UseSample::class);
$aliasMap = $this->typeProcessor->getAliasMapping($sourceClass);

self::assertEquals([
'SampleOne' => SampleOne::class,
'Sample2' => SampleTwo::class,
], $aliasMap);
}

/**
* Resolve fully qualified class names data provider
*
* @return array
*/
public function resolveFullyQualifiedClassNamesDataProvider(): array
{
return [
[UseSample::class, 'string', 'string'],
[UseSample::class, 'string[]', 'string[]'],

[UseSample::class, 'SampleOne', '\\' . SampleOne::class],
[UseSample::class, 'Sample2', '\\' . SampleTwo::class],
[
UseSample::class,
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\SampleOne',
'\\' . SampleOne::class
],
[
UseSample::class,
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\SampleTwo',
'\\' . SampleTwo::class
],
[UseSample::class, 'UseClasses\\SampleOne', '\\' . SampleOne::class],
[UseSample::class, 'UseClasses\\SampleTwo', '\\' . SampleTwo::class],

[UseSample::class, 'SampleOne[]', '\\' . SampleOne::class . '[]'],
[UseSample::class, 'Sample2[]', '\\' . SampleTwo::class . '[]'],
[
UseSample::class,
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\SampleOne[]',
'\\' . SampleOne::class . '[]'
],
[
UseSample::class,
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\SampleTwo[]',
'\\' . SampleTwo::class . '[]'
],
[UseSample::class, 'UseClasses\\SampleOne[]', '\\' . SampleOne::class . '[]'],
[UseSample::class, 'UseClasses\\SampleTwo[]', '\\' . SampleTwo::class . '[]'],

[UseSample::class, 'SampleOne\SampleThree', '\\' . SampleThree::class],
[UseSample::class, 'SampleOne\SampleThree[]', '\\' . SampleThree::class . '[]'],

[UseSample::class, 'Sample2\SampleFour', '\\' . SampleFour::class],
[UseSample::class, 'Sample2\SampleFour[]', '\\' . SampleFour::class . '[]'],

[UseSample::class, 'Sample2\NotExisting', 'Sample2\NotExisting'],
[UseSample::class, 'Sample2\NotExisting[]', 'Sample2\NotExisting[]'],

[
UseSample::class,
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\NotExisting',
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\NotExisting'
],
[
UseSample::class,
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\NotExisting[]',
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\NotExisting[]'
],
];
}

/**
* Resolve fully qualified class names
*
* @dataProvider resolveFullyQualifiedClassNamesDataProvider
* @param string $className
* @param string $type
* @param string $expectedValue
* @throws \ReflectionException
*/
public function testResolveFullyQualifiedClassNames(string $className, string $type, string $expectedValue)
{
$sourceClass = new ClassReflection($className);
$fullyQualified = $this->typeProcessor->resolveFullyQualifiedClassName($sourceClass, $type);

self::assertEquals($expectedValue, $fullyQualified);
}
}
Loading