test_that("should_stop_for_warnings", {
  withr::local_options(pkg.build_stop_for_warnings = NULL)
  withr::local_envvar(PKG_BUILD_STOP_FOR_WARNINGS = NA_character_)
  expect_false(should_stop_for_warnings())

  withr::local_options(pkg.build_stop_for_warnings = FALSE)
  withr::local_envvar(PKG_BUILD_STOP_FOR_WARNINGS = "true")
  expect_false(should_stop_for_warnings())

  withr::local_options(pkg.build_stop_for_warnings = TRUE)
  withr::local_envvar(PKG_BUILD_STOP_FOR_WARNINGS = "false")
  expect_true(should_stop_for_warnings())

  withr::local_options(pkg.build_stop_for_warnings = NULL)
  withr::local_envvar(PKG_BUILD_STOP_FOR_WARNINGS = "true")
  expect_true(should_stop_for_warnings())

  withr::local_options(pkg.build_stop_for_warnings = NULL)
  withr::local_envvar(PKG_BUILD_STOP_FOR_WARNINGS = "false")
  expect_false(should_stop_for_warnings())

  withr::local_options(pkg.build_stop_for_warnings = 1:10)
  withr::local_envvar(PKG_BUILD_STOP_FOR_WARNINGS = "false")
  expect_snapshot(error = TRUE, should_stop_for_warnings())

  withr::local_options(pkg.build_stop_for_warnings = NULL)
  withr::local_envvar(PKG_BUILD_STOP_FOR_WARNINGS = "foobar")
  expect_snapshot(error = TRUE, should_stop_for_warnings())
})

test_that("isFALSE", {
  pos <- list(FALSE, structure(FALSE, class = "foo"))
  neg <- list(1, c(FALSE, TRUE), NA, list(FALSE))
  for (p in pos) expect_true(isFALSE(p), info = p)
  for (n in neg) expect_false(isFALSE(n), info = n)
})

test_that("should_add_compiler_flags", {
  # should not be called if option is set
  local_mocked_bindings(makevars_user = function() stop("dont"))

  # options is TRUE
  withr::local_options(pkg.build_extra_flags = TRUE)
  expect_true(should_add_compiler_flags())

  # options is FALSE
  withr::local_options(pkg.build_extra_flags = FALSE)
  expect_false(should_add_compiler_flags())

  # depends on whether Makevars exists
  withr::local_options(pkg.build_extra_flags = "missing")
  local_mocked_bindings(makevars_user = function() character())
  expect_true(should_add_compiler_flags())
  local_mocked_bindings(makevars_user = function() "foobar")
  withr::local_options(pkg.build_extra_flags = "missing")
  expect_false(should_add_compiler_flags())

  local_mocked_bindings(makevars_user = function() stop("dont"))
  withr::local_options(pkg.build_extra_flags = NULL)

  # env var true
  withr::local_envvar(PKG_BUILD_EXTRA_FLAGS = "true")
  expect_true(should_add_compiler_flags())

  # env var false
  withr::local_envvar(PKG_BUILD_EXTRA_FLAGS = "false")
  expect_false(should_add_compiler_flags())

  # depends on whether Makevars exists
  withr::local_envvar(PKG_BUILD_EXTRA_FLAGS = "missing")
  local_mocked_bindings(makevars_user = function() character())
  expect_true(should_add_compiler_flags())
  local_mocked_bindings(makevars_user = function() "foobar")
  expect_false(should_add_compiler_flags())

  # no option or env var, then TRUE
  local_mocked_bindings(makevars_user = function() stop("dont"))
  withr::local_options(pkg.build_extra_flags = NULL)
  withr::local_envvar(PKG_BUILD_EXTRA_FLAGS = NA_character_)
  expect_true(should_add_compiler_flags())
})

test_that("should_add_compiler_flags errors", {
  # invalid option type
  withr::local_options(pkg.build_extra_flags = 1:10)
  expect_snapshot(error = TRUE, should_add_compiler_flags())

  # invalid option value
  withr::local_options(pkg.build_extra_flags = "foobar")
  expect_snapshot(error = TRUE, should_add_compiler_flags())

  # invalid env var value
  withr::local_options(pkg.build_extra_flags = NULL)
  withr::local_envvar(PKG_BUILD_EXTRA_FLAGS = "foo")
  expect_snapshot(error = TRUE, should_add_compiler_flags())
})
