forked from genewildish/Mainline
Split monolithic scroll.py into focused modules: - viewport.py: terminal size (tw/th), ANSI positioning helpers - frame.py: FrameTimer class, scroll step calculation - layers.py: message overlay, ticker zone, firehose rendering - scroll.py: simplified orchestrator, imports from new modules Add stream controller and event types for future event-driven architecture: - controller.py: StreamController for source initialization and stream lifecycle - events.py: EventType enum and event dataclasses (HeadlineEvent, FrameTickEvent, etc.) Added tests for new modules: - test_viewport.py: 8 tests for viewport utilities - test_frame.py: 10 tests for frame timing - test_layers.py: 13 tests for layer compositing - test_events.py: 11 tests for event types - test_controller.py: 6 tests for stream controller This enables: - Testable chunks with clear responsibilities - Reusable viewport utilities across modules - Better separation of concerns in render pipeline - Foundation for future event-driven architecture Also includes Phase 1 documentation updates in code comments.
64 lines
2.0 KiB
Python
64 lines
2.0 KiB
Python
"""
|
|
Tests for engine.frame module.
|
|
"""
|
|
|
|
import time
|
|
|
|
from engine.frame import FrameTimer, calculate_scroll_step
|
|
|
|
|
|
class TestFrameTimer:
|
|
"""Tests for FrameTimer class."""
|
|
|
|
def test_init_default(self):
|
|
"""FrameTimer initializes with default values."""
|
|
timer = FrameTimer()
|
|
assert timer.target_frame_dt == 0.05
|
|
assert timer.fps >= 0
|
|
|
|
def test_init_custom(self):
|
|
"""FrameTimer accepts custom frame duration."""
|
|
timer = FrameTimer(target_frame_dt=0.1)
|
|
assert timer.target_frame_dt == 0.1
|
|
|
|
def test_fps_calculation(self):
|
|
"""FrameTimer calculates FPS correctly."""
|
|
timer = FrameTimer()
|
|
timer._frame_count = 10
|
|
timer._start_time = time.monotonic() - 1.0
|
|
assert timer.fps >= 9.0
|
|
|
|
def test_reset(self):
|
|
"""FrameTimer.reset() clears frame count."""
|
|
timer = FrameTimer()
|
|
timer._frame_count = 100
|
|
timer.reset()
|
|
assert timer._frame_count == 0
|
|
|
|
|
|
class TestCalculateScrollStep:
|
|
"""Tests for calculate_scroll_step function."""
|
|
|
|
def test_basic_calculation(self):
|
|
"""calculate_scroll_step returns positive value."""
|
|
result = calculate_scroll_step(5.0, 24)
|
|
assert result > 0
|
|
|
|
def test_with_padding(self):
|
|
"""calculate_scroll_step respects padding parameter."""
|
|
without_padding = calculate_scroll_step(5.0, 24, padding=0)
|
|
with_padding = calculate_scroll_step(5.0, 24, padding=15)
|
|
assert with_padding < without_padding
|
|
|
|
def test_larger_view_slower_scroll(self):
|
|
"""Larger view height results in slower scroll steps."""
|
|
small = calculate_scroll_step(5.0, 10)
|
|
large = calculate_scroll_step(5.0, 50)
|
|
assert large < small
|
|
|
|
def test_longer_duration_slower_scroll(self):
|
|
"""Longer scroll duration results in slower scroll steps."""
|
|
fast = calculate_scroll_step(2.0, 24)
|
|
slow = calculate_scroll_step(10.0, 24)
|
|
assert slow > fast
|