@@ -95,6 +95,8 @@ pub struct Asset {
9595 capacity : Capacity ,
9696 /// The year the asset was/will be commissioned
9797 commission_year : u32 ,
98+ /// The maximum year that the asset could be decommissioned
99+ max_decommission_year : u32 ,
98100}
99101
100102impl Asset {
@@ -111,6 +113,7 @@ impl Asset {
111113 region_id,
112114 capacity,
113115 commission_year,
116+ None ,
114117 )
115118 }
116119
@@ -125,12 +128,13 @@ impl Asset {
125128 }
126129
127130 /// Create a new future asset
128- pub fn new_future (
131+ pub fn new_future_with_max_decommission (
129132 agent_id : AgentID ,
130133 process : Rc < Process > ,
131134 region_id : RegionID ,
132135 capacity : Capacity ,
133136 commission_year : u32 ,
137+ max_decommission_year : Option < u32 > ,
134138 ) -> Result < Self > {
135139 check_capacity_valid_for_asset ( capacity) ?;
136140 Self :: new_with_state (
@@ -139,6 +143,25 @@ impl Asset {
139143 region_id,
140144 capacity,
141145 commission_year,
146+ max_decommission_year,
147+ )
148+ }
149+
150+ /// Create a new future asset
151+ pub fn new_future (
152+ agent_id : AgentID ,
153+ process : Rc < Process > ,
154+ region_id : RegionID ,
155+ capacity : Capacity ,
156+ commission_year : u32 ,
157+ ) -> Result < Self > {
158+ Self :: new_future_with_max_decommission (
159+ agent_id,
160+ process,
161+ region_id,
162+ capacity,
163+ commission_year,
164+ None ,
142165 )
143166 }
144167
@@ -160,6 +183,7 @@ impl Asset {
160183 region_id,
161184 capacity,
162185 commission_year,
186+ None ,
163187 )
164188 }
165189
@@ -170,6 +194,7 @@ impl Asset {
170194 region_id : RegionID ,
171195 capacity : Capacity ,
172196 commission_year : u32 ,
197+ max_decommission_year : Option < u32 > ,
173198 ) -> Result < Self > {
174199 check_region_year_valid_for_process ( & process, & region_id, commission_year) ?;
175200 ensure ! ( capacity >= Capacity ( 0.0 ) , "Capacity must be non-negative" ) ;
@@ -214,6 +239,13 @@ impl Asset {
214239 } ) ?
215240 . clone ( ) ;
216241
242+ let max_decommission_year =
243+ max_decommission_year. unwrap_or ( commission_year + process_parameter. lifetime ) ;
244+ ensure ! (
245+ max_decommission_year >= commission_year,
246+ "Max decommission year must be after/same as commission year"
247+ ) ;
248+
217249 Ok ( Self {
218250 state,
219251 process,
@@ -223,6 +255,7 @@ impl Asset {
223255 region_id,
224256 capacity,
225257 commission_year,
258+ max_decommission_year,
226259 } )
227260 }
228261
@@ -238,7 +271,7 @@ impl Asset {
238271
239272 /// The last year in which this asset should be decommissioned
240273 pub fn max_decommission_year ( & self ) -> u32 {
241- self . commission_year + self . process_parameter . lifetime
274+ self . max_decommission_year
242275 }
243276
244277 /// Get the activity limits for this asset in a particular time slice
@@ -1503,8 +1536,8 @@ mod tests {
15031536 }
15041537
15051538 #[ rstest]
1506- #[ case:: early_decommission_within_lifetime ( 2024 , 2024 ) ]
1507- #[ case:: decommission_at_maximum_year ( 2026 , 2025 ) ]
1539+ #[ case:: commission_during_process_lifetime ( 2024 , 2024 ) ]
1540+ #[ case:: decommission_after_process_lifetime_ends ( 2026 , 2025 ) ]
15081541 fn test_asset_decommission (
15091542 #[ case] requested_decommission_year : u32 ,
15101543 #[ case] expected_decommission_year : u32 ,
@@ -1530,6 +1563,38 @@ mod tests {
15301563 assert_eq ! ( asset. decommission_year( ) , Some ( expected_decommission_year) ) ;
15311564 }
15321565
1566+ #[ rstest]
1567+ #[ case:: decommission_after_predefined_max_year( 2026 , 2025 , Some ( 2025 ) ) ]
1568+ #[ case:: decommission_before_predefined_max_year( 2024 , 2024 , Some ( 2025 ) ) ]
1569+ #[ case:: decommission_during_process_lifetime_end_no_max_year( 2024 , 2024 , None ) ]
1570+ #[ case:: decommission_after_process_lifetime_end_no_max_year( 2026 , 2025 , None ) ]
1571+ fn test_asset_decommission_with_max_decommission_year_predefined (
1572+ #[ case] requested_decommission_year : u32 ,
1573+ #[ case] expected_decommission_year : u32 ,
1574+ #[ case] max_decommission_year : Option < u32 > ,
1575+ process : Process ,
1576+ ) {
1577+ // Test successful commissioning of Future asset
1578+ let process_rc = Rc :: new ( process) ;
1579+ let mut asset = Asset :: new_future_with_max_decommission (
1580+ "agent1" . into ( ) ,
1581+ Rc :: clone ( & process_rc) ,
1582+ "GBR" . into ( ) ,
1583+ Capacity ( 1.0 ) ,
1584+ 2020 ,
1585+ max_decommission_year,
1586+ )
1587+ . unwrap ( ) ;
1588+ asset. commission ( AssetID ( 1 ) , "" ) ;
1589+ assert ! ( asset. is_commissioned( ) ) ;
1590+ assert_eq ! ( asset. id( ) , Some ( AssetID ( 1 ) ) ) ;
1591+
1592+ // Test successful decommissioning
1593+ asset. decommission ( requested_decommission_year, "" ) ;
1594+ assert ! ( !asset. is_commissioned( ) ) ;
1595+ assert_eq ! ( asset. decommission_year( ) , Some ( expected_decommission_year) ) ;
1596+ }
1597+
15331598 #[ rstest]
15341599 #[ should_panic( expected = "Assets with state Candidate cannot be commissioned" ) ]
15351600 fn test_commission_wrong_states ( process : Process ) {
0 commit comments