Andrey Epifancev 1eef422b6e feat(parser): каскад стратегий иерархии строк (outline → indent → account_pattern → sums)
hierarchy.py: BodyRow, Levels, стратегии outline (сдвиг к 0), indent (ранги
различных отступов — единицы alignment.indent и пробелов не смешиваются),
account_pattern (ранг кода + жирность, ASSUMPTION в docstring), sums
(жадно, без рекурсии); is_consistent, parents (по позициям и уровням,
Review Focus 3), resolve_levels: «Итого» в стратегии не передаётся и
получает уровень 0; меньше двух строк кроме «Итого» — дерево «trivial».
deadline.py: кооперативный Deadline (R-3). Unit-тесты; fixtures-тест — в
Задаче 8 (R-2). Отметки плана и tasks.md 2.3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 13:31:59 +04:00

50 lines
1.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Кооперативный дедлайн разбора (design D-8, ruling R-3): проверка между шагами, часы подменяются в тестах."""
import pytest
from src.parser.deadline import Deadline
from src.parser.errors import ParseTimeoutError
class FakeClock:
"""Часы-заглушка: время двигается только вручную."""
def __init__(self) -> None:
self.now = 1000.0
def __call__(self) -> float:
return self.now
def test_check_passes_within_limit() -> None:
clock = FakeClock()
deadline = Deadline(10, clock=clock)
clock.now += 10
deadline.check("иерархия") # ровно на границе лимита — ещё не превышен
def test_check_raises_after_limit_with_step_name() -> None:
clock = FakeClock()
deadline = Deadline(120, clock=clock)
clock.now += 120.5
with pytest.raises(ParseTimeoutError) as raised:
deadline.check("иерархия (outline)")
assert raised.value.message == "превышен лимит 120 с на шаге иерархия (outline)"
def test_limit_is_counted_from_creation() -> None:
clock = FakeClock()
clock.now += 500
deadline = Deadline(1, clock=clock)
deadline.check("старт")
def test_default_clock_is_monotonic() -> None:
Deadline(60).check("сразу")