diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 6e447d3..e0e6fb2 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -78,7 +78,7 @@ jobs: coverage: "none" extensions: "${{ env.PHP_EXTENSIONS }}" php-version: "${{ matrix.php-version }}" - tools: "composer-require-checker, composer-unused, flex" + tools: "flex" - name: "Install composer dependencies" uses: "ramsey/composer-install@v3" @@ -87,11 +87,8 @@ jobs: with: dependency-versions: "${{ matrix.dependencies }}" - - name: "Run maglnet/composer-require-checker" - run: "composer-require-checker check" - - - name: "Run composer-unused/composer-unused" - run: "composer-unused" + - name: "Run shipmonk/composer-dependency-analyser" + run: "vendor/bin/composer-dependency-analyser" static-code-analysis: name: "Static Code Analysis" diff --git a/composer-dependency-analyser.php b/composer-dependency-analyser.php new file mode 100644 index 0000000..a36a954 --- /dev/null +++ b/composer-dependency-analyser.php @@ -0,0 +1,24 @@ +ignoreErrorsOnPackage('doctrine/doctrine-bundle', [ErrorType::UNUSED_DEPENDENCY]) +; + +if (class_exists(Type::class)) { + $config->ignoreErrorsOnPackage('symfony/type-info', [ErrorType::SHADOW_DEPENDENCY]); +} else { + $config->ignoreUnknownClasses([Type::class]); +} + +// ignore polyfill +if (version_compare(PHP_VERSION, '8.3.0', '>=')) { + $config->ignoreErrorsOnPackage('symfony/polyfill-php83', [ErrorType::UNUSED_DEPENDENCY]); +} + +return $config; diff --git a/composer-unused.php b/composer-unused.php deleted file mode 100644 index 9fbcd60..0000000 --- a/composer-unused.php +++ /dev/null @@ -1,12 +0,0 @@ -addNamedFilter(NamedFilter::fromString('doctrine/doctrine-bundle')) - ; -}; diff --git a/composer.json b/composer.json index 79d4a96..34a9304 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,7 @@ "symfony/form": "^5.4 || ^6.0 || ^7.0", "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0", "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-php83": "^1.27", "symfony/property-info": "^5.4 || ^6.0 || ^7.0", "symfony/validator": "^5.4 || ^6.0 || ^7.0", "webmozart/assert": "^1.10" @@ -30,9 +31,10 @@ "phpunit/phpunit": "^9.5", "psalm/plugin-phpunit": "^0.19", "roave/security-advisories": "dev-latest", + "shipmonk/composer-dependency-analyser": "^1.8", "sylius-labs/coding-standard": "^4.1.1", "symplify/easy-coding-standard": "^12.3.6", - "vimeo/psalm": "^5.24" + "vimeo/psalm": "^6.0" }, "prefer-stable": true, "autoload": { diff --git a/psalm.xml b/psalm.xml index 24058ff..883f428 100644 --- a/psalm.xml +++ b/psalm.xml @@ -17,6 +17,11 @@ + + + + + @@ -32,5 +37,15 @@ + + + + + + + + + + diff --git a/src/DependencyInjection/SetonoCronExpressionExtension.php b/src/DependencyInjection/SetonoCronExpressionExtension.php index aa289ba..c670ebb 100644 --- a/src/DependencyInjection/SetonoCronExpressionExtension.php +++ b/src/DependencyInjection/SetonoCronExpressionExtension.php @@ -14,12 +14,14 @@ final class SetonoCronExpressionExtension extends Extension implements PrependExtensionInterface { + #[\Override] public function load(array $configs, ContainerBuilder $container): void { $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); $loader->load('services.xml'); } + #[\Override] public function prepend(ContainerBuilder $container): void { if (!$container->hasExtension('doctrine')) { diff --git a/src/Doctrine/DBAL/Types/CronExpressionType.php b/src/Doctrine/DBAL/Types/CronExpressionType.php index e385335..c5b5f17 100644 --- a/src/Doctrine/DBAL/Types/CronExpressionType.php +++ b/src/Doctrine/DBAL/Types/CronExpressionType.php @@ -15,6 +15,7 @@ final class CronExpressionType extends Type { public const CRON_EXPRESSION_TYPE = 'cron_expression'; + #[\Override] public function getSQLDeclaration(array $column, AbstractPlatform $platform): string { return $platform->getStringTypeDeclarationSQL($column); @@ -25,6 +26,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform): st * * @throws InvalidType|ValueNotConvertible */ + #[\Override] public function convertToPHPValue($value, AbstractPlatform $platform): ?CronExpression { if (null === $value) { @@ -55,6 +57,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform): ?CronExpr /** * @param mixed $value */ + #[\Override] public function convertToDatabaseValue($value, AbstractPlatform $platform): ?string { if (null === $value) { @@ -69,6 +72,7 @@ public function getName(): string return self::CRON_EXPRESSION_TYPE; } + /** @noinspection PhpUnusedParameterInspection */ public function requiresSQLCommentHint(AbstractPlatform $platform): bool { return true; diff --git a/src/Form/DataTransformer/CronExpressionToPartsTransformer.php b/src/Form/DataTransformer/CronExpressionToPartsTransformer.php index dc0db25..8a0e4cd 100644 --- a/src/Form/DataTransformer/CronExpressionToPartsTransformer.php +++ b/src/Form/DataTransformer/CronExpressionToPartsTransformer.php @@ -21,6 +21,7 @@ final class CronExpressionToPartsTransformer implements DataTransformerInterface * * @return array> */ + #[\Override] public function transform($value): array { if (null === $value) { @@ -49,6 +50,7 @@ public function transform($value): array /** * @param mixed $value */ + #[\Override] public function reverseTransform($value): CronExpression { $cronExpression = CronExpression::factory('* * * * *'); diff --git a/src/Form/DataTransformer/CronExpressionToStringPartsTransformer.php b/src/Form/DataTransformer/CronExpressionToStringPartsTransformer.php index 161025a..023c967 100644 --- a/src/Form/DataTransformer/CronExpressionToStringPartsTransformer.php +++ b/src/Form/DataTransformer/CronExpressionToStringPartsTransformer.php @@ -21,6 +21,7 @@ final class CronExpressionToStringPartsTransformer implements DataTransformerInt * * @return array */ + #[\Override] public function transform($value): array { if (null === $value) { @@ -49,6 +50,7 @@ public function transform($value): array /** * @param mixed $value */ + #[\Override] public function reverseTransform($value): CronExpression { $exception = new TransformationFailedException('Expected an instance of array{minutes: string, hours: string, days: string, months: string, weekdays: string}'); diff --git a/src/Form/DataTransformer/CronExpressionToStringTransformer.php b/src/Form/DataTransformer/CronExpressionToStringTransformer.php index f2ad557..fb0f954 100644 --- a/src/Form/DataTransformer/CronExpressionToStringTransformer.php +++ b/src/Form/DataTransformer/CronExpressionToStringTransformer.php @@ -18,6 +18,7 @@ final class CronExpressionToStringTransformer implements DataTransformerInterfac /** * @param mixed $value */ + #[\Override] public function transform($value): ?string { if (null === $value) { @@ -34,6 +35,7 @@ public function transform($value): ?string /** * @param mixed $value */ + #[\Override] public function reverseTransform($value): CronExpression { if (null === $value || '' === $value) { diff --git a/src/Form/Type/CronExpressionType.php b/src/Form/Type/CronExpressionType.php index 5c75402..1e971d4 100644 --- a/src/Form/Type/CronExpressionType.php +++ b/src/Form/Type/CronExpressionType.php @@ -27,6 +27,7 @@ public function __construct() $this->fieldFactory = new FieldFactory(); } + #[\Override] public function buildForm(FormBuilderInterface $builder, array $options): void { if ('single_text' === $options['widget']) { @@ -102,6 +103,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void } } + #[\Override] public function configureOptions(OptionsResolver $resolver): void { $compound = function (Options $options): bool { @@ -125,6 +127,7 @@ public function configureOptions(OptionsResolver $resolver): void ]); } + #[\Override] public function getBlockPrefix(): string { return 'setono_cron_expression'; diff --git a/src/Form/TypeGuesser/CronExpressionTypeGuesser.php b/src/Form/TypeGuesser/CronExpressionTypeGuesser.php index 912ad37..1ef2ab5 100644 --- a/src/Form/TypeGuesser/CronExpressionTypeGuesser.php +++ b/src/Form/TypeGuesser/CronExpressionTypeGuesser.php @@ -10,11 +10,13 @@ use Symfony\Component\Form\Guess\Guess; use Symfony\Component\Form\Guess\TypeGuess; use Symfony\Component\Form\Guess\ValueGuess; +use Symfony\Component\PropertyInfo\Extractor\ConstructorExtractor; use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor; use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor; use Symfony\Component\PropertyInfo\PropertyInfoExtractor; use Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface; -use Symfony\Component\PropertyInfo\Type; +use Symfony\Component\PropertyInfo\Type as LegacyType; +use Symfony\Component\TypeInfo\Type; final class CronExpressionTypeGuesser implements FormTypeGuesserInterface { @@ -29,21 +31,15 @@ public function __construct(?PropertyTypeExtractorInterface $extractor = null) * @param string $class * @param string $property */ + #[\Override] public function guessType($class, $property): ?TypeGuess { if (!class_exists($class)) { return null; } - $types = $this->extractor->getTypes($class, $property); - if (null === $types) { - return null; - } - foreach ($types as $type) { - if (Type::BUILTIN_TYPE_OBJECT === $type->getBuiltinType() && - CronExpression::class === $type->getClassName()) { - return new TypeGuess(CronExpressionType::class, [], Guess::VERY_HIGH_CONFIDENCE); - } + if ($this->isCronExpression($class, $property)) { + return new TypeGuess(CronExpressionType::class, [], Guess::VERY_HIGH_CONFIDENCE); } return null; @@ -53,6 +49,7 @@ public function guessType($class, $property): ?TypeGuess * @param string $class * @param string $property */ + #[\Override] public function guessRequired($class, $property): ?ValueGuess { return null; @@ -62,6 +59,7 @@ public function guessRequired($class, $property): ?ValueGuess * @param string $class * @param string $property */ + #[\Override] public function guessMaxLength($class, $property): ?ValueGuess { return null; @@ -71,6 +69,7 @@ public function guessMaxLength($class, $property): ?ValueGuess * @param string $class * @param string $property */ + #[\Override] public function guessPattern($class, $property): ?ValueGuess { return null; @@ -78,9 +77,52 @@ public function guessPattern($class, $property): ?ValueGuess private function createExtractor(): PropertyTypeExtractorInterface { + $docExtractor = new PhpDocExtractor(); + $reflectionExtractor = new ReflectionExtractor(); + return new PropertyInfoExtractor([], [ - new PhpDocExtractor(), - new ReflectionExtractor(), - ]); + $docExtractor, + $reflectionExtractor, + new ConstructorExtractor([ + $docExtractor, + $reflectionExtractor, + ]), + ], [], [], [$reflectionExtractor]); + } + + private function isCronExpression(string $class, string $property): bool + { + if (class_exists(Type::class) && method_exists($this->extractor, 'getType')) { + /** + * @psalm-suppress MixedAssignment + */ + $type = $this->extractor->getType($class, $property); + if (null === $type) { + return false; + } + if ($type->isIdentifiedBy(CronExpression::class)) { + return true; + } + } else { + /** + * @psalm-suppress DeprecatedClass + * @psalm-suppress DeprecatedMethod + */ + $types = $this->extractor->getTypes($class, $property); + if (null === $types) { + return false; + } + foreach ($types as $lType) { + /** + * @psalm-suppress DeprecatedClass + */ + if (LegacyType::BUILTIN_TYPE_OBJECT === $lType->getBuiltinType() && + CronExpression::class === $lType->getClassName()) { + return true; + } + } + } + + return false; } } diff --git a/src/SetonoCronExpressionBundle.php b/src/SetonoCronExpressionBundle.php index e42cd12..ddedc77 100644 --- a/src/SetonoCronExpressionBundle.php +++ b/src/SetonoCronExpressionBundle.php @@ -6,6 +6,6 @@ use Symfony\Component\HttpKernel\Bundle\Bundle; -class SetonoCronExpressionBundle extends Bundle +final class SetonoCronExpressionBundle extends Bundle { } diff --git a/src/Validator/CronExpression.php b/src/Validator/CronExpression.php index 3533ea8..98ccd0d 100644 --- a/src/Validator/CronExpression.php +++ b/src/Validator/CronExpression.php @@ -13,7 +13,7 @@ * @Target({"PROPERTY", "METHOD", "ANNOTATION"}) */ #[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] -class CronExpression extends Constraint +final class CronExpression extends Constraint { public string $message = '{{ value }} is not a valid cron expression.'; diff --git a/src/Validator/CronExpressionValidator.php b/src/Validator/CronExpressionValidator.php index 9e2c563..41f5177 100644 --- a/src/Validator/CronExpressionValidator.php +++ b/src/Validator/CronExpressionValidator.php @@ -10,11 +10,12 @@ use Symfony\Component\Validator\Exception\UnexpectedTypeException; use Symfony\Component\Validator\Exception\UnexpectedValueException; -class CronExpressionValidator extends ConstraintValidator +final class CronExpressionValidator extends ConstraintValidator { /** * @param mixed $value */ + #[\Override] public function validate($value, Constraint $constraint): void { if (!$constraint instanceof CronExpression) { diff --git a/tests/DependencyInjection/SetonoCronExpressionExtensionTest.php b/tests/DependencyInjection/SetonoCronExpressionExtensionTest.php index c7aa8f7..c505be5 100644 --- a/tests/DependencyInjection/SetonoCronExpressionExtensionTest.php +++ b/tests/DependencyInjection/SetonoCronExpressionExtensionTest.php @@ -9,6 +9,7 @@ final class SetonoCronExpressionExtensionTest extends AbstractExtensionTestCase { + #[\Override] protected function getContainerExtensions(): array { return [ @@ -16,10 +17,7 @@ protected function getContainerExtensions(): array ]; } - /** - * @test - */ - public function loadServices(): void + public function testLoadServices(): void { $this->load(); diff --git a/tests/DependencyInjection/SetonoCronExpressionExtensionWithDoctrineTest.php b/tests/DependencyInjection/SetonoCronExpressionExtensionWithDoctrineTest.php index 21fa477..c38d873 100644 --- a/tests/DependencyInjection/SetonoCronExpressionExtensionWithDoctrineTest.php +++ b/tests/DependencyInjection/SetonoCronExpressionExtensionWithDoctrineTest.php @@ -11,6 +11,7 @@ final class SetonoCronExpressionExtensionWithDoctrineTest extends AbstractExtensionTestCase { + #[\Override] protected function getContainerExtensions(): array { return [ @@ -19,10 +20,7 @@ protected function getContainerExtensions(): array ]; } - /** - * @test - */ - public function loadServices(): void + public function testLoadServices(): void { $this->setParameter('kernel.debug', true); $this->load(); diff --git a/tests/Doctrine/DBAL/Types/CronExpressionTypeTest.php b/tests/Doctrine/DBAL/Types/CronExpressionTypeTest.php index 2349353..80d910e 100644 --- a/tests/Doctrine/DBAL/Types/CronExpressionTypeTest.php +++ b/tests/Doctrine/DBAL/Types/CronExpressionTypeTest.php @@ -16,25 +16,16 @@ final class CronExpressionTypeTest extends TestCase { - /** - * @test - */ public function testTypeName(): void { self::assertEquals('cron_expression', $this->getType()->getName()); } - /** - * @test - */ public function testTypeRequiresHint(): void { self::assertTrue($this->getType()->requiresSQLCommentHint($this->getPlatform())); } - /** - * @test - */ public function testTypeColumn(): void { $length = 255; @@ -44,40 +35,28 @@ public function testTypeColumn(): void self::assertStringContainsString((string) $length, $sql); } - /** - * @test - */ - public function convertToPhpNull(): void + public function testConvertToPhpNull(): void { $val = $this->getType()->convertToPHPValue(null, $this->getPlatform()); self::assertNull($val); } - /** - * @test - */ - public function convertEmptyToPhpNull(): void + public function testConvertEmptyToPhpNull(): void { $val = $this->getType()->convertToPHPValue('', $this->getPlatform()); self::assertNull($val); } - /** - * @test - */ - public function convertToPhpReturnsCronExpression(): void + public function testConvertToPhpReturnsCronExpression(): void { $val = $this->getType()->convertToPHPValue('@daily', $this->getPlatform()); self::assertInstanceOf(CronExpression::class, $val); } - /** - * @test - */ - public function convertFaultyTypeToPhpThrowsException(): void + public function testConvertFaultyTypeToPhpThrowsException(): void { self::expectException(ConversionException::class); if (class_exists(InvalidType::class)) { @@ -90,10 +69,7 @@ public function convertFaultyTypeToPhpThrowsException(): void $this->getType()->convertToPHPValue(new stdClass(), $this->getPlatform()); } - /** - * @test - */ - public function convertFaultyStringToPhpThrowsException(): void + public function testConvertFaultyStringToPhpThrowsException(): void { self::expectException(ConversionException::class); if (class_exists(ValueNotConvertible::class)) { @@ -106,20 +82,14 @@ public function convertFaultyStringToPhpThrowsException(): void $this->getType()->convertToPHPValue('@never', $this->getPlatform()); } - /** - * @test - */ - public function convertToDatabaseReturnsString(): void + public function testConvertToDatabaseReturnsString(): void { $val = $this->getType()->convertToDatabaseValue(CronExpression::factory('0 0 * * *'), $this->getPlatform()); self::assertSame('0 0 * * *', $val); } - /** - * @test - */ - public function convertToDatabaseNull(): void + public function testConvertToDatabaseNull(): void { $val = $this->getType()->convertToDatabaseValue(null, $this->getPlatform()); self::assertNull($val); diff --git a/tests/Form/DataTransformer/ToPartsTest.php b/tests/Form/DataTransformer/ToPartsTest.php index 0fad532..3087b39 100644 --- a/tests/Form/DataTransformer/ToPartsTest.php +++ b/tests/Form/DataTransformer/ToPartsTest.php @@ -4,13 +4,12 @@ namespace Setono\CronExpressionBundle\Tests\Form\DataTransformer; -use Cron\CronExpression; use PHPUnit\Framework\TestCase; use Setono\CronExpressionBundle\Form\DataTransformer\CronExpressionToPartsTransformer; use stdClass; use Symfony\Component\Form\Exception\TransformationFailedException; -class ToPartsTest extends TestCase +final class ToPartsTest extends TestCase { public function testNullReverseTransform(): void { @@ -62,25 +61,16 @@ public function testFaultyKeyRangeInvalidReverseTransform(): void ]); } - /** - * @param mixed $value - */ - protected function invalidReverseTransform($value): void + protected function invalidReverseTransform(mixed $value): void { $transformer = new CronExpressionToPartsTransformer(); $this->expectException(TransformationFailedException::class); $transformer->reverseTransform($value); } - /** - * @param mixed $input - */ - protected function expectedReverseTransform($input, string $expected): void + protected function expectedReverseTransform(mixed $input, string $expected): void { $transformer = new CronExpressionToPartsTransformer(); - $value = $transformer->reverseTransform($input); - - $this->assertInstanceOf(CronExpression::class, $value); - $this->assertSame($expected, $value->getExpression()); + $this->assertSame($expected, $transformer->reverseTransform($input)->getExpression()); } } diff --git a/tests/Form/DataTransformer/ToStringPartsTest.php b/tests/Form/DataTransformer/ToStringPartsTest.php index b949e34..8310b5a 100644 --- a/tests/Form/DataTransformer/ToStringPartsTest.php +++ b/tests/Form/DataTransformer/ToStringPartsTest.php @@ -4,13 +4,12 @@ namespace Setono\CronExpressionBundle\Tests\Form\DataTransformer; -use Cron\CronExpression; use PHPUnit\Framework\TestCase; use Setono\CronExpressionBundle\Form\DataTransformer\CronExpressionToStringPartsTransformer; use stdClass; use Symfony\Component\Form\Exception\TransformationFailedException; -class ToStringPartsTest extends TestCase +final class ToStringPartsTest extends TestCase { public function testNullReverseTransform(): void { @@ -51,25 +50,16 @@ public function testFaultyKeyInvalidReverseTransform(): void ]); } - /** - * @param mixed $value - */ - protected function invalidReverseTransform($value): void + protected function invalidReverseTransform(mixed $value): void { $transformer = new CronExpressionToStringPartsTransformer(); $this->expectException(TransformationFailedException::class); $transformer->reverseTransform($value); } - /** - * @param mixed $input - */ - protected function expectedReverseTransform($input, string $expected): void + protected function expectedReverseTransform(mixed $input, string $expected): void { $transformer = new CronExpressionToStringPartsTransformer(); - $value = $transformer->reverseTransform($input); - - $this->assertInstanceOf(CronExpression::class, $value); - $this->assertSame($expected, $value->getExpression()); + $this->assertSame($expected, $transformer->reverseTransform($input)->getExpression()); } } diff --git a/tests/Form/DataTransformer/ToStringTest.php b/tests/Form/DataTransformer/ToStringTest.php index 1fe05ca..f78d473 100644 --- a/tests/Form/DataTransformer/ToStringTest.php +++ b/tests/Form/DataTransformer/ToStringTest.php @@ -9,8 +9,13 @@ use stdClass; use Symfony\Component\Form\Exception\TransformationFailedException; -class ToStringTest extends TestCase +final class ToStringTest extends TestCase { + public function testNullReverseTransform(): void + { + $this->expectedReverseTransform(null, '* * * * *'); + } + public function testInvalidReverseTransform(): void { $this->invalidReverseTransform(new stdClass()); @@ -21,13 +26,16 @@ public function testInvalidCronReverseTransform(): void $this->invalidReverseTransform('* * * * * *'); } - /** - * @param mixed $value - */ - protected function invalidReverseTransform($value): void + protected function invalidReverseTransform(mixed $value): void { $transformer = new CronExpressionToStringTransformer(); $this->expectException(TransformationFailedException::class); $transformer->reverseTransform($value); } + + protected function expectedReverseTransform(mixed $input, string $expected): void + { + $transformer = new CronExpressionToStringTransformer(); + $this->assertSame($expected, $transformer->reverseTransform($input)->getExpression()); + } } diff --git a/tests/Form/Type/CronExpressionTypeCallbackTest.php b/tests/Form/Type/CronExpressionTypeCallbackTest.php index 907812e..2ce3cdd 100644 --- a/tests/Form/Type/CronExpressionTypeCallbackTest.php +++ b/tests/Form/Type/CronExpressionTypeCallbackTest.php @@ -10,7 +10,7 @@ use Setono\CronExpressionBundle\Form\Type\CronExpressionType; use Symfony\Component\Validator\Context\ExecutionContextInterface; -class CronExpressionTypeCallbackTest extends TestCase +final class CronExpressionTypeCallbackTest extends TestCase { public function testNullNoViolation(): void { diff --git a/tests/Form/Type/CronExpressionTypeStringTest.php b/tests/Form/Type/CronExpressionTypeStringTest.php index c653693..a06c770 100644 --- a/tests/Form/Type/CronExpressionTypeStringTest.php +++ b/tests/Form/Type/CronExpressionTypeStringTest.php @@ -10,36 +10,24 @@ use Symfony\Component\Form\Exception\TransformationFailedException; use Symfony\Component\Form\Test\TypeTestCase; -class CronExpressionTypeStringTest extends TypeTestCase +final class CronExpressionTypeStringTest extends TypeTestCase { - /** - * @test - */ - public function submitWithAllSet(): void + public function testSubmitWithAllSet(): void { $this->_submit('0 12 1 6 3', '0 12 1 6 3'); } - /** - * @test - */ - public function submitMultipleMinutes(): void + public function testSubmitMultipleMinutes(): void { $this->_submit('0,13 12 1 6 3', '0,13 12 1 6 3'); } - /** - * @test - */ - public function submitMinutesOnly(): void + public function testSubmitMinutesOnly(): void { $this->_submit('0 * * * *', '0 * * * *'); } - /** - * @test - */ - public function submitEmpty(): void + public function testSubmitEmpty(): void { $this->_submit(null, '* * * * *'); } @@ -62,18 +50,12 @@ private function _submit(?string $formData, string $expected): void $this->assertSame($expected, $cronExpression->getExpression()); } - /** - * @test - */ - public function submitFaultyEmpty(): void + public function testSubmitFaultyEmpty(): void { $this->_submitFaultyData([]); } - /** - * @test - */ - public function submitFaultyArray(): void + public function testSubmitFaultyArray(): void { $this->_submitFaultyData([ 'foo' => 'bar', @@ -95,10 +77,7 @@ private function _submitFaultyData($formData): void $this->assertFalse($form->isSynchronized()); } - /** - * @test - */ - public function createWithFaultyData(): void + public function testCreateWithFaultyData(): void { $data = new stdClass(); diff --git a/tests/Form/Type/CronExpressionTypeTest.php b/tests/Form/Type/CronExpressionTypeTest.php index a3fdb5d..ca8f894 100644 --- a/tests/Form/Type/CronExpressionTypeTest.php +++ b/tests/Form/Type/CronExpressionTypeTest.php @@ -10,12 +10,9 @@ use Symfony\Component\Form\Exception\TransformationFailedException; use Symfony\Component\Form\Test\TypeTestCase; -class CronExpressionTypeTest extends TypeTestCase +final class CronExpressionTypeTest extends TypeTestCase { - /** - * @test - */ - public function submitWithAllSet(): void + public function testSubmitWithAllSet(): void { $this->_submit([ 'minutes' => ['0'], @@ -26,10 +23,7 @@ public function submitWithAllSet(): void ], '0 12 1 6 3'); } - /** - * @test - */ - public function submitMultipleMinutes(): void + public function testSubmitMultipleMinutes(): void { $this->_submit([ 'minutes' => ['0', '13'], @@ -40,20 +34,14 @@ public function submitMultipleMinutes(): void ], '0,13 12 1 6 3'); } - /** - * @test - */ - public function submitMinutesOnly(): void + public function testSubmitMinutesOnly(): void { $this->_submit([ 'minutes' => ['0'], ], '0 * * * *'); } - /** - * @test - */ - public function submitEmpty(): void + public function testSubmitEmpty(): void { $this->_submit([], '* * * * *'); } @@ -81,10 +69,7 @@ private function _submit(array $formData, string $expected): void $this->assertSame($expected, $cronExpression->getExpression()); } - /** - * @test - */ - public function createWithFaultyData(): void + public function testCreateWithFaultyData(): void { $data = new stdClass(); diff --git a/tests/Form/Type/CronExpressionTypeTextTest.php b/tests/Form/Type/CronExpressionTypeTextTest.php index 055c0b1..a3e47fc 100644 --- a/tests/Form/Type/CronExpressionTypeTextTest.php +++ b/tests/Form/Type/CronExpressionTypeTextTest.php @@ -11,14 +11,11 @@ use Symfony\Component\Form\Test\Traits\ValidatorExtensionTrait; use Symfony\Component\Form\Test\TypeTestCase; -class CronExpressionTypeTextTest extends TypeTestCase +final class CronExpressionTypeTextTest extends TypeTestCase { use ValidatorExtensionTrait; - /** - * @test - */ - public function submitWithAllSet(): void + public function testSubmitWithAllSet(): void { $this->_submit([ 'minutes' => '0', @@ -29,10 +26,7 @@ public function submitWithAllSet(): void ], '0 12 1 6 3'); } - /** - * @test - */ - public function submitMultipleMinutes(): void + public function testSubmitMultipleMinutes(): void { $this->_submit([ 'minutes' => '0,13', @@ -43,20 +37,14 @@ public function submitMultipleMinutes(): void ], '0,13 12 1 6 3'); } - /** - * @test - */ - public function submitMinutesOnly(): void + public function testSubmitMinutesOnly(): void { $this->_submit([ 'minutes' => '0', ], '0 * * * *'); } - /** - * @test - */ - public function submitEmpty(): void + public function testSubmitEmpty(): void { $this->_submit([], '* * * * *'); } @@ -86,10 +74,7 @@ private function _submit(array $formData, string $expected): void $this->assertSame($expected, $cronExpression->getExpression()); } - /** - * @test - */ - public function submitFaultyMinutesOnly(): void + public function testSubmitFaultyMinutesOnly(): void { $this->_submitFaultyData([ 'minutes' => '61', @@ -111,10 +96,7 @@ private function _submitFaultyData($formData): void $this->assertFalse($form->isSynchronized()); } - /** - * @test - */ - public function createWithFaultyData(): void + public function testCreateWithFaultyData(): void { $data = new stdClass(); @@ -124,20 +106,14 @@ public function createWithFaultyData(): void ]); } - /** - * @test - */ - public function submitChild(): void + public function testSubmitChild(): void { $this->_submitWithChild([ 'minutes' => '0', ], '0 * * * *'); } - /** - * @test - */ - public function submitNull(): void + public function testSubmitNull(): void { $this->_submitWithChild(null, '* * * * *'); } diff --git a/tests/Form/TypeGuesser/CronExpressionTypeGuesserTest.php b/tests/Form/TypeGuesser/CronExpressionTypeGuesserTest.php index 5562118..c09d4ff 100644 --- a/tests/Form/TypeGuesser/CronExpressionTypeGuesserTest.php +++ b/tests/Form/TypeGuesser/CronExpressionTypeGuesserTest.php @@ -14,71 +14,48 @@ final class CronExpressionTypeGuesserTest extends TestCase { private CronExpressionTypeGuesser $typeGuesser; + #[\Override] public function setUp(): void { $this->typeGuesser = new CronExpressionTypeGuesser(); } - /** - * @test - */ - public function it_returns_null_if_class_does_not_exist(): void + public function testItReturnsNullIfClassDoesNotExist(): void { $this->assertNull($this->typeGuesser->guessType('Class\\Does\\Not\\Exist', 'property')); } - /** - * @test - */ - public function it_returns_null_if_no_phpdoc_is_present(): void + public function testItReturnsNullIfNoPhpdocIsPresent(): void { $this->assertNull($this->typeGuesser->guessType(StubWithNoPhpDoc::class, 'property')); } - /** - * @test - */ - public function it_returns_null_if_property_doesnt_exist(): void + public function testItReturnsNullIfPropertyDoesntExist(): void { $this->assertNull($this->typeGuesser->guessType(StubWithNoPhpDoc::class, 'property2')); } - /** - * @test - */ - public function it_returns_null_if_property_has_wrong_type(): void + public function testItReturnsNullIfPropertyHasWrongType(): void { $this->assertNull($this->typeGuesser->guessType(StubWithWrongType::class, 'property')); } - /** - * @test - */ - public function it_guesses_type_when_type_is_a_fqcn(): void + public function testItGuessesTypeWhenTypeIsAFqcn(): void { $this->guess_type(StubFqcn::class); } - /** - * @test - */ - public function it_guesses_type_when_type_is_an_alias(): void + public function testItGuessesTypeWhenTypeIsAnAlias(): void { $this->guess_type(StubAliased::class); } - /** - * @test - */ - public function it_guesses_type_when_type_is_imported(): void + public function testItGuessesTypeWhenTypeIsImported(): void { $this->guess_type(StubImported::class); } - /** - * @test - */ - public function it_guesses_type_when_type_is_hinted(): void + public function testItGuessesTypeWhenTypeIsHinted(): void { $this->guess_type(StubWithTypeHint::class); } diff --git a/tests/Validator/CronExpressionTest.php b/tests/Validator/CronExpressionTest.php index 30075b9..f984f25 100644 --- a/tests/Validator/CronExpressionTest.php +++ b/tests/Validator/CronExpressionTest.php @@ -18,8 +18,9 @@ * * @psalm-suppress TooManyTemplateParams */ -class CronExpressionTest extends ConstraintValidatorTestCase +final class CronExpressionTest extends ConstraintValidatorTestCase { + #[\Override] protected function createValidator(): CronExpressionValidator { return new CronExpressionValidator(); @@ -82,7 +83,7 @@ public function testInvalidValues($value, string $valueAsString): void /** * @psalm-return list */ - public function getInvalidValues(): array + public static function getInvalidValues(): array { return [ [123456, '"123456"'], diff --git a/tests/Validator/FormCallbackTest.php b/tests/Validator/FormCallbackTest.php index 9133b24..017924c 100644 --- a/tests/Validator/FormCallbackTest.php +++ b/tests/Validator/FormCallbackTest.php @@ -15,8 +15,9 @@ * * @psalm-suppress TooManyTemplateParams */ -class FormCallbackTest extends ConstraintValidatorTestCase +final class FormCallbackTest extends ConstraintValidatorTestCase { + #[\Override] protected function createValidator(): CallbackValidator { return new CallbackValidator();