test_that("bs_theme_update() can update defaults", {
  vars <- c(
    "black",
    "white",
    "primary",
    "danger",
    "font-family-base",
    "font-family-monospace"
  )
  pre_theme <- bs_theme("4")
  pre_vars <- bs_get_variables(pre_theme, vars)
  post_theme <- bs_theme_update(
    pre_theme,
    bg = "black",
    fg = "white",
    primary = "#222222",
    base_font = "SomeFont"
  )
  post_vars <- bs_get_variables(post_theme, vars)
  # bg/fg has been inverted, primary and base font have been updated
  expect_true(post_vars[["black"]] == "#FFFFFF")
  expect_true(post_vars[["white"]] == "#000000")
  expect_true(post_vars[["primary"]] == "#222222")
  expect_true(post_vars[["font-family-base"]] == "SomeFont")
  # Danger hasn't been set
  expect_true(post_vars[["danger"]] == pre_vars[["danger"]])
  # Neither has monospace
  expect_true(
    post_vars[["font-family-monospace"]] == pre_vars[["font-family-monospace"]]
  )
})

test_that("Sass bundles work as expected with a theme", {
  theme <- bs_add_variables(bs_theme("4"), primary = "#222222")
  expect_true(bs_get_variables(theme, "primary") == "#222222")
  # declarations can be used in rules
  theme <- bs_add_mixins(theme, list(foo = "bar !default"))
  expect_identical(
    as.character(sass_partial(".foo {color: $foo}", theme)),
    ".foo {\n  color: bar;\n}\n"
  )
  # but declarations come after defaults (so this won't override the value!)
  theme <- bs_add_mixins(theme, list(primary = "#333333 !default"))
  expect_true(bs_get_variables(theme, "primary") == "#222222")
  # Can drop-down to the lower-level bs_bundle()
  theme <- bs_bundle(
    theme,
    sass::sass_layer(defaults = list(primary = "#333333 !default"))
  )
  expect_true(bs_get_variables(theme, "primary") == "#333333")
})

test_that("bs_theme_update() can update the bootswatch theme", {
  darkly <- bs_theme(bootswatch = "darkly")
  cosmo <- bs_theme(bootswatch = "cosmo")

  expect_false(identical(darkly, cosmo))
  darkly2 <- bs_theme_update(cosmo, bootswatch = "darkly")
  expect_identical(
    sass::sass(darkly),
    sass::sass(darkly2)
  )
  cyborg <- bs_theme(bootswatch = "cyborg")
  cyborg2 <- bs_theme_update(bs_theme(), bootswatch = "cyborg")
  expect_identical(
    sass::sass(cyborg),
    sass::sass(cyborg2)
  )
  default <- bs_theme_update(cosmo, bootswatch = "default")
  expect_identical(
    sass::sass(default),
    sass::sass(bs_theme(preset = "bootstrap"))
  )
  expect_null(theme_bootswatch(default))
})

test_that("is_bs_theme() works", {
  expect_true(is_bs_theme(bs_theme()))
  expect_true(is_bs_theme(bs_theme(3)))
  expect_true(is_bs_theme(bs_theme(4)))
})
