mirror of
https://github.com/pestphp/pest.git
synced 2026-03-06 15:57:21 +01:00
89 lines
2.2 KiB
PHP
89 lines
2.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Pest\Bootstrappers;
|
|
|
|
use Pest\Contracts\Bootstrapper;
|
|
use Pest\Support\DatasetInfo;
|
|
use Pest\Support\Str;
|
|
use function Pest\testDirectory;
|
|
use Pest\TestSuite;
|
|
use RecursiveDirectoryIterator;
|
|
use RecursiveIteratorIterator;
|
|
use SebastianBergmann\FileIterator\Facade as PhpUnitFileIterator;
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
final class BootFiles implements Bootstrapper
|
|
{
|
|
/**
|
|
* The structure of the tests directory.
|
|
*
|
|
* @var array<int, string>
|
|
*/
|
|
private const STRUCTURE = [
|
|
'Expectations',
|
|
'Expectations.php',
|
|
'Helpers',
|
|
'Helpers.php',
|
|
'Pest.php',
|
|
];
|
|
|
|
/**
|
|
* Boots the structure of the tests directory.
|
|
*/
|
|
public function boot(): void
|
|
{
|
|
$rootPath = TestSuite::getInstance()->rootPath;
|
|
$testsPath = $rootPath.DIRECTORY_SEPARATOR.testDirectory();
|
|
|
|
foreach (self::STRUCTURE as $filename) {
|
|
$filename = sprintf('%s%s%s', $testsPath, DIRECTORY_SEPARATOR, $filename);
|
|
|
|
if (! file_exists($filename)) {
|
|
continue;
|
|
}
|
|
|
|
if (is_dir($filename)) {
|
|
$directory = new RecursiveDirectoryIterator($filename);
|
|
$iterator = new RecursiveIteratorIterator($directory);
|
|
/** @var \DirectoryIterator $file */
|
|
foreach ($iterator as $file) {
|
|
$this->load($file->__toString());
|
|
}
|
|
} else {
|
|
$this->load($filename);
|
|
}
|
|
}
|
|
|
|
$this->bootDatasets($testsPath);
|
|
}
|
|
|
|
/**
|
|
* Loads, if possible, the given file.
|
|
*/
|
|
private function load(string $filename): void
|
|
{
|
|
if (! Str::endsWith($filename, '.php')) {
|
|
return;
|
|
}
|
|
if (! file_exists($filename)) {
|
|
return;
|
|
}
|
|
include_once $filename;
|
|
}
|
|
|
|
private function bootDatasets(string $testsPath): void
|
|
{
|
|
$files = (new PhpUnitFileIterator)->getFilesAsArray($testsPath, '.php');
|
|
|
|
foreach ($files as $file) {
|
|
if (DatasetInfo::isADatasetsFile($file) || DatasetInfo::isInsideADatasetsDirectory($file)) {
|
|
$this->load($file);
|
|
}
|
|
}
|
|
}
|
|
}
|