test_that("write_vtr streams VTR -> VTR", {
  f <- tempfile(fileext = ".vtr")
  f2 <- tempfile(fileext = ".vtr")
  on.exit(unlink(c(f, f2)))
  write_vtr(mtcars, f)
  tbl(f) |> write_vtr(f2)
  result <- tbl(f2) |> collect()
  expect_equal(nrow(result), 32L)
  expect_equal(ncol(result), 11L)
  expect_equal(result$mpg, mtcars$mpg)
})

test_that("write_vtr streams CSV -> VTR", {
  csv <- tempfile(fileext = ".csv")
  f <- tempfile(fileext = ".vtr")
  on.exit(unlink(c(csv, f)))
  write.csv(mtcars, csv, row.names = FALSE)
  tbl_csv(csv) |> write_vtr(f)
  result <- tbl(f) |> collect()
  expect_equal(nrow(result), 32L)
  expect_equal(result$mpg, mtcars$mpg)
})

test_that("write_vtr streams SQLite -> VTR", {
  f <- tempfile(fileext = ".vtr")
  db <- tempfile(fileext = ".sqlite")
  f2 <- tempfile(fileext = ".vtr")
  on.exit(unlink(c(f, db, f2)))
  write_vtr(mtcars, f)
  tbl(f) |> write_sqlite(db, "cars")
  tbl_sqlite(db, "cars") |> write_vtr(f2)
  result <- tbl(f2) |> collect()
  expect_equal(nrow(result), 32L)
})

test_that("write_vtr streams filtered node", {
  f <- tempfile(fileext = ".vtr")
  f2 <- tempfile(fileext = ".vtr")
  on.exit(unlink(c(f, f2)))
  write_vtr(mtcars, f)
  tbl(f) |> filter(mpg > 20) |> write_vtr(f2)
  result <- tbl(f2) |> collect()
  expect_equal(nrow(result), sum(mtcars$mpg > 20))
})

test_that("write_vtr streams mutated node", {
  f <- tempfile(fileext = ".vtr")
  f2 <- tempfile(fileext = ".vtr")
  on.exit(unlink(c(f, f2)))
  write_vtr(mtcars, f)
  tbl(f) |> mutate(kpl = mpg * 0.425144) |> write_vtr(f2)
  result <- tbl(f2) |> collect()
  expect_equal(ncol(result), 12L)
  expect_true("kpl" %in% names(result))
})

test_that("write_vtr atomic write leaves no temp file", {
  f <- tempfile(fileext = ".vtr")
  f2 <- tempfile(fileext = ".vtr")
  on.exit(unlink(c(f, f2)))
  write_vtr(mtcars, f)
  tbl(f) |> write_vtr(f2)
  expect_false(file.exists(paste0(f2, ".~writing")))
  expect_true(file.exists(f2))
})

test_that("write_vtr.data.frame still works", {
  f <- tempfile(fileext = ".vtr")
  on.exit(unlink(f))
  write_vtr(iris, f)
  result <- tbl(f) |> collect()
  expect_equal(nrow(result), 150L)
  expect_equal(ncol(result), 5L)
})
