diff --git a/src/Twig/Functions/IconExtension.php b/src/Twig/Functions/IconExtension.php index 7dc26a1..c1e0c76 100644 --- a/src/Twig/Functions/IconExtension.php +++ b/src/Twig/Functions/IconExtension.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Pcm\IconBundle\Twig\Functions; +use Exception; use InvalidArgumentException; use Twig\Extension\AbstractExtension; use Twig\TwigFunction; @@ -18,7 +19,7 @@ final class IconExtension extends AbstractExtension 'size' => self::DEFAULT_SIZE ]; - public function __construct(private array $directories) + public function __construct(private array $directories, private array $palletes) { if (empty($this->directories)) throw new InvalidArgumentException('Directories array must contain at least one path!'); @@ -28,6 +29,21 @@ final class IconExtension extends AbstractExtension if ($dirsContainNonString) throw new \TypeError('Directories array must only contain strings!'); + + if (empty($this->palletes)) + throw new InvalidArgumentException('Palletes array must contain at least one pallet!'); + + $pelletesContainNonarray = array_reduce($this->palletes, + fn($notArray, $path) => $notArray || !is_array($path)); + + if ($pelletesContainNonarray) + throw new \TypeError('Palletes array must only contain arrays!'); + + foreach ($this->palletes as $pallete) { + if (!(array_key_exists('stroke', $pallete) && array_key_exists('fill', $pallete))) { + throw new \Exception('Palletes must contain a "stroke" and "fill" key!'); + } + } } /** diff --git a/tests/Twig/Functions/IconExtensionTest.php b/tests/Twig/Functions/IconExtensionTest.php index b444a29..dbb1d8b 100644 --- a/tests/Twig/Functions/IconExtensionTest.php +++ b/tests/Twig/Functions/IconExtensionTest.php @@ -10,11 +10,24 @@ use Pcm\IconBundle\Tests\TestKernel; use Pcm\IconBundle\Twig\Functions\IconExtension; use Pcm\IconBundle\Twig\Functions\IconNotFound; use PHPUnit\Framework\TestCase; +use TypeError; class IconExtensionTest extends TestCase { private const ICON = 'test'; + private const PALLETES = [ + 'primary' => [ + 'stroke' => 'stroke-primary', + 'fill' => 'fill-primary' + ], + + 'white' => [ + 'stroke' => 'stroke-white', + 'fill' => 'fill-white' + ], + ]; + /** * @var IconExtension */ @@ -22,7 +35,7 @@ class IconExtensionTest extends TestCase protected function setUp(): void { - $this->icon = new IconExtension(['tests/icons']); + $this->icon = new IconExtension(['tests/icons'], self::PALLETES); } public function testInstanceOf(): void @@ -33,20 +46,19 @@ class IconExtensionTest extends TestCase public function testThrowsIfDirectoriesIsEmpty(): void { $this->expectException(\InvalidArgumentException::class); - new IconExtension([]); + new IconExtension([], self::PALLETES); } public function testThrowsIfDirectoriesContainsNonString(): void { $this->expectException(\TypeError::class); - new IconExtension([99]); + new IconExtension([99], self::PALLETES); } - public function testThrowsIfDirectoriesContainsNonStringAmongStrings(): void { $this->expectException(\TypeError::class); - new IconExtension(['string', 99, 'string']); + new IconExtension(['string', 99, 'string'], self::PALLETES); } public function testThrowsWhenPassedAnInvalidIconName(): void @@ -152,4 +164,34 @@ class IconExtensionTest extends TestCase $timesMatched = preg_match_all($heightRegex, $content); $this->assertSame(1, $timesMatched); } + + public function testThrowsIfPalletsIsEmpty(): void + { + $this->expectException(\InvalidArgumentException::class); + new IconExtension(['/'], []); + } + + public function testThrowsIfPalletesContainsNonArray(): void + { + $this->expectException(\TypeError::class); + new IconExtension(['/'], [99]); + } + + public function testThrowsIfPalletesContainsNonArrayInbetweenArrays(): void + { + $this->expectException(\TypeError::class); + new IconExtension(['/'], [[], 99, []]); + } + + public function testThrowsIfChildArrayDoesntContainStrokeKey(): void + { + $this->expectException(\Exception::class); + new IconExtension(['/'], [['fill' => '']]); + } + + public function testThrowsIfChildArrayDoesntContainFillKey(): void + { + $this->expectException(\Exception::class); + new IconExtension(['/'], [['stroke' => '']]); + } }