diff --git a/src/SignatureAssertionUtil.php b/src/SignatureAssertionUtil.php index 05c74b9f8c15809c008b342555a156b036cd6a8a..4a7f4e8976f9426bfb3bbad5f06c65adb5c72654 100644 --- a/src/SignatureAssertionUtil.php +++ b/src/SignatureAssertionUtil.php @@ -71,32 +71,32 @@ final class SignatureAssertionUtil private static function parseType(string $type): array { $cleanType = $type; // e.g. ?Namespace\Class - $optional = FALSE; + $nullable = FALSE; if ($type[0] === '?') { - $optional = TRUE; + $nullable = TRUE; $cleanType = substr($type, 1); // without leading '?' } - return [$cleanType, $optional]; + return [$cleanType, $nullable]; } private static function checkFunctionParameter( \ReflectionFunction $functionReflection, \ReflectionParameter $parameterReflection, string $expectedParameterType, - bool $expectedOptional + bool $expectedNullable ): void { $reflectionType = $parameterReflection->getType(); assert($reflectionType instanceof \ReflectionType); // checks: - $actuallyOptional = $reflectionType->allowsNull(); - if ($expectedOptional !== $actuallyOptional) { + $actuallyNullable = $reflectionType->allowsNull(); + if ($expectedNullable !== $actuallyNullable) { throw FunctionSignatureAssertionError::parameterNullability( $functionReflection, $parameterReflection, - $expectedOptional, - $actuallyOptional + $expectedNullable, + $actuallyNullable ); } if ($expectedParameterType !== (string) $reflectionType) { diff --git a/src/exceptions.php b/src/exceptions.php index c227449c1be8a26e2b56820b07a02d016fdf9239..d2075fd6dcbfa8b50576d8d456c73cd6024bfb3a 100644 --- a/src/exceptions.php +++ b/src/exceptions.php @@ -50,12 +50,12 @@ final class FunctionSignatureAssertionError extends \AssertionError { } - public static function parameterNullability(\ReflectionFunction $functionReflection, \ReflectionParameter $param, bool $expectedOptional, bool $actuallyOptional): self + public static function parameterNullability(\ReflectionFunction $functionReflection, \ReflectionParameter $param, bool $expectedNullable, bool $actuallyNullable): self { return new self( $functionReflection, - $expectedOptional - ? "Function should have parameter {$param->getName()} optional but it is not." + $expectedNullable + ? "Function should have parameter {$param->getName()} nullable but it is not." : "Function should have parameter {$param->getName()} required but it is not." ); } diff --git a/tests/fn.assertSignature.allOptional.phpt b/tests/fn.assertSignature.allNullable.phpt similarity index 83% rename from tests/fn.assertSignature.allOptional.phpt rename to tests/fn.assertSignature.allNullable.phpt index 9f845dcaafcf8c490ed32f98f37813d68012e398..a89737a44f4ad7b3bbc46fa619c00dba3f30fed3 100644 --- a/tests/fn.assertSignature.allOptional.phpt +++ b/tests/fn.assertSignature.allNullable.phpt @@ -8,20 +8,20 @@ use Tester\Assert; $fn = function(?T1 $t1, ?T2 $t2): ?T3 {return new T3;}; assertSignature($fn, params(nullable(T1::class), nullable(T2::class)), nullable(T3::class)); -// missing optional check -Assert::exception(function () use ($fn) { +// parameter is nullable, non-nullable is expected +Assert::exception(function () use ($fn) { // 1st param assertSignature($fn, params(T1::class, nullable(T2::class)), nullable(T3::class)); }, \AssertionError::class /* todo: assert message */); -Assert::exception(function () use ($fn) { +Assert::exception(function () use ($fn) { // 2nd param assertSignature($fn, params(nullable(T1::class), T2::class), nullable(T3::class)); }, \AssertionError::class /* todo: assert message */); -Assert::exception(function () use ($fn) { +Assert::exception(function () use ($fn) { // return type assertSignature($fn, params(nullable(T1::class), nullable(T2::class)), T3::class); }, \AssertionError::class /* todo: assert message */); -// Wrong return type type +// Wrong return type Assert::exception(function () use ($fn) { assertSignature($fn, params(nullable(T1::class), nullable(T2::class)), nullable(T2::class)); }, \AssertionError::class /* todo: assert message */);