diff --git a/src/asset.rs b/src/asset.rs index b7a96d2a7..2d0b7638e 100644 --- a/src/asset.rs +++ b/src/asset.rs @@ -453,7 +453,7 @@ impl Asset { self.state = AssetState::Decommissioned { id, agent_id, - decommission_year, + decommission_year: decommission_year.min(self.max_decommission_year()), }; } @@ -867,7 +867,7 @@ mod tests { assert_error, asset, commodity_id, process, process_parameter_map, region_id, time_slice, }; use crate::process::{ - FlowType, Process, ProcessActivityLimitsMap, ProcessFlow, ProcessFlowsMap, ProcessID, + FlowType, Process, ProcessActivityLimitsMap, ProcessFlow, ProcessFlowsMap, ProcessParameter, ProcessParameterMap, }; use crate::region::RegionID; @@ -1473,7 +1473,7 @@ mod tests { } #[rstest] - fn test_asset_state_transitions(process: Process) { + fn test_asset_commission(process: Process) { // Test successful commissioning of Future asset let process_rc = Rc::new(process); let mut asset1 = Asset::new_future( @@ -1500,11 +1500,34 @@ mod tests { asset2.commission(AssetID(2), ""); assert!(asset2.is_commissioned()); assert_eq!(asset2.id(), Some(AssetID(2))); + } + + #[rstest] + #[case::early_decommission_within_lifetime(2024, 2024)] + #[case::decommission_at_maximum_year(2026, 2025)] + fn test_asset_decommission( + #[case] requested_decommission_year: u32, + #[case] expected_decommission_year: u32, + process: Process, + ) { + // Test successful commissioning of Future asset + let process_rc = Rc::new(process); + let mut asset = Asset::new_future( + "agent1".into(), + Rc::clone(&process_rc), + "GBR".into(), + Capacity(1.0), + 2020, + ) + .unwrap(); + asset.commission(AssetID(1), ""); + assert!(asset.is_commissioned()); + assert_eq!(asset.id(), Some(AssetID(1))); // Test successful decommissioning - asset1.decommission(2025, ""); - assert!(!asset1.is_commissioned()); - assert_eq!(asset1.decommission_year(), Some(2025)); + asset.decommission(requested_decommission_year, ""); + assert!(!asset.is_commissioned()); + assert_eq!(asset.decommission_year(), Some(expected_decommission_year)); } #[rstest] diff --git a/src/fixture.rs b/src/fixture.rs index dfb2a686a..37e72036e 100644 --- a/src/fixture.rs +++ b/src/fixture.rs @@ -126,7 +126,7 @@ pub fn process_parameter_map(region_ids: IndexSet) -> ProcessParameter capital_cost: MoneyPerCapacity(0.0), fixed_operating_cost: MoneyPerCapacityPerYear(0.0), variable_operating_cost: MoneyPerActivity(0.0), - lifetime: 1, + lifetime: 5, discount_rate: Dimensionless(1.0), }); diff --git a/tests/data/missing_commodity/assets.csv b/tests/data/missing_commodity/assets.csv index e6275cb05..e2ec94edc 100644 --- a/tests/data/missing_commodity/assets.csv +++ b/tests/data/missing_commodity/assets.csv @@ -3,8 +3,8 @@ asset_id,process_id,region_id,agent_id,commission_year,decommission_year,capacit 1,GASPRC,GBR,A0_GPR,2020,2040,3782.13 2,WNDFRM,GBR,A0_ELC,2020,2040,3.964844 3,GASCGT,GBR,A0_ELC,2020,2040,2.43 -4,RGASBR,GBR,A0_RES,2020,2040,2900.0 -5,RELCHP,GBR,A0_RES,2020,2040,399.98 +4,RGASBR,GBR,A0_RES,2020,2035,2900.0 +5,RELCHP,GBR,A0_RES,2020,2035,399.98 6,RBIOBL,GBR,A0_RES,2030,,355.83840587648046 7,BIOPLL,GBR,A0_BPL,2030,,449.480091633449 8,BIOPRO,GBR,A0_BPD,2030,,448.35639140436535 diff --git a/tests/data/simple/assets.csv b/tests/data/simple/assets.csv index 443293aa1..8a82ef546 100644 --- a/tests/data/simple/assets.csv +++ b/tests/data/simple/assets.csv @@ -3,7 +3,7 @@ asset_id,process_id,region_id,agent_id,commission_year,decommission_year,capacit 1,GASPRC,GBR,A0_GPR,2020,,3782.13 2,WNDFRM,GBR,A0_ELC,2020,2040,3.964844 3,GASCGT,GBR,A0_ELC,2020,2040,2.43 -4,RGASBR,GBR,A0_RES,2020,2040,2900.0 -5,RELCHP,GBR,A0_RES,2020,2040,399.98 +4,RGASBR,GBR,A0_RES,2020,2035,2900.0 +5,RELCHP,GBR,A0_RES,2020,2035,399.98 6,RGASBR,GBR,A0_RES,2030,,355.83840587648046 7,RGASBR,GBR,A0_RES,2040,,3655.8189696 diff --git a/tests/data/simple/debug_appraisal_results.csv b/tests/data/simple/debug_appraisal_results.csv index d4350e5f2..7a398dce0 100644 --- a/tests/data/simple/debug_appraisal_results.csv +++ b/tests/data/simple/debug_appraisal_results.csv @@ -4,21 +4,21 @@ milestone_year,run_description,asset_id,process_id,region_id,capacity,unmet_dema 2030,ironing out iteration 0; RSHEAT A0_RES round 0,,RGASBR,GBR,365.58184058764806,731.9814967499585,16.969542701647153 2030,ironing out iteration 0; RSHEAT A0_RES round 0,,RELCHP,GBR,365.58184058764806,731.9814967499585,32.7615162456679 2030,ironing out iteration 0; RSHEAT A0_RES round 1,4,RGASBR,GBR,2900.0,11.119950183640015,12.82090004166788 -2030,ironing out iteration 0; RSHEAT A0_RES round 1,,RGASBR,GBR,365.58184058764806,458.2122119206317,19.09314691763651 +2030,ironing out iteration 0; RSHEAT A0_RES round 1,,RGASBR,GBR,365.58184058764806,458.2122119206317,19.093146917636513 2030,ironing out iteration 0; RSHEAT A0_RES round 1,,RELCHP,GBR,365.58184058764806,458.2122119206317,38.32240163825729 -2030,ironing out iteration 0; RSHEAT A0_RES round 2,,RGASBR,GBR,355.83840587648046,0.0,292.9539943035967 +2030,ironing out iteration 0; RSHEAT A0_RES round 2,,RGASBR,GBR,355.83840587648046,0.0,292.9539943035968 2030,ironing out iteration 0; RSHEAT A0_RES round 2,,RELCHP,GBR,355.83840587648046,0.0,720.5264354789919 2030,ironing out iteration 0; ELCTRI A0_ELC round 0,2,WNDFRM,GBR,3.964844,9.122582406189563,7.95135326336099 2030,ironing out iteration 0; ELCTRI A0_ELC round 0,3,GASCGT,GBR,2.43,8.533338146005143,11.116173242419679 -2030,ironing out iteration 0; ELCTRI A0_ELC round 0,,WNDFRM,GBR,0.8296341257939862,21.18388884708709,31.912566180263063 +2030,ironing out iteration 0; ELCTRI A0_ELC round 0,,WNDFRM,GBR,0.8296341257939862,21.18388884708709,31.91256618026307 2030,ironing out iteration 0; ELCTRI A0_ELC round 0,,GASCGT,GBR,0.464994715704925,19.786860477508085,16.700042478191456 2030,ironing out iteration 0; ELCTRI A0_ELC round 1,3,GASCGT,GBR,2.43,0.0,13.587119801355628 -2030,ironing out iteration 0; ELCTRI A0_ELC round 1,,WNDFRM,GBR,0.8296341257939862,6.934490527620455,53.54594746891633 +2030,ironing out iteration 0; ELCTRI A0_ELC round 1,,WNDFRM,GBR,0.8296341257939862,6.934490527620455,53.545947468916346 2030,ironing out iteration 0; ELCTRI A0_ELC round 1,,GASCGT,GBR,0.464994715704925,7.0400656048469985,29.262425253778225 2030,ironing out iteration 0; GASNAT A0_GPR round 0,1,GASPRC,GBR,3782.13,0.0,3.5946466245698283 2030,ironing out iteration 0; GASNAT A0_GPR round 0,,GASPRC,GBR,1882.2106508775898,105.87434741787482,4.6491158129807735 2030,ironing out iteration 0; GASPRD A0_GEX round 0,0,GASDRV,GBR,4002.26,0.0,3.4590637024393733 -2030,ironing out iteration 0; GASPRD A0_GEX round 0,,GASDRV,GBR,1782.3574244480762,100.25760352108253,5.120344950409316 +2030,ironing out iteration 0; GASPRD A0_GEX round 0,,GASDRV,GBR,1782.3574244480762,100.25760352108253,5.120344950409317 2040,ironing out iteration 0; RSHEAT A0_RES round 0,6,RGASBR,GBR,355.83840587648046,837.2243916125647,7.910651988850701 2040,ironing out iteration 0; RSHEAT A0_RES round 0,,RGASBR,GBR,401.16573754764806,803.2288927232066,16.96954270164715 2040,ironing out iteration 0; RSHEAT A0_RES round 0,,RELCHP,GBR,401.16573754764806,803.2288927232066,32.7615162456679 @@ -26,11 +26,11 @@ milestone_year,run_description,asset_id,process_id,region_id,capacity,unmet_dema 2040,ironing out iteration 0; RSHEAT A0_RES round 1,,RELCHP,GBR,401.16573754764806,553.002604410226,36.93897594690447 2040,ironing out iteration 0; RSHEAT A0_RES round 2,,RGASBR,GBR,401.16573754764806,344.439249133942,23.122931761022492 2040,ironing out iteration 0; RSHEAT A0_RES round 2,,RELCHP,GBR,401.16573754764806,344.439249133942,48.2108123214798 -2040,ironing out iteration 0; RSHEAT A0_RES round 3,,RGASBR,GBR,401.16573754764806,231.4426548511842,37.717511126543194 +2040,ironing out iteration 0; RSHEAT A0_RES round 3,,RGASBR,GBR,401.16573754764806,231.4426548511842,37.7175111265432 2040,ironing out iteration 0; RSHEAT A0_RES round 3,,RELCHP,GBR,401.16573754764806,231.4426548511842,84.02344255458496 -2040,ironing out iteration 0; RSHEAT A0_RES round 4,,RGASBR,GBR,401.16573754764806,135.33002996294968,43.31272689192322 +2040,ironing out iteration 0; RSHEAT A0_RES round 4,,RGASBR,GBR,401.16573754764806,135.33002996294968,43.312726891923226 2040,ironing out iteration 0; RSHEAT A0_RES round 4,,RELCHP,GBR,401.16573754764806,135.33002996294968,97.75315605036315 -2040,ironing out iteration 0; RSHEAT A0_RES round 5,,RGASBR,GBR,401.16573754764806,63.522481615597556,55.98733471331223 +2040,ironing out iteration 0; RSHEAT A0_RES round 5,,RGASBR,GBR,401.16573754764806,63.522481615597556,55.98733471331224 2040,ironing out iteration 0; RSHEAT A0_RES round 5,,RELCHP,GBR,401.16573754764806,63.522481615597556,128.8545007269613 2040,ironing out iteration 0; RSHEAT A0_RES round 6,,RGASBR,GBR,401.16573754764806,39.02576700981601,152.78630430986536 2040,ironing out iteration 0; RSHEAT A0_RES round 6,,RELCHP,GBR,401.16573754764806,39.02576700981601,370.4833534015565 @@ -40,12 +40,12 @@ milestone_year,run_description,asset_id,process_id,region_id,capacity,unmet_dema 2040,ironing out iteration 0; RSHEAT A0_RES round 8,,RELCHP,GBR,401.16573754764806,13.952908413088004,720.5264354789919 2040,ironing out iteration 0; RSHEAT A0_RES round 9,,RGASBR,GBR,401.16573754764806,1.4164791147240017,292.95399430359674 2040,ironing out iteration 0; RSHEAT A0_RES round 9,,RELCHP,GBR,401.16573754764806,1.4164791147240017,720.5264354789919 -2040,ironing out iteration 0; RSHEAT A0_RES round 10,,RGASBR,GBR,45.327331671168054,0.0,292.95399430359674 +2040,ironing out iteration 0; RSHEAT A0_RES round 10,,RGASBR,GBR,45.327331671168054,0.0,292.9539943035968 2040,ironing out iteration 0; RSHEAT A0_RES round 10,,RELCHP,GBR,45.327331671168054,0.0,720.5264354789919 2040,ironing out iteration 0; GASNAT A0_GPR round 0,1,GASPRC,GBR,3782.13,0.0,3.5296209362039472 2040,ironing out iteration 0; GASNAT A0_GPR round 0,,GASPRC,GBR,2210.5242056822512,124.34198458015484,4.767386617539143 2040,ironing out iteration 0; GASPRD A0_GEX round 0,0,GASDRV,GBR,4002.26,0.0,3.086521021442066 -2040,ironing out iteration 0; GASPRD A0_GEX round 0,,GASDRV,GBR,2321.050415966363,130.55908380916256,4.847920882198776 +2040,ironing out iteration 0; GASPRD A0_GEX round 0,,GASDRV,GBR,2321.050415966363,130.55908380916256,4.8479208821987765 2040,ironing out iteration 1; RSHEAT A0_RES round 0,6,RGASBR,GBR,355.83840587648046,837.2243916125647,7.910651988850701 2040,ironing out iteration 1; RSHEAT A0_RES round 0,,RGASBR,GBR,401.16573754764806,803.2288927232066,16.96954270164715 2040,ironing out iteration 1; RSHEAT A0_RES round 0,,RELCHP,GBR,401.16573754764806,803.2288927232066,28.05951450411788 @@ -53,11 +53,11 @@ milestone_year,run_description,asset_id,process_id,region_id,capacity,unmet_dema 2040,ironing out iteration 1; RSHEAT A0_RES round 1,,RELCHP,GBR,401.16573754764806,553.002604410226,31.95907006149655 2040,ironing out iteration 1; RSHEAT A0_RES round 2,,RGASBR,GBR,401.16573754764806,344.439249133942,23.122931761022492 2040,ironing out iteration 1; RSHEAT A0_RES round 2,,RELCHP,GBR,401.16573754764806,344.439249133942,43.44298715255623 -2040,ironing out iteration 1; RSHEAT A0_RES round 3,,RGASBR,GBR,401.16573754764806,231.4426548511842,37.717511126543194 +2040,ironing out iteration 1; RSHEAT A0_RES round 3,,RGASBR,GBR,401.16573754764806,231.4426548511842,37.7175111265432 2040,ironing out iteration 1; RSHEAT A0_RES round 3,,RELCHP,GBR,401.16573754764806,231.4426548511842,79.929435566358 -2040,ironing out iteration 1; RSHEAT A0_RES round 4,,RGASBR,GBR,401.16573754764806,135.33002996294968,43.31272689192322 +2040,ironing out iteration 1; RSHEAT A0_RES round 4,,RGASBR,GBR,401.16573754764806,135.33002996294968,43.312726891923226 2040,ironing out iteration 1; RSHEAT A0_RES round 4,,RELCHP,GBR,401.16573754764806,135.33002996294968,93.91747497980806 -2040,ironing out iteration 1; RSHEAT A0_RES round 5,,RGASBR,GBR,401.16573754764806,63.522481615597556,55.98733471331223 +2040,ironing out iteration 1; RSHEAT A0_RES round 5,,RGASBR,GBR,401.16573754764806,63.522481615597556,55.98733471331224 2040,ironing out iteration 1; RSHEAT A0_RES round 5,,RELCHP,GBR,401.16573754764806,63.522481615597556,125.60399453328056 2040,ironing out iteration 1; RSHEAT A0_RES round 6,,RGASBR,GBR,401.16573754764806,39.02576700981601,152.78630430986536 2040,ironing out iteration 1; RSHEAT A0_RES round 6,,RELCHP,GBR,401.16573754764806,39.02576700981601,367.6014185246633 @@ -67,9 +67,9 @@ milestone_year,run_description,asset_id,process_id,region_id,capacity,unmet_dema 2040,ironing out iteration 1; RSHEAT A0_RES round 8,,RELCHP,GBR,401.16573754764806,13.952908413088004,718.0206435089918 2040,ironing out iteration 1; RSHEAT A0_RES round 9,,RGASBR,GBR,401.16573754764806,1.4164791147240017,292.95399430359674 2040,ironing out iteration 1; RSHEAT A0_RES round 9,,RELCHP,GBR,401.16573754764806,1.4164791147240017,718.0206435089918 -2040,ironing out iteration 1; RSHEAT A0_RES round 10,,RGASBR,GBR,45.327331671168054,0.0,292.95399430359674 +2040,ironing out iteration 1; RSHEAT A0_RES round 10,,RGASBR,GBR,45.327331671168054,0.0,292.9539943035968 2040,ironing out iteration 1; RSHEAT A0_RES round 10,,RELCHP,GBR,45.327331671168054,0.0,718.0206435089917 2040,ironing out iteration 1; GASNAT A0_GPR round 0,1,GASPRC,GBR,3782.13,0.0,3.5296209362039472 2040,ironing out iteration 1; GASNAT A0_GPR round 0,,GASPRC,GBR,2210.5242056822512,124.34198458015484,4.767386617539143 2040,ironing out iteration 1; GASPRD A0_GEX round 0,0,GASDRV,GBR,4002.26,0.0,3.086521021442066 -2040,ironing out iteration 1; GASPRD A0_GEX round 0,,GASDRV,GBR,2321.050415966363,130.55908380916256,4.847920882198776 +2040,ironing out iteration 1; GASPRD A0_GEX round 0,,GASDRV,GBR,2321.050415966363,130.55908380916256,4.8479208821987765