54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
"""Identity pin budgets: explicit, measured, visible overflow."""
|
|
|
|
from rune.orchestration.budget import BudgetRegistry, PinBudget
|
|
|
|
|
|
def test_reserve_within_budget_is_measured_and_true():
|
|
reg = BudgetRegistry()
|
|
reg.register(PinBudget("high", 5))
|
|
assert reg.reserve("high", "pin1", 3) is True
|
|
assert reg.used("high") == 3
|
|
|
|
|
|
def test_overflow_raises_pressure_and_calls_strategy():
|
|
calls: list[tuple[str, int]] = []
|
|
reg = BudgetRegistry(strategy=lambda p, u: calls.append((p, u)))
|
|
reg.register(PinBudget("high", 5))
|
|
reg.reserve("high", "pin1", 3)
|
|
assert reg.reserve("high", "pin2", 3) is False # 6 > 5
|
|
assert reg.pressure() == ["high"]
|
|
assert calls == [("high", 6)]
|
|
assert reg.used("high") == 6 # overflow item still measured
|
|
|
|
|
|
def test_priority_classes_are_separate():
|
|
reg = BudgetRegistry()
|
|
reg.register(PinBudget("high", 5))
|
|
reg.register(PinBudget("low", 10))
|
|
reg.reserve("high", "a", 5)
|
|
reg.reserve("low", "b", 8)
|
|
assert reg.pressure() == []
|
|
reg.reserve("high", "c", 1) # high overflows
|
|
assert reg.pressure() == ["high"]
|
|
assert reg.used("low") == 8 # low unaffected
|
|
|
|
|
|
def test_used_is_exact_sum():
|
|
reg = BudgetRegistry()
|
|
reg.register(PinBudget("high", 100))
|
|
reg.reserve("high", "a", 2)
|
|
reg.reserve("high", "b", 3)
|
|
reg.reserve("high", "c", 5)
|
|
assert reg.used("high") == 10
|
|
|
|
|
|
def test_reserve_rejects_negative_size():
|
|
reg = BudgetRegistry()
|
|
reg.register(PinBudget("high", 5))
|
|
try:
|
|
reg.reserve("high", "p", -1)
|
|
raise AssertionError("expected ValueError")
|
|
except ValueError:
|
|
pass
|
|
assert reg.used("high") == 0
|