From 560c97ddcca07c778c6726b9dd09415c5763789b Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Wed, 26 Apr 2023 09:15:09 +0200 Subject: [PATCH] TASK: Add `ExpressionTypeNarrowerTest` --- src/TypeSystem/Narrower/NarrowedTypes.php | 6 + .../Narrower/ExpressionTypeNarrowerTest.php | 104 ++++++++++++++++++ .../TernaryOperationTypeResolverTest.php | 26 ----- 3 files changed, 110 insertions(+), 26 deletions(-) create mode 100644 test/Unit/TypeSystem/Narrower/ExpressionTypeNarrowerTest.php diff --git a/src/TypeSystem/Narrower/NarrowedTypes.php b/src/TypeSystem/Narrower/NarrowedTypes.php index f8f1595f..8e2ff64c 100644 --- a/src/TypeSystem/Narrower/NarrowedTypes.php +++ b/src/TypeSystem/Narrower/NarrowedTypes.php @@ -53,4 +53,10 @@ public function getType(string $identifierName): ?TypeInterface { return $this->types[$identifierName] ?? null; } + + /** @return array */ + public function toArray(): array + { + return $this->types; + } } diff --git a/test/Unit/TypeSystem/Narrower/ExpressionTypeNarrowerTest.php b/test/Unit/TypeSystem/Narrower/ExpressionTypeNarrowerTest.php new file mode 100644 index 00000000..ef186abb --- /dev/null +++ b/test/Unit/TypeSystem/Narrower/ExpressionTypeNarrowerTest.php @@ -0,0 +1,104 @@ +. + */ + +declare(strict_types=1); + +namespace PackageFactory\ComponentEngine\Test\Unit\TypeSystem\Narrower; + + +use PackageFactory\ComponentEngine\Parser\Ast\ExpressionNode; +use PackageFactory\ComponentEngine\Test\Unit\TypeSystem\Scope\Fixtures\DummyScope; +use PackageFactory\ComponentEngine\TypeSystem\Narrower\ExpressionTypeNarrower; +use PackageFactory\ComponentEngine\TypeSystem\Narrower\NarrowedTypes; +use PackageFactory\ComponentEngine\TypeSystem\Narrower\TypeNarrowerContext; +use PackageFactory\ComponentEngine\TypeSystem\Type\NullType\NullType; +use PackageFactory\ComponentEngine\TypeSystem\Type\StringType\StringType; +use PackageFactory\ComponentEngine\TypeSystem\Type\UnionType\UnionType; +use PHPUnit\Framework\TestCase; + +final class ExpressionTypeNarrowerTest extends TestCase +{ + public function narrowedExpressionsExamples(): mixed + { + return [ + 'nullableString' => [ + 'nullableString', + $variableIsString = NarrowedTypes::fromEntry('nullableString', StringType::get()) + ], + + 'nullableString === null' => [ + 'nullableString === null', + $variableIsNull = NarrowedTypes::fromEntry('nullableString', NullType::get()) + ], + // Patience you must have my young Padawan. + 'null === nullableString' => [ + 'null === nullableString', $variableIsNull + ], + + 'nullableString !== null' => [ + 'nullableString !== null', $variableIsString + ], + 'null !== nullableString' => [ + 'null !== nullableString', $variableIsString + ], + + 'true === (nullableString === null)' => [ + 'true === (nullableString === null)', $variableIsNull + ], + 'false !== (nullableString === null)' => [ + 'false !== (nullableString === null)', $variableIsNull + ], + + 'false === (nullableString === null)' => [ + 'false === (nullableString === null)', $variableIsString + ], + 'true !== (nullableString === null)' => [ + 'true !== (nullableString === null)', $variableIsString + ], + + 'nullableString === variableOfTypeNull' => [ + 'nullableString === variableOfTypeNull', $variableIsNull + ], + ]; + } + + /** + * @dataProvider narrowedExpressionsExamples + * @test + */ + public function narrowedExpressions(string $expressionAsString, NarrowedTypes $expectedTypes): void + { + $expressionTypeNarrower = new ExpressionTypeNarrower( + scope: new DummyScope([ + 'nullableString' => UnionType::of(StringType::get(), NullType::get()), + 'variableOfTypeNull' => NullType::get() + ]) + ); + + $expressionNode = ExpressionNode::fromString($expressionAsString); + + $actualTypes = $expressionTypeNarrower->narrowTypesOfSymbolsIn($expressionNode, TypeNarrowerContext::TRUTHY); + + $this->assertEqualsCanonicalizing( + $expectedTypes->toArray(), + $actualTypes->toArray() + ); + } +} diff --git a/test/Unit/TypeSystem/Resolver/TernaryOperation/TernaryOperationTypeResolverTest.php b/test/Unit/TypeSystem/Resolver/TernaryOperation/TernaryOperationTypeResolverTest.php index e9b30c4e..430cdb26 100644 --- a/test/Unit/TypeSystem/Resolver/TernaryOperation/TernaryOperationTypeResolverTest.php +++ b/test/Unit/TypeSystem/Resolver/TernaryOperation/TernaryOperationTypeResolverTest.php @@ -63,31 +63,6 @@ public function ternaryOperationExamples(): array 'null === nullableString ? "" : nullableString' => [ 'null === nullableString ? "" : nullableString', StringType::get() ], - - 'nullableString !== null ? nullableString : ""' => [ - 'nullableString !== null ? nullableString : ""', StringType::get() - ], - 'null !== nullableString ? nullableString : ""' => [ - 'null !== nullableString ? nullableString : ""', StringType::get() - ], - - 'true === (nullableString === null) ? "" : nullableString' => [ - 'true === (nullableString === null) ? "" : nullableString', StringType::get() - ], - 'false !== (nullableString === null) ? "" : nullableString' => [ - 'false !== (nullableString === null) ? "" : nullableString', StringType::get() - ], - - 'false === (nullableString === null) ? nullableString : ""' => [ - 'false === (nullableString === null) ? nullableString : ""', StringType::get() - ], - 'true !== (nullableString === null) ? nullableString : ""' => [ - 'true !== (nullableString === null) ? nullableString : ""', StringType::get() - ], - - 'nullableString === variableOfTypeNull ? "" : nullableString' => [ - 'nullableString === variableOfTypeNull ? "" : nullableString', StringType::get() - ], ]; } @@ -103,7 +78,6 @@ public function resolvesTernaryOperationToResultingType(string $ternaryExpressio $scope = new DummyScope([ 'variableOfTypeString' => StringType::get(), 'variableOfTypeNumber' => NumberType::get(), - 'variableOfTypeNull' => NullType::get(), 'nullableString' => UnionType::of(StringType::get(), NullType::get()) ]); $ternaryOperationTypeResolver = new TernaryOperationTypeResolver(