classes(Selector::inNamespace(self::ACTION_NAMESPACE)) ->shouldBeNamed( fqcn: '/^(?!.*Action$).*$/', regex: TRUE, ); } function test_action_classes_are_final(): Rule { return PHPat::rule() ->classes(Selector::inNamespace(self::ACTION_NAMESPACE)) ->shouldBeFinal(); } function test_action_classes_are_readonly(): Rule { return PHPat::rule() ->classes(Selector::inNamespace(self::ACTION_NAMESPACE)) ->shouldBeReadonly(); } function test_action_classes_are_invokeable(): Rule { return PHPat::rule() ->classes(Selector::inNamespace(self::ACTION_NAMESPACE)) ->shouldHaveOnlyOnePublicMethodNamed('__invoke'); } function test_action_classes_do_not_extend_other_classes(): Rule { return PHPat::rule() ->classes(Selector::inNamespace(self::ACTION_NAMESPACE)) ->shouldNotExtend() ->classes(Selector::all()); } function test_action_classes_do_not_implement_interfaces(): Rule { return PHPat::rule() ->classes(Selector::inNamespace(self::ACTION_NAMESPACE)) ->shouldNotImplement() ->classes(Selector::all()); } }