tests/testthat/test-12-simulation.R

# =============================================================================
# test-12-simulation.R
# Tests para el motor de simulación (run_fb4_simulation) y prepare_simulation_data.
# Se usan fixtures de helper-setup.R (bio_chinook_30, 30 días).
# =============================================================================

# =============================================================================
# 1. prepare_simulation_data
# =============================================================================

test_that("prepare_simulation_data retorna lista con campos requeridos", {
  psd <- prepare_simulation_data(
    bio_obj  = bio_chinook_30,
    strategy = "direct"
  )

  expect_type(psd, "list")
  expect_true("species_params" %in% names(psd))
  expect_true("n_days"         %in% names(psd))
  expect_true("temperatures"   %in% names(psd))
  expect_true("initial_weight" %in% names(psd))
})

test_that("prepare_simulation_data respeta duración del objeto Bioenergetic", {
  psd <- prepare_simulation_data(bio_obj = bio_chinook_30, strategy = "direct")
  expect_equal(psd$n_days, 30L)
})

test_that("prepare_simulation_data tiene 30 valores de temperatura", {
  psd <- prepare_simulation_data(bio_obj = bio_chinook_30, strategy = "direct")
  expect_length(psd$temperatures, 30)
  expect_true(all(psd$temperatures > 0))
})

# =============================================================================
# 2. run_fb4_simulation — método directo (p_value fijo)
# =============================================================================

test_that("run_fb4_simulation (direct, p = 0.5) retorna lista con campos clave", {
  psd <- prepare_simulation_data(bio_obj = bio_chinook_30, strategy = "direct")
  result <- run_fb4_simulation(
    consumption_method       = list(type = "p_value", value = 0.5),
    processed_simulation_data = psd
  )

  expect_type(result, "list")
  expect_true("final_weight"      %in% names(result))
  expect_true("total_consumption" %in% names(result))
  expect_true("daily_output"      %in% names(result))
})

test_that("run_fb4_simulation produce crecimiento positivo con p = 0.5", {
  psd <- prepare_simulation_data(bio_obj = bio_chinook_30, strategy = "direct")
  result <- run_fb4_simulation(
    consumption_method        = list(type = "p_value", value = 0.5),
    processed_simulation_data = psd
  )

  expect_gt(result$final_weight, psd$initial_weight)
})

test_that("run_fb4_simulation: mayor p produce mayor peso final", {
  psd <- prepare_simulation_data(bio_obj = bio_chinook_30, strategy = "direct")

  r_low  <- run_fb4_simulation(list(type = "p_value", value = 0.3), psd)
  r_high <- run_fb4_simulation(list(type = "p_value", value = 0.8), psd)

  expect_gt(r_high$final_weight, r_low$final_weight)
})

test_that("run_fb4_simulation: p = 0 produce pérdida de peso (catabolismo)", {
  psd <- prepare_simulation_data(bio_obj = bio_chinook_30, strategy = "direct")
  result <- run_fb4_simulation(
    consumption_method        = list(type = "p_value", value = 0.0),
    processed_simulation_data = psd
  )
  expect_lt(result$final_weight, psd$initial_weight)
})

test_that("run_fb4_simulation daily_output tiene columnas requeridas", {
  psd <- prepare_simulation_data(bio_obj = bio_chinook_30, strategy = "direct")
  result <- run_fb4_simulation(
    consumption_method        = list(type = "p_value", value = 0.5),
    processed_simulation_data = psd
  )

  do <- result$daily_output
  expect_true(all(c("Day", "Weight", "Consumption_energy",
                    "Respiration", "Egestion", "Excretion",
                    "SDA", "Net_energy") %in% names(do)))
})

test_that("run_fb4_simulation daily_output tiene 30 filas", {
  psd <- prepare_simulation_data(bio_obj = bio_chinook_30, strategy = "direct")
  result <- run_fb4_simulation(
    consumption_method        = list(type = "p_value", value = 0.5),
    processed_simulation_data = psd
  )
  expect_equal(nrow(result$daily_output), 30L)
})

test_that("run_fb4_simulation: energías diarias son todas no-negativas", {
  psd <- prepare_simulation_data(bio_obj = bio_chinook_30, strategy = "direct")
  result <- run_fb4_simulation(
    consumption_method        = list(type = "p_value", value = 0.5),
    processed_simulation_data = psd
  )
  do <- result$daily_output
  expect_true(all(do$Respiration   >= 0))
  expect_true(all(do$Egestion      >= 0))
  expect_true(all(do$Excretion     >= 0))
  expect_true(all(do$SDA           >= 0))
})

test_that("run_fb4_simulation: consumo total = suma diaria de consumo", {
  psd <- prepare_simulation_data(bio_obj = bio_chinook_30, strategy = "direct")
  result <- run_fb4_simulation(
    consumption_method        = list(type = "p_value", value = 0.5),
    processed_simulation_data = psd
  )
  # Consumo total en gramos presa
  cons_sum <- sum(result$daily_output$Consumption_gg * result$daily_output$Weight[-31],
                  na.rm = TRUE)
  expect_equal(result$total_consumption, cons_sum, tolerance = 1)  # tolerancia 1 g
})

Try the fb4package package in your browser

Any scripts or data that you put into this service are public.

fb4package documentation built on May 8, 2026, 1:07 a.m.