5 new test files covering the pure-function extractions from Phase 1: - test_search_controller.py (24): tag building, blacklist filtering, backfill - test_window_state.py (16): geometry parsing, splitter parsing, hyprctl cmds - test_media_controller.py (9): prefetch ring-expansion ordering - test_post_actions.py (10): batch message detection, library membership - test_popout_controller.py (3): video sync dict shape All import-pure (no PySide6, no mpv, no httpx). Total suite: 186 tests.
82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
"""Tests for media_controller -- prefetch order computation.
|
|
|
|
Pure Python. No Qt, no mpv, no httpx.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from booru_viewer.gui.media_controller import compute_prefetch_order
|
|
|
|
|
|
# ======================================================================
|
|
# Nearby mode
|
|
# ======================================================================
|
|
|
|
|
|
def test_nearby_center_returns_4_cardinals():
|
|
"""Center of a grid returns right, left, below, above."""
|
|
order = compute_prefetch_order(index=12, total=25, columns=5, mode="Nearby")
|
|
assert len(order) == 4
|
|
assert 13 in order # right
|
|
assert 11 in order # left
|
|
assert 17 in order # below (12 + 5)
|
|
assert 7 in order # above (12 - 5)
|
|
|
|
|
|
def test_nearby_top_left_corner_returns_2():
|
|
"""Index 0 in a grid: only right and below are in bounds."""
|
|
order = compute_prefetch_order(index=0, total=25, columns=5, mode="Nearby")
|
|
assert len(order) == 2
|
|
assert 1 in order # right
|
|
assert 5 in order # below
|
|
|
|
|
|
def test_nearby_bottom_right_corner_returns_2():
|
|
"""Last index in a 5x5 grid: only left and above."""
|
|
order = compute_prefetch_order(index=24, total=25, columns=5, mode="Nearby")
|
|
assert len(order) == 2
|
|
assert 23 in order # left
|
|
assert 19 in order # above
|
|
|
|
|
|
def test_nearby_single_post_returns_empty():
|
|
order = compute_prefetch_order(index=0, total=1, columns=5, mode="Nearby")
|
|
assert order == []
|
|
|
|
|
|
# ======================================================================
|
|
# Aggressive mode
|
|
# ======================================================================
|
|
|
|
|
|
def test_aggressive_returns_more_than_nearby():
|
|
nearby = compute_prefetch_order(index=12, total=25, columns=5, mode="Nearby")
|
|
aggressive = compute_prefetch_order(index=12, total=25, columns=5, mode="Aggressive")
|
|
assert len(aggressive) > len(nearby)
|
|
|
|
|
|
def test_aggressive_no_duplicates():
|
|
order = compute_prefetch_order(index=12, total=100, columns=5, mode="Aggressive")
|
|
assert len(order) == len(set(order))
|
|
|
|
|
|
def test_aggressive_excludes_self():
|
|
order = compute_prefetch_order(index=12, total=100, columns=5, mode="Aggressive")
|
|
assert 12 not in order
|
|
|
|
|
|
def test_aggressive_all_in_bounds():
|
|
order = compute_prefetch_order(index=0, total=50, columns=5, mode="Aggressive")
|
|
for idx in order:
|
|
assert 0 <= idx < 50
|
|
|
|
|
|
def test_aggressive_respects_cap():
|
|
"""Aggressive is capped by max_radius=3, so even with a huge grid
|
|
the returned count doesn't blow up unboundedly."""
|
|
order = compute_prefetch_order(index=500, total=10000, columns=10, mode="Aggressive")
|
|
# columns * max_radius * 2 + columns = 10*3*2+10 = 70
|
|
assert len(order) <= 70
|