feat(support): add MacroColorConverter utility
This commit is contained in:
parent
846bd12f90
commit
a1612dc3ef
20
app/Support/MacroColorConverter.php
Normal file
20
app/Support/MacroColorConverter.php
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Support;
|
||||||
|
|
||||||
|
final class MacroColorConverter
|
||||||
|
{
|
||||||
|
public static function fromRgba(?array $rgba): ?string
|
||||||
|
{
|
||||||
|
if ($rgba === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sprintf(
|
||||||
|
'#%02X%02X%02X',
|
||||||
|
(int) round(max(0.0, min(1.0, $rgba['r'])) * 255),
|
||||||
|
(int) round(max(0.0, min(1.0, $rgba['g'])) * 255),
|
||||||
|
(int) round(max(0.0, min(1.0, $rgba['b'])) * 255),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
27
tests/Unit/Support/MacroColorConverterTest.php
Normal file
27
tests/Unit/Support/MacroColorConverterTest.php
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use App\Support\MacroColorConverter;
|
||||||
|
|
||||||
|
test('converts rgba floats to hex string', function () {
|
||||||
|
expect(MacroColorConverter::fromRgba(['r' => 1.0, 'g' => 0.0, 'b' => 0.5, 'a' => 1.0]))->toBe('#FF0080');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('converts pure black', function () {
|
||||||
|
expect(MacroColorConverter::fromRgba(['r' => 0.0, 'g' => 0.0, 'b' => 0.0, 'a' => 1.0]))->toBe('#000000');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('converts pure white', function () {
|
||||||
|
expect(MacroColorConverter::fromRgba(['r' => 1.0, 'g' => 1.0, 'b' => 1.0, 'a' => 1.0]))->toBe('#FFFFFF');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('converts grey', function () {
|
||||||
|
expect(MacroColorConverter::fromRgba(['r' => 0.5, 'g' => 0.5, 'b' => 0.5, 'a' => 1.0]))->toBe('#808080');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('clamps out-of-range values', function () {
|
||||||
|
expect(MacroColorConverter::fromRgba(['r' => 1.5, 'g' => -0.1, 'b' => 0.5, 'a' => 0.0]))->toBe('#FF0080');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('returns null for null input', function () {
|
||||||
|
expect(MacroColorConverter::fromRgba(null))->toBeNull();
|
||||||
|
});
|
||||||
Loading…
Reference in a new issue