1111
1212use Webmozart \Glob \Glob ;
1313use function array_map ;
14+ use PHPUnit \Util \FileMatcherRegex ;
1415
1516/**
1617 * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
@@ -23,12 +24,12 @@ final class SourceFilter
2324 private Source $ source ;
2425
2526 /**
26- * @var list<string >
27+ * @var list<FileMatcherRegex >
2728 */
2829 private array $ includeDirectoryRegexes ;
2930
3031 /**
31- * @var list<string >
32+ * @var list<FileMatcherRegex >
3233 */
3334 private array $ excludeDirectoryRegexes ;
3435
@@ -49,11 +50,11 @@ public function __construct(Source $source)
4950 $ this ->source = $ source ;
5051 $ this ->includeDirectoryRegexes = array_map (static function (FilterDirectory $ directory )
5152 {
52- return Glob::toRegEx (self ::toGlob ($ directory ));
53+ return [ $ directory , Glob::toRegEx (self ::toGlob ($ directory ))] ;
5354 }, $ source ->includeDirectories ()->asArray ());
5455 $ this ->excludeDirectoryRegexes = array_map (static function (FilterDirectory $ directory )
5556 {
56- return Glob::toRegEx (self ::toGlob ($ directory ));
57+ return [ $ directory , Glob::toRegEx (self ::toGlob ($ directory ))] ;
5758 }, $ source ->excludeDirectories ()->asArray ());
5859 }
5960
@@ -63,14 +64,16 @@ public function __construct(Source $source)
6364 public function includes (string $ path ): bool
6465 {
6566 $ included = false ;
67+ $ dirPath = dirname ($ path ) . '/ ' ;
68+ $ filename = basename ($ path );
6669 foreach ($ this ->source ->includeFiles () as $ file ) {
6770 if ($ file ->path () === $ path ) {
6871 $ included = true ;
6972 }
7073 }
7174
72- foreach ($ this ->includeDirectoryRegexes as $ directoryRegex ) {
73- if (preg_match ($ directoryRegex , $ path )) {
75+ foreach ($ this ->includeDirectoryRegexes as [ $ directory , $ directoryRegex] ) {
76+ if (preg_match ($ directoryRegex , $ dirPath ) && self :: filenameMatches ( $ directory , $ filename )) {
7477 $ included = true ;
7578 }
7679 }
@@ -81,8 +84,8 @@ public function includes(string $path): bool
8184 }
8285 }
8386
84- foreach ($ this ->excludeDirectoryRegexes as $ directoryRegex ) {
85- if (preg_match ($ directoryRegex , $ path )) {
87+ foreach ($ this ->excludeDirectoryRegexes as [ $ directory , $ directoryRegex] ) {
88+ if (preg_match ($ directoryRegex , $ dirPath ) && self :: filenameMatches ( $ directory , $ filename )) {
8689 $ included = false ;
8790 }
8891 }
@@ -92,7 +95,12 @@ public function includes(string $path): bool
9295
9396 public static function toGlob (FilterDirectory $ directory ): string
9497 {
95- $ glob = sprintf ('%s/**/%s*%s ' , $ directory ->path (), $ directory -> prefix (), $ directory -> suffix ());
98+ $ glob = sprintf ('%s/**/* ' , $ directory ->path ());
9699 return $ glob ;
97100 }
101+
102+ private static function filenameMatches (FilterDirectory $ directory , string $ filename ): bool
103+ {
104+ return str_starts_with ($ filename , $ directory ->prefix ()) && str_ends_with ($ filename , $ directory ->suffix ());
105+ }
98106}
0 commit comments