test_that("'utf8_encode' can encode an ASCII string", {
  expect_equal(utf8_encode("hello"), "hello")
})


test_that("'utf8_encode' can encode NULL or an NA string", {
  expect_equal(utf8_encode(NULL), NULL)
  expect_equal(utf8_encode(NA_character_), NA_character_)
})


test_that("'utf8_encode' preserves attributes", {
  x <- matrix(LETTERS, 2, 13)
  x[1, 4] <- "\xa4"
  Encoding(x) <- "latin1"
  dimnames(x) <- list(c("foo", "bar"), as.character(1:13))
  class(x) <- "my_class"

  local_ctype("UTF-8")

  expect_equal(utf8_encode(x), enc2utf8(x))
})


test_that("'utf8_encode' can encode basic Unicode", {
  x <- "\u200b"
  Encoding(x) <- "UTF-8"

  local_ctype("UTF-8")

  expect_equal(utf8_encode(x), x)
})


test_that("'utf8_encode' can encode extended Unicode", {
  skip_on_os("windows") # no extended Unicode

  x <- intToUtf8(0x0001f60d)
  Encoding(x) <- "UTF-8"

  local_ctype("UTF-8")

  expect_equal(utf8_encode(x), x)
})


test_that("'utf8_encode' can handle ASCII escapes", {
  x <- "\x01\a\b\f\n\r\t\v\x7f"
  expect_equal(utf8_encode(x), "\\u0001\\a\\b\\f\\n\\r\\t\\v\\u007f")
})

test_that("'utf8_encode' can handle invalid UTF-8", {
  x <- "\xfe"
  Encoding(x) <- "bytes"
  expect_equal(utf8_encode(x), "\\xfe")
})

test_that("'utf8_encode' can handle bytes", {
  x <- "\x01\a\b\f\n\r\t\v\x7f\x80\xff"
  Encoding(x) <- "bytes"
  expect_equal(
    utf8_encode(x),
    "\\x01\\a\\b\\f\\n\\r\\t\\v\\x7f\\x80\\xff"
  )
})

test_that("'utf8_encode' can handle latin-1", {
  x <- "her \xa320"
  Encoding(x) <- "latin1"

  # https://github.com/r-lib/testthat/issues/1285
  with_ctype("C", {
    latin <- utf8_encode(x)
  })
  expect_equal(latin, "her \\u00a320")

  local_ctype("UTF-8")
  expect_equal(utf8_encode(x), "her \u00a320")
})


test_that("'utf8_encode' can handle bytes", {
  x <- c("fa\u00E7ile", "fa\xE7ile", "fa\xC3\xA7ile")
  Encoding(x) <- c("UTF-8", "UTF-8", "bytes")

  local_ctype("UTF-8")

  y <- c("fa\u00e7ile", "fa\\xe7ile", "fa\\xc3\\xa7ile")
  Encoding(y) <- c("UTF-8", "UTF-8", "bytes")

  expect_equal(utf8_encode(x), y)
})


test_that("'utf8_encode escapes controls in UTF-8 text", {
  local_ctype("UTF-8")

  x <- "\n\u2026"
  Encoding(x) <- "UTF-8"
  y <- "\\n\u2026"
  Encoding(y) <- "UTF-8"
  expect_equal(utf8_encode(x), y)
})


test_that("'utf8_encode' can quote", {
  x <- c("abcde", "x", "123", "\"", "'")
  expect_equal(utf8_encode(x, quote = FALSE), encodeString(x, quote = ""))
  expect_equal(utf8_encode(x, quote = TRUE), encodeString(x, quote = '"'))
})


test_that("'utf8_encode' ignores justify if width = 0", {
  x <- c("abcde", "x", "123", "\"", "'")
  expect_equal(
    utf8_encode(x, width = 0, justify = "none"),
    encodeString(x, width = 0, justify = "none")
  )
  expect_equal(
    utf8_encode(x, width = 0, justify = "left"),
    encodeString(x, width = 0, justify = "left")
  )
  expect_equal(
    utf8_encode(x, width = 0, justify = "centre"),
    encodeString(x, width = 0, justify = "centre")
  )
  expect_equal(
    utf8_encode(x, width = 0, justify = "right"),
    encodeString(x, width = 0, justify = "right")
  )
})


test_that("'utf8_encode' can justify", {
  x <- c("abcde", "x", "123", "\"", "'")
  expect_equal(
    utf8_encode(x, width = NULL, justify = "none"),
    encodeString(x, width = NULL, justify = "none")
  )
  expect_equal(
    utf8_encode(x, width = NULL, justify = "left"),
    encodeString(x, width = NULL, justify = "left")
  )
  expect_equal(
    utf8_encode(x, width = NULL, justify = "centre"),
    encodeString(x, width = NULL, justify = "centre")
  )
  expect_equal(
    utf8_encode(x, width = NULL, justify = "right"),
    encodeString(x, width = NULL, justify = "right")
  )
})


test_that("'utf8_encode' can justify and quote", {
  expect_equal(
    utf8_encode(c("1", "10", "100"), width = NULL, quote = TRUE),
    encodeString(c("1", "10", "100"), width = NULL, quote = '"')
  )
})
