From 929c7545bb1e143534ba79b372985bca49f99db2 Mon Sep 17 00:00:00 2001 From: Oliver Vogel Date: Sat, 14 Oct 2023 14:33:12 +0200 Subject: [PATCH] Add color tests --- src/Colors/Cmyk/Color.php | 41 ++++---- src/Colors/Cmyk/Colorspace.php | 10 +- src/Colors/Rgb/Color.php | 44 +++------ src/Colors/Rgb/Colorspace.php | 21 ++++- src/Colors/Rgba/Channels/Alpha.php | 8 ++ src/Colors/Rgba/Channels/Blue.php | 10 ++ src/Colors/Rgba/Channels/Green.php | 10 ++ src/Colors/Rgba/Channels/Red.php | 10 ++ src/Colors/Rgba/Color.php | 94 +++++++++++++++++++ src/Colors/Rgba/Colorspace.php | 55 +++++++++++ src/Colors/Traits/CanHandleChannels.php | 34 +++++++ src/Interfaces/ColorInterface.php | 14 +-- src/Interfaces/ColorspaceInterface.php | 8 +- tests/Colors/Cmyk/ColorTest.php | 94 +++++++++++++++++++ tests/Colors/Cmyk/ColorspaceTest.php | 26 ++++++ tests/Colors/Rgb/ColorTest.php | 52 +++++++---- tests/Colors/Rgb/ColorspaceTest.php | 26 ++++++ tests/Colors/Rgba/ColorTest.php | 119 ++++++++++++++++++++++++ tests/Colors/Rgba/ColorspaceTest.php | 26 ++++++ 19 files changed, 623 insertions(+), 79 deletions(-) create mode 100644 src/Colors/Rgba/Channels/Alpha.php create mode 100644 src/Colors/Rgba/Channels/Blue.php create mode 100644 src/Colors/Rgba/Channels/Green.php create mode 100644 src/Colors/Rgba/Channels/Red.php create mode 100644 src/Colors/Rgba/Color.php create mode 100644 src/Colors/Rgba/Colorspace.php create mode 100644 src/Colors/Traits/CanHandleChannels.php create mode 100644 tests/Colors/Cmyk/ColorTest.php create mode 100644 tests/Colors/Cmyk/ColorspaceTest.php create mode 100644 tests/Colors/Rgb/ColorspaceTest.php create mode 100644 tests/Colors/Rgba/ColorTest.php create mode 100644 tests/Colors/Rgba/ColorspaceTest.php diff --git a/src/Colors/Cmyk/Color.php b/src/Colors/Cmyk/Color.php index 63b90b6d..26b423ea 100644 --- a/src/Colors/Cmyk/Color.php +++ b/src/Colors/Cmyk/Color.php @@ -9,24 +9,26 @@ use Intervention\Image\Colors\Cmyk\Channels\Key; use Intervention\Image\Colors\Cmyk\Colorspace as CmykColorspace; use Intervention\Image\Colors\Rgb\Color as RgbColor; use Intervention\Image\Colors\Rgb\Colorspace as RgbColorspace; +use Intervention\Image\Colors\Rgba\Colorspace as RgbaColorspace; +use Intervention\Image\Colors\Rgba\Color as RgbaColor; +use Intervention\Image\Colors\Traits\CanHandleChannels; use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\ColorspaceInterface; class Color implements ColorInterface { - protected array $channels; + use CanHandleChannels; - protected Cyan $cyan; - protected Magenta $magenta; - protected Yellow $yellow; - protected Key $key; + protected array $channels; public function __construct(int $c, int $m, int $y, int $k) { - $this->cyan = new Cyan($c); - $this->magenta = new Magenta($m); - $this->yellow = new Yellow($y); - $this->key = new Key($k); + $this->channels = [ + new Cyan($c), + new Magenta($m), + new Yellow($y), + new Key($k), + ]; } public function channels(): array @@ -36,22 +38,22 @@ class Color implements ColorInterface public function cyan(): Cyan { - return $this->cyan; + return $this->channel(Cyan::class); } public function magenta(): Magenta { - return $this->magenta; + return $this->channel(Magenta::class); } public function yellow(): Yellow { - return $this->yellow; + return $this->channel(Yellow::class); } public function key(): Key { - return $this->key; + return $this->channel(Key::class); } public function toArray(): array @@ -64,24 +66,29 @@ class Color implements ColorInterface ]; } - public function transformTo(string|ColorspaceInterface $colorspace): ColorInterface + public function convertTo(string|ColorspaceInterface $colorspace): ColorInterface { $colorspace = match (true) { is_object($colorspace) => $colorspace, default => new $colorspace(), }; - return $colorspace->transformColor($this); + return $colorspace->convertColor($this); } public function toRgb(): RgbColor { - return $this->transformTo(RgbColorspace::class); + return $this->convertTo(RgbColorspace::class); + } + + public function toRgba(): RgbaColor + { + return $this->convertTo(RgbaColorspace::class); } public function toCmyk(): self { - return $this->transformTo(CmykColorspace::class); + return $this->convertTo(CmykColorspace::class); } public function __toString(): string diff --git a/src/Colors/Cmyk/Colorspace.php b/src/Colors/Cmyk/Colorspace.php index 968bd023..69c6c82a 100644 --- a/src/Colors/Cmyk/Colorspace.php +++ b/src/Colors/Cmyk/Colorspace.php @@ -3,16 +3,22 @@ namespace Intervention\Image\Colors\Cmyk; use Intervention\Image\Colors\Rgb\Color as RgbColor; +use Intervention\Image\Colors\Rgba\Color as RgbaColor; use Intervention\Image\Colors\Cmyk\Color as CmykColor; use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\ColorspaceInterface; class Colorspace implements ColorspaceInterface { - public function transformColor(ColorInterface $color): ColorInterface + /** + * {@inheritdoc} + * + * @see ColorspaceInterface::convertColor() + */ + public function convertColor(ColorInterface $color): ColorInterface { return match (get_class($color)) { - RgbColor::class => $this->convertRgbColor($color), + RgbColor::class, RgbaColor::class => $this->convertRgbColor($color), default => $color, }; } diff --git a/src/Colors/Rgb/Color.php b/src/Colors/Rgb/Color.php index 18be0fc2..644b3936 100644 --- a/src/Colors/Rgb/Color.php +++ b/src/Colors/Rgb/Color.php @@ -4,15 +4,20 @@ namespace Intervention\Image\Colors\Rgb; use Intervention\Image\Colors\Cmyk\Color as CmykColor; use Intervention\Image\Colors\Cmyk\Colorspace as CmykColorspace; +use Intervention\Image\Colors\Rgba\Colorspace as RgbaColorspace; use Intervention\Image\Colors\Rgb\Channels\Blue; use Intervention\Image\Colors\Rgb\Channels\Green; use Intervention\Image\Colors\Rgb\Channels\Red; +use Intervention\Image\Colors\Rgba\Color as RgbaColor; +use Intervention\Image\Colors\Traits\CanHandleChannels; use Intervention\Image\Interfaces\ColorChannelInterface; use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\ColorspaceInterface; class Color implements ColorInterface { + use CanHandleChannels; + protected array $channels; public function __construct(int $r, int $g, int $b) @@ -24,20 +29,6 @@ class Color implements ColorInterface ]; } - public function channels(): array - { - return $this->channels; - } - - public function channel(string $classname): ColorChannelInterface - { - $channels = array_filter($this->channels(), function (ColorChannelInterface $channel) use ($classname) { - return is_a($channel, $classname); - }); - - return reset($channels); - } - public function red(): Red { return $this->channel(Red::class); @@ -60,13 +51,6 @@ class Color implements ColorInterface }, $this->channels()); } - public function normalize(): array - { - return array_map(function (ColorChannelInterface $channel) { - return $channel->normalize(); - }, $this->channels()); - } - public function toHex(string $prefix = ''): string { return sprintf( @@ -78,29 +62,29 @@ class Color implements ColorInterface ); } - public function toRgb(): Color + public function toRgb(): self { return $this; } - public function toInt(): int - { - return $this->red()->value() * 256 * 256 + $this->green()->value() * 256 + $this->blue()->value(); - } - - public function transformTo(string|ColorspaceInterface $colorspace): ColorInterface + public function convertTo(string|ColorspaceInterface $colorspace): ColorInterface { $colorspace = match (true) { is_object($colorspace) => $colorspace, default => new $colorspace(), }; - return $colorspace->transformColor($this); + return $colorspace->convertColor($this); } public function toCmyk(): CmykColor { - return $this->transformTo(CmykColorspace::class); + return $this->convertTo(CmykColorspace::class); + } + + public function toRgba(): RgbaColor + { + return $this->convertTo(RgbaColorspace::class); } public function __toString(): string diff --git a/src/Colors/Rgb/Colorspace.php b/src/Colors/Rgb/Colorspace.php index fd28b1e9..489df51d 100644 --- a/src/Colors/Rgb/Colorspace.php +++ b/src/Colors/Rgb/Colorspace.php @@ -3,15 +3,17 @@ namespace Intervention\Image\Colors\Rgb; use Intervention\Image\Colors\Cmyk\Color as CmykColor; +use Intervention\Image\Colors\Rgba\Color as RgbaColor; use Intervention\Image\Interfaces\ColorInterface; use Intervention\Image\Interfaces\ColorspaceInterface; class Colorspace implements ColorspaceInterface { - public function transformColor(ColorInterface $color): ColorInterface + public function convertColor(ColorInterface $color): ColorInterface { - return match ($color) { + return match (get_class($color)) { CmykColor::class => $this->convertCmykColor($color), + RgbaColor::class => $this->convertRgbaColor($color), default => $color, }; } @@ -19,9 +21,18 @@ class Colorspace implements ColorspaceInterface protected function convertCmykColor(CmykColor $color): Color { return new Color( - (int) (255 * (1 - $color->cyan()->value()) * (1 - $color->key()->value())), - (int) (255 * (1 - $color->magenta()->value()) * (1 - $color->key()->value())), - (int) (255 * (1 - $color->yellow()->value()) * (1 - $color->key()->value())), + (int) (255 * (1 - $color->cyan()->normalize()) * (1 - $color->key()->normalize())), + (int) (255 * (1 - $color->magenta()->normalize()) * (1 - $color->key()->normalize())), + (int) (255 * (1 - $color->yellow()->normalize()) * (1 - $color->key()->normalize())), + ); + } + + protected function convertRgbaColor(RgbaColor $color): Color + { + return new Color( + $color->red()->value(), + $color->green()->value(), + $color->blue()->value() ); } } diff --git a/src/Colors/Rgba/Channels/Alpha.php b/src/Colors/Rgba/Channels/Alpha.php new file mode 100644 index 00000000..46d3a152 --- /dev/null +++ b/src/Colors/Rgba/Channels/Alpha.php @@ -0,0 +1,8 @@ +channels = [ + new Red($r), + new Green($g), + new Blue($b), + new Alpha($a), + ]; + } + + public function red(): Red + { + return $this->channel(Red::class); + } + + public function green(): Green + { + return $this->channel(Green::class); + } + + public function blue(): Blue + { + return $this->channel(Blue::class); + } + + public function alpha(): Alpha + { + return $this->channel(Alpha::class); + } + + public function isFullyOpaque(): bool + { + return $this->alpha()->value() === 255; + } + + public function toHex(string $prefix = ''): string + { + if ($this->isFullyOpaque()) { + return parent::toHex($prefix); + } + + return sprintf( + '%s%02x%02x%02x%02x', + $prefix, + $this->red()->value(), + $this->green()->value(), + $this->blue()->value(), + $this->alpha()->value() + ); + } + + public function toRgb(): RgbColor + { + return $this->convertTo(RgbColorspace::class); + } + + public function toRgba(): self + { + return $this; + } + + public function toCmyk(): CmykColor + { + return $this->convertTo(CmykColorspace::class); + } + + public function __toString(): string + { + return sprintf( + 'rgba(%d, %d, %d, %.1F)', + $this->red()->value(), + $this->green()->value(), + $this->blue()->value(), + $this->alpha()->normalize(), + ); + } +} diff --git a/src/Colors/Rgba/Colorspace.php b/src/Colors/Rgba/Colorspace.php new file mode 100644 index 00000000..28b53f83 --- /dev/null +++ b/src/Colors/Rgba/Colorspace.php @@ -0,0 +1,55 @@ + $this->convertCmykColor($color), + RgbColor::class => $this->convertRgbColor($color), + default => $color, + }; + } + + /** + * Convert given color to the RGBA colorspace + * + * @param RgbColor $color + * @return Color + */ + protected function convertRgbColor(RgbColor $color): Color + { + return new Color( + $color->red()->value(), + $color->green()->value(), + $color->blue()->value(), + 255 + ); + } + + /** + * Convert given color to the RGBA colorspace + * + * @param CmykColor $color + * @return Color + */ + protected function convertCmykColor(CmykColor $color): Color + { + return new Color( + (int) (255 * (1 - $color->cyan()->normalize()) * (1 - $color->key()->normalize())), + (int) (255 * (1 - $color->magenta()->normalize()) * (1 - $color->key()->normalize())), + (int) (255 * (1 - $color->yellow()->normalize()) * (1 - $color->key()->normalize())), + 255 + ); + } +} diff --git a/src/Colors/Traits/CanHandleChannels.php b/src/Colors/Traits/CanHandleChannels.php new file mode 100644 index 00000000..bc231139 --- /dev/null +++ b/src/Colors/Traits/CanHandleChannels.php @@ -0,0 +1,34 @@ +channels; + } + + public function channel(string $classname): ColorChannelInterface + { + $channels = array_filter($this->channels(), function (ColorChannelInterface $channel) use ($classname) { + return get_class($channel) == $classname; + }); + + if (count($channels) == 0) { + throw new ColorException('Channel ' . $classname . ' could not be found.'); + } + + return reset($channels); + } + + public function normalize(): array + { + return array_map(function (ColorChannelInterface $channel) { + return $channel->normalize(); + }, $this->channels()); + } +} diff --git a/src/Interfaces/ColorInterface.php b/src/Interfaces/ColorInterface.php index 0953402d..1333e94b 100644 --- a/src/Interfaces/ColorInterface.php +++ b/src/Interfaces/ColorInterface.php @@ -2,18 +2,20 @@ namespace Intervention\Image\Interfaces; -use Intervention\Image\Colors\CmykColor; -use Intervention\Image\Colors\RgbColor; +use Intervention\Image\Colors\Cmyk\Color as CmykColor; +use Intervention\Image\Colors\Rgb\Color as RgbColor; +use Intervention\Image\Colors\Rgba\Color as RgbaColor; interface ColorInterface { + // public function toRgb(): RgbColor; + // public function toRgba(): RgbaColor; + // public function toCmyk(): CmykColor; + // public function channels(): array; // public function channel(string $classname): ColorChannelInterface; // public function colorspace(): ColorspaceInterface; - // public function toRgb(): RgbColor; - // public function toRgba(): RgbColor; - // public function toCmyk(): CmykColor; // public function toArray(): array; - // public function transformTo(string|ColorspaceInterface $colorspace): ColorInterface; + // public function convertTo(string|ColorspaceInterface $colorspace): ColorInterface; // public function __toString(): string; } diff --git a/src/Interfaces/ColorspaceInterface.php b/src/Interfaces/ColorspaceInterface.php index b1dc3bd1..a2bb37db 100644 --- a/src/Interfaces/ColorspaceInterface.php +++ b/src/Interfaces/ColorspaceInterface.php @@ -4,5 +4,11 @@ namespace Intervention\Image\Interfaces; interface ColorspaceInterface { - public function transformColor(ColorInterface $color): ColorInterface; + /** + * Convert given color to the format of the current colorspace + * + * @param ColorInterface $color + * @return ColorInterface + */ + public function convertColor(ColorInterface $color): ColorInterface; } diff --git a/tests/Colors/Cmyk/ColorTest.php b/tests/Colors/Cmyk/ColorTest.php new file mode 100644 index 00000000..2052480f --- /dev/null +++ b/tests/Colors/Cmyk/ColorTest.php @@ -0,0 +1,94 @@ +assertInstanceOf(Color::class, $color); + } + + public function testChannels(): void + { + $color = new Color(10, 20, 30, 40); + $this->assertIsArray($color->channels()); + $this->assertCount(4, $color->channels()); + } + + public function testChannel(): void + { + $color = new Color(10, 20, 30, 40); + $channel = $color->channel(Cyan::class); + $this->assertInstanceOf(Cyan::class, $channel); + $this->assertEquals(10, $channel->value()); + } + + public function testCyanMagentaYellowKey(): void + { + $color = new Color(10, 20, 30, 40); + $this->assertInstanceOf(Cyan::class, $color->cyan()); + $this->assertInstanceOf(Magenta::class, $color->magenta()); + $this->assertInstanceOf(Yellow::class, $color->yellow()); + $this->assertInstanceOf(Key::class, $color->key()); + $this->assertEquals(10, $color->cyan()->value()); + $this->assertEquals(20, $color->magenta()->value()); + $this->assertEquals(30, $color->yellow()->value()); + $this->assertEquals(40, $color->key()->value()); + } + + public function testToArray(): void + { + $color = new Color(10, 20, 30, 40); + $this->assertEquals([10, 20, 30, 40], $color->toArray()); + } + + public function testNormalize(): void + { + $color = new Color(100, 50, 20, 0); + $this->assertEquals([1.0, 0.5, 0.2, 0.0], $color->normalize()); + } + + public function testToString(): void + { + $color = new Color(100, 50, 20, 0); + $this->assertEquals('cmyk(100, 50, 20, 0)', (string) $color); + } + + public function testToCmyk(): void + { + $color = new Color(0, 0, 0, 0); + $converted = $color->toCmyk(); + $this->assertInstanceOf(Color::class, $converted); + } + + public function testToRgb(): void + { + $color = new Color(0, 20, 20, 0); + $converted = $color->toRgb(); + $this->assertInstanceOf(RgbColor::class, $converted); + $this->assertEquals([255, 204, 204], $converted->toArray()); + } + + public function testToRgba(): void + { + $color = new Color(0, 20, 20, 0); + $converted = $color->toRgba(); + $this->assertInstanceOf(RgbaColor::class, $converted); + $this->assertEquals([255, 204, 204, 255], $converted->toArray()); + } +} diff --git a/tests/Colors/Cmyk/ColorspaceTest.php b/tests/Colors/Cmyk/ColorspaceTest.php new file mode 100644 index 00000000..818269fc --- /dev/null +++ b/tests/Colors/Cmyk/ColorspaceTest.php @@ -0,0 +1,26 @@ +assertInstanceOf( + CmykColor::class, + $colorspace->convertColor( + new RgbColor(0, 0, 0) + ) + ); + } +} diff --git a/tests/Colors/Rgb/ColorTest.php b/tests/Colors/Rgb/ColorTest.php index 31e4436b..5c542fa7 100644 --- a/tests/Colors/Rgb/ColorTest.php +++ b/tests/Colors/Rgb/ColorTest.php @@ -2,6 +2,8 @@ namespace Intervention\Image\Tests\Colors\Rgb; +use Intervention\Image\Colors\Cmyk\Color as CmykColor; +use Intervention\Image\Colors\Rgba\Color as RgbaColor; use Intervention\Image\Colors\Rgb\Channels\Red; use Intervention\Image\Colors\Rgb\Channels\Green; use Intervention\Image\Colors\Rgb\Channels\Blue; @@ -65,18 +67,6 @@ class ColorTest extends TestCase $this->assertEquals([1.0, 0.0, 0.2], $color->normalize()); } - public function testToInt(): void - { - $color = new Color(0, 0, 0); - $this->assertEquals(0, $color->toInt()); - - $color = new Color(255, 255, 255); - $this->assertEquals(16777215, $color->toInt()); - - $color = new Color(181, 55, 23); - $this->assertEquals(11876119, $color->toInt()); - } - public function testToString(): void { $color = new Color(181, 55, 23); @@ -86,21 +76,47 @@ class ColorTest extends TestCase public function testToCmyk(): void { $color = new Color(0, 0, 0); - $this->assertEquals([0, 0, 0, 100], $color->toCmyk()->toArray()); + $converted = $color->toCmyk(); + $this->assertInstanceOf(CmykColor::class, $converted); + $this->assertEquals([0, 0, 0, 100], $converted->toArray()); $color = new Color(255, 255, 255); - $this->assertEquals([0, 0, 0, 0], $color->toCmyk()->toArray()); + $converted = $color->toCmyk(); + $this->assertInstanceOf(CmykColor::class, $converted); + $this->assertEquals([0, 0, 0, 0], $converted->toArray()); $color = new Color(255, 0, 0); - $this->assertEquals([0, 100, 100, 0], $color->toCmyk()->toArray()); + $converted = $color->toCmyk(); + $this->assertInstanceOf(CmykColor::class, $converted); + $this->assertEquals([0, 100, 100, 0], $converted->toArray()); $color = new Color(255, 0, 255); - $this->assertEquals([0, 100, 0, 0], $color->toCmyk()->toArray()); + $converted = $color->toCmyk(); + $this->assertInstanceOf(CmykColor::class, $converted); + $this->assertEquals([0, 100, 0, 0], $converted->toArray()); $color = new Color(255, 255, 0); - $this->assertEquals([0, 0, 100, 0], $color->toCmyk()->toArray()); + $converted = $color->toCmyk(); + $this->assertInstanceOf(CmykColor::class, $converted); + $this->assertEquals([0, 0, 100, 0], $converted->toArray()); $color = new Color(255, 204, 204); - $this->assertEquals([0, 20, 20, 0], $color->toCmyk()->toArray()); + $converted = $color->toCmyk(); + $this->assertInstanceOf(CmykColor::class, $converted); + $this->assertEquals([0, 20, 20, 0], $converted->toArray()); + } + + public function testToRgb(): void + { + $color = new Color(181, 55, 23); + $this->assertInstanceOf(Color::class, $color->toRgb()); + } + + public function testToRgba(): void + { + $color = new Color(181, 55, 23); + $converted = $color->toRgba(); + $this->assertInstanceOf(RgbaColor::class, $converted); + $this->assertEquals([181, 55, 23, 255], $converted->toArray()); } } diff --git a/tests/Colors/Rgb/ColorspaceTest.php b/tests/Colors/Rgb/ColorspaceTest.php new file mode 100644 index 00000000..be7808c5 --- /dev/null +++ b/tests/Colors/Rgb/ColorspaceTest.php @@ -0,0 +1,26 @@ +assertInstanceOf( + RgbColor::class, + $colorspace->convertColor( + new CmykColor(0, 0, 0, 0) + ) + ); + } +} diff --git a/tests/Colors/Rgba/ColorTest.php b/tests/Colors/Rgba/ColorTest.php new file mode 100644 index 00000000..cf9b9e61 --- /dev/null +++ b/tests/Colors/Rgba/ColorTest.php @@ -0,0 +1,119 @@ +assertInstanceOf(Color::class, $color); + } + + public function testChannels(): void + { + $color = new Color(10, 20, 30, 255); + $this->assertIsArray($color->channels()); + $this->assertCount(4, $color->channels()); + } + + public function testChannel(): void + { + $color = new Color(10, 20, 30, 255); + $channel = $color->channel(Red::class); + $this->assertInstanceOf(Red::class, $channel); + $this->assertEquals(10, $channel->value()); + $channel = $color->channel(Alpha::class); + $this->assertInstanceOf(Alpha::class, $channel); + $this->assertEquals(255, $channel->value()); + } + + public function testRedGreenBlueAlpha(): void + { + $color = new Color(10, 20, 30, 255); + $this->assertInstanceOf(Red::class, $color->red()); + $this->assertInstanceOf(Green::class, $color->green()); + $this->assertInstanceOf(Blue::class, $color->blue()); + $this->assertInstanceOf(Alpha::class, $color->alpha()); + $this->assertEquals(10, $color->red()->value()); + $this->assertEquals(20, $color->green()->value()); + $this->assertEquals(30, $color->blue()->value()); + $this->assertEquals(255, $color->alpha()->value()); + } + + public function testToArray(): void + { + $color = new Color(10, 20, 30, 255); + $this->assertEquals([10, 20, 30, 255], $color->toArray()); + } + + public function testToHex(): void + { + $color = new Color(181, 55, 23, 0); + $this->assertEquals('b5371700', $color->toHex()); + $this->assertEquals('#b5371700', $color->toHex('#')); + + $color = new Color(181, 55, 23, 255); + $this->assertEquals('b53717', $color->toHex()); + + $color = new Color(181, 55, 23, 204); + $this->assertEquals('b53717cc', $color->toHex()); + } + + public function testNormalize(): void + { + $color = new Color(255, 0, 51, 255); + $this->assertEquals([1.0, 0.0, 0.2, 1.0], $color->normalize()); + $color = new Color(255, 0, 51, 51); + $this->assertEquals([1.0, 0.0, 0.2, 0.2], $color->normalize()); + } + + public function testToString(): void + { + $color = new Color(255, 255, 255, 255); + $this->assertEquals('rgba(255, 255, 255, 1.0)', (string) $color); + + $color = new Color(10, 20, 30, 85); + $this->assertEquals('rgba(10, 20, 30, 0.3)', (string) $color); + } + + public function testToRgba(): void + { + $color = new Color(181, 55, 23, 120); + $converted = $color->toRgba(); + $this->assertInstanceOf(Color::class, $converted); + } + + public function testToRgb(): void + { + $color = new Color(181, 55, 23, 120); + $converted = $color->toRgb(); + $this->assertInstanceOf(RgbColor::class, $converted); + $this->assertEquals([181, 55, 23], $converted->toArray()); + } + + public function testToCmyk(): void + { + $color = new Color(0, 0, 0, 255); + $converted = $color->toCmyk(); + $this->assertInstanceOf(CmykColor::class, $converted); + $this->assertEquals([0, 0, 0, 100], $converted->toArray()); + + $color = new Color(0, 0, 0, 0); + $converted = $color->toCmyk(); + $this->assertInstanceOf(CmykColor::class, $converted); + $this->assertEquals([0, 0, 0, 100], $converted->toArray()); + } +} diff --git a/tests/Colors/Rgba/ColorspaceTest.php b/tests/Colors/Rgba/ColorspaceTest.php new file mode 100644 index 00000000..2ff88b0f --- /dev/null +++ b/tests/Colors/Rgba/ColorspaceTest.php @@ -0,0 +1,26 @@ +assertInstanceOf( + RgbaColor::class, + $colorspace->convertColor( + new CmykColor(0, 0, 0, 0) + ) + ); + } +}