""" Tests for BorderEffect. """ from engine.effects.plugins.border import BorderEffect 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 TestBorderEffect: """Tests for BorderEffect.""" def test_basic_init(self): """BorderEffect initializes with defaults.""" effect = BorderEffect() assert effect.name == "border" assert effect.config.enabled is True def test_adds_border(self): """BorderEffect adds border around content.""" effect = BorderEffect() buf = [ "Hello World", "Test Content", "Third Line", ] ctx = make_ctx(terminal_width=20, terminal_height=10) result = effect.process(buf, ctx) # Should have top and bottom borders assert len(result) >= 3 # First line should start with border character assert result[0][0] in "┌┎┍" # Last line should end with border character assert result[-1][-1] in "┘┖┚" def test_border_with_small_buffer(self): """BorderEffect handles small buffer (too small for border).""" effect = BorderEffect() buf = ["ab"] # Too small for proper border ctx = make_ctx(terminal_width=10, terminal_height=5) result = effect.process(buf, ctx) # Should still try to add border but result may differ # At minimum should have output assert len(result) >= 1 def test_metrics_in_border(self): """BorderEffect includes FPS and frame time in border.""" effect = BorderEffect() buf = ["x" * 10] * 5 ctx = make_ctx(terminal_width=20, terminal_height=10) # Add metrics to context ctx.set_state( "metrics", { "avg_ms": 16.5, "frame_count": 100, "fps": 60.0, }, ) result = effect.process(buf, ctx) # Check for FPS in top border top_line = result[0] assert "FPS" in top_line or "60" in top_line # Check for frame time in bottom border bottom_line = result[-1] assert "ms" in bottom_line or "16" in bottom_line def test_no_metrics(self): """BorderEffect works without metrics.""" effect = BorderEffect() buf = ["content"] * 5 ctx = make_ctx(terminal_width=20, terminal_height=10) # No metrics set result = effect.process(buf, ctx) # Should still have border characters assert len(result) >= 3 assert result[0][0] in "┌┎┍" def test_crops_before_bordering(self): """BorderEffect crops input before adding border.""" effect = BorderEffect() buf = ["x" * 100] * 50 # Very large buffer ctx = make_ctx(terminal_width=20, terminal_height=10) result = effect.process(buf, ctx) # Should be cropped to fit, then bordered # Result should be <= terminal_height with border assert len(result) <= ctx.terminal_height # Each line should be <= terminal_width for line in result: assert len(line) <= ctx.terminal_width