## tests for digest, taken from the examples in the manual page

suppressMessages(library(digest))


# zap small numbers to zero
zapsmall <- 1:10
border <- 2 ^ floor(log2(10 ^ -zapsmall))
expect_equal(
    sapply(
        seq_along(zapsmall),
        function(i) { digest:::num2hex(border[i] * -1:1, digits = 6, zapsmall = zapsmall[i]) }
    ),
    matrix(
        "0",
        ncol = length(zapsmall),
        nrow = 3
    )
)

# handle 0 correct
expect_equal(digest:::num2hex(0), "0")


# digits are consistent
x <- pi
x.hex <- sapply(1:16, digest:::num2hex, x = x)
x.hex <- x.hex[c(TRUE, diff(nchar(x.hex)) > 0)]
exponent <-  unique(gsub("^[0-9a-f]* ", "", x.hex))
expect_equal(length(exponent), 1L)

mantissa <- gsub(" [0-9]*$", "", x.hex)
ignore(expect_true)(all(
    sapply(
        head(seq_along(mantissa), -1),
        function(i){
            all(
                grepl(
                    paste0("^", mantissa[i], ".*"),
                    tail(mantissa, -i)
                )
            )
        }
    )
))

#it keeps NA values
x <- c(pi, NA, 0)
expect_equal(is.na(digest:::num2hex(x)), is.na(x))

x <- c(pi, NA, pi)
expect_equal(is.na(digest:::num2hex(x)), is.na(x))

x <- as.numeric(c(NA, NA, NA))
expect_equal(is.na(digest:::num2hex(x)), is.na(x))


# handles empty vectors
expect_equal(digest:::num2hex(numeric(0)), character(0))


# example from FAQ 7.31
# tests if all trailing zero's are removed
expect_true(identical(digest:::num2hex(2, digits = 14),
                    digest:::num2hex(sqrt(2) ^ 2, digits = 14)))

expect_true(!identical(digest:::num2hex(2, digits = 15),
                     digest:::num2hex(sqrt(2) ^ 2, digits = 15)))
