Files
openrgb-hue/tests/test_gradient.py
T
valknarandClaude Sonnet 5 71921b5600 Add openrgb-hue: Hue scene gradients for OpenRGB lights
Applies gradients derived from 103 bundled Philips Hue scenes to
OpenRGB-controlled LEDs, with six mapping modes (sequence, per-device,
per-zone, matrix, mirror, shuffle) and five animation modes (static,
scroll, pingpong, pulse, wave). Typer/Rich CLI with dry-run preview,
device/zone targeting, and a scenes-update command to refresh the
bundled dataset from its source gist.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-15 12:40:13 +02:00

59 lines
2.4 KiB
Python

from openrgb_hue.color import Color
from openrgb_hue.gradient import Gradient, Stop
def test_from_colors_even_spacing_single():
gradient = Gradient.from_colors([Color(10, 20, 30)])
assert [s.position for s in gradient.stops] == [0.0]
def test_from_colors_even_spacing_multiple():
colors = [Color(0, 0, 0), Color(50, 50, 50), Color(255, 255, 255)]
gradient = Gradient.from_colors(colors)
assert [s.position for s in gradient.stops] == [0.0, 0.5, 1.0]
def test_sample_at_exact_stop_positions():
colors = [Color(255, 0, 0), Color(0, 255, 0), Color(0, 0, 255)]
gradient = Gradient.from_colors(colors, interpolation="rgb")
assert gradient.sample(0.0) == colors[0]
assert gradient.sample(0.5) == colors[1]
assert gradient.sample(1.0) == colors[0] # cyclic: wraps back to the first stop
def test_sample_wraps_cyclically():
colors = [Color(255, 0, 0), Color(0, 0, 255)]
gradient = Gradient.from_colors(colors, interpolation="rgb")
# t=0.75 is halfway between the last stop (1.0 -> wraps to 0.0) and back
# to the first stop; verify negative/over-1 t wrap to the same result.
assert gradient.sample(-0.25) == gradient.sample(0.75)
assert gradient.sample(1.25) == gradient.sample(0.25)
def test_single_stop_gradient_is_constant():
gradient = Gradient([Stop(0.3, Color(1, 2, 3))])
assert gradient.sample(0.0) == Color(1, 2, 3)
assert gradient.sample(0.9) == Color(1, 2, 3)
def test_from_scene_dedupe_collapses_consecutive_duplicates(sample_scene):
with_dedupe = Gradient.from_scene(sample_scene, dedupe=True, use_brightness=False)
without_dedupe = Gradient.from_scene(sample_scene, dedupe=False, use_brightness=False)
# sample_scene has 4 lights but lights 2 and 3 share a color.
assert len(with_dedupe.stops) == 3
assert len(without_dedupe.stops) == 4
def test_from_scene_use_brightness_scales_colors(sample_scene):
gradient = Gradient.from_scene(sample_scene, dedupe=False, use_brightness=True)
# Fourth light: Color(0, 0, 255) at brightness 128/255.
last_stop_color = gradient.stops[-1].color
expected = Color(0, 0, 255).scale_brightness(128 / 255)
assert last_stop_color == expected
def test_preview_stops_length():
gradient = Gradient.from_colors([Color(255, 0, 0), Color(0, 255, 0)])
assert len(gradient.preview_stops(10)) == 10
assert gradient.preview_stops(0) == []