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")
}
