test_that("vld_join", {
  expect_true(vld_join(data.frame(z = 1), data.frame(z = 1:2), by = "z"))
  expect_false(vld_join(data.frame(z = 1), data.frame(z = 2), by = "z"))
  expect_true(vld_join(data.frame(z = 1:2), data.frame(z = 1:2), by = "z"))
})

test_that("vld_join with by = NULL", {
  expect_false(vld_join(data.frame(z = 1), data.frame(z = 1:2), by = NULL))
})

test_that("vld_join with names", {
  expect_true(vld_join(data.frame(z = 1), data.frame(a = 1:2), by = c(z = "a")))
  expect_false(vld_join(data.frame(z = 1), data.frame(a = 2), by = c(z = "a")))
  expect_error(
    vld_join(data.frame(z = 1), data.frame(a = 2), by = c(a = "z")),
    "undefined columns selected"
  )
  expect_true(vld_join(data.frame(z = 1, z2 = 2), data.frame(z = 1:2, z2 = 2:1), by = "z"))
  expect_true(vld_join(data.frame(z = 1, z2 = 2), data.frame(z = 1:2, z2 = 2:1), by = c("z", "z2")))
  expect_true(vld_join(data.frame(z = 1, z2 = 2), data.frame(z = 1:2, z2 = 1:2), by = "z"))
  expect_false(vld_join(data.frame(z = 1, z2 = 2), data.frame(z = 1:2, z2 = 1:2), by = c("z", "z2")))
})

test_that("vld_join with zero length", {
  expect_true(vld_join(data.frame(z = numeric(0)), data.frame(z = 2), by = c("z")))
  expect_true(vld_join(data.frame(z = numeric(0)), data.frame(z = numeric(0)), by = c("z")))
  expect_false(vld_join(data.frame(z = 1), data.frame(z = numeric(0)), by = c("z")))
})

test_that("vld_join with missing values", {
  expect_false(vld_join(data.frame(z = NA_integer_), data.frame(z = 2), by = c("z")))
  expect_false(vld_join(data.frame(z = 2), data.frame(z = NA_integer_), by = c("z")))
  expect_true(vld_join(data.frame(z = NA_integer_), data.frame(z = NA_integer_), by = c("z")))
})

test_that("chk_join", {
  expect_identical(
    chk_join(data.frame(z = 1), data.frame(z = 1), by = "z"),
    chk_join(data.frame(z = 1), data.frame(z = 1), by = "z")
  )
  expect_invisible(chk_join(data.frame(z = 1), data.frame(z = 1), by = "z"))
})

test_that("chk_join", {
  expect_chk_error(
    chk_join(data.frame(z = 1), data.frame(z = 2), by = "z"),
    "^All rows in `data.frame[(]z [=] 1[)]` must match at least one in the y object of class <d"
  )
})
