feat(figment): complete pipeline integration with native effect plugin

- Add engine/effects/plugins/figment.py (native pipeline implementation)
- Add engine/figment_render.py, engine/figment_trigger.py, engine/themes.py
- Add 3 SVG assets in figments/ (Mexican/Aztec motif)
- Add engine/display/backends/animation_report.py for debugging
- Add engine/pipeline/adapters/frame_capture.py for frame capture
- Add test-figment preset to presets.toml
- Add cairosvg optional dependency to pyproject.toml
- Update EffectPluginStage to support is_overlay attribute (for overlay effects)
- Add comprehensive tests: test_figment_effect.py, test_figment_pipeline.py, test_figment_render.py
- Remove obsolete test_ui_simple.py
- Update TODO.md with test cleanup plan
- Refactor test_adapters.py to use real components instead of mocks

This completes the figment SVG overlay feature integration using the modern pipeline architecture, avoiding legacy effects_plugins. All tests pass (758 total).
This commit is contained in:
2026-03-21 13:09:37 -07:00
parent ef0c43266a
commit 7185005f9b
17 changed files with 1990 additions and 181 deletions

View File

@@ -0,0 +1,103 @@
"""
Tests for the FigmentOverlayEffect plugin.
"""
import pytest
from engine.effects.plugins import discover_plugins
from engine.effects.registry import get_registry
from engine.effects.types import EffectConfig, create_effect_context
from engine.pipeline.adapters import EffectPluginStage
class TestFigmentEffect:
"""Tests for FigmentOverlayEffect."""
def setup_method(self):
"""Discover plugins before each test."""
discover_plugins()
def test_figment_plugin_discovered(self):
"""Figment plugin is discovered and registered."""
registry = get_registry()
figment = registry.get("figment")
assert figment is not None
assert figment.name == "figment"
def test_figment_plugin_enabled_by_default(self):
"""Figment plugin is enabled by default."""
registry = get_registry()
figment = registry.get("figment")
assert figment.config.enabled is True
def test_figment_renders_overlay(self):
"""Figment renders SVG overlay after interval."""
registry = get_registry()
figment = registry.get("figment")
# Configure with short interval for testing
config = EffectConfig(
enabled=True,
intensity=1.0,
params={
"interval_secs": 0.1, # 100ms
"display_secs": 1.0,
"figment_dir": "figments",
},
)
figment.configure(config)
# Create test buffer
buf = [" " * 80 for _ in range(24)]
# Create context
ctx = create_effect_context(
terminal_width=80,
terminal_height=24,
frame_number=0,
)
# Process frames until figment renders
for i in range(20):
result = figment.process(buf, ctx)
if len(result) > len(buf):
# Figment rendered overlay
assert len(result) > len(buf)
# Check that overlay lines contain ANSI escape codes
overlay_lines = result[len(buf) :]
assert len(overlay_lines) > 0
# First overlay line should contain cursor positioning
assert "\x1b[" in overlay_lines[0]
assert "H" in overlay_lines[0]
return
ctx.frame_number += 1
pytest.fail("Figment did not render in 20 frames")
def test_figment_stage_capabilities(self):
"""EffectPluginStage wraps figment correctly."""
registry = get_registry()
figment = registry.get("figment")
stage = EffectPluginStage(figment, name="figment")
assert "effect.figment" in stage.capabilities
def test_figment_configure_preserves_params(self):
"""Figment configuration preserves figment_dir."""
registry = get_registry()
figment = registry.get("figment")
# Configure without figment_dir
config = EffectConfig(
enabled=True,
intensity=1.0,
params={
"interval_secs": 30.0,
"display_secs": 3.0,
},
)
figment.configure(config)
# figment_dir should be preserved
assert "figment_dir" in figment.config.params
assert figment.config.params["figment_dir"] == "figments"