df <- mtcars
df$cyl <- paste0("cyl", df$cyl)

has_alert <- function(model) tidypredict_test(model, df = df, include_intervals = TRUE)$alert

test_that("Predictions within threshold and parsed model results are equal", {
  expect_false(has_alert(lm(mpg ~ wt, offset = am, data = df)))
  expect_false(has_alert(lm(mpg ~ wt + am + cyl, data = df)))
  expect_false(has_alert(lm(mpg ~ wt + disp * am, data = df)))
  expect_false(has_alert(lm(mpg ~ wt + disp * cyl, data = df)))
  expect_false(has_alert(lm(mpg ~ (wt + disp) * cyl, data = df)))
})

test_that("tidypredict works when variable names are subset of other variables", {
  df2 <- df
  df2$wt_sq <- df2$wt ^ 2
  df2$char_cyl = as.character(df2$cyl)
  df2$char_cyl_2 = sample(letters[1:3], size = nrow(df2), replace = TRUE)
  model4 <- lm(
    am ~ wt + wt_sq + char_cyl + char_cyl_2, 
    data = df2
  )
  
  expect_silent(tidypredict_fit(model4))
  expect_false(tidypredict_test(model4)$alert)
})

lm_parsnip <- function(...) {
  parsnip::fit(
    parsnip::set_engine(parsnip::linear_reg(), "lm"),
    ...
  )
}

test_that("Predictions within threshold and parsed model results are equal", {
  expect_false(has_alert(lm_parsnip(mpg ~ wt, offset = am, data = df)))
  expect_false(has_alert(lm_parsnip(mpg ~ wt + am + cyl, data = df)))
  expect_false(has_alert(lm_parsnip(mpg ~ wt + disp * am, data = df)))
  expect_false(has_alert(lm_parsnip(mpg ~ wt + disp * cyl, data = df)))
  expect_false(has_alert(lm_parsnip(mpg ~ (wt + disp) * cyl, data = df)))
})

test_that("Model can be saved and re-loaded", {
  model <- lm(mpg ~ (wt + disp) * cyl, data = df)
  mp <- tempfile(fileext = ".yml")
  yaml::write_yaml(parse_model(model), mp)
  l <- yaml::read_yaml(mp)
  pm <- as_parsed_model(l)
  expect_snapshot(tidypredict_fit(pm))
})

test_that("tidy() works", {
  expect_s3_class(
    tidy(parse_model(lm(mpg ~., mtcars))),
    "tbl_df"
  )  
})
