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();