expectException(\InvalidArgumentException::class); Slug::random(3); } /** * @return array */ public static function slugValidationProvider(): array { return [ 'einfach' => ['messe2026', true], 'mit Bindestrich' => ['messe-2026-halle-3', true], 'nur Ziffern' => ['12345', true], 'einzelnes Zeichen' => ['a', true], 'leer' => ['', false], 'Grossbuchstaben' => ['Messe2026', false], 'Umlaut' => ['grüße', false], 'Leerzeichen' => ['messe 2026', false], 'Unterstrich' => ['messe_2026', false], 'Punkt' => ['messe.2026', false], 'Slash' => ['messe/2026', false], 'fuehrender Bindestrich' => ['-messe', false], 'abschliessender Bindestrich' => ['messe-', false], 'doppelter Bindestrich' => ['messe--2026', false], 'reserviert admin' => ['admin', false], 'reserviert login' => ['login', false], 'zu lang' => [str_repeat('a', 65), false], 'maximale Laenge' => [str_repeat('a', 64), true], ]; } /** * @dataProvider slugValidationProvider */ public function testValidation(string $slug, bool $expected): void { self::assertSame($expected, Slug::isValid($slug)); self::assertSame($expected, Slug::validationError($slug) === null); } public function testNormalizeCreatesUsableSlugs(): void { self::assertSame('messe-2026', Slug::normalize('Messe 2026')); self::assertSame('gruesse-aus-muenchen', Slug::normalize('Grüße aus München')); self::assertSame('a-b', Slug::normalize('--a---b--')); self::assertSame('strasse', Slug::normalize('Straße')); self::assertSame('', Slug::normalize(' ')); } public function testNormalizedInputIsAlwaysValidOrEmpty(): void { foreach (['Messe 2026', 'Grüße!', 'a/b/c', '###', 'Test_Fall'] as $input) { $normalized = Slug::normalize($input); if ($normalized !== '') { self::assertTrue(Slug::isValid($normalized), $input . ' -> ' . $normalized); } } } }