Skip to content

Commit

Permalink
building unit test fixed
Browse files Browse the repository at this point in the history
  • Loading branch information
Manish-Khanra committed Nov 20, 2024
1 parent 5804bd3 commit 27fbcf6
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 20 deletions.
2 changes: 1 addition & 1 deletion assume/units/building.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ def __init__(
and component not in self.optional_technologies
):
raise ValueError(
f"Components {component} is not a valid component for the steel plant unit."
f"Components {component} is not a valid component for the building unit."
)

# Initialize forecasting data for various energy prices and demands
Expand Down
115 changes: 96 additions & 19 deletions tests/test_building.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,17 @@ def pv_plant_config():
}


# Fixtures for Default Objective and Flexibility Measure
@pytest.fixture
def default_objective():
return "min_variable_cost"


@pytest.fixture
def default_flexibility_measure():
return "cost_based_load_shift"


# Fixtures for Availability Profiles
@pytest.fixture
def ev_availability_profile():
Expand Down Expand Up @@ -181,16 +192,25 @@ def available_solver():


# Test Cases


def test_building_initialization_heatpump(
forecast, index, building_components_heatpump, available_solver
forecast,
index,
building_components_heatpump,
available_solver,
default_objective,
default_flexibility_measure,
):
building = Building(
id="building_heatpump",
unit_operator="operator_hp",
index=index,
bidding_strategies={},
components=building_components_heatpump,
forecaster=forecast, # Passed via **kwargs
objective=default_objective,
flexibility_measure=default_flexibility_measure,
forecaster=forecast,
)

assert building.id == "building_heatpump"
Expand All @@ -205,14 +225,21 @@ def test_building_initialization_heatpump(


def test_building_initialization_boiler(
forecast, index, building_components_boiler, available_solver
forecast,
index,
building_components_boiler,
available_solver,
default_objective,
default_flexibility_measure,
):
building = Building(
id="building_boiler",
unit_operator="operator_boiler",
index=index,
bidding_strategies={},
components=building_components_boiler,
objective=default_objective,
flexibility_measure=default_flexibility_measure,
forecaster=forecast, # Passed via **kwargs
)

Expand All @@ -227,7 +254,9 @@ def test_building_initialization_boiler(
assert building.has_pv is True


def test_building_initialization_invalid_component(forecast, index, available_solver):
def test_building_initialization_invalid_component(
forecast, index, available_solver, default_objective, default_flexibility_measure
):
invalid_components = {"invalid_component": {"some_param": 123}}

with pytest.raises(ValueError) as exc_info:
Expand All @@ -237,11 +266,14 @@ def test_building_initialization_invalid_component(forecast, index, available_so
index=index,
bidding_strategies={},
components=invalid_components,
forecaster=forecast, # Passed via **kwargs
objective=default_objective,
flexibility_measure=default_flexibility_measure,
forecaster=forecast,
)

# Match the actual error message
assert (
"Component invalid_component is not a valid component for the building unit."
"Components invalid_component is not a valid component for the building unit."
in str(exc_info.value)
)

Expand All @@ -252,19 +284,26 @@ def test_solver_availability():


def test_building_optimization_heatpump(
forecast, index, building_components_heatpump, available_solver
forecast,
index,
building_components_heatpump,
available_solver,
default_objective,
default_flexibility_measure,
):
building = Building(
id="building_heatpump",
unit_operator="operator_hp",
index=index,
bidding_strategies={},
objective=default_objective,
flexibility_measure=default_flexibility_measure,
components=building_components_heatpump,
forecaster=forecast, # Passed via **kwargs
)

# Perform optimization
building.calculate_optimal_operation()
building.determine_optimal_operation_without_flex()

# Check if optimal power requirement is calculated
assert building.opt_power_requirement is not None
Expand Down Expand Up @@ -295,19 +334,26 @@ def test_building_optimization_heatpump(


def test_building_optimization_boiler(
forecast, index, building_components_boiler, available_solver
forecast,
index,
building_components_boiler,
available_solver,
default_objective,
default_flexibility_measure,
):
building = Building(
id="building_boiler",
unit_operator="operator_boiler",
index=index,
bidding_strategies={},
objective=default_objective,
flexibility_measure=default_flexibility_measure,
components=building_components_boiler,
forecaster=forecast, # Passed via **kwargs
)

# Perform optimization
building.calculate_optimal_operation()
building.determine_optimal_operation_without_flex()

# Check if optimal power requirement is calculated
assert building.opt_power_requirement is not None
Expand All @@ -332,18 +378,25 @@ def test_building_optimization_boiler(


def test_building_marginal_cost_calculation_heatpump(
forecast, index, building_components_heatpump, available_solver
forecast,
index,
building_components_heatpump,
available_solver,
default_objective,
default_flexibility_measure,
):
building = Building(
id="building_heatpump",
unit_operator="operator_hp",
index=index,
bidding_strategies={},
objective=default_objective,
flexibility_measure=default_flexibility_measure,
components=building_components_heatpump,
forecaster=forecast, # Passed via **kwargs
)

building.calculate_optimal_operation()
building.determine_optimal_operation_without_flex()

# Select a timestamp to test
test_time = 0 # Using integer index
Expand All @@ -361,18 +414,25 @@ def test_building_marginal_cost_calculation_heatpump(


def test_building_marginal_cost_calculation_boiler(
forecast, index, building_components_boiler, available_solver
forecast,
index,
building_components_boiler,
available_solver,
default_objective,
default_flexibility_measure,
):
building = Building(
id="building_boiler",
unit_operator="operator_boiler",
index=index,
bidding_strategies={},
objective=default_objective,
flexibility_measure=default_flexibility_measure,
components=building_components_boiler,
forecaster=forecast, # Passed via **kwargs
)

building.calculate_optimal_operation()
building.determine_optimal_operation_without_flex()

# Select a timestamp to test
test_time = 1 # Using integer index
Expand All @@ -390,20 +450,26 @@ def test_building_marginal_cost_calculation_boiler(


def test_building_objective_function_heatpump(
forecast, index, building_components_heatpump, available_solver
forecast,
index,
building_components_heatpump,
available_solver,
default_objective,
default_flexibility_measure,
):
building = Building(
id="building_heatpump",
unit_operator="operator_hp",
index=index,
bidding_strategies={},
objective=default_objective,
flexibility_measure=default_flexibility_measure,
components=building_components_heatpump,
objective="min_variable_cost",
forecaster=forecast, # Passed via **kwargs
)

# Access the objective function
objective = building.model.obj_rule
objective = building.model.obj_rule_opt

assert isinstance(objective, pyo.Objective)
assert objective.sense == pyo.minimize
Expand Down Expand Up @@ -453,11 +519,18 @@ def test_building_no_available_solvers(


def test_building_define_constraints_heatpump(
forecast, index, building_components_heatpump, available_solver
forecast,
index,
building_components_heatpump,
available_solver,
default_objective,
default_flexibility_measure,
):
building = Building(
id="building_constraints_hp",
unit_operator="operator_constraints_hp",
objective=default_objective,
flexibility_measure=default_flexibility_measure,
index=index,
bidding_strategies={},
components=building_components_heatpump,
Expand All @@ -466,7 +539,7 @@ def test_building_define_constraints_heatpump(

# Check if constraints are defined
constraints = list(building.model.component_map(pyo.Constraint).keys())
assert "variable_power_constraint" in constraints
assert "total_power_input_constraint" in constraints
if building.has_heatpump:
assert "heat_flow_constraint" in constraints

Expand All @@ -481,3 +554,7 @@ def test_building_get_available_solvers():
assert isinstance(available_solvers, list)
for solver in available_solvers:
assert SolverFactory(solver).available()


if __name__ == "__main__":
pytest.main(["-s", __file__])

0 comments on commit 27fbcf6

Please sign in to comment.