
start_app()
on.exit(stop_app(), add = TRUE)

test_that_cli(
  configs = c("plain", "ansi"),
  "quoting phrases that don't start or end with letter or number", {

    expect_snapshot(local({
      x0 <- "good-name"
      cli_text("The name is {.file {x0}}.")

      x <- "weird-name "
      cli_text("The name is {.file {x}}.")
      cli_text("The name is {.path {x}}.")
      cli_text("The name is {.email {x}}.")
    }))
  }
)

test_that_cli(configs = c("plain", "ansi"), "quoting weird names, still", {
  nb <- function(x) gsub("\u00a0", " ", x, fixed = TRUE)
  expect_snapshot(local({
    cat_line(nb(quote_weird_name("good")))
    cat_line(nb(quote_weird_name("  bad")))
    cat_line(nb(quote_weird_name("bad  ")))
    cat_line(nb(quote_weird_name("  bad  ")))
  }))
})

test_that_cli(configs = c("ansi"), "~/ files are not weird", {
  nb <- function(x) gsub("\u00a0", " ", x, fixed = TRUE)
  expect_snapshot(local({
    cat_line(nb(quote_weird_name("~/good")))
    cat_line(nb(quote_weird_name("~~bad")))
    cat_line(nb(quote_weird_name("bad~  ")))
    cat_line(nb(quote_weird_name(" ~ bad ~ ")))
  }))
})

test_that_cli("custom truncation", {
  expect_snapshot({
    x <- cli_vec(1:100, list("vec-trunc" = 5))
    cli_text("Some numbers: {x}.")
    cli_text("Some numbers: {.val {x}}.")
  })
})

test_that_cli(configs = c("plain", "ansi"), "collapsing class names", {
  expect_snapshot(local({
    cc <- c("one", "two")
    cli_text("this is a class: {.cls myclass}")
    cli_text("multiple classes: {.cls {cc}}")
  }))
})

test_that_cli(configs = c("plain", "ansi"), "transform", {
  expect_snapshot(local({
    cli_text("This is a {.field field} (before)")
    foo <- function(x) toupper(x)
    cli_div(theme = list(span.field = list(transform = foo)))
    cli_text("This is a {.field field} (during)")
    cli_end()
    cli_text("This is a {.field field} (after)")
  }))
})

test_that("cli_format", {
  expect_snapshot(
    cli_format(1:4/7, list(digits = 2))
  )
})

test_that("cli_format() is used for .val", {
  withr::local_options(cli.width = 60)
  withr::local_rng_version("3.3.0")
  set.seed(42)
  expect_snapshot(local({
    cli_div(theme = list(.val = list(digits = 2)))
    cli_text("Some random numbers: {.val {runif(4)}}.")
  }))
})

test_that(".q always double quotes", {
  expect_snapshot(
    cli_text("just a {.q string}, nothing more")
  )
})

test_that(".or", {
  expect_snapshot(
    cli_text("{.or {letters[1:5]}}")
  )
  expect_snapshot(
    cli_text("{.or {letters[1:2]}}")
  )
})

test_that("line breaks", {
  txt <- paste(
    "Cupidatat deserunt culpa enim deserunt minim aliqua tempor fugiat",
    "cupidatat laboris officia esse ex aliqua. Ullamco mollit adipisicing",
    "anim."
  )
  txt2 <- paste0(txt, "\f", txt)
  expect_snapshot(ansi_strwrap(txt2, width = 60))
})

test_that_cli(configs = "ansi", "double ticks", {
  x <- c("a", "`x`", "b")
  cli_div(theme = list(
    .code = list(color = "red"),
    .fun = list(color = "red")
  ))
  expect_snapshot(format_inline("{.code {x}}"))
  expect_snapshot(format_inline("{.fun {x}}"))
})

test_that("do not inherit 'transform' issue #422", {
  expect_snapshot({
    d <- deparse(c("cli", "glue"))
    cli::cli_alert_info("To install, run {.code install.packages({d})}")
  })

  expect_snapshot({
    cli::cli_text("{.code foo({1+1})}")
  })
})

test_that_cli(configs = c("ansi", "plain"), "no inherit color, issue #474", {
  expect_snapshot({
    cli::cli_text("pre {.val x {'foo'} y} post")
  })
})

test_that_cli(configs = c("ansi", "plain"), "\\f at the end, issue #491", {
  expect_snapshot({
    cli_fmt(cli::cli_text("{.val a}{.val b}"))
    cli_fmt(cli::cli_text("\f{.val a}{.val b}"))
    cli_fmt(cli::cli_text("\f\f{.val a}{.val b}"))
    cli_fmt(cli::cli_text("{.val a}\f{.val b}"))
    cli_fmt(cli::cli_text("{.val a}\f\f{.val b}"))
    cli_fmt(cli::cli_text("{.val a}{.val b}\f"))
    cli_fmt(cli::cli_text("{.val a}{.val b}\f\f"))
    cli_fmt(cli::cli_text("\f\f\f{.val a}\f\f\f{.val b}\f\f\f"))
  })
})

test_that("truncate vectors at 20", {
  expect_snapshot(
    cli::cli_text("Some letters: {letters}")
  )
})

test_that_cli(configs = "ansi", "brace expresssion edge cases", {
  foo <- "foo"
  bar <- "bar"
  expect_snapshot({
    cli_text("{.code {foo} and {bar}}")
    cli_text("{.emph {foo} and {bar}}")
    cli_text("{.q {foo} and {bar}}")
  })
})

test_that("various errors", {
  expect_snapshot_error(
    cli_text("xx {.foobar} yy")
  )
  expect_snapshot_error(
    cli_text("xx {.someverylong+expression} yy")
  )
  expect_snapshot(
    error = TRUE,
    cli_text("xx {__cannot-parse-this__} yy"),
    transform = sanitize_srcref,
    variant = if (getRversion() < "4.2.0") "old-r" else "new-r"
  )
  expect_snapshot(
    error = TRUE,
    cli_text("xx {1 + 'a'} yy"),
    transform = function(x) sanitize_call(sanitize_srcref(x))
  )
})

test_that("format_inline and newlines", {
  expect_snapshot({
    format_inline("foo\nbar")
    format_inline("\nfoo\n\nbar\n")
    format_inline("foo\fbar")
    format_inline("\ffoo\f\fbar\f")
  })

  expect_snapshot({
    format_inline("foo\nbar", keep_whitespace = FALSE)
    format_inline("\nfoo\n\nbar\n", keep_whitespace = FALSE)
    format_inline("foo\fbar", keep_whitespace = FALSE)
    format_inline("\ffoo\f\fbar\f", keep_whitespace = FALSE)
  })
})
