test_that("impute_guarded matches guarded preprocessing output", {
  train <- data.frame(
    a = c(1, 2, NA, 4),
    b = c(NA, 1, 2, 3)
  )
  test <- data.frame(
    a = c(NA, 5),
    b = c(1, NA)
  )

  res <- impute_guarded(train, test, method = "median", winsor = FALSE, seed = 1)
  guard <- guard_fit(
    train,
    y = NULL,
    steps = list(
      impute = list(method = "median", winsor = FALSE, winsor_k = 3),
      normalize = list(method = "none"),
      filter = list(var_thresh = 0, iqr_thresh = 0),
      fs = list(method = "none")
    ),
    task = "gaussian"
  )

  expect_equal(res$train, guard$transform(train))
  expect_equal(res$test, guard$transform(test))
})

test_that("impute_guarded validates inputs and emits warnings", {
  train <- data.frame(a = c(1, NA), b = c(2, 3))
  test <- data.frame(a = c(NA, 4), b = c(1, NA))

  expect_error(impute_guarded(1, test), "data frames")
  expect_error(impute_guarded(train, 1), "data frames")

  res <- expect_warning_match(
    impute_guarded(train, test, method = "median",
                   parallel = TRUE, return_outliers = TRUE,
                   constant_value = 1),
    "unused|not supported",
    all = TRUE
  )
  expect_equal(class(res), "LeakImpute")
})

test_that("impute_guarded respects vars selection", {
  train <- data.frame(a = c(1, NA), b = c(2, 3), c = c(4, 5))
  test <- data.frame(a = c(NA, 4), b = c(1, NA), c = c(6, 7))
  res <- impute_guarded(train, test, method = "median", vars = c("a", "b"))
  expect_equal(names(res$train), c("a", "b"))
  expect_equal(names(res$test), c("a", "b"))
})
