forked from genewildish/Mainline
- 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).
104 lines
3.3 KiB
Python
104 lines
3.3 KiB
Python
"""
|
|
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"
|