test_vroom <- function(content, delim = ",", col_types = list(), ..., equals) {
  if(any(grepl("\n", content))) {
    content <- I(content)
  }
  suppressWarnings({

  # with altrep
  withr::with_envvar(c("VROOM_USE_ALTREP_CHR" = "true", "VROOM_USE_ALTREP_NUMERICS" = "true"), {
    expect_equal(
      vroom(content, delim = delim, col_types = col_types, ...),
      equals
    )
  })

  # without altrep
  withr::with_envvar(c("VROOM_USE_ALTREP_CHR" = "false", "VROOM_USE_ALTREP_NUMERICS" = "false"), {
    expect_equal(
      vroom(content, delim = delim, col_types = col_types, ...),
      equals
    )
  })

  if (!file.exists(content)) {
    tf <- tempfile()
    on.exit(unlink(tf))
    out_con <- file(tf, "wb", encoding = "UTF-8")
    writeBin(charToRaw(content), out_con)
    close(out_con)

    con <- file(tf, "rb")
  } else {
    con <- file(content, "rb")
  }
  on.exit(close(con), add = TRUE)

  res <- vroom(con, delim = delim, col_types = col_types, ...)

  expect_equal(res, equals)
  for (i in seq_along(res)) {
    force_materialization(res[[i]])
  }
  expect_equal(res, equals)
  })

  invisible(res)
}

test_parse_number <- function(x, expected, ...) {
  test_vroom(paste0(paste0(x, collapse = "\n"), "\n"), delim = "\t",
    col_names = FALSE, col_types = "n", ...,
    equals = tibble::tibble(X1 = expected)
  )
}

test_parse_datetime <- function(x, expected, format = "", ...) {
  test_vroom(paste0(paste0(x, collapse = "\n"), "\n"), delim = "\t",
    col_names = FALSE, col_types = cols(X1 = col_datetime(format = format)), ...,
    equals = tibble::tibble(X1 = expected)
  )
}

test_parse_date <- function(x, expected, format = "", ...) {
  test_vroom(paste0(paste0(x, collapse = "\n"), "\n"), delim = "\t",
    col_names = FALSE, col_types = cols(X1 = col_date(format = format)), ...,
    equals = tibble::tibble(X1 = expected)
  )
}

test_parse_time <- function(x, expected, format = "", ...) {
  test_vroom(paste0(paste0(x, collapse = "\n"), "\n"), delim = "\t",
    col_names = FALSE, col_types = cols(X1 = col_time(format = format)), ...,
    equals = tibble::tibble(X1 = expected)
  )
}

expect_error_free <- function(object, ...) {
  expect_error(object, regexp = NA)
}

on_github_actions <- function() {
  identical(Sys.getenv("GITHUB_ACTIONS"), "true")
}
