test_that("can snapshot values", {
  x <- list("a", 1.5, 1L, TRUE)
  expect_snapshot_value(x, style = "json")
  expect_snapshot_value(x, style = "json2")
  expect_snapshot_value(x, style = "deparse")
  expect_snapshot_value(x, style = "serialize")
})

test_that("can control snapshot value details", {
  expect_snapshot_value(1.2, tolerance = 0.1)

  # including through ...
  f <- ~1
  expect_snapshot_value(f, style = "serialize", ignore_formula_env = TRUE)
})

test_that("tolerance passed to check_roundtrip", {
  expect_snapshot_value(0.900000000000001, style = "json")
})

test_that("reparse handles common cases", {
  roundtrip <- function(x) reparse(deparse(x))
  expect_equal(roundtrip(-1), -1)
  expect_equal(roundtrip(c(1, 2, 3)), c(1, 2, 3))
  expect_equal(roundtrip(list(1, 2, 3)), list(1, 2, 3))
  expect_equal(roundtrip(mtcars), mtcars)
  expect_equal(roundtrip(1:10), 1:10)
  expect_equal(roundtrip(numeric()), numeric())

  f <- function(x) x + 1
  expect_equal(roundtrip(f), f, ignore_function_env = TRUE)
})

test_that("errors if can't roundtrip", {
  snapper <- local_test_snapshotter()
  snapper$start_file("snapshot-4", "test")

  expect_error(expect_snapshot_value(NULL), "safely serialized")
})

test_that("check_roundtrip() gives nice error", {
  # disable crayon usage
  local_bindings(crayon = FALSE, .env = get_reporter())

  wrapper <- function(...) check_roundtrip(...)
  expect_snapshot(
    wrapper(NULL, list(), label = "foo", style = "json"),
    error = TRUE
  )
})

test_that("expect_snapshot_value validates its inputs", {
  expect_snapshot(error = TRUE, {
    expect_snapshot_value(123, cran = "yes")
    expect_snapshot_value(123, tolerance = "high")
  })
})
