Files
Tirsvad d7c45320d5 Add speed calc decorator, tests and lecture-step screenshots
Package src/speed_calc with the decorator, fast_function, slow_function,
constants.py and runnable lecture steps; pytest tests with a fake clock;
four screenshots rendered from real output; README lecture steps; review
record RC-007.

Task: MIL-002#1
Task: MIL-002#2
Task: MIL-002#3
Task: MIL-002#4
Task: MIL-002#5
Task: MIL-002#6
Task: MIL-002#7
2026-11-06 13:35:21 +08:00

61 lines
1.4 KiB
Python

"""Tests for the speed calc decorator; a fake clock replaces real time."""
from collections.abc import Callable
import pytest
from speed_calc.decorator import make_speed_calc_decorator
def make_clock(*times: float) -> Callable[[], float]:
values = iter(times)
return lambda: next(values)
def test_prints_function_name_and_elapsed_seconds() -> None:
lines: list[str] = []
decorate = make_speed_calc_decorator(make_clock(10.0, 12.5), lines.append)
@decorate
def work() -> None:
pass
work()
assert lines == ["work run speed: 2.5s"]
def test_returns_the_result_of_the_function() -> None:
decorate = make_speed_calc_decorator(make_clock(0.0, 1.0), lambda _: None)
@decorate
def add(a: int, b: int) -> int:
return a + b
assert add(2, b=3) == 5
def test_keeps_name_and_docstring() -> None:
decorate = make_speed_calc_decorator(make_clock(0.0, 1.0), lambda _: None)
@decorate
def documented() -> None:
"""Doc."""
assert documented.__name__ == "documented"
assert documented.__doc__ == "Doc."
def test_default_decorator_prints_to_stdout(capsys: pytest.CaptureFixture[str]) -> None:
from speed_calc import speed_calc_decorator
@speed_calc_decorator
def quick() -> None:
pass
quick()
out = capsys.readouterr().out
assert out.startswith("quick run speed: ")
assert out.endswith("s\n")