# A unit test for boxcox transformations
test_that("tests for biasadj automatically set based on model fit", {
  # lm
  fit <- tslm(USAccDeaths ~ trend, lambda = 0.5, biasadj = TRUE)
  expect_true(all.equal(forecast(fit), forecast(fit, biasadj = TRUE)))

  # HoltWintersZZ
  fit <- ses(USAccDeaths, initial = "simple", lambda = 0.5, biasadj = TRUE)
  expect_true(all.equal(forecast(fit), forecast(fit, biasadj = TRUE)))

  # arfima
  x <- fracdiff::fracdiff.sim(100, ma = -.4, d = .3)$series
  fit <- arfima(x)
  expect_true(all.equal(forecast(fit), forecast(fit, biasadj = TRUE)))

  #arima
  fit1 <- Arima(
    USAccDeaths,
    order = c(0, 1, 1),
    seasonal = c(0, 1, 1),
    lambda = 0.5,
    biasadj = TRUE
  )
  fit2 <- auto.arima(
    USAccDeaths,
    max.p = 0,
    max.d = 1,
    max.q = 1,
    max.P = 0,
    max.D = 1,
    max.Q = 1,
    lambda = 0.5,
    biasadj = TRUE
  )
  expect_true(all.equal(forecast(fit1), forecast(fit1, biasadj = TRUE)))
  expect_true(all.equal(forecast(fit2), forecast(fit2, biasadj = TRUE)))
  expect_true(all.equal(forecast(fit1)$mean, forecast(fit2)$mean))

  # ets
  fit <- ets(USAccDeaths, model = "ANA", lambda = 0.5, biasadj = TRUE)
  expect_true(all.equal(forecast(fit), forecast(fit, biasadj = TRUE)))

  # bats
  # fit <- bats(USAccDeaths, use.box.cox = TRUE, biasadj = TRUE)
  # expect_true(all.equal(forecast(fit), forecast(fit, biasadj=TRUE)))

  # tbats
  # fit <- tbats(USAccDeaths, use.box.cox = TRUE, biasadj = TRUE)
  # expect_true(all.equal(forecast(fit), forecast(fit, biasadj=TRUE)))
})

test_that("tests for automatic lambda selection in BoxCox transformation", {
  lambda_auto <- BoxCox.lambda(USAccDeaths)

  # lm
  fit <- tslm(USAccDeaths ~ trend, lambda = "auto", biasadj = TRUE)
  expect_equal(as.numeric(fit$lambda), lambda_auto, tolerance = 1e-3)

  # ets
  fit <- ets(USAccDeaths, model = "ANA", lambda = "auto", biasadj = TRUE)
  expect_equal(as.numeric(fit$lambda), lambda_auto, tolerance = 1e-3)

  # arima
  fit <- Arima(
    USAccDeaths,
    order = c(0, 1, 1),
    seasonal = c(0, 1, 1),
    lambda = "auto",
    biasadj = TRUE
  )
  expect_equal(as.numeric(fit$lambda), lambda_auto, tolerance = 1e-3)
})
