test_that("write tables whose colnames and contents are UTF-8 encoded (#277)", {
  if (.Platform$OS.type == "windows") {
    skip_if_not(getRversion() >= "4.0")
    withr::local_collate("cht")
  } else {
    withr::local_collate("zh_TW.UTF-8")
  }
  con <- dbConnect(SQLite())
  withr::defer({
    dbDisconnect(con)
  })

  utf8_string <- rawToChar(as.raw(c(0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87)))
  Encoding(utf8_string) <- "UTF-8"
  df <- structure(
    list(V1 = 1:3),
    class = "data.frame",
    row.names = 1:3
  )
  colnames(df) <- utf8_string
  dbWriteTable(con, "a", df)
  res <- dbReadTable(con, "a", check.names = FALSE)
  expect_identical(res, df)

  df <- structure(
    list(V1 = 1:3, V2 = rep(utf8_string, 3)),
    class = "data.frame",
    row.names = 1:3
  )
  colnames(df) <- paste(utf8_string, 1:2, sep = "")
  dbWriteTable(con, "b", df)
  res <- dbReadTable(con, "b", check.names = FALSE)
  expect_identical(res, df)
})

test_that("list the field of tables whose colnames are BIG5 encoded (#277)", {
  skip_if_not(.Platform$OS.type == "windows")
  if (.Platform$OS.type == "windows") {
    withr::local_collate("cht")
  } else {
    withr::local_collate("zh_TW.UTF-8")
  }
  con <- dbConnect(SQLite())
  withr::defer({
    dbDisconnect(con)
  })

  big5_string <- rawToChar(as.raw(c(0xa4, 0xa4, 0xa4, 0xe5)))
  df <- structure(
    list(V1 = 1:3),
    class = "data.frame",
    row.names = c(NA, -3L)
  )

  skip_on_os("windows")

  colnames(df) <- big5_string
  dbWriteTable(con, "a", df)
  expect_identical(dbListFields(con, "a"), colnames(df))
  df <- structure(
    list(V1 = 1:3, V2 = rep(big5_string, 3)),
    class = "data.frame",
    row.names = 1:3
  )
  colnames(df) <- paste(big5_string, 1:2, sep = "")
  dbWriteTable(con, "b", df)
  expect_identical(dbListFields(con, "b"), colnames(df))
})

test_that("list the field of tables whose colnames are UTF-8 encoded (#277)", {
  if (.Platform$OS.type == "windows") {
    withr::local_collate("cht")
  } else {
    withr::local_collate("zh_TW.UTF-8")
  }
  con <- dbConnect(SQLite())
  withr::defer({
    dbDisconnect(con)
  })

  utf8_string <- rawToChar(as.raw(c(0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87)))
  Encoding(utf8_string) <- "UTF-8"
  df <- structure(
    list(V1 = 1:3),
    class = "data.frame",
    row.names = c(NA, -3L)
  )
  colnames(df) <- utf8_string
  dbWriteTable(con, "a", df)
  expect_identical(dbListFields(con, "a"), colnames(df))
  df <- structure(
    list(V1 = 1:3, V2 = rep(utf8_string, 3)),
    class = "data.frame",
    row.names = 1:3
  )
  colnames(df) <- paste(utf8_string, 1:2, sep = "")
  dbWriteTable(con, "b", df)
  expect_identical(dbListFields(con, "b"), colnames(df))
})

test_that("append tables whose colnames are UTF-8 encoded (#277)", {
  if (.Platform$OS.type == "windows") {
    withr::local_collate("cht")
  } else {
    withr::local_collate("zh_TW.UTF-8")
  }
  con <- dbConnect(SQLite())
  withr::defer({
    dbDisconnect(con)
  })

  df <- structure(
    list(V1 = 1:3),
    class = "data.frame",
    row.names = c(NA, -3L)
  )
  utf8_string <- rawToChar(as.raw(c(0xe4, 0xb8, 0xad, 0xe6, 0x96, 0x87)))
  Encoding(utf8_string) <- "UTF-8"
  colnames(df) <- utf8_string
  dbWriteTable(con, "a", df)
  expect_error(dbWriteTable(con, "a", df, append = TRUE), NA)

  df <- structure(
    list(V1 = 1:3, V2 = rep(utf8_string, 3)),
    class = "data.frame",
    row.names = 1:3
  )
  colnames(df) <- paste(utf8_string, 1:2, sep = "")
  dbWriteTable(con, "b", df)
  expect_error(dbWriteTable(con, "b", df, append = TRUE), NA)
})

test_that("write tables whose colnames or contents are BIG5 encoded (#277)", {
  skip_if_not(.Platform$OS.type == "windows")

  .loc <- Sys.getlocale("LC_COLLATE")
  suppressWarnings(Sys.setlocale(locale = "cht"))
  withr::defer({
    Sys.setlocale(locale = .loc)
  })

  con <- dbConnect(SQLite())
  withr::defer({
    dbDisconnect(con)
  })

  big5_string <- rawToChar(as.raw(c(0xa4, 0xa4, 0xa4, 0xe5)))
  df <- structure(
    list(V1 = 1:3),
    class = "data.frame",
    row.names = 1:3
  )
  colnames(df) <- big5_string
  dbWriteTable(con, "a", df)
  res <- dbReadTable(con, "a")
  expect_identical(res, df)

  df <- structure(
    list(V1 = 1:3, V2 = rep(big5_string, 3)),
    class = "data.frame",
    row.names = 1:3
  )
  colnames(df) <- paste(big5_string, 1:2, sep = "")
  dbWriteTable(con, "b", df)
  res <- dbReadTable(con, "b")
  expect_identical(res, df)
})
