Skip to content

Commit 9e67d9d

Browse files
committed
Add annual demand increase tests
1 parent f8064d8 commit 9e67d9d

1 file changed

Lines changed: 81 additions & 0 deletions

File tree

offgridplanner/optimization/tests/test_processing.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,3 +232,84 @@ def test_exact_values_match_uploaded_data(self, uploaded_demand):
232232
def test_length_matches_uploaded_data(self, uploaded_demand):
233233
handler = _make_handler(uploaded_series=uploaded_demand)
234234
assert len(handler.collect_project_demand()) == len(uploaded_demand)
235+
236+
237+
# ---------- Annual demand increase ----------
238+
239+
240+
class TestAnnualDemandIncrease:
241+
@pytest.fixture
242+
def base_demand(self):
243+
return pd.Series([1.5] * N_HOURS)
244+
245+
def test_none_growth_returns_original_demand(self, base_demand):
246+
handler = _make_handler(uploaded_series=base_demand, annual_growth=None)
247+
result = handler.collect_project_demand().reset_index(drop=True)
248+
pd.testing.assert_series_equal(result, base_demand, check_names=False)
249+
250+
def test_positive_growth_increases_demand(self, base_demand):
251+
handler = _make_handler(
252+
uploaded_series=base_demand,
253+
annual_growth=0.05,
254+
project_lifetime=10,
255+
)
256+
assert handler.collect_project_demand().sum() > base_demand.sum()
257+
258+
def test_mean_growth_factor_math(self, base_demand):
259+
growth = 0.1
260+
years = 3
261+
handler = _make_handler(
262+
uploaded_series=base_demand,
263+
annual_growth=growth,
264+
project_lifetime=years,
265+
)
266+
result = handler.collect_project_demand().reset_index(drop=True)
267+
268+
yearly_factors = [(1 + growth) ** y for y in range(years)]
269+
expected_factor = sum(yearly_factors) / years
270+
expected = (base_demand * expected_factor).reset_index(drop=True)
271+
pd.testing.assert_series_equal(result, expected, check_names=False)
272+
273+
def test_one_year_project_applies_no_scaling(self, base_demand):
274+
# range(1) = [0] → (1+g)^0 = 1.0 → mean factor = 1.0
275+
handler = _make_handler(
276+
uploaded_series=base_demand,
277+
annual_growth=0.2,
278+
project_lifetime=1,
279+
)
280+
result = handler.collect_project_demand().reset_index(drop=True)
281+
pd.testing.assert_series_equal(result, base_demand, check_names=False)
282+
283+
def test_result_scales_linearly_with_base_demand(self):
284+
base = pd.Series([2.5] * N_HOURS)
285+
double = base * 2
286+
growth, years = 0.08, 15
287+
288+
result_base = (
289+
_make_handler(
290+
uploaded_series=base, annual_growth=growth, project_lifetime=years
291+
)
292+
.collect_project_demand()
293+
.reset_index(drop=True)
294+
)
295+
296+
result_double = (
297+
_make_handler(
298+
uploaded_series=double, annual_growth=growth, project_lifetime=years
299+
)
300+
.collect_project_demand()
301+
.reset_index(drop=True)
302+
)
303+
304+
pd.testing.assert_series_equal(
305+
result_double, result_base * 2, check_names=False
306+
)
307+
308+
def test_higher_growth_rate_produces_larger_demand(self, base_demand):
309+
low = _make_handler(
310+
uploaded_series=base_demand, annual_growth=0.01, project_lifetime=20
311+
).collect_project_demand()
312+
high = _make_handler(
313+
uploaded_series=base_demand, annual_growth=0.10, project_lifetime=20
314+
).collect_project_demand()
315+
assert high.sum() > low.sum()

0 commit comments

Comments
 (0)