$violations * @return list */ function fixtureRelative(array $violations): array { return array_map(fn (string $violation): string => str_replace(realpath(GUARD_FIXTURES).'/', '', $violation), $violations); } it('finds what compiles to nothing', function () { expect(fixtureRelative(DesignGuard::scan(realpath(GUARD_FIXTURES))->violations()))->toBe([ 'app/Status.php:14 colour the theme does not declare `text-red-500`', 'views/page.blade.php:3 daisyUI class `card`', 'views/page.blade.php:6 daisyUI class `btn-primary`', 'views/page.blade.php:4 unknown Material Symbol `o-home`', 'views/page.blade.php:5 unknown Material Symbol `not_a_symbol`', 'views/page.blade.php:9 Blade directive `@class` inside a component tag, where it does not compile', 'views/page.blade.php:2 maryUI component `forbidColours(['tertiary']) ->violations()); expect($violations)->toContain('views/page.blade.php:7 colour the theme does not declare `text-tertiary`'); }); it('bans any further pattern', function () { $violations = fixtureRelative(DesignGuard::scan(realpath(GUARD_FIXTURES.'/views')) ->forbid('/\bfocus-ring\b/', 'a retired utility') ->violations()); expect($violations)->toContain('views/page.blade.php:7 a retired utility'); }); it('passes the package\'s own views', function () { expect(DesignGuard::scan([__DIR__.'/../../resources/views', __DIR__.'/../../resources/js', __DIR__.'/../../src'])->violations()) ->toBe([]); });