skip_on_os(c("mac", "solaris"))
skip_if_not_installed("MASS")
skip_if_not_installed("datawizard")
skip_if_not_installed("effects")
skip_if_not_installed("emmeans")

test_that("ggpredict, negbin", {
  data(efc, package = "ggeffects")
  efc$e42dep <- datawizard::to_factor(efc$e42dep)
  fit <- MASS::glm.nb(
    tot_sc_e ~ neg_c_7 + I(neg_c_7^2) + neg_c_7:e42dep + I(neg_c_7^2):e42dep + c12hour + c172code,
    data = efc,
    init.theta = 1.133641349,
    link = log
  )
  expect_s3_class(ggpredict(fit, "neg_c_7"), "data.frame")
  expect_s3_class(ggeffect(fit, "neg_c_7"), "data.frame")
  expect_s3_class(ggemmeans(fit, "neg_c_7"), "data.frame")
  expect_s3_class(ggpredict(fit, c("neg_c_7", "e42dep")), "data.frame")
  expect_s3_class(ggeffect(fit, c("neg_c_7", "e42dep")), "data.frame")
  expect_s3_class(ggemmeans(fit, c("neg_c_7", "e42dep")), "data.frame")

  # validate against predict()
  pr1 <- predict(fit, newdata = data_grid(fit, "neg_c_7"))
  pr2 <- ggpredict(fit, "neg_c_7")
  expect_equal(
    insight::link_inverse(fit)(pr1),
    pr2$predicted,
    tolerance = 1e-4,
    ignore_attr = TRUE
  )
})

test_that("ggpredict, negbin", {
  data(efc, package = "ggeffects")
  fit <- MASS::glm.nb(
    tot_sc_e ~ neg_c_7 + I(neg_c_7^2) + neg_c_7:e42dep + I(neg_c_7^2):e42dep + c12hour + c172code,
    data = efc,
    init.theta = 1.133641349,
    link = log
  )
  expect_s3_class(ggpredict(fit, "neg_c_7"), "data.frame")
  expect_s3_class(ggeffect(fit, "neg_c_7"), "data.frame")
  expect_s3_class(ggemmeans(fit, "neg_c_7"), "data.frame")
  expect_s3_class(ggpredict(fit, c("neg_c_7", "e42dep")), "data.frame")
  expect_s3_class(ggeffect(fit, c("neg_c_7", "e42dep")), "data.frame")
  expect_s3_class(ggemmeans(fit, c("neg_c_7", "e42dep")), "data.frame")
})
