tests/testthat/test-pluralization.R

start_app()
on.exit(stop_app(), add = TRUE)

test_that("simplest", {
  expect_snapshot({
    for (n in 0:2) cli_text("{n} package{?s}")
    for (n in 0:2) print(pluralize("{n} package{?s}"))
  })
})

test_that("irregular", {
  expect_snapshot({
    for (n in 0:2) cli_text("{n} dictionar{?y/ies}")
    for (n in 0:2) print(pluralize("{n} dictionar{?y/ies}"))
  })
})

test_that("multiple substitutions", {
  expect_snapshot({
    for (n in 0:2) cli_text("{n} package{?s} {?is/are} ...")
    for (n in 0:2) print(pluralize("{n} package{?s} {?is/are} ..."))
  })
})

test_that("multiple quantities", {
  expect_snapshot({
    for (m in 0:2) for (n in 0:2) cli_text("{m} package{?s} and {n} folder{?s}")
    for (m in 0:2) for (n in 0:2) print(pluralize("{m} package{?s} and {n} folder{?s}"))
  })
})

test_that("no()", {
  expect_snapshot({
    for (n in 0:2) cli_text("{no(n)} package{?s}")
    for (n in 0:2) print(pluralize("{no(n)} package{?s}"))
  })
})

test_that("set qty() explicitly", {
  expect_snapshot({
    for (n in 0:2) cli_text("{qty(n)}There {?is/are} {n} package{?s}")
    for (n in 0:2) print(pluralize("{qty(n)}There {?is/are} {n} package{?s}"))
  })
})

test_that("collapsing vectors", {
  expect_snapshot({
    pkgs <- function(n) glue::glue("pkg{seq_len(n)}")
    for (n in 1:3) cli_text("The {pkgs(n)} package{?s}")
    for (n in 1:3) print(pluralize("The {pkgs(n)} package{?s}"))
  })
})

test_that("pluralization and style", {
  expect_snapshot({
    special_style <- list(span.foo = list(before = "<", after = ">"))
    cli_div(theme = special_style)
    for (n in 0:2) cli_text("{n} {.foo package{?s}}")
  })

  expect_snapshot({
    pkgs <- function(n) glue::glue("pkg{seq_len(n)}")
    for (n in 1:3) cli_text("The {.foo {pkgs(n)}} package{?s}")
  })
})

test_that("post-processing", {
  expect_snapshot({
    for (n in 0:2) cli_text("Package{?s}: {n}")
  })

  expect_snapshot({
    pkgs <- function(n) glue::glue("pkg{seq_len(n)}")
    for (n in 1:2) cli_text("Package{?s}: {pkgs(n)}")
    for (n in 1:2) print(pluralize("Package{?s}: {pkgs(n)}"))
  })
})

test_that("post-processing errors", {
  expect_error(
    cli_text("package{?s}"),
    "Cannot pluralize without a quantity"
  )
  expect_error(
    pluralize("package{?s}"),
    "Cannot pluralize without a quantity"
  )
  expect_error(
    cli_text("package{?s} {5} {10}"),
    "Multiple quantities for pluralization"
  )
  expect_error(
    pluralize("package{?s} {5} {10}"),
    "Multiple quantities for pluralization"
  )
})

test_that("issue 158", {
  expect_snapshot({
    print(pluralize("{0} word{?A/B/}"))
    print(pluralize("{1} word{?A/B/}"))
    print(pluralize("{9} word{?A/B/}"))
  })
})

test_that("Edge cases for pluralize() (#701)", {
  expect_snapshot({
    # Should not be pluralized
    print(pluralize("{NA} file{?s} expected"))
    print(pluralize("{NA_character_} file{?s} expected"))

    # Should be pluralized
    print(pluralize("{NA_real_} file{?s} expected"))
    print(pluralize("{NA_integer_} file{?s} expected"))
    print(pluralize("{NaN} file{?s} expected"))
    print(pluralize("{Inf} file{?s} expected"))
    print(pluralize("{-Inf} file{?s} expected"))
  })

  expect_snapshot({
    # Should not be pluralized
    print(pluralize("Found {NA} director{?y/ies}."))
    print(pluralize("Found {NA_character_} director{?y/ies}."))

    # Should be pluralized
    print(pluralize("Found {NA_real_} director{?y/ies}."))
    print(pluralize("Found {NA_integer_} director{?y/ies}."))
    print(pluralize("Found {NaN} director{?y/ies}."))
    print(pluralize("Found {Inf} director{?y/ies}."))
    print(pluralize("Found {-Inf} director{?y/ies}."))
  })

  expect_snapshot({
    # Should not be pluralized
    print(pluralize("Will remove {?no/the/the} {NA} package{?s}."))
    print(pluralize("Will remove {?no/the/the} {NA_character_} package{?s}."))

    # Should be pluralized
    print(pluralize("Will remove {?no/the/the} {NA_real_} package{?s}."))
    print(pluralize("Will remove {?no/the/the} {NA_integer_} package{?s}."))
    print(pluralize("Will remove {?no/the/the} {NaN} package{?s}."))
    print(pluralize("Will remove {?no/the/the} {Inf} package{?s}."))
    print(pluralize("Will remove {?no/the/the} {-Inf} package{?s}."))
  })
})
r-lib/cli documentation built on April 5, 2025, 7:11 p.m.