@@ -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