test_that("inline_linegraph returns expected response for a ts vector", {
  input <- inline_linegraph(freeny$y)
  expect_identical(input, "⣀⣀⠤⠤⠒⠒⠉⠉")
})

test_that("inline_linegraph returns expected response for a long ts vector.", {
  input <- inline_linegraph(AirPassengers)
  expect_identical(input, "⣀⣀⣀⠔⠤⠊⠑⠊")
})

test_that("inline_linegraph returns expected response for an NA ts vector.", {
  input <- inline_linegraph(ts(c(NA, NA, NA, NA, NA, NA)))
  expect_identical(input, "⠀")
})

test_that("ts_start returns expected response for a ts vector", {
  input <- ts_start(freeny$y)
  expect_identical(input, 1962)
})

test_that("ts_start returns expected response for a ts vector", {
  input <- ts_end(freeny$y)
  expect_identical(input, 1971)
})

test_that("n_missing is calculated correctly.", {
  data <- c("a", "b", "c", NA, " ")
  input <- n_missing(data)
  expect_identical(input, 1L)
})

test_that("n_complete is calculated correctly.", {
  data <- c("a", "b", "c", NA)
  input <- n_complete(data)
  expect_identical(input, 3L)
})

test_that("complete_rate is calculated correctly.", {
  data <- c("a", "b", "c", NA, " ")
  input <- complete_rate(data)
  expect_equal(input, .8, tolerance = .001)
})

test_that("n_whitespace is calculated correctly.", {
  data <- c("a", "b", "c", NA, " ", "  a", "   ", "   a")
  input <- n_whitespace(data)
  expect_identical(input, 2L)
})

test_that("inline histogram is calculated correctly.", {
  input <- inline_hist(iris$Sepal.Length)
  expect_identical(input, "▂▇▅▇▆▅▂▂")
})

test_that("inline histogram is calculated correctly when x is all zeros.", {
  input <- inline_hist(numeric(10))
  expect_identical(input, "▁▁▁▇▁▁▁▁")
})

test_that("inline histogram returns an empty string when x is length 0.", {
  input <- inline_hist(numeric(0))
  expect_identical(input, " ")
})

test_that("inline hist is calculated correctly when x is all zeores or NAs", {
  input <- inline_hist(as.numeric(c(NA, NA, NA, 0, 0)))
  expect_identical(input, "▁▁▁▇▁▁▁▁")
})

test_that("inline histogram is calculated correctly when x is all 1s.", {
  input <- inline_hist(c(1, 1, 1, 1, 1, 1))
  expect_identical(input, "▁▁▁▇▁▁▁▁")
})

test_that("inline histogram returns empty string when x is all NAs.", {
  input <- inline_hist(as.numeric(rep(NA, 10)))
  expect_identical(input, " ")
})

test_that("inline histogram is returns empty string when x is all NaN.", {
  input <- inline_hist(rep(NaN, 10))
  expect_identical(input, " ")
})

test_that("inline histogram is correct when x is evenly distributed.", {
  input <- inline_hist(c(1, 2, 3, 4, 5, 6, 7, 8))
  expect_identical(input, "▇▇▇▇▇▇▇▇")
})

test_that("inline histogram is calculated correctly with NaN.", {
  input <- inline_hist(c(1, 2, 3, 3, 6, 6, 6, 8, NaN))
  expect_identical(input, "▂▂▅▁▁▇▁▂")
})

test_that("inline histogram is calculated correctly with NA.", {
  input <- inline_hist(c(1, 2, 3, 3, 6, 6, 6, 8, NA))
  expect_identical(input, "▂▂▅▁▁▇▁▂")
})

test_that("inline histogram is calculated correctly with Inf.", {
  expect_warning(input <-
    inline_hist(c(1, 2, 3, 3, 6, 6, 6, 8, Inf, -Inf)))
  expect_identical(input, "▂▂▅▁▁▇▁▂")
})

test_that("n_empty is calculated correctly.", {
  data <- c("a", "ab", "abc", "")
  correct <- as.integer(1)
  input <- n_empty(data)
  expect_identical(input, correct)
})

test_that("min_char is calculated correctly, including empty strings.", {
  data <- c("a", "ab", "abc", "")
  correct <- as.integer(0)
  input <- min_char(data)
  expect_identical(input, correct)
})

test_that("min_char with a multibyte character does not throw an error.", {
  data <- c("a", "ab", "abc", "Coleophora asteris M\x9fhl.")
  expect_error(min_char(data), NA)
})

test_that("min_char returns NA when there are only NA values.", {
  data <- as.character(c(NA, NA, NA, NA))
  input <- min_char(data)
  expect_equal(input, NA)
})

test_that("max_char is calculated correctly, including empty strings.", {
  data <- c("a", "ab", "abc", "")
  correct <- as.integer(3)
  input <- max_char(data)
  expect_identical(input, correct)
})

test_that("max_char with a multibyte character does not throw an error.", {
  data <- c("a", "ab", "abc", "Coleophora asteris M\x9fhl.")
  # correct <- as.integer(3)
  # input <- max_char(data)
  # expect_identical(input, correct)
  expect_error(max_char(data, NA))
})

test_that("max_char returns NA when there are only NA values.", {
  data <- as.character(c(NA, NA, NA, NA))
  input <- max_char(data)
  expect_equal(input, NA)
})

test_that("n_unique is calculated correctly.", {
  correct <- 4L
  data <- c("a", "ab", "abc", "")
  input <- n_unique(data)
  expect_identical(input, correct)
})

test_that("n_unique handles NA as expected.", {
  correct <- 4L
  data <- c("a", "ab", "abc", "", NA)
  input <- n_unique(data)
  expect_identical(input, correct)
})

test_that("list_lengths_min is calculated correctly.", {
  dat <- list(
    list("a", "b", "c"),
    list("d", "b", "d"),
    list("e", "f", "g"),
    d = list("h"),
    e = list("i", "j", "k", "l"),
    f = NA
  )
  expect_identical(list_lengths_min(dat), 1L)
})

test_that("list_lengths_max is calculated correctly.", {
  dat <- list(
    list("a", "b", "c"),
    list("d", "b", "d"),
    list("e", "f", "g"),
    d = list("h"),
    e = list("i", "j", "k", "l"),
    f = NA
  )
  expect_identical(list_lengths_max(dat), 4L)
})

test_that("list_lengths_median is calculated correctly.", {
  dat <- list(
    list("a", "b", "c"),
    list("d", "b", "d"),
    list("e", "f", "g"),
    d = list("h"),
    e = list("i", "j", "k", "l"),
    f = NA
  )
  expect_identical(list_lengths_median(dat), 3L)
})

test_that("list_min_length is calculated correctly.", {
  dat <- I(list(5, 5:6, 5:10, NA))
  expect_identical(list_min_length(dat), 1L)
})

test_that("list_max_length is calculated correctly.", {
  dat <- I(list(5, 5:6, 5:10, NA))
  expect_identical(list_max_length(dat), 6L)
})

test_that("sorted count is calculated correctly.", {
  dat <- c("A", "A", "A", "B", "C", "C")
  expect_equal(sorted_count(dat)[1:3], c("A" = 3, "C" = 2, "B" = 1))
  expect_equal(names(sorted_count(dat)), c("A", "C", "B"))
})

test_that("top counts is calculated correctly", {
  dat <- c("A", "A", "A", "B", "C", "C")
  expect_equal(top_counts(dat), "A: 3, C: 2, B: 1")
})

test_that("sorted count is calculated correctly with a NA.", {
  # NA should be sorted as if it is a regular value
  dat <- c("A", "A", "A", "A", "B", NA, NA, "C", "C", "C")
  expect_equal(unname(sorted_count(dat)), c(4, 3, 1))
  expect_equal(names(sorted_count(dat)), c("A", "C", "B"))
})

test_that("top counts is calculated correctly with a NA", {
  dat <- c("A", "A", "A", "B", "C", "C")
  expect_equal(top_counts(dat), "A: 3, C: 2, B: 1")
})

test_that("sorted count is calculated correctly with \"\".", {
  # \"\" should be converted to \"empty \" and a warning issued.
  dat <- c("A", "A", "A", "A", "B", "", "", "C", "C", "C")
  dat <- as.factor(dat)
  expect_warning(expected <- sorted_count(dat))
  expect_equal(unname(expected), c(4, 3, 2, 1))
  expect_equal(names(expected), c("A", "C", "empty", "B"))
})
