skip_on_cran()
skip_if_not_installed("serp")
skip_if_not_installed("withr")

# make sure we have the correct interaction mark for tests
withr::with_options(
  list(parameters_interaction = "*"),
  test_that("model_parameters.serp", {
    data(wine, package = "serp")
    m1 <- serp::serp(
      rating ~ temp * contact,
      slope = "penalize",
      link = "logit",
      reverse = TRUE,
      tuneMethod = "user",
      lambda = 5,
      data = ordinal::wine
    )
    mp <- model_parameters(m1, verbose = FALSE)
    expect_snapshot(suppressMessages(print(mp)))

    # validate against coef
    out <- coef(summary(m1))
    expect_equal(mp$Coefficient, out[, 1], tolerance = 1e-4, ignore_attr = TRUE)
    expect_equal(mp$SE, out[, 2], tolerance = 1e-4, ignore_attr = TRUE)
    expect_equal(mp$z, out[, 3], tolerance = 1e-4, ignore_attr = TRUE)
    expect_equal(mp$p, out[, 4], tolerance = 1e-4, ignore_attr = TRUE)

    out <- confint(m1)
    expect_equal(mp$CI_low, out[, 1], tolerance = 1e-4, ignore_attr = TRUE)

    expect_equal(degrees_of_freedom(m1), Inf, tolerance = 1e-3)
    expect_equal(degrees_of_freedom(m1, "residual"), 279.5938, tolerance = 1e-3)
  })
)
