mirror of
https://github.com/pestphp/pest.git
synced 2026-06-05 02:52:12 +02:00
wip
This commit is contained in:
@ -26,8 +26,8 @@ final readonly class BootSubscribers implements Bootstrapper
|
|||||||
Subscribers\EnsureKernelDumpIsFlushed::class,
|
Subscribers\EnsureKernelDumpIsFlushed::class,
|
||||||
Subscribers\EnsureTeamCityEnabled::class,
|
Subscribers\EnsureTeamCityEnabled::class,
|
||||||
Subscribers\EnsureTiaIsRunningPestTestsOnly::class,
|
Subscribers\EnsureTiaIsRunningPestTestsOnly::class,
|
||||||
Subscribers\EnsureTiaCoverageIsRecorded::class,
|
Subscribers\EnsureTiaStarts::class,
|
||||||
Subscribers\EnsureTiaCoverageIsFlushed::class,
|
Subscribers\EnsureTiaEnds::class,
|
||||||
Subscribers\EnsureTiaResultsAreCollected::class,
|
Subscribers\EnsureTiaResultsAreCollected::class,
|
||||||
Subscribers\EnsureTiaResultIsRecordedOnPassed::class,
|
Subscribers\EnsureTiaResultIsRecordedOnPassed::class,
|
||||||
Subscribers\EnsureTiaResultIsRecordedOnFailed::class,
|
Subscribers\EnsureTiaResultIsRecordedOnFailed::class,
|
||||||
|
|||||||
@ -1391,7 +1391,7 @@ private bool $piggybackCoverage = false;
|
|||||||
$coverage = Container::getInstance()->get(Coverage::class);
|
$coverage = Container::getInstance()->get(Coverage::class);
|
||||||
assert($coverage instanceof Coverage);
|
assert($coverage instanceof Coverage);
|
||||||
|
|
||||||
return $coverage->coverage === true;
|
return $coverage->coverage;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -4,7 +4,6 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Pest\Plugins\Tia;
|
namespace Pest\Plugins\Tia;
|
||||||
|
|
||||||
use Composer\InstalledVersions;
|
|
||||||
use Pest\Exceptions\BaselineFetchFailed;
|
use Pest\Exceptions\BaselineFetchFailed;
|
||||||
use Pest\Panic;
|
use Pest\Panic;
|
||||||
use Pest\Plugins\Tia;
|
use Pest\Plugins\Tia;
|
||||||
@ -94,7 +93,7 @@ final readonly class BaselineSync
|
|||||||
if ($payload === null) {
|
if ($payload === null) {
|
||||||
if ($failureKind === 'no-runs' || $failureKind === null) {
|
if ($failureKind === 'no-runs' || $failureKind === null) {
|
||||||
$this->startCooldown();
|
$this->startCooldown();
|
||||||
$this->emitPublishInstructions($repo);
|
$this->emitPublishInstructions();
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -162,7 +161,7 @@ final readonly class BaselineSync
|
|||||||
return $seconds.'s';
|
return $seconds.'s';
|
||||||
}
|
}
|
||||||
|
|
||||||
private function emitPublishInstructions(string $repo): void
|
private function emitPublishInstructions(): void
|
||||||
{
|
{
|
||||||
if ($this->isCi()) {
|
if ($this->isCi()) {
|
||||||
$this->renderBadge('INFO', 'No baseline yet — this run will produce one.');
|
$this->renderBadge('INFO', 'No baseline yet — this run will produce one.');
|
||||||
@ -170,23 +169,8 @@ final readonly class BaselineSync
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$yaml = $this->isLaravel()
|
|
||||||
? $this->laravelWorkflowYaml()
|
|
||||||
: $this->genericWorkflowYaml();
|
|
||||||
|
|
||||||
$this->renderBadge('WARN', 'No baseline published yet — recording locally.');
|
$this->renderBadge('WARN', 'No baseline published yet — recording locally.');
|
||||||
$this->renderChild('To share the baseline with your team, add this workflow to the repo:');
|
$this->renderChild('See https://pestphp.com/docs/tia for how to publish one from CI.');
|
||||||
$this->renderChild('.github/workflows/tia-baseline.yml');
|
|
||||||
|
|
||||||
$indentedYaml = array_map(
|
|
||||||
static fn (string $line): string => ' '.$line,
|
|
||||||
explode("\n", $yaml),
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->output->writeln(['', ...$indentedYaml, '']);
|
|
||||||
|
|
||||||
$this->renderChild(sprintf('Commit, push, then run once: gh workflow run tia-baseline.yml -R %s', $repo));
|
|
||||||
$this->renderChild('Details: https://pestphp.com/docs/tia');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function isCi(): bool
|
private function isCi(): bool
|
||||||
@ -196,79 +180,6 @@ final readonly class BaselineSync
|
|||||||
|| getenv('CIRCLECI') === 'true';
|
|| getenv('CIRCLECI') === 'true';
|
||||||
}
|
}
|
||||||
|
|
||||||
private function isLaravel(): bool
|
|
||||||
{
|
|
||||||
return class_exists(InstalledVersions::class)
|
|
||||||
&& InstalledVersions::isInstalled('laravel/framework');
|
|
||||||
}
|
|
||||||
|
|
||||||
private function laravelWorkflowYaml(): string
|
|
||||||
{
|
|
||||||
return <<<'YAML'
|
|
||||||
name: TIA Baseline
|
|
||||||
on:
|
|
||||||
push: { branches: [main] }
|
|
||||||
schedule: [{ cron: '0 3 * * *' }]
|
|
||||||
workflow_dispatch:
|
|
||||||
jobs:
|
|
||||||
baseline:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 0 }
|
|
||||||
- uses: shivammathur/setup-php@v2
|
|
||||||
with:
|
|
||||||
php-version: '8.4'
|
|
||||||
coverage: xdebug
|
|
||||||
extensions: json, dom, curl, libxml, mbstring, zip, pdo, pdo_sqlite, sqlite3, bcmath, intl
|
|
||||||
- run: cp .env.example .env
|
|
||||||
- run: composer install --no-interaction --prefer-dist
|
|
||||||
- run: php artisan key:generate
|
|
||||||
- run: ./vendor/bin/pest --parallel --tia --coverage
|
|
||||||
- name: Stage baseline for upload
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
mkdir -p .pest-tia-baseline
|
|
||||||
cp -R "$HOME/.pest/tia"/*/. .pest-tia-baseline/
|
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: pest-tia-baseline
|
|
||||||
path: .pest-tia-baseline/
|
|
||||||
retention-days: 30
|
|
||||||
YAML;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function genericWorkflowYaml(): string
|
|
||||||
{
|
|
||||||
return <<<'YAML'
|
|
||||||
name: TIA Baseline
|
|
||||||
on:
|
|
||||||
push: { branches: [main] }
|
|
||||||
schedule: [{ cron: '0 3 * * *' }]
|
|
||||||
workflow_dispatch:
|
|
||||||
jobs:
|
|
||||||
baseline:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with: { fetch-depth: 0 }
|
|
||||||
- uses: shivammathur/setup-php@v2
|
|
||||||
with: { php-version: '8.4', coverage: xdebug }
|
|
||||||
- run: composer install --no-interaction --prefer-dist
|
|
||||||
- run: ./vendor/bin/pest --parallel --tia --coverage
|
|
||||||
- name: Stage baseline for upload
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
mkdir -p .pest-tia-baseline
|
|
||||||
cp -R "$HOME/.pest/tia"/*/. .pest-tia-baseline/
|
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: pest-tia-baseline
|
|
||||||
path: .pest-tia-baseline/
|
|
||||||
retention-days: 30
|
|
||||||
YAML;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function detectGitHubRepo(string $projectRoot): ?string
|
private function detectGitHubRepo(string $projectRoot): ?string
|
||||||
{
|
{
|
||||||
$gitConfig = $projectRoot.DIRECTORY_SEPARATOR.'.git'.DIRECTORY_SEPARATOR.'config';
|
$gitConfig = $projectRoot.DIRECTORY_SEPARATOR.'.git'.DIRECTORY_SEPARATOR.'config';
|
||||||
|
|||||||
@ -5,7 +5,6 @@ declare(strict_types=1);
|
|||||||
namespace Pest\Plugins\Tia;
|
namespace Pest\Plugins\Tia;
|
||||||
|
|
||||||
use PHPUnit\Runner\CodeCoverage as PhpUnitCodeCoverage;
|
use PHPUnit\Runner\CodeCoverage as PhpUnitCodeCoverage;
|
||||||
use ReflectionClass;
|
|
||||||
use Throwable;
|
use Throwable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -4,7 +4,6 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Pest\Plugins\Tia;
|
namespace Pest\Plugins\Tia;
|
||||||
|
|
||||||
use Pest\Factories\Attribute;
|
|
||||||
use Pest\Factories\TestCaseFactory;
|
use Pest\Factories\TestCaseFactory;
|
||||||
use Pest\Factories\TestCaseMethodFactory;
|
use Pest\Factories\TestCaseMethodFactory;
|
||||||
use Pest\Support\Container;
|
use Pest\Support\Container;
|
||||||
@ -1012,7 +1011,7 @@ final class Graph
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ($method->attributes as $attribute) {
|
foreach ($method->attributes as $attribute) {
|
||||||
if (! $attribute instanceof Attribute || $attribute->name !== Group::class) {
|
if ($attribute->name !== Group::class) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,7 @@ use PHPUnit\Event\Test\FinishedSubscriber;
|
|||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
final readonly class EnsureTiaCoverageIsFlushed implements FinishedSubscriber
|
final readonly class EnsureTiaEnds implements FinishedSubscriber
|
||||||
{
|
{
|
||||||
public function __construct(private Recorder $recorder) {}
|
public function __construct(private Recorder $recorder) {}
|
||||||
|
|
||||||
@ -12,7 +12,7 @@ use PHPUnit\Event\Test\PreparedSubscriber;
|
|||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
*/
|
*/
|
||||||
final readonly class EnsureTiaCoverageIsRecorded implements PreparedSubscriber
|
final readonly class EnsureTiaStarts implements PreparedSubscriber
|
||||||
{
|
{
|
||||||
public function __construct(private Recorder $recorder) {}
|
public function __construct(private Recorder $recorder) {}
|
||||||
|
|
||||||
@ -22,7 +22,7 @@ describe('of()', function () {
|
|||||||
describe('PHP files', function () {
|
describe('PHP files', function () {
|
||||||
it('produces the same hash regardless of whitespace differences', function () {
|
it('produces the same hash regardless of whitespace differences', function () {
|
||||||
$a = ContentHash::ofContent('a.php', "<?php \$foo = 1;\n\necho \$foo;");
|
$a = ContentHash::ofContent('a.php', "<?php \$foo = 1;\n\necho \$foo;");
|
||||||
$b = ContentHash::ofContent('a.php', "<?php \$foo=1; echo \$foo;");
|
$b = ContentHash::ofContent('a.php', '<?php $foo=1; echo $foo;');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
@ -56,8 +56,8 @@ describe('PHP files', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('detects code changes', function () {
|
it('detects code changes', function () {
|
||||||
$a = ContentHash::ofContent('a.php', "<?php \$foo = 1;");
|
$a = ContentHash::ofContent('a.php', '<?php $foo = 1;');
|
||||||
$b = ContentHash::ofContent('a.php', "<?php \$foo = 2;");
|
$b = ContentHash::ofContent('a.php', '<?php $foo = 2;');
|
||||||
|
|
||||||
expect($a)->not->toBe($b);
|
expect($a)->not->toBe($b);
|
||||||
});
|
});
|
||||||
@ -70,8 +70,8 @@ describe('PHP files', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('treats variable renames as a change', function () {
|
it('treats variable renames as a change', function () {
|
||||||
$a = ContentHash::ofContent('a.php', "<?php \$foo = 1;");
|
$a = ContentHash::ofContent('a.php', '<?php $foo = 1;');
|
||||||
$b = ContentHash::ofContent('a.php', "<?php \$bar = 1;");
|
$b = ContentHash::ofContent('a.php', '<?php $bar = 1;');
|
||||||
|
|
||||||
expect($a)->not->toBe($b);
|
expect($a)->not->toBe($b);
|
||||||
});
|
});
|
||||||
@ -92,43 +92,43 @@ describe('PHP files', function () {
|
|||||||
|
|
||||||
describe('Blade files', function () {
|
describe('Blade files', function () {
|
||||||
it('strips blade comments', function () {
|
it('strips blade comments', function () {
|
||||||
$a = ContentHash::ofContent('a.blade.php', "<div>{{-- a comment --}}Hello</div>");
|
$a = ContentHash::ofContent('a.blade.php', '<div>{{-- a comment --}}Hello</div>');
|
||||||
$b = ContentHash::ofContent('a.blade.php', "<div>Hello</div>");
|
$b = ContentHash::ofContent('a.blade.php', '<div>Hello</div>');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('strips multi-line blade comments', function () {
|
it('strips multi-line blade comments', function () {
|
||||||
$a = ContentHash::ofContent('a.blade.php', "<div>\n{{--\n multi\n line\n--}}\nHello\n</div>");
|
$a = ContentHash::ofContent('a.blade.php', "<div>\n{{--\n multi\n line\n--}}\nHello\n</div>");
|
||||||
$b = ContentHash::ofContent('a.blade.php', "<div> Hello </div>");
|
$b = ContentHash::ofContent('a.blade.php', '<div> Hello </div>');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('collapses whitespace', function () {
|
it('collapses whitespace', function () {
|
||||||
$a = ContentHash::ofContent('a.blade.php', "<div>\n Hello\n World\n</div>");
|
$a = ContentHash::ofContent('a.blade.php', "<div>\n Hello\n World\n</div>");
|
||||||
$b = ContentHash::ofContent('a.blade.php', "<div> Hello World </div>");
|
$b = ContentHash::ofContent('a.blade.php', '<div> Hello World </div>');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('detects content changes', function () {
|
it('detects content changes', function () {
|
||||||
$a = ContentHash::ofContent('a.blade.php', "<div>Hello</div>");
|
$a = ContentHash::ofContent('a.blade.php', '<div>Hello</div>');
|
||||||
$b = ContentHash::ofContent('a.blade.php', "<div>Goodbye</div>");
|
$b = ContentHash::ofContent('a.blade.php', '<div>Goodbye</div>');
|
||||||
|
|
||||||
expect($a)->not->toBe($b);
|
expect($a)->not->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('keeps blade directives intact', function () {
|
it('keeps blade directives intact', function () {
|
||||||
$a = ContentHash::ofContent('a.blade.php', "@if(\$user)Hi @endif");
|
$a = ContentHash::ofContent('a.blade.php', '@if($user)Hi @endif');
|
||||||
$b = ContentHash::ofContent('a.blade.php', "@if(\$user)Bye @endif");
|
$b = ContentHash::ofContent('a.blade.php', '@if($user)Bye @endif');
|
||||||
|
|
||||||
expect($a)->not->toBe($b);
|
expect($a)->not->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not use the PHP tokenizer for blade files', function () {
|
it('does not use the PHP tokenizer for blade files', function () {
|
||||||
$a = ContentHash::ofContent('a.blade.php', "<?php // not stripped ?> hello");
|
$a = ContentHash::ofContent('a.blade.php', '<?php // not stripped ?> hello');
|
||||||
$b = ContentHash::ofContent('a.blade.php', "<?php ?> hello");
|
$b = ContentHash::ofContent('a.blade.php', '<?php ?> hello');
|
||||||
|
|
||||||
expect($a)->not->toBe($b);
|
expect($a)->not->toBe($b);
|
||||||
});
|
});
|
||||||
@ -137,70 +137,70 @@ describe('Blade files', function () {
|
|||||||
describe('JavaScript-like files', function () {
|
describe('JavaScript-like files', function () {
|
||||||
it('strips line comments', function () {
|
it('strips line comments', function () {
|
||||||
$a = ContentHash::ofContent('a.js', "// a comment\nconst foo = 1;");
|
$a = ContentHash::ofContent('a.js', "// a comment\nconst foo = 1;");
|
||||||
$b = ContentHash::ofContent('a.js', "const foo = 1;");
|
$b = ContentHash::ofContent('a.js', 'const foo = 1;');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('strips block comments on their own lines', function () {
|
it('strips block comments on their own lines', function () {
|
||||||
$a = ContentHash::ofContent('a.js', "/* block */\nconst foo = 1;");
|
$a = ContentHash::ofContent('a.js', "/* block */\nconst foo = 1;");
|
||||||
$b = ContentHash::ofContent('a.js', "const foo = 1;");
|
$b = ContentHash::ofContent('a.js', 'const foo = 1;');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('collapses whitespace', function () {
|
it('collapses whitespace', function () {
|
||||||
$a = ContentHash::ofContent('a.js', "const foo = 1;\n\nconst bar = 2;");
|
$a = ContentHash::ofContent('a.js', "const foo = 1;\n\nconst bar = 2;");
|
||||||
$b = ContentHash::ofContent('a.js', "const foo = 1; const bar = 2;");
|
$b = ContentHash::ofContent('a.js', 'const foo = 1; const bar = 2;');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('detects code changes', function () {
|
it('detects code changes', function () {
|
||||||
$a = ContentHash::ofContent('a.js', "const foo = 1;");
|
$a = ContentHash::ofContent('a.js', 'const foo = 1;');
|
||||||
$b = ContentHash::ofContent('a.js', "const foo = 2;");
|
$b = ContentHash::ofContent('a.js', 'const foo = 2;');
|
||||||
|
|
||||||
expect($a)->not->toBe($b);
|
expect($a)->not->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not strip inline trailing comments', function () {
|
it('does not strip inline trailing comments', function () {
|
||||||
$a = ContentHash::ofContent('a.js', "const foo = 1; // inline");
|
$a = ContentHash::ofContent('a.js', 'const foo = 1; // inline');
|
||||||
$b = ContentHash::ofContent('a.js', "const foo = 1;");
|
$b = ContentHash::ofContent('a.js', 'const foo = 1;');
|
||||||
|
|
||||||
expect($a)->not->toBe($b);
|
expect($a)->not->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('applies the same rules to .ts files', function () {
|
it('applies the same rules to .ts files', function () {
|
||||||
$a = ContentHash::ofContent('a.ts', "// comment\nconst foo: number = 1;");
|
$a = ContentHash::ofContent('a.ts', "// comment\nconst foo: number = 1;");
|
||||||
$b = ContentHash::ofContent('a.ts', "const foo: number = 1;");
|
$b = ContentHash::ofContent('a.ts', 'const foo: number = 1;');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('applies the same rules to .tsx files', function () {
|
it('applies the same rules to .tsx files', function () {
|
||||||
$a = ContentHash::ofContent('a.tsx', "// comment\nconst Foo = () => <div/>;");
|
$a = ContentHash::ofContent('a.tsx', "// comment\nconst Foo = () => <div/>;");
|
||||||
$b = ContentHash::ofContent('a.tsx', "const Foo = () => <div/>;");
|
$b = ContentHash::ofContent('a.tsx', 'const Foo = () => <div/>;');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('applies the same rules to .jsx files', function () {
|
it('applies the same rules to .jsx files', function () {
|
||||||
$a = ContentHash::ofContent('a.jsx', "// comment\nconst Foo = () => <div/>;");
|
$a = ContentHash::ofContent('a.jsx', "// comment\nconst Foo = () => <div/>;");
|
||||||
$b = ContentHash::ofContent('a.jsx', "const Foo = () => <div/>;");
|
$b = ContentHash::ofContent('a.jsx', 'const Foo = () => <div/>;');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('applies the same rules to .vue files', function () {
|
it('applies the same rules to .vue files', function () {
|
||||||
$a = ContentHash::ofContent('a.vue', "<script>\n// comment\nexport default {}\n</script>");
|
$a = ContentHash::ofContent('a.vue', "<script>\n// comment\nexport default {}\n</script>");
|
||||||
$b = ContentHash::ofContent('a.vue', "<script> export default {} </script>");
|
$b = ContentHash::ofContent('a.vue', '<script> export default {} </script>');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('applies the same rules to .svelte files', function () {
|
it('applies the same rules to .svelte files', function () {
|
||||||
$a = ContentHash::ofContent('a.svelte', "<script>\n// comment\nlet foo = 1;\n</script>");
|
$a = ContentHash::ofContent('a.svelte', "<script>\n// comment\nlet foo = 1;\n</script>");
|
||||||
$b = ContentHash::ofContent('a.svelte', "<script> let foo = 1; </script>");
|
$b = ContentHash::ofContent('a.svelte', '<script> let foo = 1; </script>');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
@ -208,7 +208,7 @@ describe('JavaScript-like files', function () {
|
|||||||
it('applies the same rules to .mjs, .cjs, and .mts files', function () {
|
it('applies the same rules to .mjs, .cjs, and .mts files', function () {
|
||||||
foreach (['mjs', 'cjs', 'mts'] as $ext) {
|
foreach (['mjs', 'cjs', 'mts'] as $ext) {
|
||||||
$a = ContentHash::ofContent("a.$ext", "// comment\nexport const foo = 1;");
|
$a = ContentHash::ofContent("a.$ext", "// comment\nexport const foo = 1;");
|
||||||
$b = ContentHash::ofContent("a.$ext", "export const foo = 1;");
|
$b = ContentHash::ofContent("a.$ext", 'export const foo = 1;');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
}
|
}
|
||||||
@ -217,22 +217,22 @@ describe('JavaScript-like files', function () {
|
|||||||
|
|
||||||
describe('unknown extensions', function () {
|
describe('unknown extensions', function () {
|
||||||
it('hashes the raw content for unknown extensions', function () {
|
it('hashes the raw content for unknown extensions', function () {
|
||||||
$a = ContentHash::ofContent('a.txt', "hello world");
|
$a = ContentHash::ofContent('a.txt', 'hello world');
|
||||||
$b = ContentHash::ofContent('a.txt', "hello world");
|
$b = ContentHash::ofContent('a.txt', 'hello world');
|
||||||
|
|
||||||
expect($a)->toBe($b);
|
expect($a)->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not normalise whitespace for unknown extensions', function () {
|
it('does not normalise whitespace for unknown extensions', function () {
|
||||||
$a = ContentHash::ofContent('a.txt', "hello world");
|
$a = ContentHash::ofContent('a.txt', 'hello world');
|
||||||
$b = ContentHash::ofContent('a.txt', "hello world");
|
$b = ContentHash::ofContent('a.txt', 'hello world');
|
||||||
|
|
||||||
expect($a)->not->toBe($b);
|
expect($a)->not->toBe($b);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not strip comments for unknown extensions', function () {
|
it('does not strip comments for unknown extensions', function () {
|
||||||
$a = ContentHash::ofContent('a.txt', "// not a comment here\nhello");
|
$a = ContentHash::ofContent('a.txt', "// not a comment here\nhello");
|
||||||
$b = ContentHash::ofContent('a.txt', "hello");
|
$b = ContentHash::ofContent('a.txt', 'hello');
|
||||||
|
|
||||||
expect($a)->not->toBe($b);
|
expect($a)->not->toBe($b);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user