library(testthat)
library(recipes)

# results based on second example at
# https://github.com/tidymodels/textrecipes/issues/17#issue-382503618
tokenize_old <-
  tibble::tribble(
    ~variable,
    ~type,
    ~role,
    ~source,
    "essay0",
    "nominal",
    "predictor",
    "original",
    "essay0",
    "nominal",
    "textual",
    "original",
    "essay1",
    "nominal",
    "predictor",
    "original",
    "essay1",
    "nominal",
    "textual",
    "original",
    "essay2",
    "nominal",
    "predictor",
    "original",
    "essay2",
    "nominal",
    "textual",
    "original",
    "essay3",
    "nominal",
    "predictor",
    "original",
    "essay3",
    "nominal",
    "textual",
    "original",
    "essay4",
    "nominal",
    "predictor",
    "original",
    "essay4",
    "nominal",
    "textual",
    "original",
    "essay5",
    "nominal",
    "predictor",
    "original",
    "essay5",
    "nominal",
    "textual",
    "original",
    "essay6",
    "nominal",
    "predictor",
    "original",
    "essay6",
    "nominal",
    "textual",
    "original",
    "essay7",
    "nominal",
    "predictor",
    "original",
    "essay7",
    "nominal",
    "textual",
    "original",
    "essay8",
    "nominal",
    "predictor",
    "original",
    "essay8",
    "nominal",
    "textual",
    "original",
    "essay9",
    "nominal",
    "predictor",
    "original",
    "essay9",
    "nominal",
    "textual",
    "original"
  )

tokenize_new <-
  tibble::tribble(
    ~variable,
    ~type,
    "essay0",
    "list",
    "essay1",
    "list",
    "essay2",
    "list",
    "essay3",
    "list",
    "essay4",
    "list",
    "essay5",
    "list",
    "essay6",
    "list",
    "essay7",
    "list",
    "essay8",
    "list",
    "essay9",
    "list"
  )

tokenize_res <-
  tibble::tribble(
    ~variable,
    ~type,
    ~role,
    ~source,
    "essay0",
    "list",
    "predictor",
    "original",
    "essay0",
    "list",
    "textual",
    "original",
    "essay1",
    "list",
    "predictor",
    "original",
    "essay1",
    "list",
    "textual",
    "original",
    "essay2",
    "list",
    "predictor",
    "original",
    "essay2",
    "list",
    "textual",
    "original",
    "essay3",
    "list",
    "predictor",
    "original",
    "essay3",
    "list",
    "textual",
    "original",
    "essay4",
    "list",
    "predictor",
    "original",
    "essay4",
    "list",
    "textual",
    "original",
    "essay5",
    "list",
    "predictor",
    "original",
    "essay5",
    "list",
    "textual",
    "original",
    "essay6",
    "list",
    "predictor",
    "original",
    "essay6",
    "list",
    "textual",
    "original",
    "essay7",
    "list",
    "predictor",
    "original",
    "essay7",
    "list",
    "textual",
    "original",
    "essay8",
    "list",
    "predictor",
    "original",
    "essay8",
    "list",
    "textual",
    "original",
    "essay9",
    "list",
    "predictor",
    "original",
    "essay9",
    "list",
    "textual",
    "original"
  )

untokenize_old <-
  tibble::tribble(
    ~variable,
    ~type,
    ~role,
    ~source,
    "essay0",
    "nominal",
    "predictor",
    "original",
    "essay0",
    "nominal",
    "textual",
    "original",
    "essay1",
    "nominal",
    "predictor",
    "original",
    "essay1",
    "nominal",
    "textual",
    "original",
    "essay2",
    "nominal",
    "predictor",
    "original",
    "essay2",
    "nominal",
    "textual",
    "original",
    "essay3",
    "nominal",
    "predictor",
    "original",
    "essay3",
    "nominal",
    "textual",
    "original",
    "essay4",
    "nominal",
    "predictor",
    "original",
    "essay4",
    "nominal",
    "textual",
    "original",
    "essay5",
    "nominal",
    "predictor",
    "original",
    "essay5",
    "nominal",
    "textual",
    "original",
    "essay6",
    "nominal",
    "predictor",
    "original",
    "essay6",
    "nominal",
    "textual",
    "original",
    "essay7",
    "nominal",
    "predictor",
    "original",
    "essay7",
    "nominal",
    "textual",
    "original",
    "essay8",
    "nominal",
    "predictor",
    "original",
    "essay8",
    "nominal",
    "textual",
    "original",
    "essay9",
    "nominal",
    "predictor",
    "original",
    "essay9",
    "nominal",
    "textual",
    "original"
  )

untokenize_new <-
  tibble::tribble(
    ~variable,
    ~type,
    "essay0",
    "list",
    "essay1",
    "list",
    "essay2",
    "list",
    "essay3",
    "list",
    "essay4",
    "list",
    "essay5",
    "list",
    "essay6",
    "list",
    "essay7",
    "list",
    "essay8",
    "list",
    "essay9",
    "list"
  )

untokenize_res <-
  tibble::tribble(
    ~variable,
    ~type,
    ~role,
    ~source,
    "essay0",
    "list",
    "predictor",
    "original",
    "essay0",
    "list",
    "textual",
    "original",
    "essay1",
    "list",
    "predictor",
    "original",
    "essay1",
    "list",
    "textual",
    "original",
    "essay2",
    "list",
    "predictor",
    "original",
    "essay2",
    "list",
    "textual",
    "original",
    "essay3",
    "list",
    "predictor",
    "original",
    "essay3",
    "list",
    "textual",
    "original",
    "essay4",
    "list",
    "predictor",
    "original",
    "essay4",
    "list",
    "textual",
    "original",
    "essay5",
    "list",
    "predictor",
    "original",
    "essay5",
    "list",
    "textual",
    "original",
    "essay6",
    "list",
    "predictor",
    "original",
    "essay6",
    "list",
    "textual",
    "original",
    "essay7",
    "list",
    "predictor",
    "original",
    "essay7",
    "list",
    "textual",
    "original",
    "essay8",
    "list",
    "predictor",
    "original",
    "essay8",
    "list",
    "textual",
    "original",
    "essay9",
    "list",
    "predictor",
    "original",
    "essay9",
    "list",
    "textual",
    "original"
  )

test_that("issue #", {
  expect_equal(
    recipes:::merge_term_info(.old = tokenize_old, .new = tokenize_new),
    tokenize_res
  )

  expect_equal(
    recipes:::merge_term_info(.old = untokenize_old, .new = untokenize_new),
    untokenize_res
  )
})

# tests based on the results of this code before the update:

skip_if_not_installed("modeldata")
data(credit_data, package = "modeldata")
#
# recipe(Status ~ Seniority + Job + Price + Age, data = credit_data) |>
#   step_dummy(Job) |>
#   step_poly(Price) |>
#   step_rm(Age) |>
#   prep(credit_data)

dummy_old <-
  tibble::tribble(
    ~variable,
    ~type,
    ~role,
    ~source,
    "Seniority",
    "numeric",
    "predictor",
    "original",
    "Job",
    "nominal",
    "predictor",
    "original",
    "Price",
    "numeric",
    "predictor",
    "original",
    "Age",
    "numeric",
    "predictor",
    "original",
    "Status",
    "nominal",
    "outcome",
    "original"
  )
dummy_new <-
  tibble::tribble(
    ~variable,
    ~type,
    "Seniority",
    "numeric",
    "Price",
    "numeric",
    "Age",
    "numeric",
    "Status",
    "nominal",
    "Job_freelance",
    "numeric",
    "Job_others",
    "numeric",
    "Job_partime",
    "numeric"
  )

dummy_res <-
  tibble::tribble(
    ~variable,
    ~type,
    ~role,
    ~source,
    "Seniority",
    "numeric",
    "predictor",
    "original",
    "Price",
    "numeric",
    "predictor",
    "original",
    "Age",
    "numeric",
    "predictor",
    "original",
    "Status",
    "nominal",
    "outcome",
    "original",
    "Job_freelance",
    "numeric",
    NA,
    NA,
    "Job_others",
    "numeric",
    NA,
    NA,
    "Job_partime",
    "numeric",
    NA,
    NA
  )

# recipes:::merge_term_info(.new = dummy_new, .old = dummy_old)

poly_old <-
  tibble::tribble(
    ~variable,
    ~type,
    ~role,
    ~source,
    "Seniority",
    "numeric",
    "predictor",
    "original",
    "Price",
    "numeric",
    "predictor",
    "original",
    "Age",
    "numeric",
    "predictor",
    "original",
    "Status",
    "nominal",
    "outcome",
    "original",
    "Job_freelance",
    "numeric",
    "predictor",
    "derived",
    "Job_others",
    "numeric",
    "predictor",
    "derived",
    "Job_partime",
    "numeric",
    "predictor",
    "derived"
  )

poly_new <-
  tibble::tribble(
    ~variable,
    ~type,
    "Seniority",
    "numeric",
    "Age",
    "numeric",
    "Status",
    "nominal",
    "Job_freelance",
    "numeric",
    "Job_others",
    "numeric",
    "Job_partime",
    "numeric",
    "Price_poly_1",
    "numeric",
    "Price_poly_2",
    "numeric"
  )

poly_res <-
  tibble::tribble(
    ~variable,
    ~type,
    ~role,
    ~source,
    "Seniority",
    "numeric",
    "predictor",
    "original",
    "Age",
    "numeric",
    "predictor",
    "original",
    "Status",
    "nominal",
    "outcome",
    "original",
    "Job_freelance",
    "numeric",
    "predictor",
    "derived",
    "Job_others",
    "numeric",
    "predictor",
    "derived",
    "Job_partime",
    "numeric",
    "predictor",
    "derived",
    "Price_poly_1",
    "numeric",
    NA,
    NA,
    "Price_poly_2",
    "numeric",
    NA,
    NA
  )

rm_old <-
  tibble::tribble(
    ~variable,
    ~type,
    ~role,
    ~source,
    "Seniority",
    "numeric",
    "predictor",
    "original",
    "Age",
    "numeric",
    "predictor",
    "original",
    "Status",
    "nominal",
    "outcome",
    "original",
    "Job_freelance",
    "numeric",
    "predictor",
    "derived",
    "Job_others",
    "numeric",
    "predictor",
    "derived",
    "Job_partime",
    "numeric",
    "predictor",
    "derived",
    "Price_poly_1",
    "numeric",
    "predictor",
    "derived",
    "Price_poly_2",
    "numeric",
    "predictor",
    "derived"
  )

rm_new <-
  tibble::tribble(
    ~variable,
    ~type,
    "Seniority",
    "numeric",
    "Status",
    "nominal",
    "Job_freelance",
    "numeric",
    "Job_others",
    "numeric",
    "Job_partime",
    "numeric",
    "Price_poly_1",
    "numeric",
    "Price_poly_2",
    "numeric"
  )

rm_res <-
  tibble::tribble(
    ~variable,
    ~type,
    ~role,
    ~source,
    "Seniority",
    "numeric",
    "predictor",
    "original",
    "Status",
    "nominal",
    "outcome",
    "original",
    "Job_freelance",
    "numeric",
    "predictor",
    "derived",
    "Job_others",
    "numeric",
    "predictor",
    "derived",
    "Job_partime",
    "numeric",
    "predictor",
    "derived",
    "Price_poly_1",
    "numeric",
    "predictor",
    "derived",
    "Price_poly_2",
    "numeric",
    "predictor",
    "derived"
  )

test_that("typical use cases", {
  expect_equal(
    recipes:::merge_term_info(.old = dummy_old, .new = dummy_new),
    dummy_res
  )

  expect_equal(
    recipes:::merge_term_info(.old = poly_old, .new = poly_new),
    poly_res
  )

  expect_equal(
    recipes:::merge_term_info(.old = rm_old, .new = rm_new),
    rm_res
  )
})
