
test_that("diff_chr", {
  # Something simple first
  a <- as.character(c(1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5))
  b <- as.character(c(1,1,1,1,1,1,1,2,10,4,4,4,4,4,4,4,6,7,5))
  d <- diff_chr(a, b)
  expect_snapshot(d$lcs)
  d <- diff_chr(b, a)
  expect_snapshot(d$lcs)
})

test_that_cli(configs = c("plain", "ansi"), "diff_chr", {
  # Something simple first
  a <- as.character(c(1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5))
  b <- as.character(c(1,1,1,1,1,1,1,2,10,4,4,4,4,4,4,4,6,7,5))
  d <- diff_chr(a, b)
  expect_snapshot(d)
  expect_snapshot(d$lcs)
})

test_that("diff_chr edge cases", {
  expect_snapshot(diff_chr(character(), character()))
  expect_snapshot(diff_chr(character(), character())$lcs)
  expect_snapshot(diff_chr("a", character()))
  expect_snapshot(diff_chr(character(), "b"))
  expect_snapshot(diff_chr("a", "a"))
  expect_snapshot(diff_chr(letters, letters))
  expect_snapshot(diff_chr(c("a", NA, "a2"), "b"))
  expect_snapshot(diff_chr(NA_character_, "NA"))
})

test_that("format.cli_diff_chr context", {
  # Something simple first
  a <- as.character(c(1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5))
  b <- as.character(c(1,1,1,1,1,1,1,2,10,4,4,4,4,4,4,4,6,7,5))
  d <- diff_chr(a, b)
  expect_snapshot(print(d, context = 1))
  expect_snapshot(print(d, context = 0))
  expect_snapshot(print(d, context = Inf))
  d2 <- diff_chr(c("foo", "bar"), c("foo", "bar"))
  expect_snapshot(print(d2, context = Inf))
})

test_that_cli(config = c("plain", "ansi"), "diff_str", {
  str1 <- "abcdefghijklmnopqrstuvwxyz"
  str2 <- "PREabcdefgMIDDLEnopqrstuvwxyzPOST"
  d <- diff_str(str1, str2)
  expect_snapshot(d)
})

test_that("warnings and errors", {
  expect_error(diff_chr(1:10, 1:10), "is.character")
  expect_error(
    format(diff_chr("foo", "bar"), context = -1),
    "is_count"
  )
  expect_warning(
    format(diff_chr("foo", "bar"), what = 1, is = 2, this = 3),
    "Extra arguments"
  )
  expect_warning(
    format(diff_str("foo", "bar"), what = 1, is = 2, this = 3),
    "Extra arguments"
  )
})

test_that("max_diff", {
  err <- tryCatch(
    diff_chr("a", c("a", "b"), 0),
    error = function(e) e
  )
  expect_s3_class(err, "cli_diff_max_dist")

  expect_silent(diff_chr(c("a", "c"), c("a", "b"), 2))
  err <- tryCatch(
    diff_chr(c("a", "c"), c("a", "b"), 1),
    error = function(e) e
  )
  expect_s3_class(err, "cli_diff_max_dist")
})
