packages/deriver/tests/Unit/Finder/DirectoryScanTest.php
1<?php
2
3declare (strict_types=1);
4
5namespace Tests\Unit\Finder;
6
7use Deriver\Finder\DirectoryScan;
8use Deriver\Finder\PathPattern;
9use org\bovigo\vfs\vfsStream;
10use org\bovigo\vfs\vfsStreamDirectory;
11use org\bovigo\vfs\vfsStreamFile;
12use Override;
13use PHPUnit\Framework\Attributes\CoversClass;
14use PHPUnit\Framework\Attributes\Small;
15use PHPUnit\Framework\Attributes\UsesClass;
16use PHPUnit\Framework\TestCase;
17
18#[CoversClass(DirectoryScan::class)]
19#[UsesClass(PathPattern::class)]
20#[Small]
21final class DirectoryScanTest extends TestCase
22{
23 /**
24 * @throws \org\bovigo\vfs\vfsStreamException
25 */
26 public function testFilesPruneExcludedDirectoriesAndSymbolicLinks(): void
27 {
28 $root = vfsStream::setup('project', null, ['keep.php' => '', 'skip' => ['sub' => ['file.php' => '']]]);
29 /** vfsStream has no link targets; link mode exercises lstat-based pruning. */
30 (new class ('alias.php') extends vfsStreamFile {
31 #[Override]
32 public function getType(): int
33 {
34 return 0120000;
35 }
36 })->at($root);
37 (new class ('loop') extends vfsStreamDirectory {
38 #[Override]
39 public function getType(): int
40 {
41 return 0120000;
42 }
43 })->at($root);
44 self::assertTrue(is_link($root->url() . '/alias.php'));
45 self::assertTrue(is_link($root->url() . '/loop'));
46 $files = (new DirectoryScan())->files($root->url(), [], [new PathPattern('skip')]);
47 self::assertSame([$root->url() . '/keep.php'], iterator_to_array($files, false));
48 }
49}
50