Skip to content

Commit cf25c0e

Browse files
authored
ENGCOM-4046: Support for non-FQN classes on web-API interfaces. #17424
2 parents 9b5590c + a7afbde commit cf25c0e

File tree

9 files changed

+427
-7
lines changed

9 files changed

+427
-7
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses;
9+
10+
class SampleOne
11+
{
12+
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleOne;
9+
10+
class SampleThree
11+
{
12+
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses;
9+
10+
class SampleTwo
11+
{
12+
13+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleTwo;
9+
10+
class SampleFour
11+
{
12+
13+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Framework\Reflection\Test\Unit\Fixture;
9+
10+
use Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleOne;
11+
use Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleTwo as Sample2;
12+
13+
class UseSample
14+
{
15+
// ...
16+
}

lib/internal/Magento/Framework/Reflection/Test/Unit/TypeProcessorTest.php

Lines changed: 185 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88

99
use Magento\Framework\Exception\SerializationException;
1010
use Magento\Framework\Reflection\Test\Unit\Fixture\TSample;
11+
use Magento\Framework\Reflection\Test\Unit\Fixture\TSampleInterface;
12+
use Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleOne;
13+
use Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleOne\SampleThree;
14+
use Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleTwo;
15+
use Magento\Framework\Reflection\Test\Unit\Fixture\UseClasses\SampleTwo\SampleFour;
16+
use Magento\Framework\Reflection\Test\Unit\Fixture\UseSample;
1117
use Magento\Framework\Reflection\TypeProcessor;
1218
use Zend\Code\Reflection\ClassReflection;
1319

@@ -278,7 +284,7 @@ public function arrayParamTypeDataProvider()
278284
{
279285
return [
280286
['method name' => 'addData', 'type' => 'array[]'],
281-
['method name' => 'addObjectList', 'type' => 'TSampleInterface[]']
287+
['method name' => 'addObjectList', 'type' => '\\' . TSampleInterface::class . '[]']
282288
];
283289
}
284290

@@ -354,4 +360,182 @@ public function testGetReturnTypeWithoutReturnTag()
354360
$methodReflection = $classReflection->getMethod('getName');
355361
$this->typeProcessor->getGetterReturnType($methodReflection);
356362
}
363+
364+
/**
365+
* Simple and complex data provider
366+
*
367+
* @return array
368+
*/
369+
public function simpleAndComplexDataProvider(): array
370+
{
371+
return [
372+
['string', true],
373+
['array', true],
374+
['int', true],
375+
['SomeClass', false],
376+
['\\My\\Namespace\\Model\\Class', false],
377+
['Some\\Other\\Class', false],
378+
];
379+
}
380+
381+
/**
382+
* Test simple type detection method
383+
*
384+
* @dataProvider simpleAndComplexDataProvider
385+
* @param string $type
386+
* @param bool $expectedValue
387+
*/
388+
public function testIsSimpleType(string $type, bool $expectedValue)
389+
{
390+
self::assertEquals($expectedValue, $this->typeProcessor->isSimpleType($type));
391+
}
392+
393+
/**
394+
* Simple and complex data provider
395+
*
396+
* @return array
397+
*/
398+
public function basicClassNameProvider(): array
399+
{
400+
return [
401+
['SomeClass[]', 'SomeClass'],
402+
['\\My\\Namespace\\Model\\Class[]', '\\My\\Namespace\\Model\\Class'],
403+
['Some\\Other\\Class[]', 'Some\\Other\\Class'],
404+
['SomeClass', 'SomeClass'],
405+
['\\My\\Namespace\\Model\\Class', '\\My\\Namespace\\Model\\Class'],
406+
['Some\\Other\\Class', 'Some\\Other\\Class'],
407+
];
408+
}
409+
410+
/**
411+
* Extract basic class name
412+
*
413+
* @dataProvider basicClassNameProvider
414+
* @param string $type
415+
* @param string $expectedValue
416+
*/
417+
public function testBasicClassName(string $type, string $expectedValue)
418+
{
419+
self::assertEquals($expectedValue, $this->typeProcessor->getBasicClassName($type));
420+
}
421+
422+
/**
423+
* Fully qualified class names data provider
424+
*
425+
* @return array
426+
*/
427+
public function isFullyQualifiedClassNamesDataProvider(): array
428+
{
429+
return [
430+
['SomeClass', false],
431+
['\\My\\Namespace\\Model\\Class', true],
432+
['Some\\Other\\Class', false],
433+
];
434+
}
435+
436+
/**
437+
* Test fully qualified class name detector
438+
*
439+
* @dataProvider isFullyQualifiedClassNamesDataProvider
440+
* @param string $type
441+
* @param bool $expectedValue
442+
*/
443+
public function testIsFullyQualifiedClassName(string $type, bool $expectedValue)
444+
{
445+
self::assertEquals($expectedValue, $this->typeProcessor->isFullyQualifiedClassName($type));
446+
}
447+
448+
/**
449+
* Test alias mapping
450+
*/
451+
public function testGetAliasMapping()
452+
{
453+
$sourceClass = new ClassReflection(UseSample::class);
454+
$aliasMap = $this->typeProcessor->getAliasMapping($sourceClass);
455+
456+
self::assertEquals([
457+
'SampleOne' => SampleOne::class,
458+
'Sample2' => SampleTwo::class,
459+
], $aliasMap);
460+
}
461+
462+
/**
463+
* Resolve fully qualified class names data provider
464+
*
465+
* @return array
466+
*/
467+
public function resolveFullyQualifiedClassNamesDataProvider(): array
468+
{
469+
return [
470+
[UseSample::class, 'string', 'string'],
471+
[UseSample::class, 'string[]', 'string[]'],
472+
473+
[UseSample::class, 'SampleOne', '\\' . SampleOne::class],
474+
[UseSample::class, 'Sample2', '\\' . SampleTwo::class],
475+
[
476+
UseSample::class,
477+
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\SampleOne',
478+
'\\' . SampleOne::class
479+
],
480+
[
481+
UseSample::class,
482+
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\SampleTwo',
483+
'\\' . SampleTwo::class
484+
],
485+
[UseSample::class, 'UseClasses\\SampleOne', '\\' . SampleOne::class],
486+
[UseSample::class, 'UseClasses\\SampleTwo', '\\' . SampleTwo::class],
487+
488+
[UseSample::class, 'SampleOne[]', '\\' . SampleOne::class . '[]'],
489+
[UseSample::class, 'Sample2[]', '\\' . SampleTwo::class . '[]'],
490+
[
491+
UseSample::class,
492+
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\SampleOne[]',
493+
'\\' . SampleOne::class . '[]'
494+
],
495+
[
496+
UseSample::class,
497+
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\SampleTwo[]',
498+
'\\' . SampleTwo::class . '[]'
499+
],
500+
[UseSample::class, 'UseClasses\\SampleOne[]', '\\' . SampleOne::class . '[]'],
501+
[UseSample::class, 'UseClasses\\SampleTwo[]', '\\' . SampleTwo::class . '[]'],
502+
503+
[UseSample::class, 'SampleOne\SampleThree', '\\' . SampleThree::class],
504+
[UseSample::class, 'SampleOne\SampleThree[]', '\\' . SampleThree::class . '[]'],
505+
506+
[UseSample::class, 'Sample2\SampleFour', '\\' . SampleFour::class],
507+
[UseSample::class, 'Sample2\SampleFour[]', '\\' . SampleFour::class . '[]'],
508+
509+
[UseSample::class, 'Sample2\NotExisting', 'Sample2\NotExisting'],
510+
[UseSample::class, 'Sample2\NotExisting[]', 'Sample2\NotExisting[]'],
511+
512+
[
513+
UseSample::class,
514+
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\NotExisting',
515+
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\NotExisting'
516+
],
517+
[
518+
UseSample::class,
519+
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\NotExisting[]',
520+
'\\Magento\\Framework\\Reflection\\Test\\Unit\\Fixture\\UseClasses\\NotExisting[]'
521+
],
522+
];
523+
}
524+
525+
/**
526+
* Resolve fully qualified class names
527+
*
528+
* @dataProvider resolveFullyQualifiedClassNamesDataProvider
529+
* @param string $className
530+
* @param string $type
531+
* @param string $expectedValue
532+
* @throws \ReflectionException
533+
*/
534+
public function testResolveFullyQualifiedClassNames(string $className, string $type, string $expectedValue)
535+
{
536+
$sourceClass = new ClassReflection($className);
537+
$fullyQualified = $this->typeProcessor->resolveFullyQualifiedClassName($sourceClass, $type);
538+
539+
self::assertEquals($expectedValue, $fullyQualified);
540+
}
357541
}

0 commit comments

Comments
 (0)