A whole package


This vignette will teach you how to create a unit test shell for all of the examples in an entire package’s documentation.


First, let’s set up a dummy package called tempkg with just the detect.R and match.R files from the source code of the stringr package.

usethis::create_package("tempkg", open = FALSE)
#> ✔ Creating './'
#> ✔ Setting active project to '/private/var/folders/j0/sb8lpn0s4471_5sypq8qzq7h0000gn/T/Rtmpc4x6Vs/tempkg'
#> ✔ Creating 'R/'
#> ✔ Writing 'DESCRIPTION'
#> ✔ Writing 'NAMESPACE'
#> ✔ Setting active project to '/private/var/folders/j0/sb8lpn0s4471_5sypq8qzq7h0000gn/T/Rtmpc4x6Vs/tempkg'
  system.file("extdata", c("detect.R", "match.R"), package = "exampletestr"),

Now let’s move into the tempkg directory:


and set the active project:


Main event

The detect.R file looks like this (well, I’ve abbreviated it slightly):

#' Detect the presence or absence of a pattern in a string.
#' Vectorised over `string` and `pattern`.
#' @param string Input vector. Either a character vector, or something
#'  coercible to one.
#' @param pattern Pattern to look for.
#' @return A logical vector.
#' @export
#' @examples
#' fruit <- c("apple", "banana", "pear", "pinapple")
#' str_detect(fruit, "a")
#' str_detect(fruit, "^a")
#' str_detect(fruit, "a$")
#' str_detect(fruit, "b")
#' str_detect(fruit, "[aeiou]")
str_detect <- function(string, pattern) {
    empty = ,
    bound = str_count(string, pattern) > 0,
    fixed = stri_detect_fixed(string, pattern, opts_fixed = opts(pattern)),
    coll = stri_detect_coll(string, pattern, opts_collator = opts(pattern)),
    regex = stri_detect_regex(string, pattern, opts_regex = opts(pattern))

We can make a unit tests shell file for each .R file in the package using make_tests_shells_pkg():


This outputs test-detect.R and test-match.R files in the tests/testthat folder. As an example of what to do next, the test-detect.R file has contents

test_that("`str_detect()` works", {
  fruit <- c("apple", "banana", "pear", "pinapple")
  expect_equal(str_detect(fruit, "a"), )
  expect_equal(str_detect(fruit, "^a"), )
  expect_equal(str_detect(fruit, "a$"), )
  expect_equal(str_detect(fruit, "b"), )
  expect_equal(str_detect(fruit, "[aeiou]"), )
  expect_equal(str_detect("aecfg", letters), )

which can be sensibly completed as

test_that("`str_detect()` works", {
  fruit <- c("apple", "banana", "pear", "pinapple")
  expect_equal(str_detect(fruit, "a"), rep(TRUE, 4))
  expect_equal(str_detect(fruit, "^a"), c(TRUE, rep(FALSE, 3)))
  expect_equal(str_detect(fruit, "a$"), c(FALSE, TRUE, FALSE, FALSE))
  expect_equal(str_detect(fruit, "b"), c(FALSE, TRUE, FALSE, FALSE))
  expect_equal(str_detect(fruit, "[aeiou]"), rep(TRUE, 4))
    str_detect("aecfg", letters),
    letters %in% c("a", "c", "e", "f", "g")

test-match.R must similarly be completed.


knitr::opts_knit$set(root.dir = tempdir(check = TRUE))
if (fs::dir_exists("tempkg")) fs::dir_delete("tempkg")
knitr::opts_knit$set(root.dir = init_wd)