test_that("can refer to columns in | operands", {
  expect_identical(select_loc(mtcars, cyl | am), c(cyl = 2L, am = 9L))
})

test_that("can refer to columns in & operands", {
  expect_identical(select_loc(mtcars, cyl & contains("am")), set_names(int(), chr()))
  expect_identical(select_loc(mtcars, cyl & where(is.numeric)), c(cyl = 2L))
})

test_that("can use named inputs in & operands", {
  x <- list(a = 1L, b = 2L)
  expect_identical(select_loc(x, a & c(foo = a)), c(foo = 1L))
  expect_identical(select_loc(x, c(foo = a) & a), c(foo = 1L))
  expect_identical(select_loc(x, c(foo = a) & c(bar = a)), named(int()))
})

test_that("symbol operands are evaluated in strict mode", {
  foo <- 1:2
  expect_error(
    select(iris, Species | foo),
    class = "vctrs_error_subscript_oob"
  )
})

test_that("boolean operators throw relevant errors", {
  expect_error(
    select_loc(mtcars, foobar & contains("am")),
    class = "vctrs_error_subscript_oob"
  )
  expect_error(
    select_loc(mtcars, contains("am") | foobar),
    class = "vctrs_error_subscript_oob"
  )
  expect_error(
    select_loc(mtcars, cyl & am),
    "empty selection"
  )

  expect_snapshot(error = TRUE, {
    "Unknown names"
    select_loc(mtcars, foobar & contains("am"))
    select_loc(mtcars, contains("am") | foobar)

    "Empty intersection"
    select_loc(mtcars, cyl & am)

    "Symbol operands are evaluated in strict mode"
    foo <- 1:2
    select_loc(iris, Species | foo)
  })
})
