test_that("sidebar(open =) ensures backwards compatibility of defaults", {
  expect_equal(
    sidebar(open = TRUE, id = "open"),
    sidebar(open = "open", id = "open")
  )

  expect_equal(
    sidebar(open = FALSE, id = "closed"),
    sidebar(open = "closed", id = "closed")
  )

  expect_equal(
    sidebar(open = NA, id = "always"),
    sidebar(open = "always", id = "always")
  )
})

test_that("sidebar() - assigns input binding class if `id` is provided", {
  my_sidebar <- as.tags(sidebar(id = "my-id", open = sidebar_open_on()))

  expect_match(
    htmltools::tagGetAttribute(my_sidebar[[1]], "class"),
    "bslib-sidebar-input"
  )

  expect_equal(
    htmltools::tagGetAttribute(my_sidebar[[1]], "id"),
    "my-id"
  )
})

test_that("sidebar() - assigns a random `id` if collapsible and `id` not provided", {
  sidebar_open <- as.tags(sidebar(open = "open"))

  expect_match(
    htmltools::tagGetAttribute(sidebar_open[[1]], "id"),
    "bslib-sidebar-\\d+"
  )

  expect_equal(
    htmltools::tagGetAttribute(sidebar_open[[2]], "aria-controls"),
    htmltools::tagGetAttribute(sidebar_open[[1]], "id")
  )

  sidebar_closed <- as.tags(sidebar(open = "closed"))
  expect_match(
    htmltools::tagGetAttribute(sidebar_closed[[1]], "id"),
    "bslib-sidebar-\\d+"
  )

  expect_equal(
    htmltools::tagGetAttribute(sidebar_closed[[2]], "aria-controls"),
    htmltools::tagGetAttribute(sidebar_closed[[1]], "id")
  )

  sidebar_desktop <- as.tags(sidebar(open = "desktop"))
  expect_match(
    htmltools::tagGetAttribute(sidebar_desktop[[1]], "id"),
    "bslib-sidebar-\\d+"
  )

  expect_equal(
    htmltools::tagGetAttribute(sidebar_desktop[[2]], "aria-controls"),
    htmltools::tagGetAttribute(sidebar_desktop[[1]], "id")
  )

  expect_null(
    htmltools::tagGetAttribute(sidebar(open = "always")[[1]], "id")
  )
})

test_that("sidebar() - sets `aria-expanded` correctly on collapse toggle", {
  get_sidebar_collapse_tag <- function(...) {
    as.tags(sidebar(...))[[2]]
  }

  expect_equal(
    htmltools::tagGetAttribute(
      get_sidebar_collapse_tag(open = "open"),
      "aria-expanded"
    ),
    "true"
  )

  expect_equal(
    htmltools::tagGetAttribute(
      get_sidebar_collapse_tag(open = "closed"),
      "aria-expanded"
    ),
    "false"
  )

  expect_equal(
    htmltools::tagGetAttribute(
      get_sidebar_collapse_tag(open = "desktop"),
      "aria-expanded"
    ),
    "true"
  )
})

test_that("sidebar() - throws an error for invalid `open` values", {
  expect_error(
    sidebar(open = "bad")
  )

  expect_error(
    sidebar(open = c("open", "closed"))
  )

  expect_error(
    sidebar(open = 1)
  )

  expect_error(
    sidebar(open = "OPEN")
  )

  expect_error(
    sidebar(open = character())
  )
})

test_that("sidebar() - warns if `max_height_mobile` used with `open != 'always'", {
  expect_warning(
    as.tags(sidebar(open = "open", max_height_mobile = "100px"))
  )

  expect_silent(
    as.tags(sidebar(open = "always", max_height_mobile = "100px"))
  )
})

test_that("layout_sidebar() - errors with unexpected border, border_radius input values", {
  expect_error(
    layout_sidebar(sidebar(), border = "1px solid blue")
  )
  expect_error(
    layout_sidebar(sidebar(), border = c(TRUE, FALSE))
  )
  expect_error(
    layout_sidebar(sidebar(), border_radius = c(TRUE, FALSE))
  )
  expect_error(
    layout_sidebar(sidebar(), border = c(TRUE, NA))
  )
  expect_error(
    layout_sidebar(sidebar(), border_radius = c(TRUE, NA))
  )
  expect_error(
    layout_sidebar(sidebar(), border = NA)
  )
  expect_error(
    layout_sidebar(sidebar(), border_radius = NA)
  )
})
