tests/testthat/test-percent.R

test_that("as_percent", {
  expect_error(as_percent(NULL))
  expect_error(as_percent("1"))

  expect_equal(
    as_percent(0.1234567),
    structure(0.1234567, class = "percent", .digits = 2)
  )

  expect_equal(format(as_percent(0.045), digits = 0), "5%")
  expect_equal(round(as_percent(0.045)), as_percent(0.05))
})

test_that("as_percent works correctly", {
  expect_s3_class(as_percent(0.5), "percent")
  expect_type(as_percent(0.5), "double")

  expect_equal(as.character(as_percent(50)), "5,000%")
  expect_equal(as.character(as_percent(5)), "500%")
  expect_equal(as.character(as_percent(0.5)), "50%")
  expect_equal(as.character(as_percent(0.05)), "5%")
  expect_equal(as.character(as_percent(0.005)), "0.5%")
  expect_equal(as.character(as_percent(0.0005)), "0.05%")
  expect_equal(as.character(as_percent(0.00005)), "0.01%")

  expect_equal(format(as_percent(50)), "5,000%")
  expect_equal(format(as_percent(5)), "500%")
  expect_equal(format(as_percent(0.5)), "50%")
  expect_equal(format(as_percent(0.05)), "5%")
  expect_equal(format(as_percent(0.005)), "0.5%")
  expect_equal(format(as_percent(0.0005)), "0.05%")
  expect_equal(format(as_percent(0.00005)), "0.01%")
})

test_that("as_percent handles non-numeric input", {
  expect_error(as_percent("not a number"), regexp = "must be a <numeric> vector, not a <character> vector")
  expect_error(as_percent(list(1, 2, 3)), regexp = "must be a <numeric> vector, not a <list> vector")
})

test_that("round_half_up handles non-numeric input", {
  expect_error(round_half_up("not a number"), regexp = "must be a <numeric> vector, not a <character> vector")
  expect_error(round_half_up(list(1, 2, 3)), regexp = "must be a <numeric> vector, not a <list> vector")
})


test_that("signif_half_up handles non-numeric input", {
  expect_error(signif_half_up("not a number"), regexp = "must be a <numeric> vector, not a <character> vector")
  expect_error(signif_half_up(list(1, 2, 3)), regexp = "must be a <numeric> vector, not a <list> vector")
})


test_that("signif_half_up results are as expected", {
  # scalars
  expect_equal(
    signif_half_up(x = 12.5, digits = 2),
    13
  )
  expect_equal(
    signif_half_up(x = 0),
    0
  )
  expect_equal(signif_half_up(x = -2.5, digits = 1), -3)
  expect_equal(
    signif_half_up(x = 123.45, digits = 4),
    123.5
  )
  expect_equal(signif_half_up(x = -123.45, digits = 4), -123.5)
  # vectors
  expect_equal(
    signif_half_up(
      x = c(12.5, 0, -2.5, 123.45, -123.45),
      digits = 2
    ),
    c(13, 0, -2.5, 120, -120)
  )
})

test_that("signif_half_up works correctly", {
  expect_equal(signif_half_up(0.555, 2), 0.56)
  expect_equal(signif_half_up(0.555, 1), 0.6)
  expect_equal(signif_half_up(12345, 3), 12300)
})

test_that("rounding and recycling", {
  x <- seq(-10, by = 0.05, length = 90)
  dig <- c(0, 1, 2)

  # No digits

  expect_equal(
    round_half_up(x, digits = NULL),
    x
  )
  expect_equal(
    signif_half_up(x, digits = NULL),
    x
  )

  # Inf digits
  expect_equal(
    round_half_up(x, digits = Inf),
    x
  )
  expect_equal(
    signif_half_up(x, digits = Inf),
    x
  )

  expect_equal(
    round_half_up(x, digits = c(Inf, 5, Inf)),
    x
  )
  expect_equal(
    signif_half_up(x, digits = c(Inf, 5, Inf)),
    x
  )

  # 0-length inputs
  expect_equal(
    round_half_up(numeric(), digits = numeric()),
    numeric()
  )
  expect_equal(
    signif_half_up(numeric(), digits = numeric()),
    numeric()
  )

  expect_equal(
    round_half_up(x, digits = numeric()),
    numeric()
  )

  expect_equal(
    signif_half_up(x, digits = numeric()),
    numeric()
  )

  expect_equal(
    round_half_up(numeric(), digits = 2),
    numeric()
  )

  expect_equal(
    signif_half_up(numeric(), digits = 2),
    numeric()
  )


  # Recycling of digits

  expect_equal(
    round_half_up(x, digits = dig),
    round_half_up(x, digits = rep_len(dig, 30))
  )
  expect_equal(
    signif_half_up(x, digits = dig),
    signif_half_up(x, digits = rep_len(dig, 30))
  )

  # Recycling of x

  x <- seq(-10, by = 0.05, length = 7)
  dig <- (sample.int(3, 70, TRUE) - 1)

  expect_equal(
    round_half_up(rep_len(x, 70), digits = dig),
    round_half_up(x, digits = dig)
  )
  expect_equal(
    signif_half_up(x, digits = dig),
    signif_half_up(rep_len(x, 70), digits = dig)
  )
})

test_that("as.character.percent works correctly", {
  p <- as_percent(0.1234)
  expect_equal(as.character(p), "12.34%")
  expect_equal(as.character(p, digits = 1), "12.3%")
})

test_that("format.percent works correctly", {
  p <- as_percent(0.1234)
  expect_equal(format(p), "12.34%")
  expect_equal(format(p, digits = 1), "12.3%")
  expect_equal(format(p, symbol = " (%)"), "12.34 (%)")
})

test_that("print.percent works correctly", {
  expect_output(print(as_percent(0.1234)), "12.34%")
  expect_output(print(as_percent(0.567890)), "56.79%")
  expect_output(print(as_percent(numeric())), "A <percent> vector of length 0")
})

test_that("subsetting percent objects works correctly", {
  p <- as_percent(c(0.1, 0.2, 0.3))
  expect_s3_class(p[1:2], "percent")
  expect_equal(p[1:2], as_percent(c(0.1, 0.2)))
})

test_that("unique.percent works correctly", {
  p <- as_percent(c(0.1, 0.2, 0.1, 0.3))
  expect_s3_class(unique(p), "percent")
  expect_equal(unique(p), as_percent(c(0.1, 0.2, 0.3)))
})

test_that("rep.percent works correctly", {
  p <- as_percent(0.1)
  expect_s3_class(rep(p, 3), "percent")
  expect_equal(rep(p, 3), as_percent(c(0.1, 0.1, 0.1)))
})

test_that("Math.percent works correctly", {
  p <- as_percent(c(0.1234, 0.5678))
  expect_equal(floor(p), as_percent(c(0.12, 0.56)))
  expect_equal(ceiling(p), as_percent(c(0.13, 0.57)))
  expect_equal(trunc(p), as_percent(c(0.12, 0.56)))
  expect_equal(round(p), as_percent(c(0.12, 0.57)))
  expect_equal(signif(p, 2), as_percent(c(0.12, 0.57)))
})

test_that("Summary.percent works correctly", {
  p <- as_percent(c(0.1, 0.2, 0.3))
  expect_s3_class(sum(p), "percent")
  expect_equal(sum(p), as_percent(0.6))
  expect_equal(prod(p), as_percent(0.006))
  expect_equal(min(p), as_percent(0.1))
  expect_equal(max(p), as_percent(0.3))
  expect_equal(range(p), as_percent(c(0.1, 0.3)))
})

test_that("mean.percent works correctly", {
  p <- as_percent(c(0.1, 0.2, 0.3))
  expect_s3_class(mean(p), "percent")
  expect_equal(mean(p), as_percent(0.2))
})

Try the phsmethods package in your browser

Any scripts or data that you put into this service are public.

phsmethods documentation built on July 31, 2026, 5:06 p.m.