Add Docker deployment support, richer Selenium/LED pattern tests, in-browser diagnostics, responsive UI improvements, and 16x16 panel simulation tooling to speed iteration and hardware-style prototyping. Made-with: Cursor
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
import importlib.util
|
|
from pathlib import Path
|
|
|
|
|
|
def _load_patterns_module():
|
|
repo_root = Path(__file__).resolve().parents[1]
|
|
module_path = repo_root / "workspace" / "code" / "led_patterns.py"
|
|
spec = importlib.util.spec_from_file_location("led_patterns", module_path)
|
|
module = importlib.util.module_from_spec(spec)
|
|
assert spec is not None and spec.loader is not None
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
def test_rainbow_frame_shape_and_bounds():
|
|
patterns = _load_patterns_module()
|
|
frame = patterns.rainbow_frame(12, 3)
|
|
assert len(frame) == 12
|
|
for color in frame:
|
|
assert len(color) == 3
|
|
assert all(0 <= c <= 255 for c in color)
|
|
|
|
|
|
def test_chase_frame_has_head_and_tail():
|
|
patterns = _load_patterns_module()
|
|
frame = patterns.chase_frame(8, 5, color=(10, 20, 30), tail=(1, 2, 3))
|
|
assert len(frame) == 8
|
|
assert frame[5] == (10, 20, 30)
|
|
assert frame[4] == (1, 2, 3)
|
|
assert sum(1 for c in frame if c != (0, 0, 0)) == 2
|
|
|
|
|
|
def test_twinkle_frame_is_deterministic_for_same_inputs():
|
|
patterns = _load_patterns_module()
|
|
a = patterns.twinkle_frame(20, frame=9, seed=777, sparkles=4)
|
|
b = patterns.twinkle_frame(20, frame=9, seed=777, sparkles=4)
|
|
assert a == b
|
|
|
|
|
|
def test_twinkle_frame_varies_between_frames():
|
|
patterns = _load_patterns_module()
|
|
a = patterns.twinkle_frame(20, frame=1, seed=777, sparkles=4)
|
|
b = patterns.twinkle_frame(20, frame=2, seed=777, sparkles=4)
|
|
assert a != b
|