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:
103
tests/test_figment_effect.py
Normal file
103
tests/test_figment_effect.py
Normal 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"
|
||||
Reference in New Issue
Block a user