# simulations to verify the model implementation
test_that("verify: constant exposure", {
  source(test_path("init-simulate_Daphnia.R"), local=TRUE)

  param <- tfs_param
  param$f <- 0.88

  tfs_result %>%
    dplyr::filter(set=="set3" & run=="control") %>%
    dplyr::pull(time) -> times

  for(i in seq(2, length(tfs_exposure$cst))) {
    exposure <- tfs_exposure$cst[,c(1,i)]

    DEBtox() %>%
      set_init(tfs_init) %>%
      set_param(param) %>%
      set_times(times) %>%
      set_exposure(exposure, reset_times = FALSE) %>%
      simulate(nout=0) -> out

    runstr <- ifelse(i == 2, "control", paste0("CST_",(i-2)))
    tfs_result %>%
      dplyr::filter(set == "set3" & run == runstr) %>%
      dplyr::select(!c(set, run)) -> verify
    expect_equal(out, verify, tolerance=0.1, ignore_attr=TRUE)
  }
})

test_that("verify: variable exposure 1", {
  source(test_path("init-simulate_Daphnia.R"), local=TRUE)

  tfs_result %>%
    dplyr::filter(set=="set1" & run=="control") %>%
    dplyr::pull(time) -> times

  for(i in seq(2, length(tfs_exposure$var1))) {
    exposure <- tfs_exposure$var1[,c(1,i)]

    DEBtox() %>%
      set_init(tfs_init) %>%
      set_param(tfs_param) %>%
      set_times(times) %>%
      set_exposure(exposure, reset_times = FALSE) %>%
      simulate() -> out

    runstr <- ifelse(i == 2, "control", paste0("VAR1_",(i-2)))
    tfs_result %>%
      dplyr::filter(set == "set1" & run == runstr) %>%
      dplyr::select(!c(set, run)) -> verify
    expect_equal(out, verify, tolerance=1e-3, ignore_attr=TRUE)
  }
})

test_that("verify: variable exposure 2", {
  source(test_path("init-simulate_Daphnia.R"), local=TRUE)

  tfs_result %>%
    dplyr::filter(set=="set2" & run=="control") %>%
    dplyr::pull(time) -> times

  for(i in seq(2, length(tfs_exposure$var1))) {
    exposure <- tfs_exposure$var2[,c(1,i)]

    DEBtox() %>%
      set_init(tfs_init) %>%
      set_param(tfs_param) %>%
      set_times(times) %>%
      set_exposure(exposure, reset_times = FALSE) %>%
      simulate(hmax=0.01) -> out

    runstr <- ifelse(i == 2, "control", paste0("VAR2_",(i-2)))
    tfs_result %>%
      dplyr::filter(set == "set2" & run == runstr) %>%
      dplyr::select(!c(set, run)) -> verify
    expect_equal(out, verify, tolerance=1e-3, ignore_attr=TRUE)
  }
})

# model behavior
test_that("brood-pouch delay", {
  source(test_path("init-simulate_Daphnia.R"), local=TRUE)

  # irregular time points
  dmagna %>%
    set_param(c(Tbp=3)) %>%
    simulate() -> res_bp
  dmagna %>%
    set_param(c(Tbp=0)) %>%
    simulate() -> res_no
  # last time point with zero reproduction should be roughly shifted by Tbp
  expect_equal(
    res_bp %>% dplyr::filter(R==0) %>% dplyr::pull(time) %>% max(),
    res_no %>% dplyr::filter(R==0) %>% dplyr::pull(time) %>% max() + 3,
    tolerance=0.1
  )
  expect_equal(res_bp$L, res_no$L)

  # regular time points
  dmagna %>%
    set_times(0:21) %>%
    set_param(c(Tbp=3)) %>%
    simulate() -> res_bp
  dmagna %>%
    set_times(0:21) %>%
    set_param(c(Tbp=0)) %>%
    simulate() -> res_no
  expect_equal(
    res_bp %>% dplyr::filter(R==0) %>% dplyr::pull(time) %>% max(),
    res_no %>% dplyr::filter(R==0) %>% dplyr::pull(time) %>% max() + 3
  )
  expect_equal(tail(res_bp$R, 19), head(res_no$R, 19))
  expect_equal(res_bp$L, res_no$L)
})
