Skip to content

Commit 784dff9

Browse files
committed
Accept traits in the class filter
1 parent 8d00113 commit 784dff9

File tree

6 files changed

+61
-27
lines changed

6 files changed

+61
-27
lines changed

src/Support/Configuration/AbstractConfiguration.php

-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ abstract class AbstractConfiguration implements ConfigurationContract
1616
*/
1717
private ?array $paths = null;
1818

19-
/**
20-
* @var bool
21-
*/
2219
private ?bool $coveredOnly = null;
2320

2421
/**

src/Support/MutationGenerator.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,11 @@ private function doesNotContainClassToMutate(string $contents, array $classesToM
154154
$namespace = preg_quote(implode('\\', $parts));
155155
$classOrNamespace = preg_quote($classOrNamespace);
156156

157-
if (preg_match("/namespace\\s+$namespace/", $contents) === 1 && preg_match("/class\\s+$class.*/", $contents) === 1) {
157+
if (preg_match("/namespace\\s+$namespace/", $contents) === 1 && preg_match("/(?:class|trait)\\s+$class.*/", $contents) === 1) {
158158
return false;
159159
}
160160

161-
if (preg_match("/class\\s+$class\[{\\s*\]/", $contents) === 1) {
161+
if (preg_match("/(?:class|trait)\\s+$class\[{\\s*\]/", $contents) === 1) {
162162
return false;
163163
}
164164

tests/Fixtures/Classes/SizeHelper.php

+4
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
44

55
namespace Tests\Fixtures\Classes;
66

7+
use Tests\Fixtures\Traits\SizeHelperTrait;
8+
79
class SizeHelper
810
{
11+
use SizeHelperTrait;
12+
913
public static function isBig(int $size): bool
1014
{
1115
return $size >= 100;
+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Tests\Fixtures\Traits;
6+
7+
trait SizeHelperTrait
8+
{
9+
public static function isSmall(int $size): bool
10+
{
11+
return $size < 100;
12+
}
13+
}

tests/Unit/MutationGeneratorTest.php

+20
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Symfony\Component\Finder\SplFileInfo;
1111
use Tests\Fixtures\Classes\AgeHelper;
1212
use Tests\Fixtures\Classes\SizeHelper;
13+
use Tests\Fixtures\Traits\SizeHelperTrait;
1314

1415
beforeEach(function (): void {
1516
$this->generator = new MutationGenerator;
@@ -102,6 +103,25 @@ classesToMutate: $classes,
102103
[[SizeHelper::class, AgeHelper::class], 2],
103104
]);
104105

106+
it('generates mutations for the given file if it contains the given trait', function (array $classes, int $expectedCount): void {
107+
$mutations = $this->generator->generate(
108+
file: new SplFileInfo(dirname(__DIR__).'/Fixtures/Traits/SizeHelperTrait.php', '', ''),
109+
mutators: [SmallerToSmallerOrEqual::class],
110+
classesToMutate: $classes,
111+
);
112+
113+
expect($mutations)
114+
->toBeArray()
115+
->toHaveCount($expectedCount);
116+
})->with([
117+
[[SizeHelperTrait::class], 1],
118+
[[SizeHelper::class], 0],
119+
[[SizeHelperTrait::class, SizeHelper::class], 1],
120+
[['SizeHelperTrait'], 1],
121+
[['Tests\\Fixtures\\Traits\\SizeHelperTrai'], 1],
122+
[['Invalid\\Namespace\\SizeHelperTrait'], 0],
123+
]);
124+
105125
it('ignores lines with the ignore annotation', function (): void {
106126
$mutations = ($this->generate)(<<<'PHP'
107127
<?php

tests/Unit/Support/FileFinderTest.php

+22-22
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66

77
it('finds all files in a directory', function (): void {
88
expect(FileFinder::files(['tests/Fixtures'], []))
9-
->toHaveCount(2)
10-
->getIterator()->current()->getRealPath()->toEndWith('AgeHelper.php');
9+
->toHaveCount(3)
10+
->getIterator()->current()->getRealPath()->toEndWith('SizeHelperTrait.php');
1111

1212
expect(FileFinder::files([getcwd().'/tests/Fixtures'], []))
13-
->toHaveCount(2)
14-
->getIterator()->current()->getRealPath()->toEndWith('AgeHelper.php');
13+
->toHaveCount(3)
14+
->getIterator()->current()->getRealPath()->toEndWith('SizeHelperTrait.php');
1515
});
1616

1717
it('finds files by path', function (): void {
@@ -22,71 +22,71 @@
2222

2323
it('excludes a file by full path', function (): void {
2424
expect(FileFinder::files(['tests/Fixtures'], ['tests/Fixtures/Classes/AgeHelper.php']))
25-
->toHaveCount(1)
26-
->getIterator()->current()->getRealPath()->toEndWith('SizeHelper.php');
25+
->toHaveCount(2)
26+
->getIterator()->current()->getRealPath()->toEndWith('SizeHelperTrait.php');
2727
});
2828

2929
it('excludes a file by relative path', function (): void {
3030
expect(FileFinder::files(['tests/Fixtures'], ['Classes/AgeHelper.php']))
31-
->toHaveCount(1)
32-
->getIterator()->current()->getRealPath()->toEndWith('SizeHelper.php');
31+
->toHaveCount(2)
32+
->getIterator()->current()->getRealPath()->toEndWith('SizeHelperTrait.php');
3333
});
3434

3535
it('excludes a file by pattern', function (): void {
3636
expect(FileFinder::files(['tests/Fixtures'], ['Classes/Age*.php']))
37-
->toHaveCount(1)
38-
->getIterator()->current()->getRealPath()->toEndWith('SizeHelper.php');
37+
->toHaveCount(2)
38+
->getIterator()->current()->getRealPath()->toEndWith('SizeHelperTrait.php');
3939
});
4040

4141
it('excludes a file by pattern ending with an asterisk', function (): void {
4242
expect(FileFinder::files(['tests/Fixtures'], ['Classes/Age*']))
43-
->toHaveCount(1)
44-
->getIterator()->current()->getRealPath()->toEndWith('SizeHelper.php');
43+
->toHaveCount(2)
44+
->getIterator()->current()->getRealPath()->toEndWith('SizeHelperTrait.php');
4545
});
4646

4747
it('does not exclude files with an incomplete path', function (): void {
4848
expect(FileFinder::files(['tests/Fixtures'], ['Classes/Age']))
49-
->toHaveCount(2);
49+
->toHaveCount(3);
5050
});
5151

5252
it('excludes a directory by full path', function (): void {
53-
expect(FileFinder::files(['tests/Fixtures'], ['tests/Fixtures/Classes']))
53+
expect(FileFinder::files(['tests/Fixtures'], ['tests/Fixtures/Classes', 'tests/Fixtures/Traits']))
5454
->toBeEmpty();
5555
});
5656

5757
it('excludes a directory by relative path', function (): void {
58-
expect(FileFinder::files(['tests/Fixtures'], ['Classes']))
58+
expect(FileFinder::files(['tests/Fixtures'], ['Classes', 'Traits']))
5959
->toBeEmpty();
6060

61-
expect(FileFinder::files(['tests/Fixtures'], ['Classes/']))
61+
expect(FileFinder::files(['tests/Fixtures'], ['Classes/', 'Traits/']))
6262
->toBeEmpty();
6363
});
6464

6565
it('excludes a directory by pattern', function (): void {
66-
expect(FileFinder::files(['tests/Fixtures'], ['tests/*/Classes']))
66+
expect(FileFinder::files(['tests/Fixtures'], ['tests/*/Classes', 'tests/*/Traits']))
6767
->toBeEmpty();
6868
});
6969

7070
it('excludes a directory by pattern with multiple wildcards', function (): void {
71-
expect(FileFinder::files(['tests/Fixtures'], ['*/*/Classes']))
71+
expect(FileFinder::files(['tests/Fixtures'], ['*/*/Classes', '*/*/Traits']))
7272
->toBeEmpty();
7373
});
7474

7575
it('excludes a directory by pattern with double asterisk wildcard', function (): void {
76-
expect(FileFinder::files(['tests/Fixtures'], ['**/Classes']))
76+
expect(FileFinder::files(['tests/Fixtures'], ['**/Classes', '**/Traits']))
7777
->toBeEmpty();
7878
});
7979

8080
it('excludes by absolute path', function (): void {
81-
expect(FileFinder::files(['tests/Fixtures'], ['/tests/Fixtures/Classes']))
81+
expect(FileFinder::files(['tests/Fixtures'], ['/tests/Fixtures/Classes', '/tests/Fixtures/Traits']))
8282
->toBeEmpty();
8383

84-
expect(FileFinder::files(['tests/Fixtures'], [getcwd().'/tests/Fixtures/Classes']))
84+
expect(FileFinder::files(['tests/Fixtures'], [getcwd().'/tests/Fixtures/Classes', getcwd().'/tests/Fixtures/Traits']))
8585
->toBeEmpty();
8686

8787
expect(FileFinder::files(['tests/Fixtures'], ['/tests/Fixtures/Invalid']))
8888
->not->toBeEmpty();
8989

9090
expect(FileFinder::files(['tests/Fixtures'], ['/tests/Fixtures/Classes/AgeHelper.php']))
91-
->toHaveCount(1);
91+
->toHaveCount(2);
9292
});

0 commit comments

Comments
 (0)