From 9ea45d0ec95acbe4cc31a5b0ff90df966e80ddd7 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Mon, 24 Feb 2025 12:15:37 +0100 Subject: [PATCH] rewrite tests to not fail when self/parent are resolved at compile time --- .../ReflectionExtractableDummyUsingTrait.php | 17 +++++++++ .../Fixtures/ReflectionExtractableTrait.php | 27 ++++++++++++++ .../ReflectionParameterTypeResolverTest.php | 22 +++++++++-- .../ReflectionPropertyTypeResolverTest.php | 22 +++++++++-- .../ReflectionReturnTypeResolverTest.php | 22 +++++++++-- .../ReflectionTypeResolverTest.php | 37 ++++++++++++------- 6 files changed, 125 insertions(+), 22 deletions(-) create mode 100644 src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableDummyUsingTrait.php create mode 100644 src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableTrait.php diff --git a/src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableDummyUsingTrait.php b/src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableDummyUsingTrait.php new file mode 100644 index 0000000000000..77fb0b02966b7 --- /dev/null +++ b/src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableDummyUsingTrait.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\TypeInfo\Tests\Fixtures; + +class ReflectionExtractableDummyUsingTrait +{ + use ReflectionExtractableTrait; +} diff --git a/src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableTrait.php b/src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableTrait.php new file mode 100644 index 0000000000000..5bc33e0bbd315 --- /dev/null +++ b/src/Symfony/Component/TypeInfo/Tests/Fixtures/ReflectionExtractableTrait.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\TypeInfo\Tests\Fixtures; + +trait ReflectionExtractableTrait +{ + public self $self; + + public function getSelf(): self + { + return $this; + } + + public function setSelf(self $self): void + { + $this->self = $self; + } +} diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionParameterTypeResolverTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionParameterTypeResolverTest.php index 41a46a899751e..e70106088db48 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionParameterTypeResolverTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionParameterTypeResolverTest.php @@ -14,6 +14,8 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\TypeInfo\Exception\UnsupportedException; use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummy; +use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummyUsingTrait; +use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableTrait; use Symfony\Component\TypeInfo\Type; use Symfony\Component\TypeInfo\TypeContext\TypeContextFactory; use Symfony\Component\TypeInfo\TypeResolver\ReflectionParameterTypeResolver; @@ -71,15 +73,29 @@ public function testResolveOptionalParameter() $this->assertEquals(Type::nullable(Type::int()), $this->resolver->resolve($reflectionParameter)); } - public function testCreateTypeContextOrUseProvided() + public function testResolveSelfFromClassWithoutContext() { $reflectionClass = new \ReflectionClass(ReflectionExtractableDummy::class); $reflectionParameter = $reflectionClass->getMethod('setSelf')->getParameters()[0]; $this->assertEquals(Type::object(ReflectionExtractableDummy::class), $this->resolver->resolve($reflectionParameter)); + } + + public function testResolveSelfFromTraitWithoutContext() + { + $reflectionClass = new \ReflectionClass(ReflectionExtractableTrait::class); + $reflectionParameter = $reflectionClass->getMethod('setSelf')->getParameters()[0]; + + $this->assertEquals(Type::object(ReflectionExtractableTrait::class), $this->resolver->resolve($reflectionParameter)); + } + + public function testResolveSelfFromTraitWithClassContext() + { + $reflectionClass = new \ReflectionClass(ReflectionExtractableTrait::class); + $reflectionParameter = $reflectionClass->getMethod('setSelf')->getParameters()[0]; - $typeContext = (new TypeContextFactory())->createFromClassName(self::class); + $typeContext = (new TypeContextFactory())->createFromClassName(ReflectionExtractableDummyUsingTrait::class); - $this->assertEquals(Type::object(self::class), $this->resolver->resolve($reflectionParameter, $typeContext)); + $this->assertEquals(Type::object(ReflectionExtractableDummyUsingTrait::class), $this->resolver->resolve($reflectionParameter, $typeContext)); } } diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionPropertyTypeResolverTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionPropertyTypeResolverTest.php index 6935f818b6f17..1c756884e697f 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionPropertyTypeResolverTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionPropertyTypeResolverTest.php @@ -14,6 +14,8 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\TypeInfo\Exception\UnsupportedException; use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummy; +use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummyUsingTrait; +use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableTrait; use Symfony\Component\TypeInfo\Type; use Symfony\Component\TypeInfo\TypeContext\TypeContextFactory; use Symfony\Component\TypeInfo\TypeResolver\ReflectionPropertyTypeResolver; @@ -52,15 +54,29 @@ public function testResolve() $this->assertEquals(Type::int(), $this->resolver->resolve($reflectionProperty)); } - public function testCreateTypeContextOrUseProvided() + public function testResolveSelfFromClassWithoutContext() { $reflectionClass = new \ReflectionClass(ReflectionExtractableDummy::class); $reflectionProperty = $reflectionClass->getProperty('self'); $this->assertEquals(Type::object(ReflectionExtractableDummy::class), $this->resolver->resolve($reflectionProperty)); + } + + public function testResolveSelfFromTraitWithoutContext() + { + $reflectionClass = new \ReflectionClass(ReflectionExtractableTrait::class); + $reflectionProperty = $reflectionClass->getProperty('self'); + + $this->assertEquals(Type::object(ReflectionExtractableTrait::class), $this->resolver->resolve($reflectionProperty)); + } + + public function testResolveSelfFromTraitWithClassContext() + { + $reflectionClass = new \ReflectionClass(ReflectionExtractableTrait::class); + $reflectionProperty = $reflectionClass->getProperty('self'); - $typeContext = (new TypeContextFactory())->createFromClassName(self::class); + $typeContext = (new TypeContextFactory())->createFromClassName(ReflectionExtractableDummyUsingTrait::class); - $this->assertEquals(Type::object(self::class), $this->resolver->resolve($reflectionProperty, $typeContext)); + $this->assertEquals(Type::object(ReflectionExtractableDummyUsingTrait::class), $this->resolver->resolve($reflectionProperty, $typeContext)); } } diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionReturnTypeResolverTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionReturnTypeResolverTest.php index 691a7d710af8c..13bfa2561fc37 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionReturnTypeResolverTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionReturnTypeResolverTest.php @@ -14,6 +14,8 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\TypeInfo\Exception\UnsupportedException; use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummy; +use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableDummyUsingTrait; +use Symfony\Component\TypeInfo\Tests\Fixtures\ReflectionExtractableTrait; use Symfony\Component\TypeInfo\Type; use Symfony\Component\TypeInfo\TypeContext\TypeContextFactory; use Symfony\Component\TypeInfo\TypeResolver\ReflectionReturnTypeResolver; @@ -62,15 +64,29 @@ public function testResolve() $this->assertEquals(Type::int(), $this->resolver->resolve($reflectionFunction)); } - public function testCreateTypeContextOrUseProvided() + public function testResolveSelfFromClassWithoutContext() { $reflectionClass = new \ReflectionClass(ReflectionExtractableDummy::class); $reflectionFunction = $reflectionClass->getMethod('getSelf'); $this->assertEquals(Type::object(ReflectionExtractableDummy::class), $this->resolver->resolve($reflectionFunction)); + } + + public function testResolveSelfFromTraitWithoutContext() + { + $reflectionClass = new \ReflectionClass(ReflectionExtractableTrait::class); + $reflectionFunction = $reflectionClass->getMethod('getSelf'); + + $this->assertEquals(Type::object(ReflectionExtractableTrait::class), $this->resolver->resolve($reflectionFunction)); + } + + public function testResolveSelfFromTraitWithClassContext() + { + $reflectionClass = new \ReflectionClass(ReflectionExtractableTrait::class); + $reflectionFunction = $reflectionClass->getMethod('getSelf'); - $typeContext = (new TypeContextFactory())->createFromClassName(self::class); + $typeContext = (new TypeContextFactory())->createFromClassName(ReflectionExtractableDummyUsingTrait::class); - $this->assertEquals(Type::object(self::class), $this->resolver->resolve($reflectionFunction, $typeContext)); + $this->assertEquals(Type::object(ReflectionExtractableDummyUsingTrait::class), $this->resolver->resolve($reflectionFunction, $typeContext)); } } diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionTypeResolverTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionTypeResolverTest.php index 4cadd5943e102..75116d97c2c3d 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionTypeResolverTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/ReflectionTypeResolverTest.php @@ -77,24 +77,35 @@ public function testCannotResolveNonProperReflectionType() $this->resolver->resolve(new \ReflectionClass(self::class)); } - /** - * @dataProvider classKeywordsTypesDataProvider - */ - public function testCannotResolveClassKeywordsWithoutTypeContext(\ReflectionType $reflection) + public function testCannotResolveStaticKeywordWithoutTypeContext() { + $subject = (new \ReflectionClass(ReflectionExtractableDummy::class))->getMethod('getStatic')->getReturnType(); + $this->expectException(InvalidArgumentException::class); - $this->resolver->resolve($reflection); + $this->resolver->resolve($subject); } - /** - * @return iterable - */ - public static function classKeywordsTypesDataProvider(): iterable + public function testResolveSelfKeywordWithoutTypeContext() { - $reflection = new \ReflectionClass(ReflectionExtractableDummy::class); + $subject = (new \ReflectionClass(ReflectionExtractableDummy::class))->getProperty('self')->getType(); + + if (\PHP_VERSION_ID >= 80500) { + $this->assertEquals(Type::object(ReflectionExtractableDummy::class), $this->resolver->resolve($subject)); + } else { + $this->expectException(InvalidArgumentException::class); + $this->resolver->resolve($subject); + } + } + + public function testResolveParentKeywordsWithoutTypeContext() + { + $subject = (new \ReflectionClass(ReflectionExtractableDummy::class))->getProperty('parent')->getType(); - yield [$reflection->getProperty('self')->getType()]; - yield [$reflection->getMethod('getStatic')->getReturnType()]; - yield [$reflection->getProperty('parent')->getType()]; + if (\PHP_VERSION_ID >= 80500) { + $this->assertEquals(Type::object(AbstractDummy::class), $this->resolver->resolve($subject)); + } else { + $this->expectException(InvalidArgumentException::class); + $this->resolver->resolve($subject); + } } }