test_that("auto units always rounds down", {
  expect_equal(label_bytes()(1000^(1:3)), c("1 kB", "1 MB", "1 GB"))
})

test_that("auto units handles 0 and other special values", {
  expect_equal(label_bytes()(NA_real_), NA_character_)
  expect_equal(label_bytes()(0), "0 B")
  expect_equal(label_bytes()(-1), "-1 B")
  expect_equal(label_bytes()(Inf), "Inf")
})

test_that("can use either binary or si units", {
  expect_equal(label_bytes("kB")(1000), "1 kB")
  expect_equal(label_bytes("kiB")(1024), "1 kiB")
})

test_that("compatible with scale argument", {
  expect_equal(label_bytes("auto_si", scale = 2)(500), "1 kB")
  expect_equal(label_bytes("auto_binary", scale = 2)(512), "1 kiB")
})

test_that("errors if unknown unit", {
  expect_snapshot(label_bytes("unit")(0), error = TRUE)
})

# deprecated interface ----------------------------------------------------

test_that("Byte formatter can take a symbol designator", {
  expect_equal(
    number_bytes(c(50, 400, 502, NA), symbol = "B"),
    c("50 B", "400 B", "502 B", NA)
  )
  expect_equal(
    number_bytes(3:5 * 1024^2, symbol = "MiB"),
    c("3 MiB", "4 MiB", "5 MiB")
  )
  expect_equal(
    number_bytes(1000^(1:3), symbol = "kB", units = "si"),
    c("1 kB", "1 000 kB", "1 000 000 kB")
  )

  # informative warning for incorrect spelling
  expect_snapshot(number_bytes(c(50, 400, 502, NA), symbol = "k"))

  # respects unit designation
  expect_equal(number_bytes(1024, accuracy = .01), c("1.00 KiB"))
  expect_equal(number_bytes(1024, units = "si", accuracy = .01), c("1.02 kB"))
  expect_equal(number_bytes(1000, units = "si", accuracy = .01), c("1.00 kB"))

  # takes parameters from number()
  expect_equal(
    number_bytes(c(3e6, 4e6, 5e6), accuracy = .001),
    c("2.861 MiB", "3.815 MiB", "4.768 MiB")
  )
  expect_equal(
    number_bytes(c(3e6, 4e6, 5e6), units = "si", accuracy = .1),
    c("3.0 MB", "4.0 MB", "5.0 MB")
  )

  # unit system is enforced
  expect_snapshot(number_bytes(1024^(1:2), "kB", units = "binary"))
  expect_snapshot(number_bytes(1024^(1:2), "KiB", units = "si"))
})

test_that("Byte formatter handles zero values", {
  expect_equal(number_bytes(0), "0 B")
})

test_that("Byte formatter handles large values", {
  expect_equal(number_bytes(1024^11), "1 073 741 824 YiB")
  expect_equal(number_bytes(1000^9, units = "si"), "1 000 YB")
})

test_that("Byte formatter handles negative values", {
  expect_equal(number_bytes(-1024^2), "-1 MiB")
})

test_that('Byte formatter symbol = "auto" can show variable multiples', {
  expect_equal(number_bytes(1024^(1:3)), c("1 KiB", "1 MiB", "1 GiB"))
})

test_that("Byte formatter throws informative error for wrong length symbol", {
  expect_snapshot(number_bytes(symbol = character()), error = TRUE)
  expect_snapshot(number_bytes(symbol = c("kB", "MB")), error = TRUE)
})

test_that("preserves names", {
  expect_named(number_bytes(c(a = 1)), "a")
})
