From 3f7bf3ed699d6211935f09cef83c0d7974bfe9f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Andr=C3=A9?= Date: Sat, 3 Feb 2024 00:37:37 +0100 Subject: [PATCH] Id / Name utils (i'd put that on an Icon class, but this is another PR :angel:) I really would like to 1. normalize things as early as possible 2. don't have multiple place where those checks are done, the main risk beeing they are not done.. --- src/Icons/src/Svg/SvgUtils.php | 62 +++++++ src/Icons/tests/Unit/Svg/SvgUtilsTest.php | 191 ++++++++++++++++++++++ 2 files changed, 253 insertions(+) create mode 100644 src/Icons/src/Svg/SvgUtils.php create mode 100644 src/Icons/tests/Unit/Svg/SvgUtilsTest.php diff --git a/src/Icons/src/Svg/SvgUtils.php b/src/Icons/src/Svg/SvgUtils.php new file mode 100644 index 00000000000..23c288eef09 --- /dev/null +++ b/src/Icons/src/Svg/SvgUtils.php @@ -0,0 +1,62 @@ +assertSame($name, SvgUtils::idToName($id)); + } + + /** + * @dataProvider provideInvalidIds + */ + public function testIdToNameThrowsException(string $id) + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('The id "'.$id.'" is not a valid id.'); + + SvgUtils::idToName($id); + } + + /** + * @dataProvider provideNameToId + */ + public function testNameToId(string $name, string $id) + { + $this->assertEquals($id, SvgUtils::nameToId($name)); + } + + /** + * @dataProvider provideInvalidNames + */ + public function testNameToIdThrowsException(string $name) + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('The name "'.$name.'" is not a valid name.'); + + SvgUtils::nameToId($name); + } + + /** + * @dataProvider provideValidIds + */ + public function testIsValidIdWithValidIds(string $id): void + { + $this->assertTrue(SvgUtils::isValidId($id)); + } + + /** + * @dataProvider provideInvalidIds + */ + public function testIsValidIdWithInvalidIds(string $id): void + { + $this->assertFalse(SvgUtils::isValidId($id)); + } + + /** + * @dataProvider provideValidNames + */ + public function testIsValidNameWithValidNames(string $name): void + { + $this->assertTrue(SvgUtils::isValidName($name)); + } + + /** + * @dataProvider provideInvalidNames + */ + public function testIsValidNameWithInvalidNames(string $name): void + { + $this->assertFalse(SvgUtils::isValidName($name)); + } + + /** + * @dataProvider provideInvalidIds + */ + public function testInvalidIdToName(string $id) + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('The id "'.$id.'" is not a valid id.'); + + $this->assertFalse(SvgUtils::isValidId($id)); + SvgUtils::idToName($id); + } + + public static function provideIdToName(): iterable + { + yield from [ + ['foo', 'foo'], + ['foo-bar', 'foo-bar'], + ['foo-bar-baz', 'foo-bar-baz'], + ['foo--bar', 'foo:bar'], + ['foo--bar--baz', 'foo:bar:baz'], + ['foo-bar--baz', 'foo-bar:baz'], + ['foo--bar-baz', 'foo:bar-baz'], + ]; + } + + public static function provideNameToId(): iterable + { + yield from [ + ['foo', 'foo'], + ['foo-bar', 'foo-bar'], + ['foo-bar-baz', 'foo-bar-baz'], + ['foo:bar', 'foo--bar'], + ['foo:bar:baz', 'foo--bar--baz'], + ['foo-bar:baz', 'foo-bar--baz'], + ['foo:bar-baz', 'foo--bar-baz'], + ]; + } + + public static function provideValidIds(): iterable + { + yield from self::provideValidIdentifiers(); + yield from [ + ['foo--bar'], + ['foo--bar-baz'], + ['foo-bar--baz'], + ]; + } + + public static function provideInvalidIds(): iterable + { + yield from self::provideInvalidIdentifiers(); + yield from [ + ['foo:'], + [':foo'], + ['foo::bar'], + ]; + } + + public static function provideValidNames(): iterable + { + yield from self::provideValidIdentifiers(); + yield from [ + ['foo:bar-baz'], + ['foo:bar'], + ]; + } + + public static function provideInvalidNames(): iterable + { + yield from self::provideInvalidIdentifiers(); + yield from [ + ['foo:'], + [':foo'], + ['foo::bar'], + ['foo:::bar'], + ['foo::'], + ['::foo'], + ['foo--bar'], + ]; + } + + private static function provideValidIdentifiers(): iterable + { + yield from [ + ['foo'], + ['123'], + ['foo-bar'], + ['123-456'], + ]; + } + + private static function provideInvalidIdentifiers(): iterable + { + yield from [ + [''], + ['FOO'], + ['&'], + ['é'], + ['.'], + ['/'], + ['foo-'], + ['-bar'], + ['_'], + ['foo_bar'], + [' '], + ['foo '], + [' foo'], + ['🙂'], + ]; + } + +}