test_that("biogas energy chain is computed correctly", { bg <- biogas_economics(feedstock = 1000, total_solids = 0.1, volatile_solids = 0.8, biogas_yield = 0.5, methane_share = 0.6, electrical_efficiency = 0.4, own_use = 0, energy_price = 5, capex = 1e6, om_rate = 0, leakage = 0, years = 10) vs <- 1000 * 0.1 * 0.8 * 1000 expect_equal(bg$annual[["biogas_m3"]], vs * 0.5) expect_equal(bg$annual[["energy_sold"]], vs * 0.5 * 0.6 * 9.97 * 0.4) cf <- bg$cashflows expect_equal(bg$appraisal[["npv"]], sum(cf$net / 1.1^cf$year)) irr <- bg$appraisal[["irr"]] expect_lt(abs(sum(cf$net / (1 + irr)^cf$year)), 1e-3) g <- biogas_economics(1000, 0.1, 0.8, 0.5, use = "gas", own_use = 0, energy_price = 30, capex = 1e6, leakage = 0) expect_equal(g$annual[["energy_sold"]], vs * 0.5 * 0.6) expect_output(print(bg), "NPV") expect_error(biogas_economics(1, 2, 0.8, 0.5, energy_price = 1, capex = 1)) }) test_that("leakage and baseline methane enter the GHG balance", { a <- biogas_economics(1000, 0.1, 0.8, 0.5, energy_price = 5, capex = 1, leakage = 0, baseline_ch4 = 10) b <- biogas_economics(1000, 0.1, 0.8, 0.5, energy_price = 5, capex = 1, leakage = 0.05, baseline_ch4 = 10) expect_equal(a$annual[["ghg_avoided_t"]], 1000 * 10 / 1000 * 28) expect_lt(b$annual[["ghg_avoided_t"]], a$annual[["ghg_avoided_t"]]) }) test_that("nutrient recovery value is correct", { nr <- nutrient_recovery_value(c(10, 20), rbind(c(N = 10, P2O5 = 5, K2O = 0), c(N = 2, P2O5 = 1, K2O = 4)), equivalence = c(N = 0.5, P2O5 = 1, K2O = 1), price = c(N = 10, P2O5 = 20, K2O = 5), input_nutrients = c(N = 500, P2O5 = 100, K2O = 80)) expect_equal(nr$by_product$value, c(10 * (10 * 0.5 * 10 + 5 * 20), 20 * (2 * 0.5 * 10 + 1 * 20 + 4 * 5))) expect_equal(nr$total, sum(nr$by_product$value)) expect_equal(nr$by_nutrient$recovery_rate, c(140 / 500, 70 / 100, 1)) expect_error(nutrient_recovery_value(1, c(Z = 1), c(Z = 1), c(Z = 1))) expect_output(print(nr), "Total value") }) test_that("circularity index scales and ranks", { d <- data.frame(u = c("a", "b", "c"), x = c(0, 0.5, 1), w = c(1, 0.5, 0)) ci <- circularity_index(d, "u", c("x", "w"), c(TRUE, FALSE)) expect_equal(ci$x_score, c(0, 0.5, 1)) expect_equal(ci$w_score, c(0, 0.5, 1)) expect_equal(ci$rank, c(3, 2, 1)) ct <- circularity_index(d, "u", c("x", "w"), c(TRUE, FALSE), method = "target", targets = c(0.5, 0.25)) expect_equal(ct$x_score, c(0, 1, 1)) expect_equal(ct$w_score, c(0.25, 0.5, 1)) expect_error(circularity_index(d, "u", "x", TRUE, method = "target")) })