test_that("trim_ws() works with data frames", {
  test_trim <- data.frame(
    x = 1:5,
    y = c("a", "b c", " d", "e f ", "g "),
    stringsAsFactors = FALSE
  )
  expect_identical(
    trim_ws(test_trim),
    data.frame(
      x = 1:5,
      y = c("a", "b c", "d", "e f", "g"),
      stringsAsFactors = FALSE
    )
  )
})

test_that("trim_ws() works with list", {
  test_trim <- list(
    x = 1:5,
    y = c("a", "b c", " d", "e f ", "g ")
  )
  expect_identical(
    trim_ws(test_trim),
    list(
      x = 1:5,
      y = c("a", "b c", "d", "e f", "g")
    )
  )
})

test_that("n_unique() works with NULL", {
  expect_identical(n_unique(NULL), 0)
})

test_that("n_unique() works with list", {
  test_n_unique <- list(
    x = 1:3,
    y = c("a", "b")
  )
  expect_identical(
    n_unique(test_n_unique),
    list(x = 3L, y = 2L)
  )
})

test_that("has_single_value() works", {
  x <- c(1, 1)
  expect_true(has_single_value(x))

  x <- c("a", "a")
  expect_true(has_single_value(x))

  x <- factor(c("a", "a"))
  expect_true(has_single_value(x))

  x <- c(NA, 1)
  expect_false(has_single_value(x))
  expect_true(has_single_value(x, remove_na = TRUE))

  x <- c(2, 1)
  expect_false(has_single_value(x))

  x <- NULL
  expect_false(has_single_value(x))

  x <- c(NA, NA)
  expect_false(has_single_value(x))
  expect_false(has_single_value(x, remove_na = TRUE))
})

test_that("safe_deparse_symbol() works", {
  expect_identical(safe_deparse_symbol(as.name("test")), "test")
  expect_null(safe_deparse_symbol("test"))
  expect_identical(safe_deparse(as.name("test")), "test")
  expect_identical(safe_deparse("test"), "\"test\"")
})

test_that("trim_ws() works with non-ascii chars", {
  expect_identical(
    trim_ws(c("test ", " Se\x96ora ", "works \x97fine ", "this too", "yeah")),
    c("test", "Se\x96ora", "works \x97fine", "this too", "yeah")
  )
})

skip_if_not_installed("withr")

withr::with_environment(
  new.env(),
  test_that("validate_argument", {
    foo1 <- function(test = "short_distance") {
      validate_argument(test, c("short_distance", "long_distance", "medium_distance"))
    }
    # match
    expect_identical(foo1("medium_distance"), "medium_distance")
    # typo
    expect_error(
      foo1("medium_ditsance"),
      regex = "Otherwise, use one"
    )
    # no match
    expect_error(
      foo1("abcabcabc"),
      regex = "Please use one"
    )

    foo2 <- function(test = "short_distance") {
      validate_argument(test, "short_distance")
    }
    # match
    expect_identical(foo2("short_distance"), "short_distance")
    # typo
    expect_error(
      foo2("short_ditsance"),
      regex = "Did you mean \"short"
    )
    # no match
    expect_error(
      foo2("abcabcabcabc"),
      regex = "Please use one"
    )

    foo3 <- function(test = "short_distance") {
      validate_argument(
        test,
        c("short_distance", "shorter_distance", "shortest_distance")
      )
    }
    # match
    expect_identical(foo3("short_distance"), "short_distance")
    # typo
    expect_error(
      foo3("short_ditsance"),
      regex = "Did you mean one"
    )
    # no match
    expect_error(
      foo3("aaaaaaaaaaaaaaaaaaaa"),
      regex = "Please use one"
    )
  })
)
