test_that("validate_outcomes_are_univariate()", {
  expect_silent(validate_outcomes_are_univariate(data.frame(x = 1)))

  expect_silent(validate_outcomes_are_univariate(matrix()))

  expect_silent(validate_outcomes_are_univariate(1))

  expect_error(
    validate_outcomes_are_univariate(iris),
    "The outcome must be univariate, but 5 columns were found."
  )
})

test_that("validate_outcomes_are_numeric()", {
  expect_silent(
    validate_outcomes_are_numeric(mtcars)
  )

  expect_error(
    validate_outcomes_are_numeric(iris),
    "'Species': 'factor'"
  )

  date <- as.POSIXct(as.POSIXlt(as.Date("2019-01-01")))
  x <- data.frame(x = date, y = factor("hi"))

  expect_error(
    validate_outcomes_are_numeric(x),
    "'x': 'POSIXct', 'POSIXt'\n'y': 'factor'"
  )
})

test_that("validate_no_formula_duplication()", {
  expect_silent(validate_no_formula_duplication(y ~ x))

  expect_error(
    validate_no_formula_duplication(y ~ y),
    "'y'"
  )

  expect_silent(validate_no_formula_duplication(y ~ log(y)))

  expect_error(
    validate_no_formula_duplication(y ~ log(y), original = TRUE),
    "'y'"
  )

  expect_error(
    validate_no_formula_duplication(y + x ~ y + x),
    "'y', 'x'"
  )

  expect_silent(validate_no_formula_duplication(y ~ .))

  expect_error(
    validate_no_formula_duplication(y ~ . + y),
    "'y'"
  )

  # offset() is a weird special case but this is ok
  expect_silent(validate_no_formula_duplication(offset(y) ~ offset(y)))

  expect_error(
    validate_no_formula_duplication(y ~ offset(y), original = TRUE),
    "'y'"
  )
})

test_that("validate_outcomes_are_factors()", {
  expect_silent(
    validate_outcomes_are_factors(data.frame(x = factor(c("A", "B"))))
  )

  date <- as.POSIXct(as.POSIXlt(as.Date("2019-01-01")))
  x <- data.frame(x = date, y = "hi", stringsAsFactors = FALSE)

  expect_error(
    validate_outcomes_are_factors(x),
    "'x': 'POSIXct', 'POSIXt'\n'y': 'character'"
  )
})

test_that("validate_outcomes_are_binary()", {
  expect_silent(
    validate_outcomes_are_binary(data.frame(x = factor(c("A", "B"))))
  )

  expect_error(
    validate_outcomes_are_binary(iris),
    "'Sepal.Length': 0\n'Sepal.Width': 0\n'Petal.Length': 0\n'Petal.Width': 0\n'Species': 3"
  )
})

test_that("validate_predictors_are_numeric()", {
  expect_silent(
    validate_predictors_are_numeric(mtcars)
  )

  expect_error(
    validate_predictors_are_numeric(iris),
    "'Species': 'factor'"
  )

  date <- as.POSIXct(as.POSIXlt(as.Date("2019-01-01")))
  x <- data.frame(x = date, y = factor("hi"))

  expect_error(
    validate_predictors_are_numeric(x),
    "'x': 'POSIXct', 'POSIXt'\n'y': 'factor'"
  )
})

test_that("validate_prediction_size()", {
  expect_silent(
    validate_prediction_size(mtcars, mtcars)
  )

  expect_error(
    validate_prediction_size(mtcars[1:5, ], mtcars),
    "The size of `new_data` \\(32\\) must match the size of `pred` \\(5\\)."
  )
})
