library(sjmisc)
data(iris)
data(efc)

if (requireNamespace("haven", quietly = TRUE) && requireNamespace("sjlabelled", quietly = TRUE)) {
  test_that("rec", {
    expect_equal(length(unique(rec(iris$Sepal.Length, rec = "lo:5=1;5.01:6.5=2;6.501:max=3", append = TRUE))), 3)
  })

  test_that("rec", {
    expect_equal(length(unique(rec(efc$c12hour, rec = "5=10;else=2"))), 3)
    expect_equal(length(unique(rec(efc$c12hour, rec = "5=10;else=2;NA=2"))), 2)
    expect_equal(length(unique(rec(efc$c82cop1, rec = "1,2=1; NA=9; else=copy"))), 4)
  })

  test_that("rec", {
    efc$c172code <- as.factor(efc$c172code)
    expect_is(rec(efc$c12hour, rec = "5=10;else=2", as.num = FALSE), "factor")
    expect_is(rec(efc$c172code, rec = "rev", as.num = TRUE), "numeric")
  })

  test_that("rec", {
    x <- c(1,2,3,NA)
    expect_equal(rec(x, rec = "1:3=NA;NA=1;else=2"), c(NA, NA, NA, 1))
    expect_equal(rec(x, rec = "1=NA;NA=1;else=copy"), c(NA, 2, 3, 1))
    expect_equal(rec(x, rec = "min=10;max=5;NA=9;else=copy"), c(10, 2, 5, 9))
  })

  test_that("rec", {
    skip_on_cran()
    expect_equal(
      unique(rec(iris, Petal.Length, rec = "lo:3=1;3.01:4.5=2;4.501:max=3", append = T, suffix = "")$Petal.Length),
      c(1, 3, 2)
    )
  })


  test_that("rec rev", {
    x <- c(1, 2, 3, 4, 1, 2, 3, 4)
    x <- sjlabelled::set_labels(x, labels = c("1" = "a", "2" = "b", "3" = "c"))
    expect_equal(
      rec(x, rec = "rev"),
      structure(c(4, 3, 2, 1, 4, 3, 2, 1), labels = c(c = 2, b = 3, a = 4))
    )


    x <- c(1, 2, 3, 4, 1, 2, 3, 4)
    x <- sjlabelled::set_labels(x, labels = c("1" = "a", "2" = "b", "3" = "c", "4" = "d"))
    expect_equal(
      rec(x, rec = "rev"),
      structure(c(4, 3, 2, 1, 4, 3, 2, 1), labels = c(d = 1, c = 2, b = 3, a = 4))
    )

    x <- c(1, 2, 3, 4, 1, 2, 3, 4)
    x <- sjlabelled::set_labels(x, labels = c("1" = "a", "2" = "b", "3" = "c", "4" = "d", "5" = "e"))
    expect_equal(
      rec(x, rec = "rev"),
      structure(c(5, 4, 3, 2, 5, 4, 3, 2), labels = c(e = 1, d = 2, c = 3, b = 4, a = 5))
    )
  }
  )
}
