From d4c1e3ca248b903d2724cae9052136af2f073566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20M=C3=B6ller?= Date: Sun, 5 Jan 2025 23:12:38 +0100 Subject: [PATCH] Fix: Remove abstract test case --- .php-cs-fixer.fixture.php | 10 +- composer.json | 1 + composer.lock | 2 +- phpstan-baseline.neon | 30 ++ .../Classes/FinalRule/AbstractClass.php | 9 + .../Classes/FinalRule/ExampleInterface.php | 9 + .../Classes/FinalRule/ExampleTrait.php | 9 + .../FinalRule/Failure/AbstractClass.php | 9 - test/Fixture/Classes/FinalRule/FinalClass.php | 9 + .../FinalClassWithAnonymousClass.php | 2 +- .../NeitherAbstractNorFinalClass.php | 2 +- ...inalClassWithAliasedOrmEntityAttribute.php | 2 +- ...ssWithEntityAnnotationInInlineDocBlock.php | 2 +- ...ithEntityAnnotationInMultilineDocBlock.php | 2 +- ...ithOrmEntityAnnotationInInlineDocBlock.php | 2 +- ...OrmEntityAnnotationInMultilineDocBlock.php | 2 +- ...appingEntityAnnotationInInlineDocBlock.php | 2 +- ...ingEntityAnnotationInMultilineDocBlock.php | 2 +- ...ifiedDoctrineOrmMappingEntityAttribute.php | 2 +- ...FinalClassWithQualifiedEntityAttribute.php | 2 +- ...assWithQualifiedMappingEntityAttribute.php | 2 +- ...WithQualifiedOrmMappingEntityAttribute.php | 2 +- ...ifiedDoctrineOrmMappingEntityAttribute.php | 2 +- ...nalClassWithUnqualifiedEntityAttribute.php | 2 +- ...ClassWithUnqualifiedOrmEntityAttribute.php | 2 +- ...thUnqualifiedOrmMappingEntityAttribute.php | 2 +- ...ithoutEntityAnnotationInInlineDocBlock.php | 2 +- ...outEntityAnnotationInMultilineDocBlock.php | 2 +- ...outOrmEntityAnnotationInInlineDocBlock.php | 2 +- ...OrmEntityAnnotationInMultilineDocBlock.php | 2 +- .../FinalRule/Success/ExampleInterface.php | 9 - .../FinalRule/Success/ExampleTrait.php | 9 - .../Classes/FinalRule/Success/FinalClass.php | 9 - .../{Success => }/TraitWithAnonymousClass.php | 2 +- .../anonymous-class.php => script.php} | 0 .../Failure/AbstractClass.php | 9 - .../Failure/NeitherAbstractNorFinalClass.php | 9 - .../Success/ExampleInterface.php | 9 - .../Success/ExampleTrait.php | 9 - .../Success/FinalClass.php | 9 - .../Success/FinalClassWithAnonymousClass.php | 18 -- .../Success/TraitWithAnonymousClass.php | 18 -- .../Success/anonymous-class.php | 12 - .../Failure/AbstractClass.php | 9 - .../Failure/NeitherAbstractNorFinalClass.php | 9 - .../Success/ExampleInterface.php | 9 - .../Success/ExampleTrait.php | 9 - .../Success/FinalClass.php | 9 - .../Success/FinalClassWithAnonymousClass.php | 18 -- ...herAbstractNorFinalClassButWhitelisted.php | 9 - .../Success/TraitWithAnonymousClass.php | 18 -- .../Success/anonymous-class.php | 12 - .../ClassExtendingOtherClass.php | 2 +- ...ClassExtendingPhpUnitFrameworkTestCase.php | 2 +- .../{Success => }/ExampleClass.php | 2 +- .../{Success => }/ExampleInterface.php | 2 +- .../anonymous-class-extending-other-class.php | 12 - .../InterfaceExtendingOtherInterface.php | 4 +- .../{Failure => }/OtherClass.php | 2 +- .../{Success => }/OtherInterface.php | 2 +- .../anonymous-class.php => script.php} | 9 +- .../Failure/ClassExtendingOtherClass.php | 9 - .../Failure/OtherClass.php | 9 - .../anonymous-class-extending-other-class.php | 12 - .../Success/ClassAllowedToBeExtended.php | 9 - ...ClassExtendingClassAllowedToBeExtended.php | 9 - ...ClassExtendingPhpUnitFrameworkTestCase.php | 11 - .../Success/ExampleClass.php | 9 - .../Success/ExampleInterface.php | 9 - .../InterfaceExtendingOtherInterface.php | 9 - .../Success/OtherInterface.php | 9 - ...extending-class-allowed-to-be-extended.php | 12 - .../Success/anonymous-class.php | 12 - .../{Failure => }/AbstractTestCase.php | 2 +- ...ExtendingAbstractTestCaseWithoutSuffix.php | 9 + .../ConcreteTestCaseWithSuffixTest.php | 2 +- ....php => ConcreteTestCaseWithoutSuffix.php} | 4 +- ...ndingAbstractTestCaseWithoutTestSuffix.php | 9 - .../ConcreteTestCaseWithoutTestSuffix.php | 15 - .../Success/ImplicitlyAbstractTestCase.php | 12 - ...-with-nullable-return-type-declaration.php | 9 - ...ble-union-type-return-type-declaration.php | 9 - .../closure-with-return-type-declaration.php | 9 - ...losure-without-return-type-declaration.php | 9 - .../script.php | 21 ++ ...with-parameter-with-null-default-value.php | 9 - ...amespace-referenced-null-default-value.php | 9 - ...wrongly-capitalized-null-default-value.php | 9 - ...-parameter-with-non-null-default-value.php | 9 - ...e-with-parameter-without-default-value.php | 9 - .../Success/closure-without-parameters.php | 8 - .../script.php | 28 ++ ...rameter-with-nullable-type-declaration.php | 9 - ...r-with-nullable-union-type-declaration.php | 9 - ...e-with-parameter-with-type-declaration.php | 9 - ...ith-parameter-without-type-declaration.php | 9 - .../Success/closure-without-parameters.php | 8 - .../script.php | 24 ++ .../Failure/compact-used-with-alias.php | 15 - .../compact-used-with-correct-case.php | 13 - .../compact-used-with-incorrect-case.php | 13 - .../compact-not-used.php => script.php} | 21 +- .../Success/error-suppression-not-used.php | 7 - .../error-suppression-used.php => script.php} | 4 +- .../Failure/eval-used-with-correct-case.php | 7 - .../Failure/eval-used-with-incorrect-case.php | 7 - .../{Success/eval-not-used.php => script.php} | 6 +- .../Failure/isset-used-with-correct-case.php | 9 - .../isset-used-with-incorrect-case.php | 9 - .../isset-not-used.php => script.php} | 10 +- .../{Success => }/file-empty.php | 0 ...re-strict-types-off-and-invalid-casing.php | 0 ...strict-types-off-and-multiple-declares.php | 0 ...h-comment-and-declare-strict-types-off.php | 0 ...are-strict-types-on-and-invalid-casing.php | 0 ...-strict-types-on-and-multiple-declares.php | 0 ...ict-types-on-and-namespace-declaration.php | 0 ...th-comment-and-declare-strict-types-on.php | 0 ...re-strict-types-off-and-invalid-casing.php | 0 ...strict-types-off-and-multiple-declares.php | 0 .../file-with-declare-strict-types-off.php | 0 ...are-strict-types-on-and-invalid-casing.php | 0 ...-strict-types-on-and-multiple-declares.php | 0 ...ict-types-on-and-namespace-declaration.php | 0 .../file-with-declare-strict-types-on.php | 0 .../{Failure => }/file-with-declare-ticks.php | 0 ...re-strict-types-off-and-invalid-casing.php | 0 ...strict-types-off-and-multiple-declares.php | 0 ...doc-block-and-declare-strict-types-off.php | 0 ...are-strict-types-on-and-invalid-casing.php | 0 ...-strict-types-on-and-multiple-declares.php | 0 ...ict-types-on-and-namespace-declaration.php | 0 ...-doc-block-and-declare-strict-types-on.php | 0 ...other-one-text-line-before-opening-tag.php | 0 ...h-shebang-and-declare-strict-types-off.php | 0 ...th-shebang-and-declare-strict-types-on.php | 0 .../file-with-text-before-opening-tag.php | 0 ...strict-types-and-namespace-declaration.php | 2 +- .../file-without-declare-strict-types.php | 0 ...-with-nullable-return-type-declaration.php | 10 - ...nullable-union-return-type-declaration.php | 10 - .../function-with-return-type-declaration.php | 10 - ...nction-without-return-type-declaration.php | 10 - .../script.php | 25 ++ ...with-parameter-with-null-default-value.php | 10 - ...amespace-referenced-null-default-value.php | 10 - ...wrongly-capitalized-null-default-value.php | 10 - ...-parameter-with-non-null-default-value.php | 10 - ...n-with-parameter-without-default-value.php | 10 - .../Success/function-without-parameters.php | 9 - .../script.php | 34 +++ ...rameter-with-nullable-type-declaration.php | 10 - ...r-with-nullable-union-type-declaration.php | 10 - ...n-with-parameter-with-type-declaration.php | 10 - ...ith-parameter-without-type-declaration.php | 10 - .../Success/function-without-parameters.php | 9 - .../script.php | 29 ++ ...endingAbstractClassWithProtectedMethod.php | 2 +- .../AbstractClassWithProtectedMethod.php | 2 +- .../AnonymousClassWithProtectedMethod.php | 2 +- .../ClassWithProtectedMethod.php | 2 +- .../FinalClassWithPrivateMethod.php | 2 +- .../FinalClassWithProtectedMethod.php | 2 +- ...sExtendingClassWithSameProtectedMethod.php | 2 +- ...dExtendingClassWithSameProtectedMethod.php | 2 +- ...FinalClassWithProtectedMethodFromTrait.php | 2 +- .../FinalClassWithPublicMethod.php | 2 +- .../TraitWithProtectedMethod.php | 2 +- test/Integration/AbstractTestCase.php | 2 + test/Integration/Classes/FinalRuleTest.php | 264 ++++++++++++++---- ...inalRuleWithAbstractClassesAllowedTest.php | 80 ------ .../Classes/FinalRuleWithAttributesTest.php | 108 ------- .../FinalRuleWithExcludedClassNamesTest.php | 92 ------ .../Integration/Classes/NoExtendsRuleTest.php | 70 +++-- ...RuleWithClassesAllowedToBeExtendedTest.php | 90 ------ .../Framework/TestCaseWithSuffixRuleTest.php | 48 +--- ...oNullableReturnTypeDeclarationRuleTest.php | 47 +--- ...oParameterWithNullDefaultValueRuleTest.php | 53 +--- ...terWithNullableTypeDeclarationRuleTest.php | 48 +--- .../Expressions/NoCompactRuleTest.php | 51 +--- .../NoErrorSuppressionRuleTest.php | 41 +-- .../Expressions/NoEvalRuleTest.php | 46 +-- .../Expressions/NoIssetRuleTest.php | 46 +-- .../Files/DeclareStrictTypesRuleTest.php | 94 +------ ...oNullableReturnTypeDeclarationRuleTest.php | 51 +--- ...oParameterWithNullDefaultValueRuleTest.php | 59 ++-- ...terWithNullableTypeDeclarationRuleTest.php | 52 +--- .../Methods/PrivateInFinalClassRuleTest.php | 57 ++-- .../Statements/NoSwitchRuleTest.php | 42 +-- test/Util/Helper.php | 35 +++ 190 files changed, 782 insertions(+), 1844 deletions(-) create mode 100644 test/Fixture/Classes/FinalRule/AbstractClass.php create mode 100644 test/Fixture/Classes/FinalRule/ExampleInterface.php create mode 100644 test/Fixture/Classes/FinalRule/ExampleTrait.php delete mode 100644 test/Fixture/Classes/FinalRule/Failure/AbstractClass.php create mode 100644 test/Fixture/Classes/FinalRule/FinalClass.php rename test/Fixture/Classes/FinalRule/{Success => }/FinalClassWithAnonymousClass.php (78%) rename test/Fixture/Classes/FinalRule/{Failure => }/NeitherAbstractNorFinalClass.php (50%) rename test/Fixture/Classes/{FinalRuleWithAttributes/Success => FinalRule}/NonFinalClassWithAliasedOrmEntityAttribute.php (61%) rename test/Fixture/Classes/FinalRule/{Success => }/NonFinalClassWithEntityAnnotationInInlineDocBlock.php (59%) rename test/Fixture/Classes/FinalRule/{Success => }/NonFinalClassWithEntityAnnotationInMultilineDocBlock.php (65%) rename test/Fixture/Classes/FinalRule/{Success => }/NonFinalClassWithOrmEntityAnnotationInInlineDocBlock.php (61%) rename test/Fixture/Classes/FinalRule/{Success => }/NonFinalClassWithOrmEntityAnnotationInMultilineDocBlock.php (67%) rename test/Fixture/Classes/FinalRule/{Success => }/NonFinalClassWithOrmMappingEntityAnnotationInInlineDocBlock.php (64%) rename test/Fixture/Classes/FinalRule/{Success => }/NonFinalClassWithOrmMappingEntityAnnotationInMultilineDocBlock.php (70%) rename test/Fixture/Classes/{FinalRuleWithAttributes/Success => FinalRule}/NonFinalClassWithQualifiedDoctrineOrmMappingEntityAttribute.php (61%) rename test/Fixture/Classes/{FinalRuleWithAttributes/Success => FinalRule}/NonFinalClassWithQualifiedEntityAttribute.php (60%) rename test/Fixture/Classes/{FinalRuleWithAttributes/Success => FinalRule}/NonFinalClassWithQualifiedMappingEntityAttribute.php (61%) rename test/Fixture/Classes/{FinalRuleWithAttributes/Success => FinalRule}/NonFinalClassWithQualifiedOrmMappingEntityAttribute.php (61%) rename test/Fixture/Classes/{FinalRuleWithAttributes/Failure => FinalRule}/NonFinalClassWithUnqualifiedDoctrineOrmMappingEntityAttribute.php (61%) rename test/Fixture/Classes/{FinalRuleWithAttributes/Failure => FinalRule}/NonFinalClassWithUnqualifiedEntityAttribute.php (53%) rename test/Fixture/Classes/{FinalRuleWithAttributes/Failure => FinalRule}/NonFinalClassWithUnqualifiedOrmEntityAttribute.php (55%) rename test/Fixture/Classes/{FinalRuleWithAttributes/Failure => FinalRule}/NonFinalClassWithUnqualifiedOrmMappingEntityAttribute.php (58%) rename test/Fixture/Classes/FinalRule/{Failure => }/NonFinalClassWithoutEntityAnnotationInInlineDocBlock.php (60%) rename test/Fixture/Classes/FinalRule/{Failure => }/NonFinalClassWithoutEntityAnnotationInMultilineDocBlock.php (66%) rename test/Fixture/Classes/FinalRule/{Failure => }/NonFinalClassWithoutOrmEntityAnnotationInInlineDocBlock.php (61%) rename test/Fixture/Classes/FinalRule/{Failure => }/NonFinalClassWithoutOrmEntityAnnotationInMultilineDocBlock.php (67%) delete mode 100644 test/Fixture/Classes/FinalRule/Success/ExampleInterface.php delete mode 100644 test/Fixture/Classes/FinalRule/Success/ExampleTrait.php delete mode 100644 test/Fixture/Classes/FinalRule/Success/FinalClass.php rename test/Fixture/Classes/FinalRule/{Success => }/TraitWithAnonymousClass.php (77%) rename test/Fixture/Classes/FinalRule/{Success/anonymous-class.php => script.php} (100%) delete mode 100644 test/Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Failure/AbstractClass.php delete mode 100644 test/Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Failure/NeitherAbstractNorFinalClass.php delete mode 100644 test/Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Success/ExampleInterface.php delete mode 100644 test/Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Success/ExampleTrait.php delete mode 100644 test/Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Success/FinalClass.php delete mode 100644 test/Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Success/FinalClassWithAnonymousClass.php delete mode 100644 test/Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Success/TraitWithAnonymousClass.php delete mode 100644 test/Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Success/anonymous-class.php delete mode 100644 test/Fixture/Classes/FinalRuleWithExcludedClassNames/Failure/AbstractClass.php delete mode 100644 test/Fixture/Classes/FinalRuleWithExcludedClassNames/Failure/NeitherAbstractNorFinalClass.php delete mode 100644 test/Fixture/Classes/FinalRuleWithExcludedClassNames/Success/ExampleInterface.php delete mode 100644 test/Fixture/Classes/FinalRuleWithExcludedClassNames/Success/ExampleTrait.php delete mode 100644 test/Fixture/Classes/FinalRuleWithExcludedClassNames/Success/FinalClass.php delete mode 100644 test/Fixture/Classes/FinalRuleWithExcludedClassNames/Success/FinalClassWithAnonymousClass.php delete mode 100644 test/Fixture/Classes/FinalRuleWithExcludedClassNames/Success/NeitherAbstractNorFinalClassButWhitelisted.php delete mode 100644 test/Fixture/Classes/FinalRuleWithExcludedClassNames/Success/TraitWithAnonymousClass.php delete mode 100644 test/Fixture/Classes/FinalRuleWithExcludedClassNames/Success/anonymous-class.php rename test/Fixture/Classes/NoExtendsRule/{Failure => }/ClassExtendingOtherClass.php (92%) rename test/Fixture/Classes/NoExtendsRule/{Success => }/ClassExtendingPhpUnitFrameworkTestCase.php (94%) rename test/Fixture/Classes/NoExtendsRule/{Success => }/ExampleClass.php (90%) rename test/Fixture/Classes/NoExtendsRule/{Success => }/ExampleInterface.php (90%) delete mode 100644 test/Fixture/Classes/NoExtendsRule/Failure/anonymous-class-extending-other-class.php rename test/Fixture/Classes/NoExtendsRule/{Success => }/InterfaceExtendingOtherInterface.php (64%) rename test/Fixture/Classes/NoExtendsRule/{Failure => }/OtherClass.php (90%) rename test/Fixture/Classes/NoExtendsRule/{Success => }/OtherInterface.php (90%) rename test/Fixture/Classes/NoExtendsRule/{Success/anonymous-class.php => script.php} (58%) delete mode 100644 test/Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Failure/ClassExtendingOtherClass.php delete mode 100644 test/Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Failure/OtherClass.php delete mode 100644 test/Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Failure/anonymous-class-extending-other-class.php delete mode 100644 test/Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/ClassAllowedToBeExtended.php delete mode 100644 test/Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/ClassExtendingClassAllowedToBeExtended.php delete mode 100644 test/Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/ClassExtendingPhpUnitFrameworkTestCase.php delete mode 100644 test/Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/ExampleClass.php delete mode 100644 test/Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/ExampleInterface.php delete mode 100644 test/Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/InterfaceExtendingOtherInterface.php delete mode 100644 test/Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/OtherInterface.php delete mode 100644 test/Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/anonymous-class-extending-class-allowed-to-be-extended.php delete mode 100644 test/Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/anonymous-class.php rename test/Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule/{Failure => }/AbstractTestCase.php (82%) create mode 100644 test/Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule/ConcreteTestCaseExtendingAbstractTestCaseWithoutSuffix.php rename test/Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule/{Success => }/ConcreteTestCaseWithSuffixTest.php (88%) rename test/Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule/{Success/ExplicitlyAbstractTestCase.php => ConcreteTestCaseWithoutSuffix.php} (55%) delete mode 100644 test/Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule/Failure/ConcreteTestCaseExtendingAbstractTestCaseWithoutTestSuffix.php delete mode 100644 test/Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule/Failure/ConcreteTestCaseWithoutTestSuffix.php delete mode 100644 test/Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule/Success/ImplicitlyAbstractTestCase.php delete mode 100644 test/Fixture/Closures/NoNullableReturnTypeDeclarationRule/Failure/closure-with-nullable-return-type-declaration.php delete mode 100644 test/Fixture/Closures/NoNullableReturnTypeDeclarationRule/Failure/closure-with-nullable-union-type-return-type-declaration.php delete mode 100644 test/Fixture/Closures/NoNullableReturnTypeDeclarationRule/Success/closure-with-return-type-declaration.php delete mode 100644 test/Fixture/Closures/NoNullableReturnTypeDeclarationRule/Success/closure-without-return-type-declaration.php create mode 100644 test/Fixture/Closures/NoNullableReturnTypeDeclarationRule/script.php delete mode 100644 test/Fixture/Closures/NoParameterWithNullDefaultValueRule/Failure/closure-with-parameter-with-null-default-value.php delete mode 100644 test/Fixture/Closures/NoParameterWithNullDefaultValueRule/Failure/closure-with-parameter-with-root-namespace-referenced-null-default-value.php delete mode 100644 test/Fixture/Closures/NoParameterWithNullDefaultValueRule/Failure/closure-with-parameter-with-wrongly-capitalized-null-default-value.php delete mode 100644 test/Fixture/Closures/NoParameterWithNullDefaultValueRule/Success/closure-with-parameter-with-non-null-default-value.php delete mode 100644 test/Fixture/Closures/NoParameterWithNullDefaultValueRule/Success/closure-with-parameter-without-default-value.php delete mode 100644 test/Fixture/Closures/NoParameterWithNullDefaultValueRule/Success/closure-without-parameters.php create mode 100644 test/Fixture/Closures/NoParameterWithNullDefaultValueRule/script.php delete mode 100644 test/Fixture/Closures/NoParameterWithNullableTypeDeclarationRule/Failure/closure-with-parameter-with-nullable-type-declaration.php delete mode 100644 test/Fixture/Closures/NoParameterWithNullableTypeDeclarationRule/Failure/closure-with-parameter-with-nullable-union-type-declaration.php delete mode 100644 test/Fixture/Closures/NoParameterWithNullableTypeDeclarationRule/Success/closure-with-parameter-with-type-declaration.php delete mode 100644 test/Fixture/Closures/NoParameterWithNullableTypeDeclarationRule/Success/closure-with-parameter-without-type-declaration.php delete mode 100644 test/Fixture/Closures/NoParameterWithNullableTypeDeclarationRule/Success/closure-without-parameters.php create mode 100644 test/Fixture/Closures/NoParameterWithNullableTypeDeclarationRule/script.php delete mode 100644 test/Fixture/Expressions/NoCompactRule/Failure/compact-used-with-alias.php delete mode 100644 test/Fixture/Expressions/NoCompactRule/Failure/compact-used-with-correct-case.php delete mode 100644 test/Fixture/Expressions/NoCompactRule/Failure/compact-used-with-incorrect-case.php rename test/Fixture/Expressions/NoCompactRule/{Success/compact-not-used.php => script.php} (53%) delete mode 100644 test/Fixture/Expressions/NoErrorSuppressionRule/Success/error-suppression-not-used.php rename test/Fixture/Expressions/NoErrorSuppressionRule/{Failure/error-suppression-used.php => script.php} (75%) delete mode 100644 test/Fixture/Expressions/NoEvalRule/Failure/eval-used-with-correct-case.php delete mode 100644 test/Fixture/Expressions/NoEvalRule/Failure/eval-used-with-incorrect-case.php rename test/Fixture/Expressions/NoEvalRule/{Success/eval-not-used.php => script.php} (77%) delete mode 100644 test/Fixture/Expressions/NoIssetRule/Failure/isset-used-with-correct-case.php delete mode 100644 test/Fixture/Expressions/NoIssetRule/Failure/isset-used-with-incorrect-case.php rename test/Fixture/Expressions/NoIssetRule/{Success/isset-not-used.php => script.php} (67%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-empty.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-comment-and-declare-strict-types-off-and-invalid-casing.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-comment-and-declare-strict-types-off-and-multiple-declares.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-comment-and-declare-strict-types-off.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-comment-and-declare-strict-types-on-and-invalid-casing.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-comment-and-declare-strict-types-on-and-multiple-declares.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-comment-and-declare-strict-types-on-and-namespace-declaration.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-comment-and-declare-strict-types-on.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-declare-strict-types-off-and-invalid-casing.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-declare-strict-types-off-and-multiple-declares.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-declare-strict-types-off.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-declare-strict-types-on-and-invalid-casing.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-declare-strict-types-on-and-multiple-declares.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-declare-strict-types-on-and-namespace-declaration.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-declare-strict-types-on.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-declare-ticks.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-doc-block-and-declare-strict-types-off-and-invalid-casing.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-doc-block-and-declare-strict-types-off-and-multiple-declares.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-doc-block-and-declare-strict-types-off.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-doc-block-and-declare-strict-types-on-and-invalid-casing.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-doc-block-and-declare-strict-types-on-and-multiple-declares.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-doc-block-and-declare-strict-types-on-and-namespace-declaration.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-doc-block-and-declare-strict-types-on.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-shebang-and-another-one-text-line-before-opening-tag.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-shebang-and-declare-strict-types-off.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Success => }/file-with-shebang-and-declare-strict-types-on.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-with-text-before-opening-tag.php (100%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-without-declare-strict-types-and-namespace-declaration.php (79%) rename test/Fixture/Files/DeclareStrictTypesRule/{Failure => }/file-without-declare-strict-types.php (100%) delete mode 100644 test/Fixture/Functions/NoNullableReturnTypeDeclarationRule/Failure/function-with-nullable-return-type-declaration.php delete mode 100644 test/Fixture/Functions/NoNullableReturnTypeDeclarationRule/Failure/function-with-nullable-union-return-type-declaration.php delete mode 100644 test/Fixture/Functions/NoNullableReturnTypeDeclarationRule/Success/function-with-return-type-declaration.php delete mode 100644 test/Fixture/Functions/NoNullableReturnTypeDeclarationRule/Success/function-without-return-type-declaration.php create mode 100644 test/Fixture/Functions/NoNullableReturnTypeDeclarationRule/script.php delete mode 100644 test/Fixture/Functions/NoParameterWithNullDefaultValueRule/Failure/function-with-parameter-with-null-default-value.php delete mode 100644 test/Fixture/Functions/NoParameterWithNullDefaultValueRule/Failure/function-with-parameter-with-root-namespace-referenced-null-default-value.php delete mode 100644 test/Fixture/Functions/NoParameterWithNullDefaultValueRule/Failure/function-with-parameter-with-wrongly-capitalized-null-default-value.php delete mode 100644 test/Fixture/Functions/NoParameterWithNullDefaultValueRule/Success/function-with-parameter-with-non-null-default-value.php delete mode 100644 test/Fixture/Functions/NoParameterWithNullDefaultValueRule/Success/function-with-parameter-without-default-value.php delete mode 100644 test/Fixture/Functions/NoParameterWithNullDefaultValueRule/Success/function-without-parameters.php create mode 100644 test/Fixture/Functions/NoParameterWithNullDefaultValueRule/script.php delete mode 100644 test/Fixture/Functions/NoParameterWithNullableTypeDeclarationRule/Failure/function-with-parameter-with-nullable-type-declaration.php delete mode 100644 test/Fixture/Functions/NoParameterWithNullableTypeDeclarationRule/Failure/function-with-parameter-with-nullable-union-type-declaration.php delete mode 100644 test/Fixture/Functions/NoParameterWithNullableTypeDeclarationRule/Success/function-with-parameter-with-type-declaration.php delete mode 100644 test/Fixture/Functions/NoParameterWithNullableTypeDeclarationRule/Success/function-with-parameter-without-type-declaration.php delete mode 100644 test/Fixture/Functions/NoParameterWithNullableTypeDeclarationRule/Success/function-without-parameters.php create mode 100644 test/Fixture/Functions/NoParameterWithNullableTypeDeclarationRule/script.php rename test/Fixture/Methods/PrivateInFinalClassRule/{Success => }/AbstractClassExtendingAbstractClassWithProtectedMethod.php (90%) rename test/Fixture/Methods/PrivateInFinalClassRule/{Success => }/AbstractClassWithProtectedMethod.php (89%) rename test/Fixture/Methods/PrivateInFinalClassRule/{Failure => }/AnonymousClassWithProtectedMethod.php (87%) rename test/Fixture/Methods/PrivateInFinalClassRule/{Success => }/ClassWithProtectedMethod.php (88%) rename test/Fixture/Methods/PrivateInFinalClassRule/{Success => }/FinalClassWithPrivateMethod.php (89%) rename test/Fixture/Methods/PrivateInFinalClassRule/{Failure => }/FinalClassWithProtectedMethod.php (89%) rename test/Fixture/Methods/PrivateInFinalClassRule/{Success => }/FinalClassWithProtectedMethodExtendingClassExtendingClassWithSameProtectedMethod.php (93%) rename test/Fixture/Methods/PrivateInFinalClassRule/{Success => }/FinalClassWithProtectedMethodExtendingClassWithSameProtectedMethod.php (92%) rename test/Fixture/Methods/PrivateInFinalClassRule/{Success => }/FinalClassWithProtectedMethodFromTrait.php (89%) rename test/Fixture/Methods/PrivateInFinalClassRule/{Success => }/FinalClassWithPublicMethod.php (89%) rename test/Fixture/Methods/PrivateInFinalClassRule/{Success => }/TraitWithProtectedMethod.php (88%) delete mode 100644 test/Integration/Classes/FinalRuleWithAbstractClassesAllowedTest.php delete mode 100644 test/Integration/Classes/FinalRuleWithAttributesTest.php delete mode 100644 test/Integration/Classes/FinalRuleWithExcludedClassNamesTest.php delete mode 100644 test/Integration/Classes/NoExtendsRuleWithClassesAllowedToBeExtendedTest.php create mode 100644 test/Util/Helper.php diff --git a/.php-cs-fixer.fixture.php b/.php-cs-fixer.fixture.php index fbc479d8..782a9bce 100644 --- a/.php-cs-fixer.fixture.php +++ b/.php-cs-fixer.fixture.php @@ -26,6 +26,7 @@ 'lowercase_keywords' => false, 'magic_method_casing' => false, 'native_function_casing' => false, + 'native_function_invocation' => false, 'nullable_type_declaration' => false, 'protected_to_private' => false, 'static_lambda' => false, @@ -36,11 +37,10 @@ $config->getFinder() ->in(__DIR__ . '/test/Fixture/') ->notPath([ - 'Classes/PHPUnit/Framework/TestCaseWithSuffixRule/Success/ImplicitlyAbstractTestCase.php', - 'Closures/NoNullableReturnTypeDeclarationRule/Failure/closure-with-nullable-union-type-return-type-declaration.php', - 'Closures/NoParameterWithNullableTypeDeclarationRule/Failure/closure-with-parameter-with-nullable-union-type-declaration.php', - 'Functions/NoNullableReturnTypeDeclarationRule/Failure/function-with-nullable-union-return-type-declaration.php', - 'Functions/NoParameterWithNullableTypeDeclarationRule/Failure/function-with-parameter-with-nullable-union-type-declaration.php', + 'Closures/NoNullableReturnTypeDeclarationRule/script.php', + 'Closures/NoParameterWithNullableTypeDeclarationRule/script.php', + 'Functions/NoNullableReturnTypeDeclarationRule/script.php', + 'Functions/NoParameterWithNullableTypeDeclarationRule/script.php', 'Methods/NoNullableReturnTypeDeclarationRule/Failure/MethodInAnonymousClassWithNullableUnionReturnTypeDeclaration.php', 'Methods/NoNullableReturnTypeDeclarationRule/Failure/MethodInClassWithNullableUnionReturnTypeDeclaration.php', 'Methods/NoNullableReturnTypeDeclarationRule/Failure/MethodInInterfaceWithNullableUnionReturnTypeDeclaration.php', diff --git a/composer.json b/composer.json index e9e6e714..40192616 100644 --- a/composer.json +++ b/composer.json @@ -38,6 +38,7 @@ "phpstan/phpstan-strict-rules": "^1.6.1", "phpunit/phpunit": "^9.6.21", "psr/container": "^2.0.2", + "symfony/finder": "^5.4.45", "symfony/process": "^5.4.47" }, "autoload": { diff --git a/composer.lock b/composer.lock index b28749e1..38817c5c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a59576f025172422ac893480a8da1701", + "content-hash": "31f0e1fba4524e34ac08c37e71265e3c", "packages": [ { "name": "phpstan/phpstan", diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index e2e011fd..6fe5530e 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -20,3 +20,33 @@ parameters: count: 1 path: src/Functions/NoNullableReturnTypeDeclarationRule.php + - + message: "#^Class Ergebnis\\\\PHPStan\\\\Rules\\\\Test\\\\Integration\\\\Methods\\\\FinalInAbstractClassRuleTest extends deprecated class Ergebnis\\\\PHPStan\\\\Rules\\\\Test\\\\Integration\\\\AbstractTestCase\\.$#" + count: 1 + path: test/Integration/Methods/FinalInAbstractClassRuleTest.php + + - + message: "#^Class Ergebnis\\\\PHPStan\\\\Rules\\\\Test\\\\Integration\\\\Methods\\\\NoConstructorParameterWithDefaultValueRuleTest extends deprecated class Ergebnis\\\\PHPStan\\\\Rules\\\\Test\\\\Integration\\\\AbstractTestCase\\.$#" + count: 1 + path: test/Integration/Methods/NoConstructorParameterWithDefaultValueRuleTest.php + + - + message: "#^Class Ergebnis\\\\PHPStan\\\\Rules\\\\Test\\\\Integration\\\\Methods\\\\NoNullableReturnTypeDeclarationRuleTest extends deprecated class Ergebnis\\\\PHPStan\\\\Rules\\\\Test\\\\Integration\\\\AbstractTestCase\\.$#" + count: 1 + path: test/Integration/Methods/NoNullableReturnTypeDeclarationRuleTest.php + + - + message: "#^Class Ergebnis\\\\PHPStan\\\\Rules\\\\Test\\\\Integration\\\\Methods\\\\NoParameterWithContainerTypeDeclarationRuleTest extends deprecated class Ergebnis\\\\PHPStan\\\\Rules\\\\Test\\\\Integration\\\\AbstractTestCase\\.$#" + count: 1 + path: test/Integration/Methods/NoParameterWithContainerTypeDeclarationRuleTest.php + + - + message: "#^Class Ergebnis\\\\PHPStan\\\\Rules\\\\Test\\\\Integration\\\\Methods\\\\NoParameterWithNullDefaultValueRuleTest extends deprecated class Ergebnis\\\\PHPStan\\\\Rules\\\\Test\\\\Integration\\\\AbstractTestCase\\.$#" + count: 1 + path: test/Integration/Methods/NoParameterWithNullDefaultValueRuleTest.php + + - + message: "#^Class Ergebnis\\\\PHPStan\\\\Rules\\\\Test\\\\Integration\\\\Methods\\\\NoParameterWithNullableTypeDeclarationRuleTest extends deprecated class Ergebnis\\\\PHPStan\\\\Rules\\\\Test\\\\Integration\\\\AbstractTestCase\\.$#" + count: 1 + path: test/Integration/Methods/NoParameterWithNullableTypeDeclarationRuleTest.php + diff --git a/test/Fixture/Classes/FinalRule/AbstractClass.php b/test/Fixture/Classes/FinalRule/AbstractClass.php new file mode 100644 index 00000000..fa9f7101 --- /dev/null +++ b/test/Fixture/Classes/FinalRule/AbstractClass.php @@ -0,0 +1,9 @@ + */ abstract class AbstractTestCase extends Testing\RuleTestCase diff --git a/test/Integration/Classes/FinalRuleTest.php b/test/Integration/Classes/FinalRuleTest.php index 63ef1b72..542ffc41 100644 --- a/test/Integration/Classes/FinalRuleTest.php +++ b/test/Integration/Classes/FinalRuleTest.php @@ -15,121 +15,265 @@ use Ergebnis\PHPStan\Rules\Classes; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Classes\FinalRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class FinalRuleTest extends Test\Integration\AbstractTestCase +final class FinalRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'final-class' => __DIR__ . '/../../Fixture/Classes/FinalRule/Success/FinalClass.php', - 'final-class-with-anonymous-class' => __DIR__ . '/../../Fixture/Classes/FinalRule/Success/FinalClassWithAnonymousClass.php', - 'interface' => __DIR__ . '/../../Fixture/Classes/FinalRule/Success/ExampleInterface.php', - 'non-final-class-with-entity-annotation-in-inline-doc-block' => __DIR__ . '/../../Fixture/Classes/FinalRule/Success/NonFinalClassWithEntityAnnotationInInlineDocBlock.php', - 'non-final-class-with-entity-annotation-in-multi-line-doc-block' => __DIR__ . '/../../Fixture/Classes/FinalRule/Success/NonFinalClassWithEntityAnnotationInMultilineDocBlock.php', - 'non-final-class-with-orm-entity-annotation-in-inline-doc-block' => __DIR__ . '/../../Fixture/Classes/FinalRule/Success/NonFinalClassWithOrmEntityAnnotationInInlineDocBlock.php', - 'non-final-class-with-orm-entity-annotation-in-multi-line-doc-block' => __DIR__ . '/../../Fixture/Classes/FinalRule/Success/NonFinalClassWithOrmEntityAnnotationInMultilineDocBlock.php', - 'non-final-class-with-orm-mapping-entity-annotation-in-inline-doc-block' => __DIR__ . '/../../Fixture/Classes/FinalRule/Success/NonFinalClassWithOrmMappingEntityAnnotationInInlineDocBlock.php', - 'non-final-class-with-orm-mapping-entity-annotation-in-multi-line-doc-block' => __DIR__ . '/../../Fixture/Classes/FinalRule/Success/NonFinalClassWithOrmMappingEntityAnnotationInMultilineDocBlock.php', - 'script-with-anonymous-class' => __DIR__ . '/../../Fixture/Classes/FinalRule/Success/anonymous-class.php', - 'trait' => __DIR__ . '/../../Fixture/Classes/FinalRule/Success/ExampleTrait.php', - 'trait-with-anonymous-class' => __DIR__ . '/../../Fixture/Classes/FinalRule/Success/TraitWithAnonymousClass.php', - ]; + use Test\Util\Helper; + private bool $allowAbstractClasses; - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + /** + * @var list + */ + private array $classesNotRequiredToBeAbstractOrFinal; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testFinalRule(): void { - $paths = [ - 'abstract-class' => [ - __DIR__ . '/../../Fixture/Classes/FinalRule/Failure/AbstractClass.php', + $this->allowAbstractClasses = false; + $this->classesNotRequiredToBeAbstractOrFinal = []; + + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Classes/FinalRule'), + [ [ \sprintf( 'Class %s is not final.', - Test\Fixture\Classes\FinalRule\Failure\AbstractClass::class, + Test\Fixture\Classes\FinalRule\AbstractClass::class, ), 7, ], - ], - 'neither-abstract-nor-final-class' => [ - __DIR__ . '/../../Fixture/Classes/FinalRule/Failure/NeitherAbstractNorFinalClass.php', [ \sprintf( 'Class %s is not final.', - Test\Fixture\Classes\FinalRule\Failure\NeitherAbstractNorFinalClass::class, + Test\Fixture\Classes\FinalRule\NeitherAbstractNorFinalClass::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithUnqualifiedDoctrineOrmMappingEntityAttribute::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithUnqualifiedEntityAttribute::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithUnqualifiedOrmEntityAttribute::class, ), 7, ], - ], - 'non-final-class-without-entity-annotation-in-inline-doc-block' => [ - __DIR__ . '/../../Fixture/Classes/FinalRule/Failure/NonFinalClassWithoutEntityAnnotationInInlineDocBlock.php', [ \sprintf( 'Class %s is not final.', - Test\Fixture\Classes\FinalRule\Failure\NonFinalClassWithoutEntityAnnotationInInlineDocBlock::class, + Test\Fixture\Classes\FinalRule\NonFinalClassWithUnqualifiedOrmMappingEntityAttribute::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithoutEntityAnnotationInInlineDocBlock::class, ), 8, ], - ], - 'non-final-class-without-entity-annotation-in-multi-line-doc-block' => [ - __DIR__ . '/../../Fixture/Classes/FinalRule/Failure/NonFinalClassWithoutEntityAnnotationInMultilineDocBlock.php', [ \sprintf( 'Class %s is not final.', - Test\Fixture\Classes\FinalRule\Failure\NonFinalClassWithoutEntityAnnotationInMultilineDocBlock::class, + Test\Fixture\Classes\FinalRule\NonFinalClassWithoutEntityAnnotationInMultilineDocBlock::class, ), 12, ], - ], - 'non-final-class-without-orm-entity-annotation-in-inline-doc-block' => [ - __DIR__ . '/../../Fixture/Classes/FinalRule/Failure/NonFinalClassWithoutOrmEntityAnnotationInInlineDocBlock.php', [ \sprintf( 'Class %s is not final.', - Test\Fixture\Classes\FinalRule\Failure\NonFinalClassWithoutOrmEntityAnnotationInInlineDocBlock::class, + Test\Fixture\Classes\FinalRule\NonFinalClassWithoutOrmEntityAnnotationInInlineDocBlock::class, ), 8, ], - ], - 'non-final-class-without-orm-entity-annotation-in-multi-line-doc-block' => [ - __DIR__ . '/../../Fixture/Classes/FinalRule/Failure/NonFinalClassWithoutOrmEntityAnnotationInMultilineDocBlock.php', [ \sprintf( 'Class %s is not final.', - Test\Fixture\Classes\FinalRule\Failure\NonFinalClassWithoutOrmEntityAnnotationInMultilineDocBlock::class, + Test\Fixture\Classes\FinalRule\NonFinalClassWithoutOrmEntityAnnotationInMultilineDocBlock::class, ), 12, ], ], + ); + } + + public function testFinalRuleWithAllowAbstractClasses(): void + { + $this->allowAbstractClasses = true; + $this->classesNotRequiredToBeAbstractOrFinal = []; + + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Classes/FinalRule'), + [ + [ + \sprintf( + 'Class %s is neither abstract nor final.', + Test\Fixture\Classes\FinalRule\NeitherAbstractNorFinalClass::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is neither abstract nor final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithUnqualifiedDoctrineOrmMappingEntityAttribute::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is neither abstract nor final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithUnqualifiedEntityAttribute::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is neither abstract nor final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithUnqualifiedOrmEntityAttribute::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is neither abstract nor final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithUnqualifiedOrmMappingEntityAttribute::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is neither abstract nor final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithoutEntityAnnotationInInlineDocBlock::class, + ), + 8, + ], + [ + \sprintf( + 'Class %s is neither abstract nor final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithoutEntityAnnotationInMultilineDocBlock::class, + ), + 12, + ], + [ + \sprintf( + 'Class %s is neither abstract nor final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithoutOrmEntityAnnotationInInlineDocBlock::class, + ), + 8, + ], + [ + \sprintf( + 'Class %s is neither abstract nor final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithoutOrmEntityAnnotationInMultilineDocBlock::class, + ), + 12, + ], + ], + ); + } + + public function testFinalRuleWithClassesNotRequiredToBeAbstractOrFinal(): void + { + $this->allowAbstractClasses = false; + $this->classesNotRequiredToBeAbstractOrFinal = [ + Test\Fixture\Classes\FinalRule\NeitherAbstractNorFinalClass::class, ]; - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Classes/FinalRule'), + [ + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\AbstractClass::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithUnqualifiedDoctrineOrmMappingEntityAttribute::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithUnqualifiedEntityAttribute::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithUnqualifiedOrmEntityAttribute::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithUnqualifiedOrmMappingEntityAttribute::class, + ), + 7, + ], + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithoutEntityAnnotationInInlineDocBlock::class, + ), + 8, + ], + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithoutEntityAnnotationInMultilineDocBlock::class, + ), + 12, + ], + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithoutOrmEntityAnnotationInInlineDocBlock::class, + ), + 8, + ], + [ + \sprintf( + 'Class %s is not final.', + Test\Fixture\Classes\FinalRule\NonFinalClassWithoutOrmEntityAnnotationInMultilineDocBlock::class, + ), + 12, + ], + ], + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Classes\FinalRule( - false, - [], + $this->allowAbstractClasses, + $this->classesNotRequiredToBeAbstractOrFinal, ); } } diff --git a/test/Integration/Classes/FinalRuleWithAbstractClassesAllowedTest.php b/test/Integration/Classes/FinalRuleWithAbstractClassesAllowedTest.php deleted file mode 100644 index f2cc5544..00000000 --- a/test/Integration/Classes/FinalRuleWithAbstractClassesAllowedTest.php +++ /dev/null @@ -1,80 +0,0 @@ - __DIR__ . '/../../Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Failure/AbstractClass.php', - 'final-class' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Success/FinalClass.php', - 'final-class-with-anonymous-class' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Success/FinalClassWithAnonymousClass.php', - 'interface' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Success/ExampleInterface.php', - 'script-with-anonymous-class' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Success/anonymous-class.php', - 'trait' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Success/ExampleTrait.php', - 'trait-with-anonymous-class' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Success/TraitWithAnonymousClass.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } - - public static function provideCasesWhereAnalysisShouldFail(): iterable - { - $paths = [ - 'neither-abstract-nor-final-class' => [ - __DIR__ . '/../../Fixture/Classes/FinalRuleWithAbstractClassesAllowed/Failure/NeitherAbstractNorFinalClass.php', - [ - \sprintf( - 'Class %s is neither abstract nor final.', - Test\Fixture\Classes\FinalRuleWithAbstractClassesAllowed\Failure\NeitherAbstractNorFinalClass::class, - ), - 7, - ], - ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } - } - - /** - * @return Rules\Rule - */ - protected function getRule(): Rules\Rule - { - return new Classes\FinalRule( - true, - [], - ); - } -} diff --git a/test/Integration/Classes/FinalRuleWithAttributesTest.php b/test/Integration/Classes/FinalRuleWithAttributesTest.php deleted file mode 100644 index abd42661..00000000 --- a/test/Integration/Classes/FinalRuleWithAttributesTest.php +++ /dev/null @@ -1,108 +0,0 @@ - __DIR__ . '/../../Fixture/Classes/FinalRuleWithAttributes/Success/NonFinalClassWithAliasedOrmEntityAttribute.php', - 'non-final-class-with-qualified-doctrine-orm-mapping-entity-attribute' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithAttributes/Success/NonFinalClassWithQualifiedDoctrineOrmMappingEntityAttribute.php', - 'non-final-class-with-qualified-entity-attribute' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithAttributes/Success/NonFinalClassWithQualifiedEntityAttribute.php', - 'non-final-class-with-qualified-mapping-entity-attribute' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithAttributes/Success/NonFinalClassWithQualifiedMappingEntityAttribute.php', - 'non-final-class-with-qualified-orm-mapping-entity-attribute' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithAttributes/Success/NonFinalClassWithQualifiedOrmMappingEntityAttribute.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } - - public static function provideCasesWhereAnalysisShouldFail(): iterable - { - $paths = [ - 'non-final-class-with-unqualified-doctrine-orm-mapping-entity-attribute' => [ - __DIR__ . '/../../Fixture/Classes/FinalRuleWithAttributes/Failure/NonFinalClassWithUnqualifiedDoctrineOrmMappingEntityAttribute.php', - [ - \sprintf( - 'Class %s is not final.', - Test\Fixture\Classes\FinalRuleWithAttributes\Failure\NonFinalClassWithUnqualifiedDoctrineOrmMappingEntityAttribute::class, - ), - 7, - ], - ], - 'non-final-class-with-unqualified-entity-attribute' => [ - __DIR__ . '/../../Fixture/Classes/FinalRuleWithAttributes/Failure/NonFinalClassWithUnqualifiedEntityAttribute.php', - [ - \sprintf( - 'Class %s is not final.', - Test\Fixture\Classes\FinalRuleWithAttributes\Failure\NonFinalClassWithUnqualifiedEntityAttribute::class, - ), - 7, - ], - ], - 'non-final-class-with-unqualified-orm-entity-attribute' => [ - __DIR__ . '/../../Fixture/Classes/FinalRuleWithAttributes/Failure/NonFinalClassWithUnqualifiedOrmEntityAttribute.php', - [ - \sprintf( - 'Class %s is not final.', - Test\Fixture\Classes\FinalRuleWithAttributes\Failure\NonFinalClassWithUnqualifiedOrmEntityAttribute::class, - ), - 7, - ], - ], - 'non-final-class-with-unqualified-orm-mapping-entity-attribute' => [ - __DIR__ . '/../../Fixture/Classes/FinalRuleWithAttributes/Failure/NonFinalClassWithUnqualifiedOrmMappingEntityAttribute.php', - [ - \sprintf( - 'Class %s is not final.', - Test\Fixture\Classes\FinalRuleWithAttributes\Failure\NonFinalClassWithUnqualifiedOrmMappingEntityAttribute::class, - ), - 7, - ], - ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } - } - - /** - * @return Rules\Rule - */ - protected function getRule(): Rules\Rule - { - return new Classes\FinalRule( - false, - [], - ); - } -} diff --git a/test/Integration/Classes/FinalRuleWithExcludedClassNamesTest.php b/test/Integration/Classes/FinalRuleWithExcludedClassNamesTest.php deleted file mode 100644 index 189f9268..00000000 --- a/test/Integration/Classes/FinalRuleWithExcludedClassNamesTest.php +++ /dev/null @@ -1,92 +0,0 @@ - __DIR__ . '/../../Fixture/Classes/FinalRuleWithExcludedClassNames/Success/NeitherAbstractNorFinalClassButWhitelisted.php', - 'final-class' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithExcludedClassNames/Success/FinalClass.php', - 'final-class-with-anonymous-class' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithExcludedClassNames/Success/FinalClassWithAnonymousClass.php', - 'interface' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithExcludedClassNames/Success/ExampleInterface.php', - 'script-with-anonymous-class' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithExcludedClassNames/Success/anonymous-class.php', - 'trait' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithExcludedClassNames/Success/ExampleTrait.php', - 'trait-with-anonymous-class' => __DIR__ . '/../../Fixture/Classes/FinalRuleWithExcludedClassNames/Success/TraitWithAnonymousClass.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } - - public static function provideCasesWhereAnalysisShouldFail(): iterable - { - $paths = [ - 'abstract-class' => [ - __DIR__ . '/../../Fixture/Classes/FinalRuleWithExcludedClassNames/Failure/AbstractClass.php', - [ - \sprintf( - 'Class %s is not final.', - Test\Fixture\Classes\FinalRuleWithExcludedClassNames\Failure\AbstractClass::class, - ), - 7, - ], - ], - 'neither-abstract-nor-final-class' => [ - __DIR__ . '/../../Fixture/Classes/FinalRuleWithExcludedClassNames/Failure/NeitherAbstractNorFinalClass.php', - [ - \sprintf( - 'Class %s is not final.', - Test\Fixture\Classes\FinalRuleWithExcludedClassNames\Failure\NeitherAbstractNorFinalClass::class, - ), - 7, - ], - ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } - } - - /** - * @return Rules\Rule - */ - protected function getRule(): Rules\Rule - { - return new Classes\FinalRule( - false, - [ - Test\Fixture\Classes\FinalRuleWithExcludedClassNames\Success\NeitherAbstractNorFinalClassButWhitelisted::class, - ], - ); - } -} diff --git a/test/Integration/Classes/NoExtendsRuleTest.php b/test/Integration/Classes/NoExtendsRuleTest.php index 2b9a94de..9667bb40 100644 --- a/test/Integration/Classes/NoExtendsRuleTest.php +++ b/test/Integration/Classes/NoExtendsRuleTest.php @@ -15,72 +15,66 @@ use Ergebnis\PHPStan\Rules\Classes; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Classes\NoExtendsRule * + * @extends Testing\RuleTestCase + * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier */ -final class NoExtendsRuleTest extends Test\Integration\AbstractTestCase +final class NoExtendsRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'class' => __DIR__ . '/../../Fixture/Classes/NoExtendsRule/Success/ExampleClass.php', - 'class-extending-php-unit-framework-test-case' => __DIR__ . '/../../Fixture/Classes/NoExtendsRule/Success/ClassExtendingPhpUnitFrameworkTestCase.php', - 'interface' => __DIR__ . '/../../Fixture/Classes/NoExtendsRule/Success/ExampleInterface.php', - 'interface-extending-other-interface' => __DIR__ . '/../../Fixture/Classes/NoExtendsRule/Success/InterfaceExtendingOtherInterface.php', - 'script-with-anonymous-class' => __DIR__ . '/../../Fixture/Classes/NoExtendsRule/Success/anonymous-class.php', - ]; + use Test\Util\Helper; - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + /** + * @var list + */ + private array $classesAllowedToBeExtended; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testNoExtendsRule(): void { - $paths = [ - 'class-extending-other-class' => [ - __DIR__ . '/../../Fixture/Classes/NoExtendsRule/Failure/ClassExtendingOtherClass.php', + $this->classesAllowedToBeExtended = []; + + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Classes/NoExtendsRule'), + [ [ \sprintf( 'Class "%s" is not allowed to extend "%s".', - Test\Fixture\Classes\NoExtendsRule\Failure\ClassExtendingOtherClass::class, - Test\Fixture\Classes\NoExtendsRule\Failure\OtherClass::class, + Test\Fixture\Classes\NoExtendsRule\ClassExtendingOtherClass::class, + Test\Fixture\Classes\NoExtendsRule\OtherClass::class, ), 7, ], - ], - 'script-with-anonymous-class-extending-other-class' => [ - __DIR__ . '/../../Fixture/Classes/NoExtendsRule/Failure/anonymous-class-extending-other-class.php', [ \sprintf( 'Anonymous class is not allowed to extend "%s".', - Test\Fixture\Classes\NoExtendsRule\Failure\OtherClass::class, + Test\Fixture\Classes\NoExtendsRule\OtherClass::class, ), - 7, + 10, ], ], + ); + } + + public function testNoExtendsRuleWithClassesAllowedToBeExtended(): void + { + $this->classesAllowedToBeExtended = [ + Test\Fixture\Classes\NoExtendsRule\OtherClass::class, ]; - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Classes/NoExtendsRule'), + [ + ], + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { - return new Classes\NoExtendsRule([]); + return new Classes\NoExtendsRule($this->classesAllowedToBeExtended); } } diff --git a/test/Integration/Classes/NoExtendsRuleWithClassesAllowedToBeExtendedTest.php b/test/Integration/Classes/NoExtendsRuleWithClassesAllowedToBeExtendedTest.php deleted file mode 100644 index 8e412e59..00000000 --- a/test/Integration/Classes/NoExtendsRuleWithClassesAllowedToBeExtendedTest.php +++ /dev/null @@ -1,90 +0,0 @@ - __DIR__ . '/../../Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/ExampleClass.php', - 'class-extending-class-allowed-to-be-extended' => __DIR__ . '/../../Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/ClassExtendingClassAllowedToBeExtended.php', - 'class-extending-php-unit-framework-test-case' => __DIR__ . '/../../Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/ClassExtendingPhpUnitFrameworkTestCase.php', - 'interface' => __DIR__ . '/../../Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/ExampleInterface.php', - 'interface-extending-other-interface' => __DIR__ . '/../../Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/InterfaceExtendingOtherInterface.php', - 'script-with-anonymous-class' => __DIR__ . '/../../Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/anonymous-class.php', - 'script-with-anonymous-class-extending-class-allowed-to-be-extended' => __DIR__ . '/../../Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Success/anonymous-class-extending-class-allowed-to-be-extended.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } - - public static function provideCasesWhereAnalysisShouldFail(): iterable - { - $paths = [ - 'class-extending-other-class' => [ - __DIR__ . '/../../Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Failure/ClassExtendingOtherClass.php', - [ - \sprintf( - 'Class "%s" is not allowed to extend "%s".', - Test\Fixture\Classes\NoExtendsRuleWithClassesAllowedToBeExtended\Failure\ClassExtendingOtherClass::class, - Test\Fixture\Classes\NoExtendsRuleWithClassesAllowedToBeExtended\Failure\OtherClass::class, - ), - 7, - ], - ], - 'script-with-anonymous-class-extending-other-class' => [ - __DIR__ . '/../../Fixture/Classes/NoExtendsRuleWithClassesAllowedToBeExtended/Failure/anonymous-class-extending-other-class.php', - [ - \sprintf( - 'Anonymous class is not allowed to extend "%s".', - Test\Fixture\Classes\NoExtendsRuleWithClassesAllowedToBeExtended\Failure\OtherClass::class, - ), - 7, - ], - ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } - } - - /** - * @return Rules\Rule - */ - protected function getRule(): Rules\Rule - { - return new Classes\NoExtendsRule([ - Test\Fixture\Classes\NoExtendsRuleWithClassesAllowedToBeExtended\Success\ClassAllowedToBeExtended::class, - ]); - } -} diff --git a/test/Integration/Classes/PHPUnit/Framework/TestCaseWithSuffixRuleTest.php b/test/Integration/Classes/PHPUnit/Framework/TestCaseWithSuffixRuleTest.php index 5715df39..206ebf87 100644 --- a/test/Integration/Classes/PHPUnit/Framework/TestCaseWithSuffixRuleTest.php +++ b/test/Integration/Classes/PHPUnit/Framework/TestCaseWithSuffixRuleTest.php @@ -15,70 +15,46 @@ use Ergebnis\PHPStan\Rules\Classes; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; use PHPUnit\Framework; /** * @covers \Ergebnis\PHPStan\Rules\Classes\PHPUnit\Framework\TestCaseWithSuffixRule * + * @extends Testing\RuleTestCase + * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier */ -final class TestCaseWithSuffixRuleTest extends Test\Integration\AbstractTestCase +final class TestCaseWithSuffixRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'concrete-test-case-with-suffix-test' => __DIR__ . '/../../../../Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule/Success/ConcreteTestCaseWithSuffixTest.php', - 'explicitly-abstract-test-case' => __DIR__ . '/../../../../Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule/Success/ExplicitlyAbstractTestCase.php', - 'implicitly-abstract-test-case' => __DIR__ . '/../../../../Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule/Success/ExplicitlyAbstractTestCase.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + use Test\Util\Helper; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testTestCaseWithSuffixRule(): void { - $paths = [ - 'concrete-test-case-extending-abstract-test-case-without-test-suffix' => [ - __DIR__ . '/../../../../Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule/Failure/ConcreteTestCaseExtendingAbstractTestCaseWithoutTestSuffix.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../../../Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule'), + [ [ \sprintf( 'Class %s extends %s, is concrete, but does not have a Test suffix.', - Test\Fixture\Classes\PHPUnit\Framework\TestCaseWithSuffixRule\Failure\ConcreteTestCaseExtendingAbstractTestCaseWithoutTestSuffix::class, + Test\Fixture\Classes\PHPUnit\Framework\TestCaseWithSuffixRule\ConcreteTestCaseExtendingAbstractTestCaseWithoutSuffix::class, Framework\TestCase::class, ), 7, ], - ], - 'concrete-test-case-without-test-suffix' => [ - __DIR__ . '/../../../../Fixture/Classes/PHPUnit/Framework/TestCaseWithSuffixRule/Failure/ConcreteTestCaseWithoutTestSuffix.php', [ \sprintf( 'Class %s extends %s, is concrete, but does not have a Test suffix.', - Test\Fixture\Classes\PHPUnit\Framework\TestCaseWithSuffixRule\Failure\ConcreteTestCaseWithoutTestSuffix::class, + Test\Fixture\Classes\PHPUnit\Framework\TestCaseWithSuffixRule\ConcreteTestCaseWithoutSuffix::class, Framework\TestCase::class, ), 9, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Classes\PHPUnit\Framework\TestCaseWithSuffixRule(self::createReflectionProvider()); diff --git a/test/Integration/Closures/NoNullableReturnTypeDeclarationRuleTest.php b/test/Integration/Closures/NoNullableReturnTypeDeclarationRuleTest.php index ae5837d2..a2e61cc9 100644 --- a/test/Integration/Closures/NoNullableReturnTypeDeclarationRuleTest.php +++ b/test/Integration/Closures/NoNullableReturnTypeDeclarationRuleTest.php @@ -15,60 +15,37 @@ use Ergebnis\PHPStan\Rules\Closures; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Closures\NoNullableReturnTypeDeclarationRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class NoNullableReturnTypeDeclarationRuleTest extends Test\Integration\AbstractTestCase +final class NoNullableReturnTypeDeclarationRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'closure-with-return-type-declaration' => __DIR__ . '/../../Fixture/Closures/NoNullableReturnTypeDeclarationRule/Success/closure-with-return-type-declaration.php', - 'closure-function-without-return-type-declaration' => __DIR__ . '/../../Fixture/Closures/NoNullableReturnTypeDeclarationRule/Success/closure-without-return-type-declaration.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + use Test\Util\Helper; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testNoNullableReturnTypeDeclarationRule(): void { - $paths = [ - 'closure-with-nullable-return-type-declaration' => [ - __DIR__ . '/../../Fixture/Closures/NoNullableReturnTypeDeclarationRule/Failure/closure-with-nullable-return-type-declaration.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Closures/NoNullableReturnTypeDeclarationRule'), + [ [ 'Closure has a nullable return type declaration.', - 7, + 15, ], - ], - 'closure-with-nullable-union-return-type-declaration' => [ - __DIR__ . '/../../Fixture/Closures/NoNullableReturnTypeDeclarationRule/Failure/closure-with-nullable-union-type-return-type-declaration.php', [ 'Closure has a nullable return type declaration.', - 7, + 19, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Closures\NoNullableReturnTypeDeclarationRule(); diff --git a/test/Integration/Closures/NoParameterWithNullDefaultValueRuleTest.php b/test/Integration/Closures/NoParameterWithNullDefaultValueRuleTest.php index 2eb841a0..9b3d4847 100644 --- a/test/Integration/Closures/NoParameterWithNullDefaultValueRuleTest.php +++ b/test/Integration/Closures/NoParameterWithNullDefaultValueRuleTest.php @@ -15,68 +15,41 @@ use Ergebnis\PHPStan\Rules\Closures; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Closures\NoParameterWithNullDefaultValueRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class NoParameterWithNullDefaultValueRuleTest extends Test\Integration\AbstractTestCase +final class NoParameterWithNullDefaultValueRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'closure-with-parameter-with-non-null-default-value' => __DIR__ . '/../../Fixture/Closures/NoParameterWithNullDefaultValueRule/Success/closure-with-parameter-with-non-null-default-value.php', - 'closure-with-parameter-without-default-value' => __DIR__ . '/../../Fixture/Closures/NoParameterWithNullDefaultValueRule/Success/closure-with-parameter-without-default-value.php', - 'closure-with-parameter-without-parameters' => __DIR__ . '/../../Fixture/Closures/NoParameterWithNullDefaultValueRule/Success/closure-without-parameters.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + use Test\Util\Helper; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testNoParameterWithNullDefaultValueRule(): void { - $paths = [ - 'closure-with-parameter-with-null-default-value' => [ - __DIR__ . '/../../Fixture/Closures/NoParameterWithNullDefaultValueRule/Failure/closure-with-parameter-with-null-default-value.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Closures/NoParameterWithNullDefaultValueRule'), + [ [ 'Closure has parameter $bar with null as default value.', - 7, + 18, ], - ], - 'closure-with-parameter-with-root-namespace-referenced-null-default-value' => [ - __DIR__ . '/../../Fixture/Closures/NoParameterWithNullDefaultValueRule/Failure/closure-with-parameter-with-root-namespace-referenced-null-default-value.php', [ 'Closure has parameter $bar with null as default value.', - 7, + 22, ], - ], - 'closure-with-parameter-with-wrongly-capitalized-null-default-value' => [ - __DIR__ . '/../../Fixture/Closures/NoParameterWithNullDefaultValueRule/Failure/closure-with-parameter-with-wrongly-capitalized-null-default-value.php', [ 'Closure has parameter $bar with null as default value.', - 7, + 26, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Closures\NoParameterWithNullDefaultValueRule(); diff --git a/test/Integration/Closures/NoParameterWithNullableTypeDeclarationRuleTest.php b/test/Integration/Closures/NoParameterWithNullableTypeDeclarationRuleTest.php index 0432bf48..5e6f09dc 100644 --- a/test/Integration/Closures/NoParameterWithNullableTypeDeclarationRuleTest.php +++ b/test/Integration/Closures/NoParameterWithNullableTypeDeclarationRuleTest.php @@ -15,61 +15,37 @@ use Ergebnis\PHPStan\Rules\Closures; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Closures\NoParameterWithNullableTypeDeclarationRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class NoParameterWithNullableTypeDeclarationRuleTest extends Test\Integration\AbstractTestCase +final class NoParameterWithNullableTypeDeclarationRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'closure-with-parameter-with-type-declaration' => __DIR__ . '/../../Fixture/Closures/NoParameterWithNullableTypeDeclarationRule/Success/closure-with-parameter-with-type-declaration.php', - 'closure-with-parameter-without-type-declaration' => __DIR__ . '/../../Fixture/Closures/NoParameterWithNullableTypeDeclarationRule/Success/closure-with-parameter-without-type-declaration.php', - 'closure-without-parameters' => __DIR__ . '/../../Fixture/Closures/NoParameterWithNullableTypeDeclarationRule/Success/closure-without-parameters.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + use Test\Util\Helper; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testNoParameterWithNullableTypeDeclarationRule(): void { - $paths = [ - 'closure-with-parameter-with-nullable-type-declaration' => [ - __DIR__ . '/../../Fixture/Closures/NoParameterWithNullableTypeDeclarationRule/Failure/closure-with-parameter-with-nullable-type-declaration.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Closures/NoParameterWithNullableTypeDeclarationRule'), + [ [ 'Closure has parameter $bar with a nullable type declaration.', - 7, + 18, ], - ], - 'closure-with-parameter-with-nullable-union-type-declaration' => [ - __DIR__ . '/../../Fixture/Closures/NoParameterWithNullableTypeDeclarationRule/Failure/closure-with-parameter-with-nullable-union-type-declaration.php', [ 'Closure has parameter $bar with a nullable type declaration.', - 7, + 22, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Closures\NoParameterWithNullableTypeDeclarationRule(); diff --git a/test/Integration/Expressions/NoCompactRuleTest.php b/test/Integration/Expressions/NoCompactRuleTest.php index 2b45ab2b..12c86069 100644 --- a/test/Integration/Expressions/NoCompactRuleTest.php +++ b/test/Integration/Expressions/NoCompactRuleTest.php @@ -15,66 +15,41 @@ use Ergebnis\PHPStan\Rules\Expressions; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Expressions\NoCompactRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class NoCompactRuleTest extends Test\Integration\AbstractTestCase +final class NoCompactRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'compact-not-used' => __DIR__ . '/../../Fixture/Expressions/NoCompactRule/Success/compact-not-used.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + use Test\Util\Helper; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testNoCompactRule(): void { - $paths = [ - 'compact-used-with-alias' => [ - __DIR__ . '/../../Fixture/Expressions/NoCompactRule/Failure/compact-used-with-alias.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Expressions/NoCompactRule'), + [ [ 'Function compact() should not be used.', - 12, + 22, ], - ], - 'compact-used-with-correct-case' => [ - __DIR__ . '/../../Fixture/Expressions/NoCompactRule/Failure/compact-used-with-correct-case.php', [ 'Function compact() should not be used.', - 10, + 27, ], - ], - 'compact-used-with-incorrect-case' => [ - __DIR__ . '/../../Fixture/Expressions/NoCompactRule/Failure/compact-used-with-incorrect-case.php', [ 'Function compact() should not be used.', - 10, + 32, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Expressions\NoCompactRule(); diff --git a/test/Integration/Expressions/NoErrorSuppressionRuleTest.php b/test/Integration/Expressions/NoErrorSuppressionRuleTest.php index 6dbbf326..0d6aef40 100644 --- a/test/Integration/Expressions/NoErrorSuppressionRuleTest.php +++ b/test/Integration/Expressions/NoErrorSuppressionRuleTest.php @@ -15,52 +15,33 @@ use Ergebnis\PHPStan\Rules\Expressions; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Expressions\NoErrorSuppressionRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class NoErrorSuppressionRuleTest extends Test\Integration\AbstractTestCase +final class NoErrorSuppressionRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'error-suppression-not-used' => __DIR__ . '/../../Fixture/Expressions/NoErrorSuppressionRule/Success/error-suppression-not-used.php', - ]; + use Test\Util\Helper; - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } - - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testNoErrorSuppressionRule(): void { - $paths = [ - 'error-suppression-used' => [ - __DIR__ . '/../../Fixture/Expressions/NoErrorSuppressionRule/Failure/error-suppression-used.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Expressions/NoErrorSuppressionRule'), + [ [ 'Error suppression via "@" should not be used.', - 7, + 9, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Expressions\NoErrorSuppressionRule(); diff --git a/test/Integration/Expressions/NoEvalRuleTest.php b/test/Integration/Expressions/NoEvalRuleTest.php index 70d0639c..28799d01 100644 --- a/test/Integration/Expressions/NoEvalRuleTest.php +++ b/test/Integration/Expressions/NoEvalRuleTest.php @@ -15,59 +15,37 @@ use Ergebnis\PHPStan\Rules\Expressions; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Expressions\NoEvalRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class NoEvalRuleTest extends Test\Integration\AbstractTestCase +final class NoEvalRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'eval-not-used' => __DIR__ . '/../../Fixture/Expressions/NoEvalRule/Success/eval-not-used.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + use Test\Util\Helper; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testNoEvalRule(): void { - $paths = [ - 'eval-used-with-correct-case' => [ - __DIR__ . '/../../Fixture/Expressions/NoEvalRule/Failure/eval-used-with-correct-case.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Expressions/NoEvalRule'), + [ [ 'Language construct eval() should not be used.', - 7, + 13, ], - ], - 'eval-used-with-incorrect-case' => [ - __DIR__ . '/../../Fixture/Expressions/NoEvalRule/Failure/eval-used-with-incorrect-case.php', [ 'Language construct eval() should not be used.', - 7, + 15, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Expressions\NoEvalRule(); diff --git a/test/Integration/Expressions/NoIssetRuleTest.php b/test/Integration/Expressions/NoIssetRuleTest.php index 24d420e3..3052860c 100644 --- a/test/Integration/Expressions/NoIssetRuleTest.php +++ b/test/Integration/Expressions/NoIssetRuleTest.php @@ -15,59 +15,37 @@ use Ergebnis\PHPStan\Rules\Expressions; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Expressions\NoIssetRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class NoIssetRuleTest extends Test\Integration\AbstractTestCase +final class NoIssetRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'isset-not-used' => __DIR__ . '/../../Fixture/Expressions/NoIssetRule/Success/isset-not-used.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + use Test\Util\Helper; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testNoIssetRule(): void { - $paths = [ - 'isset-used-with-correct-case' => [ - __DIR__ . '/../../Fixture/Expressions/NoIssetRule/Failure/isset-used-with-correct-case.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Expressions/NoIssetRule'), + [ [ 'Language construct isset() should not be used.', - 7, + 16, ], - ], - 'isset-used-with-incorrect-case' => [ - __DIR__ . '/../../Fixture/Expressions/NoIssetRule/Failure/isset-used-with-incorrect-case.php', [ 'Language construct isset() should not be used.', - 7, + 20, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Expressions\NoIssetRule(); diff --git a/test/Integration/Files/DeclareStrictTypesRuleTest.php b/test/Integration/Files/DeclareStrictTypesRuleTest.php index 92d6ffd8..449d4700 100644 --- a/test/Integration/Files/DeclareStrictTypesRuleTest.php +++ b/test/Integration/Files/DeclareStrictTypesRuleTest.php @@ -15,163 +15,89 @@ use Ergebnis\PHPStan\Rules\Files; use Ergebnis\PHPStan\Rules\Test; -use PHPStan\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Files\DeclareStrictTypesRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class DeclareStrictTypesRuleTest extends Test\Integration\AbstractTestCase +final class DeclareStrictTypesRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'file-empty' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-empty.php', - 'file-with-comment-and-declare-strict-types-on' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-comment-and-declare-strict-types-on.php', - 'file-with-comment-and-declare-strict-types-on-and-invalid-casing' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-comment-and-declare-strict-types-on-and-invalid-casing.php', - 'file-with-comment-and-declare-strict-types-on-and-multiple-declares' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-comment-and-declare-strict-types-on-and-multiple-declares.php', - 'file-with-comment-and-declare-strict-types-on-and-namespace-declaration' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-comment-and-declare-strict-types-on-and-namespace-declaration.php', - 'file-with-declare-strict-types-on' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-declare-strict-types-on.php', - 'file-with-declare-strict-types-on-and-invalid-casing' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-declare-strict-types-on-and-invalid-casing.php', - 'file-with-declare-strict-types-on-and-multiple-declares' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-declare-strict-types-on-and-multiple-declares.php', - 'file-with-declare-strict-types-on-and-namespace-declaration' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-declare-strict-types-on-and-namespace-declaration.php', - 'file-with-doc-block-and-declare-strict-types-on' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-doc-block-and-declare-strict-types-on.php', - 'file-with-doc-block-and-declare-strict-types-on-and-invalid-casing' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-doc-block-and-declare-strict-types-on-and-invalid-casing.php', - 'file-with-doc-block-and-declare-strict-types-on-and-multiple-declares' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-doc-block-and-declare-strict-types-on-and-multiple-declares.php', - 'file-with-doc-block-and-declare-strict-types-on-and-namespace-declaration' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-doc-block-and-declare-strict-types-on-and-namespace-declaration.php', - 'file-with-shebang-and-declare-strict-types-on' => __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Success/file-with-shebang-and-declare-strict-types-on.php', - ]; + use Test\Util\Helper; - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } - - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testDeclareStrictTypesRule(): void { - $paths = [ - 'file-with-comment-and-declare-strict-types-off' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-comment-and-declare-strict-types-off.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule'), + [ [ 'File is missing a "declare(strict_types=1)" declaration.', 5, ], - ], - 'file-with-comment-and-declare-strict-types-off-and-invalid-casing' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-comment-and-declare-strict-types-off-and-invalid-casing.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 5, ], - ], - 'file-with-comment-and-declare-strict-types-off-and-multiple-declares' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-comment-and-declare-strict-types-off-and-multiple-declares.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 5, ], - ], - 'file-with-declare-strict-types-off' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-declare-strict-types-off.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 3, ], - ], - 'file-with-declare-strict-types-off-and-invalid-casing' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-declare-strict-types-off-and-invalid-casing.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 3, ], - ], - 'file-with-declare-strict-types-off-and-multiple-declares' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-declare-strict-types-off-and-multiple-declares.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 3, ], - ], - 'file-with-declare-ticks' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-declare-ticks.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 3, ], - ], - 'file-with-doc-block-and-declare-strict-types-off' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-doc-block-and-declare-strict-types-off.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 7, ], - ], - 'file-with-doc-block-and-declare-strict-types-off-and-invalid-casing' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-doc-block-and-declare-strict-types-off-and-invalid-casing.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 7, ], - ], - 'file-with-doc-block-and-declare-strict-types-off-and-multiple-declares' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-doc-block-and-declare-strict-types-off-and-multiple-declares.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 7, ], - ], - 'file-with-shebang-and-another-one-text-line-before-opening-tag' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-shebang-and-another-one-text-line-before-opening-tag.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 1, ], - ], - 'file-with-shebang-and-declare-strict-types-off' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-shebang-and-declare-strict-types-off.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 1, ], - ], - 'file-with-text-before-opening-tag' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-with-text-before-opening-tag.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 1, ], - ], - 'file-without-declare-strict-types-and-namespace-declaration' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-without-declare-strict-types-and-namespace-declaration.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 3, ], - ], - 'file-without-declare-strict-types' => [ - __DIR__ . '/../../Fixture/Files/DeclareStrictTypesRule/Failure/file-without-declare-strict-types.php', [ 'File is missing a "declare(strict_types=1)" declaration.', 3, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Files\DeclareStrictTypesRule(); diff --git a/test/Integration/Functions/NoNullableReturnTypeDeclarationRuleTest.php b/test/Integration/Functions/NoNullableReturnTypeDeclarationRuleTest.php index 64fc5017..c1d94b7e 100644 --- a/test/Integration/Functions/NoNullableReturnTypeDeclarationRuleTest.php +++ b/test/Integration/Functions/NoNullableReturnTypeDeclarationRuleTest.php @@ -15,60 +15,37 @@ use Ergebnis\PHPStan\Rules\Functions; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Functions\NoNullableReturnTypeDeclarationRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class NoNullableReturnTypeDeclarationRuleTest extends Test\Integration\AbstractTestCase +final class NoNullableReturnTypeDeclarationRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'function-with-return-type-declaration' => __DIR__ . '/../../Fixture/Functions/NoNullableReturnTypeDeclarationRule/Success/function-with-return-type-declaration.php', - 'function-without-return-type-declaration' => __DIR__ . '/../../Fixture/Functions/NoNullableReturnTypeDeclarationRule/Success/function-without-return-type-declaration.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + use Test\Util\Helper; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testNoNullableReturnTypeDeclarationRule(): void { - $paths = [ - 'function-with-nullable-return-type-declaration' => [ - __DIR__ . '/../../Fixture/Functions/NoNullableReturnTypeDeclarationRule/Failure/function-with-nullable-return-type-declaration.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Functions/NoNullableReturnTypeDeclarationRule'), + [ [ - 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoNullableReturnTypeDeclarationRule\Failure\foo() has a nullable return type declaration.', - 7, + 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoNullableReturnTypeDeclarationRule\baz() has a nullable return type declaration.', + 17, ], - ], - 'function-with-nullable-union-return-type-declaration' => [ - __DIR__ . '/../../Fixture/Functions/NoNullableReturnTypeDeclarationRule/Failure/function-with-nullable-union-return-type-declaration.php', [ - 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoNullableReturnTypeDeclarationRule\Failure\foo() has a nullable return type declaration.', - 7, + 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoNullableReturnTypeDeclarationRule\quux() has a nullable return type declaration.', + 22, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Functions\NoNullableReturnTypeDeclarationRule(); diff --git a/test/Integration/Functions/NoParameterWithNullDefaultValueRuleTest.php b/test/Integration/Functions/NoParameterWithNullDefaultValueRuleTest.php index 84f2dc40..62753184 100644 --- a/test/Integration/Functions/NoParameterWithNullDefaultValueRuleTest.php +++ b/test/Integration/Functions/NoParameterWithNullDefaultValueRuleTest.php @@ -15,68 +15,41 @@ use Ergebnis\PHPStan\Rules\Functions; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Functions\NoParameterWithNullDefaultValueRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class NoParameterWithNullDefaultValueRuleTest extends Test\Integration\AbstractTestCase +final class NoParameterWithNullDefaultValueRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'function-with-parameter-with-non-null-default-value' => __DIR__ . '/../../Fixture/Functions/NoParameterWithNullDefaultValueRule/Success/function-with-parameter-with-non-null-default-value.php', - 'function-with-parameter-without-default-value' => __DIR__ . '/../../Fixture/Functions/NoParameterWithNullDefaultValueRule/Success/function-with-parameter-without-default-value.php', - 'function-without-parameters' => __DIR__ . '/../../Fixture/Functions/NoParameterWithNullDefaultValueRule/Success/function-without-parameters.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + use Test\Util\Helper; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testNoParameterWithNullDefaultValueRule(): void { - $paths = [ - 'function-with-parameter-with-null-default-value' => [ - __DIR__ . '/../../Fixture/Functions/NoParameterWithNullDefaultValueRule/Failure/function-with-parameter-with-null-default-value.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Functions/NoParameterWithNullDefaultValueRule'), + [ [ - 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoParameterWithNullDefaultValueRule\Failure\foo() has parameter $bar with null as default value.', - 7, + 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoParameterWithNullDefaultValueRule\qux() has parameter $bar with null as default value.', + 21, ], - ], - 'function-with-parameter-with-root-namespace-referenced-null-default-value' => [ - __DIR__ . '/../../Fixture/Functions/NoParameterWithNullDefaultValueRule/Failure/function-with-parameter-with-root-namespace-referenced-null-default-value.php', [ - 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoParameterWithNullDefaultValueRule\Failure\foo() has parameter $bar with null as default value.', - 7, + 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoParameterWithNullDefaultValueRule\quux() has parameter $bar with null as default value.', + 26, ], - ], - 'function-with-parameter-with-wrongly-capitalized-null-default-value' => [ - __DIR__ . '/../../Fixture/Functions/NoParameterWithNullDefaultValueRule/Failure/function-with-parameter-with-wrongly-capitalized-null-default-value.php', [ - 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoParameterWithNullDefaultValueRule\Failure\foo() has parameter $bar with null as default value.', - 7, + 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoParameterWithNullDefaultValueRule\quz() has parameter $bar with null as default value.', + 31, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Functions\NoParameterWithNullDefaultValueRule(); diff --git a/test/Integration/Functions/NoParameterWithNullableTypeDeclarationRuleTest.php b/test/Integration/Functions/NoParameterWithNullableTypeDeclarationRuleTest.php index 65d7c613..031ab514 100644 --- a/test/Integration/Functions/NoParameterWithNullableTypeDeclarationRuleTest.php +++ b/test/Integration/Functions/NoParameterWithNullableTypeDeclarationRuleTest.php @@ -15,61 +15,37 @@ use Ergebnis\PHPStan\Rules\Functions; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Functions\NoParameterWithNullableTypeDeclarationRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class NoParameterWithNullableTypeDeclarationRuleTest extends Test\Integration\AbstractTestCase +final class NoParameterWithNullableTypeDeclarationRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'function-with-parameter-with-type-declaration' => __DIR__ . '/../../Fixture/Functions/NoParameterWithNullableTypeDeclarationRule/Success/function-with-parameter-with-type-declaration.php', - 'function-with-parameter-without-type-declaration' => __DIR__ . '/../../Fixture/Functions/NoParameterWithNullableTypeDeclarationRule/Success/function-with-parameter-without-type-declaration.php', - 'function-without-parameters' => __DIR__ . '/../../Fixture/Functions/NoParameterWithNullableTypeDeclarationRule/Success/function-without-parameters.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + use Test\Util\Helper; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testNoParameterWithNullableTypeDeclarationRule(): void { - $paths = [ - 'function-with-parameter-with-nullable-type-declaration' => [ - __DIR__ . '/../../Fixture/Functions/NoParameterWithNullableTypeDeclarationRule/Failure/function-with-parameter-with-nullable-type-declaration.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Functions/NoParameterWithNullableTypeDeclarationRule'), + [ [ - 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoParameterWithNullableTypeDeclarationRule\Failure\foo() has parameter $bar with a nullable type declaration.', - 7, + 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoParameterWithNullableTypeDeclarationRule\qux() has parameter $bar with a nullable type declaration.', + 21, ], - ], - 'function-with-parameter-with-nullable-union-type-declaration' => [ - __DIR__ . '/../../Fixture/Functions/NoParameterWithNullableTypeDeclarationRule/Failure/function-with-parameter-with-nullable-union-type-declaration.php', [ - 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoParameterWithNullableTypeDeclarationRule\Failure\foo() has parameter $bar with a nullable type declaration.', - 7, + 'Function Ergebnis\PHPStan\Rules\Test\Fixture\Functions\NoParameterWithNullableTypeDeclarationRule\quux() has parameter $bar with a nullable type declaration.', + 26, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Functions\NoParameterWithNullableTypeDeclarationRule(); diff --git a/test/Integration/Methods/PrivateInFinalClassRuleTest.php b/test/Integration/Methods/PrivateInFinalClassRuleTest.php index 41436b14..088dd9fd 100644 --- a/test/Integration/Methods/PrivateInFinalClassRuleTest.php +++ b/test/Integration/Methods/PrivateInFinalClassRuleTest.php @@ -15,68 +15,47 @@ use Ergebnis\PHPStan\Rules\Methods; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Methods\PrivateInFinalClassRule * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier + * + * @extends Testing\RuleTestCase */ -final class PrivateInFinalClassRuleTest extends Test\Integration\AbstractTestCase +final class PrivateInFinalClassRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'abstract-class-with-protected-method' => __DIR__ . '/../../Fixture/Methods/PrivateInFinalClassRule/Success/AbstractClassWithProtectedMethod.php', - 'class-with-protected-method' => __DIR__ . '/../../Fixture/Methods/PrivateInFinalClassRule/Success/ClassWithProtectedMethod.php', - 'final-class-with-private-method' => __DIR__ . '/../../Fixture/Methods/PrivateInFinalClassRule/Success/FinalClassWithPrivateMethod.php', - 'final-class-with-protected-method-extending-class-extending-class-with-same-protected-method' => __DIR__ . '/../../Fixture/Methods/PrivateInFinalClassRule/Success/FinalClassWithProtectedMethodExtendingClassExtendingClassWithSameProtectedMethod.php', - 'final-class-with-protected-method-extending-class-with-same-protected-method' => __DIR__ . '/../../Fixture/Methods/PrivateInFinalClassRule/Success/FinalClassWithProtectedMethodExtendingClassWithSameProtectedMethod.php', - 'final-class-with-protected-method-from-trait' => __DIR__ . '/../../Fixture/Methods/PrivateInFinalClassRule/Success/FinalClassWithProtectedMethodFromTrait.php', - 'final-class-with-public-method' => __DIR__ . '/../../Fixture/Methods/PrivateInFinalClassRule/Success/FinalClassWithPublicMethod.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + use Test\Util\Helper; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testPrivateInFinalClassRule(): void { - $paths = [ - 'anonymous-class-with-protected-method' => [ - __DIR__ . '/../../Fixture/Methods/PrivateInFinalClassRule/Failure/AnonymousClassWithProtectedMethod.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Methods/PrivateInFinalClassRule'), + [ [ 'Method method() in anonymous class is protected, but since the containing class is final, it can be private.', 8, ], - ], - 'final-class-with-protected-method' => [ - __DIR__ . '/../../Fixture/Methods/PrivateInFinalClassRule/Failure/FinalClassWithProtectedMethod.php', [ \sprintf( 'Method %s::method() is protected, but since the containing class is final, it can be private.', - Test\Fixture\Methods\PrivateInFinalClassRule\Failure\FinalClassWithProtectedMethod::class, + Test\Fixture\Methods\PrivateInFinalClassRule\FinalClassWithProtectedMethod::class, + ), + 9, + ], + [ + \sprintf( + 'Method %s::method() is protected, but since the containing class is final, it can be private.', + Test\Fixture\Methods\PrivateInFinalClassRule\FinalClassWithProtectedMethodFromTrait::class, ), 9, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Methods\PrivateInFinalClassRule(); diff --git a/test/Integration/Statements/NoSwitchRuleTest.php b/test/Integration/Statements/NoSwitchRuleTest.php index 24e62d77..eb615f5d 100644 --- a/test/Integration/Statements/NoSwitchRuleTest.php +++ b/test/Integration/Statements/NoSwitchRuleTest.php @@ -15,59 +15,37 @@ use Ergebnis\PHPStan\Rules\Statements; use Ergebnis\PHPStan\Rules\Test; -use PhpParser\Node; use PHPStan\Rules; +use PHPStan\Testing; /** * @covers \Ergebnis\PHPStan\Rules\Statements\NoSwitchRule * + * @extends \PHPStan\Testing\RuleTestCase + * * @uses \Ergebnis\PHPStan\Rules\ErrorIdentifier */ -final class NoSwitchRuleTest extends Test\Integration\AbstractTestCase +final class NoSwitchRuleTest extends Testing\RuleTestCase { - public static function provideCasesWhereAnalysisShouldSucceed(): iterable - { - $paths = [ - 'isset-not-used' => __DIR__ . '/../../Fixture/Statements/NoSwitchRule/Success/switch-not-used.php', - ]; - - foreach ($paths as $description => $path) { - yield $description => [ - $path, - ]; - } - } + use Test\Util\Helper; - public static function provideCasesWhereAnalysisShouldFail(): iterable + public function testNoSwitchRule(): void { - $paths = [ - 'switch-used-with-correct-case' => [ - __DIR__ . '/../../Fixture/Statements/NoSwitchRule/Failure/switch-used-with-correct-case.php', + $this->analyse( + self::phpFilesIn(__DIR__ . '/../../Fixture/Statements/NoSwitchRule'), + [ [ 'Control structures using switch should not be used.', 7, ], - ], - 'switch-used-with-incorrect-case' => [ - __DIR__ . '/../../Fixture/Statements/NoSwitchRule/Failure/switch-used-with-incorrect-case.php', [ 'Control structures using switch should not be used.', 7, ], ], - ]; - - foreach ($paths as $description => [$path, $error]) { - yield $description => [ - $path, - $error, - ]; - } + ); } - /** - * @return Rules\Rule - */ protected function getRule(): Rules\Rule { return new Statements\NoSwitchRule(); diff --git a/test/Util/Helper.php b/test/Util/Helper.php new file mode 100644 index 00000000..ec2004da --- /dev/null +++ b/test/Util/Helper.php @@ -0,0 +1,35 @@ + + */ + private static function phpFilesIn(string $directory): array + { + $finder = Finder\Finder::create() + ->files() + ->in($directory) + ->name('/\.php$/') + ->sortByName(); + + return \array_map(static function (Finder\SplFileInfo $fileInfo): string { + return $fileInfo->getPathname(); + }, \iterator_to_array($finder, false)); + } +}