3838use function str_contains ;
3939use function usort ;
4040
41+ use const PHP_VERSION_ID ;
42+
4143final class PluginTest extends TestCase
4244{
4345 private static bool $ initialized = false ;
@@ -57,16 +59,21 @@ protected function setUp(): void
5759 assert (is_string ($ cwd ));
5860 $ vendorDir = __DIR__ . '/sandbox ' ;
5961 $ filepath = "$ vendorDir/attributes.php " ;
62+ $ exclude = [
63+ "$ cwd/tests/Acme/PSR4/IncompatibleSignature.php "
64+ ];
65+
66+ if (PHP_VERSION_ID < 80100 ) {
67+ $ exclude [] = "$ cwd/tests/Acme81 " ;
68+ }
6069
6170 $ config = new Config (
6271 vendorDir: $ vendorDir ,
6372 attributesFile: $ filepath ,
6473 include : [
6574 "$ cwd/tests "
6675 ],
67- exclude: [
68- "$ cwd/tests/Acme/PSR4/IncompatibleSignature.php "
69- ],
76+ exclude: $ exclude ,
7077 useCache: false ,
7178 );
7279
@@ -258,6 +265,36 @@ public function testFilterTargetMethods(): void
258265 ], $ this ->collectMethods ($ actual ));
259266 }
260267
268+ /**
269+ * @requires PHP >= 8.1
270+ */
271+ public function testFilterTargetMethods81 (): void
272+ {
273+ $ expected = [
274+ new TargetMethod (
275+ new \Acme81 \Attribute \Route ('/:id ' , method: \Acme81 \Attribute \Method::GET ),
276+ \Acme81 \PSR4 \Presentation \ArticleController::class,
277+ 'show '
278+ ),
279+ new TargetMethod (
280+ new \Acme81 \Attribute \Get (),
281+ \Acme81 \PSR4 \Presentation \ArticleController::class,
282+ 'list '
283+ ),
284+ new TargetMethod (
285+ new \Acme81 \Attribute \Post (),
286+ \Acme81 \PSR4 \Presentation \ArticleController::class,
287+ 'new '
288+ ),
289+ ];
290+
291+ $ actual = Attributes::filterTargetMethods (
292+ Attributes::predicateForAttributeInstanceOf (\Acme81 \Attribute \Route::class)
293+ );
294+
295+ $ this ->assertEquals ($ expected , $ actual );
296+ }
297+
261298 public function testFilterTargetProperties (): void
262299 {
263300 $ actual = Attributes::filterTargetProperties (
0 commit comments