"""The Scenario's measure scoping: its exclusions imply the allowlist the run considers (the live `scenario` table persists exclusions only — no inclusions).""" from domain.modelling.measure_type import MeasureType from domain.modelling.scenario import Scenario def _scenario(exclusions: frozenset[MeasureType]) -> Scenario: return Scenario( id=1, goal="Increasing EPC", goal_value="C", budget=None, is_default=True, exclusions=exclusions, ) def test_no_exclusions_considers_every_measure() -> None: # Arrange scenario = _scenario(frozenset()) # Act considered = scenario.considered_measures() # Assert — None means "consider all" (the unrestricted default). assert considered is None def test_exclusions_imply_the_complement_allowlist() -> None: # Arrange — exclude solar PV and ASHP. scenario = _scenario( frozenset({MeasureType.SOLAR_PV, MeasureType.AIR_SOURCE_HEAT_PUMP}) ) # Act considered = scenario.considered_measures() # Assert — every modelled measure survives except the two excluded ones. assert considered is not None assert MeasureType.SOLAR_PV not in considered assert MeasureType.AIR_SOURCE_HEAT_PUMP not in considered assert considered == frozenset(MeasureType) - scenario.exclusions