test_that("is_string", {
  strings <- list("foo", "", "111", "1", "-", "NA")
  not_strings <- list(
    1,
    character(),
    NA_character_,
    NA,
    c("foo", NA),
    c("1", "2"),
    NULL
  )

  for (p in strings) {
    expect_true(is_string(p))
    expect_silent(stopifnot(is_string(p)))
  }

  for (n in not_strings) {
    expect_false(is_string(n))
    expect_snapshot(error = TRUE, stopifnot(is_string(n)))
  }
})

test_that("is_border_style", {
  expect_true(is_border_style(rownames(box_styles())[1]))
  expect_false(is_border_style("blahblahxxx"))

  expect_silent(stopifnot(is_border_style(rownames(box_styles())[1])))
  expect_snapshot(error = TRUE, stopifnot(is_border_style("blahblahxxx")))
})

test_that("is_padding_or_margin", {
  good <- list(1, 0, 0L, 1L, 237, c(1, 2, 3, 4), c(0, 0, 0, 0), rep(1L, 4))
  bad <- list(
    numeric(),
    integer(),
    c(1, 2),
    c(1L, 2L, 3L),
    1:5,
    "1",
    c("1", "2", "3", "1"),
    NA,
    NA_real_,
    NA_integer_,
    c(1, 2, NA, 1),
    c(1L, NA, 3L)
  )

  for (g in good) {
    expect_true(is_padding_or_margin(g))
    expect_silent(stopifnot(is_padding_or_margin(g)))
  }
  for (b in bad) {
    expect_false(is_padding_or_margin(b))
    expect_snapshot(error = TRUE, stopifnot(is_padding_or_margin(b)))
  }
})

test_that("is_col", {
  good <- list("red", "orange", NULL, col_red)
  bad <- list(c("red", "orange"), character(), NA_character_)

  for (g in good) {
    expect_true(is_col(g))
    expect_silent(stopifnot(is_col(g)))
  }
  for (b in bad) {
    expect_false(is_col(b))
    expect_snapshot(error = TRUE, stopifnot(is_col(b)))
  }
})

test_that("is_count", {
  counts <- list(1, 1L, 0, 0L, 42, 42L)
  not_counts <- list(
    c(1, 2),
    numeric(),
    NA_integer_,
    NA_real_,
    NA,
    1.1,
    NULL,
    "1"
  )

  for (c in counts) {
    expect_true(is_count(c))
    expect_silent(stopifnot(is_count(c)))
  }

  for (n in not_counts) {
    expect_false(is_count(n))
    expect_snapshot(error = TRUE, stopifnot(is_count(n)))
  }
})

test_that("is_tree_style", {
  good <- list(
    list(h = "1", v = "2", l = "3", j = "4"),
    list(j = "4", v = "2", h = "1", l = "3")
  )
  bad <- list(
    NULL,
    1:4,
    c(h = "1", v = "2", l = "3", j = "4"),
    list(h = "1", v = "2", l = "3", j = "4", x = "10"),
    list(h = "1", v = c("2", "3"), l = "3", j = "4"),
    list(h = "1", v = "2", l = character(), j = "4"),
    list(h = "1", v = "2", l = 3, j = "4"),
    list("1", v = "2", l = "3", j = "4"),
    list("1", "2", "3", "4")
  )

  for (x in good) expect_true(is_tree_style(x))
  for (x in bad) expect_false(is_tree_style(x))
})
