skip_if_not_installed("survival")

Surv <- survival::Surv
strata <- survival::strata
ovarian <<- survival::ovarian

mod_survreg_1 <- survival::survreg(Surv(futime, fustat) ~ ecog.ps + rx,
  data = ovarian,
  dist = "exponential"
)
mod_survreg_2 <- survival::survreg(Surv(time, status) ~ ph.ecog + age + strata(sex), data = survival::lung)

test_that("model_info", {
  expect_false(model_info(mod_survreg_1)$is_linear)
  expect_true(model_info(mod_survreg_1)$is_exponential)
  expect_true(model_info(mod_survreg_2)$is_survival)
  expect_false(model_info(mod_survreg_2)$is_linear)
})

test_that("find_predictors", {
  expect_identical(find_predictors(mod_survreg_1), list(conditional = c("ecog.ps", "rx")))
  expect_identical(find_predictors(mod_survreg_1, flatten = TRUE), c("ecog.ps", "rx"))
  expect_null(find_predictors(mod_survreg_1, effects = "random"))
  expect_identical(find_predictors(mod_survreg_2), list(conditional = c("ph.ecog", "age", "sex")))
})

test_that("find_random", {
  expect_null(find_random(mod_survreg_1))
})

test_that("get_random", {
  expect_warning(get_random(mod_survreg_1))
})

test_that("find_response", {
  expect_identical(find_response(mod_survreg_1), "Surv(futime, fustat)")
})

test_that("get_response", {
  expect_equal(get_response(mod_survreg_1), ovarian[, c("futime", "fustat")])
})

test_that("get_predictors", {
  expect_equal(colnames(get_predictors(mod_survreg_1)), c("ecog.ps", "rx"))
})

test_that("link_inverse", {
  expect_equal(link_inverse(mod_survreg_1)(0.2), exp(0.2), tolerance = 1e-5)
})

test_that("get_data", {
  expect_equal(nrow(get_data(mod_survreg_1)), 26)
  expect_equal(
    colnames(get_data(mod_survreg_1)),
    c("futime", "fustat", "ecog.ps", "rx")
  )
})

test_that("get_df", {
  expect_equal(
    get_df(mod_survreg_1, type = "residual"),
    df.residual(mod_survreg_1),
    ignore_attr = TRUE
  )
  expect_equal(
    get_df(mod_survreg_1, type = "normal"),
    Inf,
    ignore_attr = TRUE
  )
  expect_equal(
    get_df(mod_survreg_1, type = "wald"),
    Inf,
    ignore_attr = TRUE
  )
})

test_that("find_formula", {
  expect_length(find_formula(mod_survreg_1), 1)
  expect_equal(
    find_formula(mod_survreg_1),
    list(conditional = as.formula("Surv(futime, fustat) ~ ecog.ps + rx")),
    ignore_attr = TRUE
  )
})

test_that("find_variables", {
  expect_equal(find_variables(mod_survreg_1), list(
    response = c("futime", "fustat"),
    conditional = c("ecog.ps", "rx")
  ))
  expect_equal(
    find_variables(mod_survreg_1, flatten = TRUE),
    c("futime", "fustat", "ecog.ps", "rx")
  )
})

test_that("n_obs", {
  expect_equal(n_obs(mod_survreg_1), 26)
})

test_that("linkfun", {
  expect_false(is.null(link_function(mod_survreg_1)))
})

test_that("find_parameters", {
  expect_equal(
    find_parameters(mod_survreg_1),
    list(conditional = c("(Intercept)", "ecog.ps", "rx"))
  )
  expect_equal(
    find_parameters(mod_survreg_2),
    list(conditional = c("(Intercept)", "ph.ecog", "age", "sex=1", "sex=2"))
  )
})

test_that("get_parameters", {
  expect_equal(nrow(get_parameters(mod_survreg_1)), 3)
  expect_equal(get_parameters(mod_survreg_1)$Parameter, c("(Intercept)", "ecog.ps", "rx"))
  expect_equal(get_parameters(mod_survreg_1)$Estimate, c(6.96184, -0.43313, 0.5815), tolerance = 1e-3)
  expect_equal(nrow(get_parameters(mod_survreg_2)), 5)
  expect_equal(get_parameters(mod_survreg_2)$Parameter, c("(Intercept)", "ph.ecog", "age", "sex=1", "sex=2"))
  expect_equal(get_parameters(mod_survreg_2)$Estimate, c(6.73235, -0.32443, -0.00581, -0.24408, -0.42345), tolerance = 1e-3)
})

test_that("get_statistic", {
  expect_equal(nrow(get_statistic(mod_survreg_1)), 3)
  expect_equal(nrow(get_statistic(mod_survreg_2)), 5)
})

test_that("is_multivariate", {
  expect_false(is_multivariate(mod_survreg_1))
})

test_that("find_statistic", {
  expect_identical(find_statistic(mod_survreg_1), "z-statistic")
})
