forked from genewildish/Mainline
feat(integration): Complete feature rewrite with pipeline architecture, effects system, and display improvements
Major changes: - Pipeline architecture with capability-based dependency resolution - Effects plugin system with performance monitoring - Display abstraction with multiple backends (terminal, null, websocket) - Camera system for viewport scrolling - Sensor framework for real-time input - Command-and-control system via ntfy - WebSocket display backend for browser clients - Comprehensive test suite and documentation Issue #48: ADR for preset scripting language included This commit consolidates 110 individual commits into a single feature integration that can be reviewed and tested before further refinement.
This commit is contained in:
99
tests/test_crop_effect.py
Normal file
99
tests/test_crop_effect.py
Normal file
@@ -0,0 +1,99 @@
|
||||
"""
|
||||
Tests for CropEffect.
|
||||
"""
|
||||
|
||||
from engine.effects.plugins.crop import CropEffect
|
||||
from engine.effects.types import EffectContext
|
||||
|
||||
|
||||
def make_ctx(terminal_width: int = 80, terminal_height: int = 24) -> EffectContext:
|
||||
"""Create a mock EffectContext."""
|
||||
return EffectContext(
|
||||
terminal_width=terminal_width,
|
||||
terminal_height=terminal_height,
|
||||
scroll_cam=0,
|
||||
ticker_height=terminal_height,
|
||||
)
|
||||
|
||||
|
||||
class TestCropEffect:
|
||||
"""Tests for CropEffect."""
|
||||
|
||||
def test_basic_init(self):
|
||||
"""CropEffect initializes with defaults."""
|
||||
effect = CropEffect()
|
||||
assert effect.name == "crop"
|
||||
assert effect.config.enabled is True
|
||||
|
||||
def test_crop_wider_buffer(self):
|
||||
"""CropEffect crops wide buffer to terminal width."""
|
||||
effect = CropEffect()
|
||||
buf = [
|
||||
"This is a very long line that exceeds the terminal width of eighty characters!",
|
||||
"Another long line that should also be cropped to fit within the terminal bounds!",
|
||||
"Short",
|
||||
]
|
||||
ctx = make_ctx(terminal_width=40, terminal_height=10)
|
||||
|
||||
result = effect.process(buf, ctx)
|
||||
|
||||
# Lines should be cropped to 40 chars
|
||||
assert len(result[0]) == 40
|
||||
assert len(result[1]) == 40
|
||||
assert result[2] == "Short" + " " * 35 # padded to width
|
||||
|
||||
def test_crop_taller_buffer(self):
|
||||
"""CropEffect crops tall buffer to terminal height."""
|
||||
effect = CropEffect()
|
||||
buf = ["line"] * 30 # 30 lines
|
||||
ctx = make_ctx(terminal_width=80, terminal_height=10)
|
||||
|
||||
result = effect.process(buf, ctx)
|
||||
|
||||
# Should be cropped to 10 lines
|
||||
assert len(result) == 10
|
||||
|
||||
def test_pad_shorter_lines(self):
|
||||
"""CropEffect pads lines shorter than width."""
|
||||
effect = CropEffect()
|
||||
buf = ["short", "medium length", ""]
|
||||
ctx = make_ctx(terminal_width=20, terminal_height=5)
|
||||
|
||||
result = effect.process(buf, ctx)
|
||||
|
||||
assert len(result[0]) == 20 # padded
|
||||
assert len(result[1]) == 20 # padded
|
||||
assert len(result[2]) == 20 # padded (was empty)
|
||||
|
||||
def test_pad_to_height(self):
|
||||
"""CropEffect pads with empty lines if buffer is too short."""
|
||||
effect = CropEffect()
|
||||
buf = ["line1", "line2"]
|
||||
ctx = make_ctx(terminal_width=20, terminal_height=10)
|
||||
|
||||
result = effect.process(buf, ctx)
|
||||
|
||||
# Should have 10 lines
|
||||
assert len(result) == 10
|
||||
# Last 8 should be empty padding
|
||||
for i in range(2, 10):
|
||||
assert result[i] == " " * 20
|
||||
|
||||
def test_empty_buffer(self):
|
||||
"""CropEffect handles empty buffer."""
|
||||
effect = CropEffect()
|
||||
ctx = make_ctx()
|
||||
|
||||
result = effect.process([], ctx)
|
||||
|
||||
assert result == []
|
||||
|
||||
def test_uses_context_dimensions(self):
|
||||
"""CropEffect uses context terminal_width/terminal_height."""
|
||||
effect = CropEffect()
|
||||
buf = ["x" * 100]
|
||||
ctx = make_ctx(terminal_width=50, terminal_height=1)
|
||||
|
||||
result = effect.process(buf, ctx)
|
||||
|
||||
assert len(result[0]) == 50
|
||||
Reference in New Issue
Block a user