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
61 lines
1.4 KiB
Python
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")
|