32 Commits
Author SHA1 Message Date
TorstenHettstedt 802eb706f9 Merge pull request 'clean-code' (#4) from clean-code into master
Reviewed-on: http://localhost:3000/TorstenHettstedt/PHP-Packages-Colors/pulls/4
2021-03-23 16:25:58 +01:00
Torstem_JetBrain 0642ffe48a Die Attribute von *PhpStorm* werden auch von *PhpStan* gefunden. 2021-03-23 16:14:37 +01:00
Torstem_JetBrain 0e033b1fbe Nutzung der Methode 'intdiv' nach Hinweisen von *PhpStan* überdacht. 2021-03-23 16:13:30 +01:00
Torstem_JetBrain 6a26eb4608 Rückgaben nach Hinweisen von *PhpStan* angepasst. 2021-03-23 16:12:35 +01:00
Torstem_JetBrain 15b425aa22 Definition der Parameter und Rückgaben im *PhpDoc*-Text wurde nach Hinweisen von *PhpStan* angepasst. 2021-03-23 15:57:30 +01:00
Torstem_JetBrain b363c26984 Die selbstgeschriebene Hilfsklasse wird mit überprüft. 2021-03-23 15:55:38 +01:00
Torstem_JetBrain f7899d9f1e Laut *PhpStan* hat die Rückgabe von Methoden in Testklassen gefehlt. 2021-03-23 15:45:03 +01:00
Torstem_JetBrain f890a9df67 Einbau von *PhpStan* 2021-03-23 15:13:13 +01:00
Torstem_JetBrain c3aa392997 Es wurde eine Empfehlung von *PhpStorm* entsprochen. 2021-03-23 14:56:09 +01:00
Torstem_JetBrain 5288425e8d Da bei allen Transformationen vom HSV-Farbmodell ausgegangen wird, ist es von Vorteil diese Klassen in einer abstrakten Klasse zusammenzufassen. 2021-03-23 14:52:32 +01:00
TorstenHettstedt 0e426b96e3 Merge pull request 'Die Berechnung von CMYK und RGB wurde angeglichen, um die Lesbarkeit zu erhöhen.' (#3) from fixed/berechnungen-verbessern into master
Reviewed-on: http://localhost:3000/TorstenHettstedt/PHP-Packages-Colors/pulls/3
2021-03-23 14:26:57 +01:00
Torstem_JetBrain 5ce7cf2552 Die Berechnung von CMYK und RGB wurde angeglichen, um die Lesbarkeit zu erhöhen. 2021-03-23 14:24:21 +01:00
TorstenHettstedt 753cac49c8 Merge pull request 'Entfernung nicht ausgeführten Codes und Dokumentation der Wertebereiche zur besseren Darstellung der möglichen Risiken.' (#2) from tests/weitere-farben into master
Reviewed-on: http://localhost:3000/TorstenHettstedt/PHP-Packages-Colors/pulls/2
2021-03-23 13:10:59 +01:00
Torstem_JetBrain 5e4f1f0bd8 Entfernung nicht ausgeführten Codes und Dokumentation der Wertebereiche zur besseren Darstellung der möglichen Risiken. 2021-03-23 13:05:45 +01:00
TorstenHettstedt 44314b264e Merge pull request 'tests/weitere-farben' (#1) from tests/weitere-farben into master
Reviewed-on: http://localhost:3000/TorstenHettstedt/PHP-Packages-Colors/pulls/1
2021-03-19 20:18:52 +01:00
Torstem_JetBrain 60c10f1d70 Es gab zuviele Stellen nach dem Komma 2021-03-19 20:18:15 +01:00
Torstem_JetBrain b6b366477d Tests um weitere unregelmäßige Farben erweitert. 2021-03-19 20:12:13 +01:00
Torstem_JetBrain 9c65840172 Um graue Farben erweitert. 2021-03-19 18:49:06 +01:00
Torstem_JetBrain a20355ccee Verbesserte Darstellung und Vervollständigung von Information-Seiten. 2021-03-19 17:43:50 +01:00
Torstem_JetBrain 6f17e57424 Einbau von Coverage. 2021-03-18 09:58:02 +01:00
Torstem_JetBrain 6ca23ee2eb Überprüfung des Codes per PHPStorm-Kontrolle ist erfolgreich. 2021-03-18 09:13:00 +01:00
Torstem_JetBrain 99c4e0dcc1 Namespaces der Testklassen war zu unterschiedlich vom Standard-Namespace. 2021-03-18 09:09:46 +01:00
Torstem_JetBrain 83eab10dd7 Die Provider-Klasse gehört in die Test-Helper. 2021-03-18 08:42:34 +01:00
Torstem_JetBrain ad2a7ddd16 Die Umwandlung von HSV zu CMYK ist erfolgreich. 2021-03-18 08:34:54 +01:00
Torstem_JetBrain c949643d26 Genauigkeit war nicht ausreichend. 2021-03-18 08:33:53 +01:00
Torstem_JetBrain 615cb0f655 Festlegung der Angabe des Farbkreises bei einem Vollkreis. Der Wert soll '0,0' lauten. 2021-03-11 15:04:38 +01:00
Torstem_JetBrain 6c4f5231c0 Definition aller Teilkreise und Sortierung der Grundfarben nach der Grad-Zahl im Farbkreis. 2021-03-11 14:55:54 +01:00
Torstem_JetBrain 9bc53ed768 Die Umwandlung von RGB zu HSV ist erfolgreich. Dabei musste die Genauigkeit angepasst werden. 2021-03-09 15:26:04 +01:00
Torstem_JetBrain f8868ddd37 Genauigkeit musste verbessert werden, da sonst die erwarteten Werte nicht erreicht werden können. 2021-03-09 14:46:55 +01:00
Torstem_JetBrain 435dff067f Grundaufbau ist vorhanden. Tests laufen noch nicht durch. 2021-03-09 14:26:19 +01:00
Torstem_JetBrain 692b8fa1c8 Tests für die erweiterten Umwandlung-Klassen geschrieben. 2021-03-09 13:59:28 +01:00
Torstem_JetBrain c832f0344c Die Daten der 'DataProvider' unterscheiden sich zu wenig. Es ist besser die Erzeugung der Daten in eine Klasse auszulagern. 2021-03-09 13:39:26 +01:00
20 changed files with 1016 additions and 312 deletions
+3 -1
View File
@@ -13,4 +13,6 @@ Die Klassen haben keinen Alphakanal.
## Hinweise zu den Transformer-Klassen
Das Vorgehen der Umwandlung nimmt die Informationen von [Wikipedia - Liste der Farbräume](https://de.wikipedia.org/wiki/Liste_der_Farbr%C3%A4ume) auf.
Das Vorgehen der Umwandlung nimmt die Informationen von
[Wikipedia - Liste der Farbräume](https://de.wikipedia.org/wiki/Liste_der_Farbr%C3%A4ume)
und [Die Chemie-Schule - HSV-Farbraum](https://www.chemie-schule.de/KnowHow/HSV-Farbraum) auf.
+14
View File
@@ -0,0 +1,14 @@
paths:
tests: tests
output: tests/_output
data: tests/_data
support: tests/_support
envs: tests/_envs
actor_suffix: Tester
extensions:
enabled:
- Codeception\Extension\RunFailed
coverage:
enabled: true
include:
- src/*
+8 -4
View File
@@ -16,15 +16,19 @@
},
"autoload-dev": {
"psr-4": {
"TorstenHettstedtUnitTests\\Colors\\" : "tests/unit"
"TorstenHettstedt\\Colors\\Tests\\Unit\\" : "tests/unit",
"TorstenHettstedt\\Colors\\Tests\\Helper\\" : "tests/_support/Helper"
}
},
"require": {
"php": "^8.0"
"php": "^8.0",
"phpunit/php-code-coverage": "^9.2",
"jetbrains/phpstorm-attributes": "^1.0.0"
},
"require-dev": {
"codeception/codeception": "^4.1.18",
"codeception/module-phpbrowser": "^1.0.0",
"codeception/module-asserts": "^1.0.0"
"codeception/module-asserts": "^1.0.0",
"phpstan/phpstan" : "^0.12.82"
}
}
}
+6
View File
@@ -0,0 +1,6 @@
parameters:
level: 6
paths:
- src
- tests/unit
- tests/_support/Helper
+1 -1
View File
@@ -8,7 +8,7 @@ use InvalidArgumentException;
abstract class AbstractColorModel
{
protected function checkValue(float $value)
protected function checkValue(float $value): void
{
if ($value > 1.0) {
throw new InvalidArgumentException('Ein Wert größer als 1 ist nicht definierbar.');
@@ -0,0 +1,41 @@
<?php
namespace TorstenHettstedt\Colors\Transformer;
use TorstenHettstedt\Colors\ColorModels\CyanMagentaYellowKey;
use TorstenHettstedt\Colors\ColorModels\HueSaturationValue;
use TorstenHettstedt\Colors\ColorModels\RedGreenBlue;
class HueSaturationValueTransformer implements ColorModelTransformInterface
{
protected HueSaturationValue $color;
/**
* @param HueSaturationValue $color
*/
public function __construct(HueSaturationValue $color)
{
$this->color = $color;
}
public function toRedGreenBlue(): RedGreenBlue
{
$utility = new Utilities\HueSaturationValueToRedGreenBlue($this->color);
return $utility->convert();
}
public function toCyanMagentaYellowKey(): CyanMagentaYellowKey
{
$utility = new Utilities\HueSaturationValueToCyanMagentaYellowKey($this->color);
return $utility->convert();
}
public function toHueSaturationValue(): HueSaturationValue
{
return clone $this->color;
}
}
@@ -0,0 +1,42 @@
<?php
namespace TorstenHettstedt\Colors\Transformer;
use TorstenHettstedt\Colors\ColorModels\CyanMagentaYellowKey;
use TorstenHettstedt\Colors\ColorModels\HueSaturationValue;
use TorstenHettstedt\Colors\ColorModels\RedGreenBlue;
class RedGreenBlueTransformer implements ColorModelTransformInterface
{
protected RedGreenBlue $color;
/**
* @param RedGreenBlue $color
*/
public function __construct(RedGreenBlue $color)
{
$this->color = $color;
}
public function toRedGreenBlue(): RedGreenBlue
{
return clone $this->color;
}
public function toCyanMagentaYellowKey(): CyanMagentaYellowKey
{
$hsv_color = (new Utilities\RedGreenBlueToHueSaturationValue($this->color))->convert();
$utility = new Utilities\HueSaturationValueToCyanMagentaYellowKey($hsv_color);
return $utility->convert();
}
public function toHueSaturationValue(): HueSaturationValue
{
$utility = new Utilities\RedGreenBlueToHueSaturationValue($this->color);
return $utility->convert();
}
}
@@ -0,0 +1,61 @@
<?php
namespace TorstenHettstedt\Colors\Transformer\Utilities;
use TorstenHettstedt\Colors\ColorModels\HueSaturationValue;
abstract class AbstractHueSaturationValueToUtility
{
/** @var int : Größe des Intervals in 1/100 Grad */
protected const INTERVAL = 60.0 * 100.0;
// Daten für HSV
/** @var float : Definition des Farbton als Anteil eines Vollkreises '$Hue * π' */
protected float $hue;
/** @var float : Anteil am Vollkreis in 1/100 Grad */
protected float $hueAsPercentGrad;
/** @var float : Definition der Sättigung der Farbe */
protected float $saturation;
/** @var float : Definition der Helligkeit der Farbe */
protected float $value;
/**
* HueSaturationValueToRedGreenBlue constructor.
* @param HueSaturationValue $from_color
* @noinspection PhpPureAttributeCanBeAddedInspection
*/
public function __construct(HueSaturationValue $from_color)
{
$this->hue = $from_color->getHue();
$this->hueAsPercentGrad = intval($this->hue * self::INTERVAL * 6.0);
$this->saturation = $from_color->getSaturation();
$this->value = $from_color->getValue();
}
protected function processConvert(): void
{
if ($this->saturation > 0.0) {
$this->splitColor();
}
}
abstract protected function splitColor(): void;
/**
* @param bool $reciprocal
*
* @return float
*/
protected function calcColorValue($reciprocal = false): float
{
// Rest-Anteil am Vollkreis des aktuellen Intervals als Wert '[0,1]'
$remainder_grad = $this->hueAsPercentGrad % self::INTERVAL;
// Rest-Anteil am Vollkreis des aktuellen Intervals als Wert '[0,1]'
$remainder = $remainder_grad / self::INTERVAL;
return $this->saturation * ($reciprocal ? (1 - $remainder) : $remainder);
}
}
@@ -2,6 +2,7 @@
namespace TorstenHettstedt\Colors\Transformer\Utilities;
use JetBrains\PhpStorm\Pure;
use TorstenHettstedt\Colors\ColorModels\CyanMagentaYellowKey;
use TorstenHettstedt\Colors\ColorModels\HueSaturationValue;
@@ -55,6 +56,9 @@ class CyanMagentaYellowKeyToHueSaturationValue
$this->minCmyProperty = min($this->cyan, $this->magenta, $this->yellow);
$this->hue = $this->buildHueAmount();
if ($this->hue === 1.0) {
$this->hue = 0.0;
}
$this->saturation = $this->maxCmyProperty;
$this->value = 1 - $this->key;
}
@@ -69,9 +73,12 @@ class CyanMagentaYellowKeyToHueSaturationValue
->setValue($this->value);
}
#[Pure]
protected function buildHueAmount(): float
{
if ($this->maxCmyProperty === 0) {
// Wenn beide Werte gleich sind, ist die Endfarbe Grau.
// Damit wird auch in {@sse hueAmount()} eine Division durch Null verhindert.
if ($this->maxCmyProperty === $this->minCmyProperty) {
return 0.0;
}
@@ -88,34 +95,32 @@ class CyanMagentaYellowKeyToHueSaturationValue
*/
private function hueAmount(string $property): float
{
if ($this->maxCmyProperty === 0.0) {
return 0.0;
}
static $amount_share = 2.0;
// Wertebereich: [0.0, 1.0]
$divisor = $this->maxCmyProperty - $this->minCmyProperty;
// Wertebereich: [1.0, 5.0]
$amount = 0.0;
// Wertebereich: [-1.0, +1.0]
$dividend = 0.0;
switch ($property) {
case self::PROPERTY_YELLOW:
$amount = 0; // 0.167
$amount = 1.0; // 0.167
$dividend = $this->cyan - $this->magenta;
break;
case self::PROPERTY_CYAN:
$amount = 1; // 0.500
$amount = 3.0; // 0.500
$dividend = $this->magenta -$this->yellow;
break;
case self::PROPERTY_MAGENTA:
$amount = 2; // 0.833
$amount = 5.0; // 0.833
$dividend = $this->yellow - $this->cyan;
break;
default:
return 0;
}
$start_amount = ($amount * $amount_share) + 1.0;
// Wertebereich: [-1.0, +1.0]
$expansion_amount = $dividend / $divisor;
return ($start_amount + $expansion_amount) / 6.0;
// Wertebereich: [+0.0, +6.0]
return ($amount + $expansion_amount) / 6.0;
}
}
@@ -0,0 +1,72 @@
<?php
namespace TorstenHettstedt\Colors\Transformer\Utilities;
use TorstenHettstedt\Colors\ColorModels\CyanMagentaYellowKey;
class HueSaturationValueToCyanMagentaYellowKey extends AbstractHueSaturationValueToUtility
{
// Daten für CMYK
/** @var float : Definition des Cyan-Anteil */
protected float $cyan = 0.0;
/** @var float : Definition des Magenta-Anteil */
protected float $magenta = 0.0;
/** @var float : Definition des Gelbanteil */
protected float $yellow = 0.0;
/** @var float : Definition des Schwarzanteil */
protected float $key = 0.0;
public function convert(): CyanMagentaYellowKey
{
$this->processConvert();
return (new CyanMagentaYellowKey())
->setCyan($this->cyan)
->setMagenta($this->magenta)
->setYellow($this->yellow)
->setKey($this->key);
}
protected function processConvert(): void
{
$this->key = 1 - $this->value;
parent::processConvert();
}
protected function splitColor(): void
{
// ID des zu nutzenden Interval
$interval_id = $this->hueAsPercentGrad / self::INTERVAL;
switch ((int)$interval_id) {
case 1: // Yellow
$this->cyan = $this->calcColorValue();
$this->yellow = $this->saturation;
break;
case 2:
$this->cyan = $this->saturation;
$this->yellow = $this->calcColorValue(true);
break;
case 3: // Cyan
$this->cyan = $this->saturation;
$this->magenta = $this->calcColorValue();
break;
case 4:
$this->cyan = $this->calcColorValue(true);
$this->magenta = $this->saturation;
break;
case 5: // Magenta
$this->magenta = $this->saturation;
$this->yellow = $this->calcColorValue();
break;
default:
$this->magenta = $this->calcColorValue(true);
$this->yellow = $this->saturation;
break;
}
}
}
@@ -4,41 +4,17 @@
namespace TorstenHettstedt\Colors\Transformer\Utilities;
use TorstenHettstedt\Colors\ColorModels\HueSaturationValue;
use TorstenHettstedt\Colors\ColorModels\RedGreenBlue;
class HueSaturationValueToRedGreenBlue
class HueSaturationValueToRedGreenBlue extends AbstractHueSaturationValueToUtility
{
/** @var int : Größe des Intervals in 1/100 Grad */
protected const INTERVAL = 60 * 100;
// Daten für HSV
/** @var float : Definition des Farbton als Anteil eines Vollkreises '$Hue * π' */
protected float $hue;
/** @var float : Definition der Sättigung der Farbe */
protected float $saturation;
/** @var float : Definition der Helligkeit der Farbe */
protected float $value;
// Daten für RGB
/** @var float : Definition des Rotanteil */
protected float $red = 1.0;
/** @var float : Definition des Grünanteil */
protected float $green = 1.0;
/** @var float : Definition des Blauanteil */
protected float $blu = 1.0;
/**
* HueSaturationValueToRedGreenBlue constructor.
* @param HueSaturationValue $from_color
* @noinspection PhpPureAttributeCanBeAddedInspection
*/
public function __construct(HueSaturationValue $from_color)
{
$this->hue = $from_color->getHue();
$this->saturation = $from_color->getSaturation();
$this->value = $from_color->getValue();
}
protected float $blue = 1.0;
public function convert(): RedGreenBlue
{
@@ -47,65 +23,56 @@ class HueSaturationValueToRedGreenBlue
return (new RedGreenBlue())
->setRed($this->red)
->setGreen($this->green)
->setBlue($this->blu);
->setBlue($this->blue);
}
protected function processConvert(): void
{
if ($this->saturation === 0.0) {
$this->red = $this->green = $this->blu = $this->value;
} else {
$this->splitColor();
}
$this->red = $this->green = $this->blue = $this->value;
parent::processConvert();
}
protected function splitColor(): void
{
// Anteil am Vollkreis in 1/100 Grad
$percent_grad = intval($this->hue * 360 * 100);
// ID des zu nutzenden Interval
$interval_id = intdiv($percent_grad , self::INTERVAL);
// Rest-Anteil am Vollkreis des aktuellen Intervals als Wert '[0,1]'
$remainder = (($percent_grad % self::INTERVAL) / self::INTERVAL);
$help_values = [
$this->value,
$this->value * ( 1 - $this->saturation),
$this->value * ( 1 - $this->saturation * $remainder),
$this->value * ( 1 - $this->saturation * (1 - $remainder)),
];
switch ($interval_id) {
$interval_id = $this->hueAsPercentGrad / self::INTERVAL;
// Ist der Wert der entgegen gesetzten Farbe.
$opposite_color_value = $this->value * ( 1 - $this->saturation);
switch ((int)$interval_id) {
case 1:
$this->red = $help_values[2];
$this->green = $help_values[0];
$this->blu = $help_values[1];
$this->red = $this->calcColorValue();
$this->blue = $opposite_color_value;
break;
case 2:
$this->red = $help_values[1];
$this->green = $help_values[0];
$this->blu = $help_values[3];
case 2: // Green
$this->red = $opposite_color_value;
$this->blue = $this->calcColorValue(true);
break;
case 3:
$this->red = $help_values[1];
$this->green = $help_values[2];
$this->blu = $help_values[0];
$this->red = $opposite_color_value;
$this->green = $this->calcColorValue();
break;
case 4:
$this->red = $help_values[3];
$this->green = $help_values[1];
$this->blu = $help_values[0];
case 4: // Blue
$this->red = $this->calcColorValue(true);
$this->green = $opposite_color_value;
break;
case 5:
$this->red = $help_values[0];
$this->green = $help_values[1];
$this->blu = $help_values[2];
$this->green = $opposite_color_value;
$this->blue = $this->calcColorValue();
break;
default:
$this->red = $help_values[0];
$this->green = $help_values[3];
$this->blu = $help_values[1];
default: // Red
$this->green = $this->calcColorValue(true);
$this->blue = $opposite_color_value;
break;
}
}
protected function calcColorValue($reciprocal = false): float
{
$color_value = $this->value;
$color_value *= 1 - parent::calcColorValue($reciprocal);
return $color_value;
}
}
@@ -0,0 +1,136 @@
<?php
namespace TorstenHettstedt\Colors\Transformer\Utilities;
use JetBrains\PhpStorm\Pure;
use TorstenHettstedt\Colors\ColorModels\HueSaturationValue;
use TorstenHettstedt\Colors\ColorModels\RedGreenBlue;
class RedGreenBlueToHueSaturationValue
{
const PROPERTY_RED = 'red';
const PROPERTY_GREEN = 'green';
const PROPERTY_BLUE = 'blue';
// Daten für RGB
/** @var float : Definition des Rotanteil */
protected float $red;
/** @var float : Definition des Grünanteil */
protected float $green;
/** @var float : Definition des Blauanteil */
protected float $blu;
/** @var float : Der größte RGB-Farbwert */
protected float $maxRgbProperty;
/** @var float : Der kleinste RGB-Farbwert */
protected float $minRgbProperty;
// Daten für HSV
/** @var float : Definition des Farbton als Anteil eines Vollkreises '$Hue * π' */
protected float $hue = 0.0;
/** @var float : Definition der Sättigung der Farbe */
protected float $saturation = 0.0;
/** @var float : Definition der Helligkeit der Farbe */
protected float $value = 1.0;
/**
* CyanMagentaYellowKeyToHueSaturationValue constructor.
*
* @param RedGreenBlue $from_color
*
* @noinspection PhpPureAttributeCanBeAddedInspection
*/
public function __construct(RedGreenBlue $from_color)
{
$this->red = $from_color->getRed();
$this->green = $from_color->getGreen();
$this->blu = $from_color->getBlue();
}
protected function processConvert(): void
{
$this->maxRgbProperty = max($this->red, $this->green, $this->blu);
$this->minRgbProperty = min($this->red, $this->green, $this->blu);
$this->hue = $this->buildHueAmount();
$this->saturation = $this->buildSaturation();
$this->value = $this->maxRgbProperty;
while($this->hue < 0.0) {
$this->hue += 1.0;
}
}
public function convert(): HueSaturationValue
{
$this->processConvert();
return (new HueSaturationValue())
->setHue($this->hue)
->setSaturation($this->saturation)
->setValue($this->value);
}
#[Pure]
protected function buildHueAmount(): float
{
// Wenn beide Werte gleich sind, ist die Endfarbe Grau.
// Damit wird auch in {@sse hueAmount()} eine Division durch Null verhindert.
if ($this->maxRgbProperty === $this->minRgbProperty) {
return 0.0;
}
return match ($this->maxRgbProperty) {
$this->red => $this->hueAmount(self::PROPERTY_RED),
$this->green => $this->hueAmount(self::PROPERTY_GREEN),
default => $this->hueAmount(self::PROPERTY_BLUE),
};
}
protected function buildSaturation(): float
{
if ($this->maxRgbProperty === 0.0) {
return 0.0;
}
$dividend = $this->maxRgbProperty - $this->minRgbProperty;
return $dividend / $this->maxRgbProperty;
}
/**
* @param string $property : Name der CMYK-Eigenschaft
*
* @return float
*/
private function hueAmount(string $property): float
{
// Wertebereich: [0.0, 1.0]
$divisor = $this->maxRgbProperty - $this->minRgbProperty;
// Wertebereich: [1.0, 5.0]
$amount = 0.0;
// Wertebereich: [-1.0, +1.0]
$dividend = 0.0;
switch ($property) {
case self::PROPERTY_RED:
$amount = 0.0; // 0.0
$dividend = $this->green - $this->blu;
break;
case self::PROPERTY_GREEN:
$amount = 2.0; // 0.333
$dividend = $this->blu -$this->red;
break;
case self::PROPERTY_BLUE:
$amount = 4.0; // 0.999
$dividend = $this->red - $this->green;
break;
}
// Wertebereich: [-1.0, +1.0]
$expansion_amount = $dividend / $divisor;
// Wertebereich: [-1.0, +5.0]
return ($amount + $expansion_amount) / 6.0;
}
}
@@ -0,0 +1,325 @@
<?php
namespace TorstenHettstedt\Colors\Tests\Helper;
class ValidColorValuesProvider
{
const CMYK = 'cmyk';
const RGB = 'rgb';
const HSV = 'hsv';
/**
* @var array<string, array<string, float>[]>
*/
protected array $definitions = [
'weiß' => [
self::CMYK => [
'cyan' => 0.0,
'magenta' => 0.0,
'yellow' => 0.0,
'key' => 0.0,
],
self::RGB => [
'red' => 1.0,
'green' => 1.0,
'blue' => 1.0,
],
self::HSV => [
'hue' => 0.0,
'saturation' => 0.0,
'value' => 1.0,
],
],
'hellgrau' => [
self::CMYK => [
'cyan' => 0.0,
'magenta' => 0.0,
'yellow' => 0.0,
'key' => 2.0 / 3.0,
],
self::RGB => [
'red' => 1.0 / 3.0,
'green' => 1.0 / 3.0,
'blue' => 1.0 / 3.0,
],
self::HSV => [
'hue' => 0.0,
'saturation' => 0.0,
'value' => 1.0 / 3.0,
],
],
'dunkelgrau' => [
self::CMYK => [
'cyan' => 0.0,
'magenta' => 0.0,
'yellow' => 0.0,
'key' => 1.0 / 3.0,
],
self::RGB => [
'red' => 2.0 / 3.0,
'green' => 2.0 / 3.0,
'blue' => 2.0 / 3.0,
],
self::HSV => [
'hue' => 0.0,
'saturation' => 0.0,
'value' => 2.0 / 3.0,
],
],
'schwarz' => [
self::CMYK => [
'cyan' => 0.0,
'magenta' => 0.0,
'yellow' => 0.0,
'key' => 1.0,
],
self::RGB => [
'red' => 0.0,
'green' => 0.0,
'blue' => 0.0,
],
self::HSV => [
'hue' => 0.0,
'saturation' => 0.0,
'value' => 0.0,
],
],
'gelb' => [
self::CMYK => [
'cyan' => 0.0,
'magenta' => 0.0,
'yellow' => 1.0,
'key' => 0.0,
],
self::RGB => [
'red' => 1.0,
'green' => 1.0,
'blue' => 0.0,
],
self::HSV => [
'hue' => 1.0 / 6.0,
'saturation' => 1.0,
'value' => 1.0,
],
],
'grün' => [
self::CMYK => [
'cyan' => 1.0,
'magenta' => 0.0,
'yellow' => 1.0,
'key' => 0.0,
],
self::RGB => [
'red' => 0.0,
'green' => 1.0,
'blue' => 0.0,
],
self::HSV => [
'hue' => 2.0 / 6.0,
'saturation' => 1.0,
'value' => 1.0,
],
],
'cyan' => [
self::CMYK => [
'cyan' => 1.0,
'magenta' => 0.0,
'yellow' => 0.0,
'key' => 0.0,
],
self::RGB => [
'red' => 0.0,
'green' => 1.0,
'blue' => 1.0,
],
self::HSV => [
'hue' => 3.0 / 6.0,
'saturation' => 1.0,
'value' => 1.0,
],
],
'blau' => [
self::CMYK => [
'cyan' => 1.0,
'magenta' => 1.0,
'yellow' => 0.0,
'key' => 0.0,
],
self::RGB => [
'red' => 0.0,
'green' => 0.0,
'blue' => 1.0,
],
self::HSV => [
'hue' => 4.0 / 6.0,
'saturation' => 1.0,
'value' => 1.0,
],
],
'magenta' => [
self::CMYK => [
'cyan' => 0.0,
'magenta' => 1.0,
'yellow' => 0.0,
'key' => 0.0,
],
self::RGB => [
'red' => 1.0,
'green' => 0.0,
'blue' => 1.0,
],
self::HSV => [
'hue' => 5.0 / 6.0,
'saturation' => 1.0,
'value' => 1.0,
],
],
'rot' => [
self::CMYK => [
'cyan' => 0.0,
'magenta' => 1.0,
'yellow' => 1.0,
'key' => 0.0,
],
self::RGB => [
'red' => 1.0,
'green' => 0.0,
'blue' => 0.0,
],
self::HSV => [
'hue' => 0.0,
'saturation' => 1.0,
'value' => 1.0,
],
],
'dunkellachs' => [
self::CMYK => [
'cyan' => 0.0,
'magenta' => 0.54,
'yellow' => 0.72,
'key' => 0.30,
],
self::RGB => [
'red' => 0.7,
'green' => 0.3216,
'blue' => 0.1961,
],
self::HSV => [
'hue' => 0.0417,
'saturation' => 0.72,
'value' => 0.70,
],
],
'gold' => [
self::CMYK => [
'cyan' => 0.0,
'magenta' => 0.13,
'yellow' => 0.76,
'key' => 0.13,
],
self::RGB => [
'red' => 0.87,
'green' => 0.757,
'blue' => 0.209,
],
self::HSV => [
'hue' => 0.138,
'saturation' => 0.76,
'value' => 0.87,
],
],
'grasgrün' => [
self::CMYK => [
'cyan' => 0.495,
'magenta' => 0.0,
'yellow' => 1.0,
'key' => 0.51,
],
self::RGB => [
'red' => 0.247,
'green' => 0.490,
'blue' => 0.0,
],
self::HSV => [
'hue' => 0.2492,
'saturation' => 1.00,
'value' => 0.49,
],
],
'aquamarin' => [
self::CMYK => [
'cyan' => 0.501,
'magenta' => 0.0,
'yellow' => 0.168,
'key' => 0.00,
],
self::RGB => [
'red' => 0.49804,
'green' => 1.0,
'blue' => 0.83285,
],
self::HSV => [
'hue' => 0.4445,
'saturation' => 0.50196,
'value' => 1.0,
],
],
'violet' => [
self::CMYK => [
'cyan' => 0.191,
'magenta' => 0.321,
'yellow' => 0.0,
'key' => 0.29,
],
self::RGB => [
'red' => 0.575,
'green' => 0.482,
'blue' => 0.71,
],
self::HSV => [
'hue' => 0.734,
'saturation' => 0.321,
'value' => 0.71,
],
],
'pflaume' => [
self::CMYK => [
'cyan' => 0.0,
'magenta' => 0.2755,
'yellow' => 0.0,
'key' => 0.1335,
],
self::RGB => [
'red' => 0.8667,
'green' => 0.6274,
'blue' => 0.8667,
],
self::HSV => [
'hue' => 0.83333,
'saturation' => 0.27601,
'value' => 0.86666,
],
],
];
/**
* @param array<string> $order
*
* @return array<string, array<string, float>[]>
*/
public function getValidColorValues(array $order): array
{
$values = [];
foreach ($this->definitions as $color => $definition) {
$definitions = [];
foreach ($order as $key) {
$definitions[] = $definition[$key];
}
$values[$color] = $definitions;
}
return $values;
}
}
@@ -1,14 +1,14 @@
<?php /** @noinspection PhpArrayShapeAttributeCanBeAddedInspection */
namespace TorstenHettstedtUnitTests\Colors\ColorModels;
namespace TorstenHettstedt\Colors\Tests\Unit\ColorModels;
use Codeception\Test\Unit;
abstract class AbstractColorModelUnit extends Unit
{
abstract public function testConstruct();
abstract public function testConstruct(): void;
/**
* @return float[][]
@@ -1,6 +1,6 @@
<?php
namespace TorstenHettstedtUnitTests\Colors\ColorModels;
namespace TorstenHettstedt\Colors\Tests\Unit\ColorModels;
use InvalidArgumentException;
use TorstenHettstedt\Colors\ColorModels\CyanMagentaYellowKey;
@@ -8,7 +8,7 @@ use TorstenHettstedt\Colors\ColorModels\CyanMagentaYellowKey;
class CyanMagentaYellowKeyTest extends AbstractColorModelUnit
{
public function testConstruct()
public function testConstruct(): void
{
$color = new CyanMagentaYellowKey();
@@ -23,7 +23,7 @@ class CyanMagentaYellowKeyTest extends AbstractColorModelUnit
*
* @dataProvider validValueProvider
*/
public function testSetCyanWithValidValue(float $value)
public function testSetCyanWithValidValue(float $value): void
{
$color = new CyanMagentaYellowKey();
@@ -36,7 +36,7 @@ class CyanMagentaYellowKeyTest extends AbstractColorModelUnit
*
* @dataProvider validValueProvider
*/
public function testSetMagentaWithValidValue(float $value)
public function testSetMagentaWithValidValue(float $value): void
{
$color = new CyanMagentaYellowKey();
@@ -49,7 +49,7 @@ class CyanMagentaYellowKeyTest extends AbstractColorModelUnit
*
* @dataProvider validValueProvider
*/
public function testSetYellowWithValidValue(float $value)
public function testSetYellowWithValidValue(float $value): void
{
$color = new CyanMagentaYellowKey();
@@ -62,7 +62,7 @@ class CyanMagentaYellowKeyTest extends AbstractColorModelUnit
*
* @dataProvider validValueProvider
*/
public function testSetKeyWithValidValue(float $value)
public function testSetKeyWithValidValue(float $value): void
{
$color = new CyanMagentaYellowKey();
@@ -75,7 +75,7 @@ class CyanMagentaYellowKeyTest extends AbstractColorModelUnit
*
* @dataProvider invalidValueProvider
*/
public function testSetCyanWithInvalidValue(float $value)
public function testSetCyanWithInvalidValue(float $value): void
{
$color = new CyanMagentaYellowKey();
@@ -88,7 +88,7 @@ class CyanMagentaYellowKeyTest extends AbstractColorModelUnit
*
* @dataProvider invalidValueProvider
*/
public function testSetMagentaWithInvalidValue(float $value)
public function testSetMagentaWithInvalidValue(float $value): void
{
$color = new CyanMagentaYellowKey();
@@ -101,7 +101,7 @@ class CyanMagentaYellowKeyTest extends AbstractColorModelUnit
*
* @dataProvider invalidValueProvider
*/
public function testSetYellowWithInvalidValue(float $value)
public function testSetYellowWithInvalidValue(float $value): void
{
$color = new CyanMagentaYellowKey();
@@ -114,7 +114,7 @@ class CyanMagentaYellowKeyTest extends AbstractColorModelUnit
*
* @dataProvider invalidValueProvider
*/
public function testSetKeyWithInvalidValue(float $value)
public function testSetKeyWithInvalidValue(float $value): void
{
$color = new CyanMagentaYellowKey();
@@ -1,6 +1,6 @@
<?php
namespace TorstenHettstedtUnitTests\Colors\ColorModels;
namespace TorstenHettstedt\Colors\Tests\Unit\ColorModels;
use InvalidArgumentException;
use TorstenHettstedt\Colors\ColorModels\HueSaturationValue;
@@ -8,7 +8,7 @@ use TorstenHettstedt\Colors\ColorModels\HueSaturationValue;
class HueSaturationValueTest extends AbstractColorModelUnit
{
public function testConstruct()
public function testConstruct(): void
{
$color = new HueSaturationValue();
@@ -22,7 +22,7 @@ class HueSaturationValueTest extends AbstractColorModelUnit
*
* @dataProvider validValueProvider
*/
public function testSetHueWithValidValue(float $value)
public function testSetHueWithValidValue(float $value): void
{
$color = new HueSaturationValue();
@@ -35,7 +35,7 @@ class HueSaturationValueTest extends AbstractColorModelUnit
*
* @dataProvider invalidValueProvider
*/
public function testSetHueWithInvalidValue(float $value)
public function testSetHueWithInvalidValue(float $value): void
{
$color = new HueSaturationValue();
@@ -48,7 +48,7 @@ class HueSaturationValueTest extends AbstractColorModelUnit
*
* @dataProvider validValueProvider
*/
public function testSetSaturationWithValidValue(float $value)
public function testSetSaturationWithValidValue(float $value): void
{
$color = new HueSaturationValue();
@@ -61,7 +61,7 @@ class HueSaturationValueTest extends AbstractColorModelUnit
*
* @dataProvider invalidValueProvider
*/
public function testSetSaturationWithInvalidValue(float $value)
public function testSetSaturationWithInvalidValue(float $value): void
{
$color = new HueSaturationValue();
@@ -74,7 +74,7 @@ class HueSaturationValueTest extends AbstractColorModelUnit
*
* @dataProvider validValueProvider
*/
public function testSetValueWithValidValue(float $value)
public function testSetValueWithValidValue(float $value): void
{
$color = new HueSaturationValue();
@@ -87,7 +87,7 @@ class HueSaturationValueTest extends AbstractColorModelUnit
*
* @dataProvider invalidValueProvider
*/
public function testSetValueWithInvalidValue(float $value)
public function testSetValueWithInvalidValue(float $value): void
{
$color = new HueSaturationValue();
+9 -9
View File
@@ -1,6 +1,6 @@
<?php /** @noinspection PhpArrayShapeAttributeCanBeAddedInspection */
<?php
namespace TorstenHettstedtUnitTests\Colors\ColorModels;
namespace TorstenHettstedt\Colors\Tests\Unit\ColorModels;
use InvalidArgumentException;
use TorstenHettstedt\Colors\ColorModels\RedGreenBlue;
@@ -8,7 +8,7 @@ use TorstenHettstedt\Colors\ColorModels\RedGreenBlue;
class RedGreenBlueTest extends AbstractColorModelUnit
{
public function testConstruct()
public function testConstruct(): void
{
$color = new RedGreenBlue();
@@ -22,7 +22,7 @@ class RedGreenBlueTest extends AbstractColorModelUnit
*
* @dataProvider validValueProvider
*/
public function testSetRedWithValidValue(float $value)
public function testSetRedWithValidValue(float $value): void
{
$color = new RedGreenBlue();
@@ -35,7 +35,7 @@ class RedGreenBlueTest extends AbstractColorModelUnit
*
* @dataProvider invalidValueProvider
*/
public function testSetRedWithInvalidValue(float $value)
public function testSetRedWithInvalidValue(float $value): void
{
$color = new RedGreenBlue();
@@ -47,7 +47,7 @@ class RedGreenBlueTest extends AbstractColorModelUnit
*
* @dataProvider validValueProvider
*/
public function testSetGreenWithValidValue(float $value)
public function testSetGreenWithValidValue(float $value): void
{
$color = new RedGreenBlue();
@@ -60,7 +60,7 @@ class RedGreenBlueTest extends AbstractColorModelUnit
*
* @dataProvider invalidValueProvider
*/
public function testSetGreenWithInvalidValue(float $value)
public function testSetGreenWithInvalidValue(float $value): void
{
$color = new RedGreenBlue();
@@ -73,7 +73,7 @@ class RedGreenBlueTest extends AbstractColorModelUnit
*
* @dataProvider validValueProvider
*/
public function testSetBlueWithValidValue(float $value)
public function testSetBlueWithValidValue(float $value): void
{
$color = new RedGreenBlue();
@@ -86,7 +86,7 @@ class RedGreenBlueTest extends AbstractColorModelUnit
*
* @dataProvider invalidValueProvider
*/
public function testSetBlueWithInvalidValue(float $value)
public function testSetBlueWithInvalidValue(float $value): void
{
$color = new RedGreenBlue();
@@ -1,10 +1,11 @@
<?php /** @noinspection PhpArrayShapeAttributeCanBeAddedInspection */
<?php
namespace TorstenHettstedtUnitTests\Colors\Transformer;
namespace TorstenHettstedt\Colors\Tests\Unit\Transformer;
use Codeception\Test\Unit;
use Exception;
use TorstenHettstedt\Colors\ColorModels\CyanMagentaYellowKey;
use TorstenHettstedt\Colors\Tests\Helper\ValidColorValuesProvider;
use TorstenHettstedt\Colors\Transformer\CyanMagentaYellowKeyTransformer;
class CyanMagentaYellowKeyTransformerTest extends Unit
@@ -15,214 +16,36 @@ class CyanMagentaYellowKeyTransformerTest extends Unit
protected CyanMagentaYellowKey $color;
/**
* @return float[][][]
* @return array<string, array<string, float>[]>
*/
public function validRgbValuesProvider(): array
{
return [
'weiß' => [
[
'cyan' => 0.0,
'magenta' => 0.0,
'yellow' => 0.0,
'key' => 0.0,
],
[
'red' => 1.0,
'green' => 1.0,
'blue' => 1.0,
]
],
'schwarz' => [
[
'cyan' => 0.0,
'magenta' => 0.0,
'yellow' => 0.0,
'key' => 1.0,
],
[
'red' => 0.0,
'green' => 0.0,
'blue' => 0.0,
]
],
'cyan' => [
[
'cyan' => 1.0,
'magenta' => 0.0,
'yellow' => 0.0,
'key' => 0.0,
],
[
'red' => 0.0,
'green' => 1.0,
'blue' => 1.0,
]
],
'magenta' => [
[
'cyan' => 0.0,
'magenta' => 1.0,
'yellow' => 0.0,
'key' => 0.0,
],
[
'red' => 1.0,
'green' => 0.0,
'blue' => 1.0,
]
],
'gelb' => [
[
'cyan' => 0.0,
'magenta' => 0.0,
'yellow' => 1.0,
'key' => 0.0,
],
[
'red' => 1.0,
'green' => 1.0,
'blue' => 0.0,
]
],
'gold' => [
[
'cyan' => 0.0,
'magenta' => 0.13,
'yellow' => 0.76,
'key' => 0.13,
],
[
'red' => 0.87,
'green' => 0.757,
'blue' => 0.209,
]
],
'violet' => [
[
'cyan' => 0.19,
'magenta' => 0.32,
'yellow' => 0.0,
'key' => 0.29,
],
[
'red' => 0.575,
'green' => 0.482,
'blue' => 0.71,
]
],
];
return (new ValidColorValuesProvider())->getValidColorValues([
ValidColorValuesProvider::CMYK,
ValidColorValuesProvider::RGB
]);
}
/**
* @return float[][][]
* @return array<string, array<string, float>[]>
*/
public function validHsvValuesProvider(): array
{
return [
'weiß' => [
[
'cyan' => 0.0,
'magenta' => 0.0,
'yellow' => 0.0,
'key' => 0.0,
],
[
'hue' => 0.0,
'saturation' => 0.0,
'value' => 1.0,
]
],
'schwarz' => [
[
'cyan' => 0.0,
'magenta' => 0.0,
'yellow' => 0.0,
'key' => 1.0,
],
[
'hue' => 0.0,
'saturation' => 0.0,
'value' => 0.0,
]
],
'cyan' => [
[
'cyan' => 1.0,
'magenta' => 0.0,
'yellow' => 0.0,
'key' => 0.0,
],
[
'hue' => 0.5,
'saturation' => 1.0,
'value' => 1.0,
]
],
'magenta' => [
[
'cyan' => 0.0,
'magenta' => 1.0,
'yellow' => 0.0,
'key' => 0.0,
],
[
'hue' => 0.833,
'saturation' => 1.0,
'value' => 1.0,
]
],
'gelb' => [
[
'cyan' => 0.0,
'magenta' => 0.0,
'yellow' => 1.0,
'key' => 0.0,
],
[
'hue' => 0.167,
'saturation' => 1.0,
'value' => 1.0,
]
],
'gold' => [
[
'cyan' => 0.0,
'magenta' => 0.13,
'yellow' => 0.76,
'key' => 0.13,
],
[
'hue' => 0.138,
'saturation' => 0.76,
'value' => 0.87,
]
],
'violet' => [
[
'cyan' => 0.19,
'magenta' => 0.32,
'yellow' => 0.0,
'key' => 0.29,
],
[
'hue' => 0.734,
'saturation' => 0.32,
'value' => 0.71,
]
],
];
return (new ValidColorValuesProvider())->getValidColorValues([
ValidColorValuesProvider::CMYK,
ValidColorValuesProvider::HSV
]);
}
/**
* @param array $cmyk
* @param array $rgb
* @param array<string, float> $cmyk
* @param array<string, float> $rgb
*
* @dataProvider validRgbValuesProvider
*
* @throws Exception
*/
public function testToRedGreenBlue(array $cmyk, array $rgb)
public function testToRedGreenBlue(array $cmyk, array $rgb): void
{
$this->color = $this->make(CyanMagentaYellowKey::class, $cmyk);
@@ -237,13 +60,13 @@ class CyanMagentaYellowKeyTransformerTest extends Unit
}
/**
* @param array $cmyk
* @param array<string, float> $cmyk
*
* @dataProvider validRgbValuesProvider
*
* @throws Exception
*/
public function testToCyanMagentaYellowKey(array $cmyk)
public function testToCyanMagentaYellowKey(array $cmyk): void
{
$this->color = $this->make(CyanMagentaYellowKey::class, $cmyk);
@@ -259,15 +82,15 @@ class CyanMagentaYellowKeyTransformerTest extends Unit
}
/**
* @param array $cmyk
* @param array $hsv
* @param array<string, float> $cmyk
* @param array<string, float> $hsv
*
* @throws Exception
*
* @dataProvider validHsvValuesProvider
*
*/
public function testToHueSaturationValue(array $cmyk, array $hsv)
public function testToHueSaturationValue(array $cmyk, array $hsv): void
{
$this->color = $this->make(CyanMagentaYellowKey::class, $cmyk);
@@ -0,0 +1,103 @@
<?php
namespace TorstenHettstedt\Colors\Tests\Unit\Transformer;
use Codeception\Test\Unit;
use Exception;
use TorstenHettstedt\Colors\ColorModels\HueSaturationValue;
use TorstenHettstedt\Colors\Tests\Helper\ValidColorValuesProvider;
use TorstenHettstedt\Colors\Transformer\HueSaturationValueTransformer;
class HueSaturationValueTransformerTest extends Unit
{
const FLOAT_DELTA = 0.001;
protected HueSaturationValue $color;
/**
* @return array<string, array<string, float>[]>
*/
public function validCmykValuesProvider(): array
{
return (new ValidColorValuesProvider())->getValidColorValues([
ValidColorValuesProvider::HSV,
ValidColorValuesProvider::CMYK,
]);
}
/**
* @return array<string, array<string, float>[]>
*/
public function validRgbValuesProvider(): array
{
return (new ValidColorValuesProvider())->getValidColorValues([
ValidColorValuesProvider::HSV,
ValidColorValuesProvider::RGB,
]);
}
/**
* @param array<string, float> $hsv
* @param array<string, float> $rgb
*
* @dataProvider validRgbValuesProvider
*
* @throws Exception
*/
public function testToRedGreenBlue(array $hsv, array $rgb): void
{
$this->color = $this->make(HueSaturationValue::class, $hsv);
$transformer = new HueSaturationValueTransformer($this->color);
$color = $transformer->toRedGreenBlue();
$this->assertEqualsWithDelta($rgb['red'], $color->getRed(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($rgb['green'], $color->getGreen(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($rgb['blue'], $color->getBlue(), self::FLOAT_DELTA);
}
/**
* @param array<string, float> $hsv
* @param array<string, float> $cmyk
*
* @throws Exception
* @dataProvider validCmykValuesProvider
*
*/
public function testToCyanMagentaYellowKey(array $hsv, array $cmyk): void
{
$this->color = $this->make(HueSaturationValue::class, $hsv);
$transformer = new HueSaturationValueTransformer($this->color);
$color = $transformer->toCyanMagentaYellowKey();
$this->assertEqualsWithDelta($cmyk['cyan'], $color->getCyan(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($cmyk['magenta'], $color->getMagenta(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($cmyk['yellow'], $color->getYellow(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($cmyk['key'], $color->getKey(), self::FLOAT_DELTA);
}
/**
* @param array<string, float> $hsv
*
* @throws Exception
* @dataProvider validCmykValuesProvider
*/
public function testToHueSaturationValue(array $hsv): void
{
$this->color = $this->make(HueSaturationValue::class, $hsv);
$transformer = new HueSaturationValueTransformer($this->color);
$color = $transformer->toHueSaturationValue();
$this->assertEqualsWithDelta($hsv['hue'], $color->getHue(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($hsv['saturation'], $color->getSaturation(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($hsv['value'], $color->getValue(), self::FLOAT_DELTA);
}
}
@@ -0,0 +1,103 @@
<?php
namespace TorstenHettstedt\Colors\Tests\Unit\Transformer;
use Codeception\Test\Unit;
use Exception;
use TorstenHettstedt\Colors\ColorModels\RedGreenBlue;
use TorstenHettstedt\Colors\Tests\Helper\ValidColorValuesProvider;
use TorstenHettstedt\Colors\Transformer\RedGreenBlueTransformer;
class RedGreenBlueTransformerTest extends Unit
{
const FLOAT_DELTA = 0.001;
protected RedGreenBlue $color;
/**
* @return array<string, array<string, float>[]>
*/
public function validCmykValuesProvider(): array
{
return (new ValidColorValuesProvider())->getValidColorValues([
ValidColorValuesProvider::RGB,
ValidColorValuesProvider::CMYK,
]);
}
/**
* @return array<string, array<string, float>[]>
*/
public function validHsvValuesProvider(): array
{
return (new ValidColorValuesProvider())->getValidColorValues([
ValidColorValuesProvider::RGB,
ValidColorValuesProvider::HSV,
]);
}
/**
* @param array<string, float> $rgb
*
* @dataProvider validCmykValuesProvider
*
* @throws Exception
*/
public function testToRedGreenBlue(array $rgb): void
{
$this->color = $this->make(RedGreenBlue::class, $rgb);
$transformer = new RedGreenBlueTransformer($this->color);
$color = $transformer->toRedGreenBlue();
$this->assertEqualsWithDelta($rgb['red'], $color->getRed(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($rgb['green'], $color->getGreen(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($rgb['blue'], $color->getBlue(), self::FLOAT_DELTA);
}
/**
* @param array<string, float> $rgb
* @param array<string, float> $cmyk
*
* @throws Exception
* @dataProvider validCmykValuesProvider
*
*/
public function testToCyanMagentaYellowKey(array $rgb, array $cmyk): void
{
$this->color = $this->make(RedGreenBlue::class, $rgb);
$transformer = new RedGreenBlueTransformer($this->color);
$color = $transformer->toCyanMagentaYellowKey();
$this->assertEqualsWithDelta($cmyk['cyan'], $color->getCyan(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($cmyk['magenta'], $color->getMagenta(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($cmyk['yellow'], $color->getYellow(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($cmyk['key'], $color->getKey(), self::FLOAT_DELTA);
}
/**
* @param array<string, float> $rgb
* @param array<string, float> $hsv
*
* @throws Exception
* @dataProvider validHsvValuesProvider
*/
public function testToHueSaturationValue(array $rgb, array $hsv): void
{
$this->color = $this->make(RedGreenBlue::class, $rgb);
$transformer = new RedGreenBlueTransformer($this->color);
$color = $transformer->toHueSaturationValue();
$this->assertEqualsWithDelta($hsv['hue'], $color->getHue(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($hsv['saturation'], $color->getSaturation(), self::FLOAT_DELTA);
$this->assertEqualsWithDelta($hsv['value'], $color->getValue(), self::FLOAT_DELTA);
}
}